it-swarm-eu.dev

Jak automaticky spouštět a vypínat stroje VirtualBox?

Potřebuji spustit softwarový systém, který je určen k instalaci jako zařízení na vyhrazený stroj. Abych ušetřil energii, mám v plánu spustit systém na VirtualBox VM místo toho.

Host je standardní Linuxová skříň se systémem SysV-Init, host je silně upravený Linux a já bych raději nemusel dále měnit. VirtualBox se používá ve verzi OSE.

Už jsem přišel na to, jak spustit VM, když hostitelské boty (Edit: =) == to se provádí, jak Nikhil zmínil níže, příkazem VBoxManager startvm), ale jak mohu elegantně vypnout VM? Jakýkoli skript spuštěný na hostiteli by musel počkat, dokud se host úplně nevypne.

Může někdo navrhnout, jak by například vypadal soubor služeb, který to dělá?

52
jstarek

Vyzkoušeli jste acpipowerbutton z této sady příkazů?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

Upravit po přečtení komentářů:

Chcete-li, aby byl půvabný, můžete použít acpid nebo jiné nástroje acpi. Můžete také poskytnout více informací o tom, jak v tuto chvíli stroj vypnete?

Prostý shutdown by nečekal na nedokončené úlohy, časové zpoždění může být příliš dlouhé.

Předpokládám, že nepoužíváte správce oken, takže zkuste tento nástroj.

Právě viděno tento démon . Možná to bude užitečné.

34
Mavromatis Lozay

Místo toho, abyste to sami sami kódovali, zvažte použití Vagrant , který je vytvořen k instanci a řízení instancí virtuálních boxů. Dokumentace je vynikající a navrhuji, abyste si ji prohlédli, místo aby se pokusili o vlastní.

Dlouhé a krátké je, že vytvoříte jednoduchý kontrolní soubor a poté spustíte vagrant up pro spuštění libovolného počtu instancí VirtualBoxu. Můžeš použít vagrant ssh pro přihlášení do hostitelů a vagrant halt pro vypnutí hostitele (bez ukončení). vagrant destroy se instance zbaví.

Podporuje zajišťování s loutkami, Ansible nebo Chef a umožňuje vám ovládat většinu exponovaných nastavení konfigurace VBoxu.

16
Aaron Brown

Mám podobnou aplikaci jako vy, s jedním rozdílem: musím restartovat systém a zotavit se ze snímku.

Zajímá vás bezhlavý režim .

Mám několik takových služeb, takže používám následující skript:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

jak mohu elegantně vypnout VM?

POKUD chcete vypnout VM elegantně, máte dvě možnosti, v závislosti na vaší aplikaci:

  • Napodobujte „vypínací tlačítko“ nebo „spací tlačítko“ a připravte VM), aby na něj reagoval (ladně uzavřít )
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Uložit VM stav, aby se později obnovil
    • VBoxManage controlvm <uuid>|<VMname> savestate

TIPY: Možná se vám bude hodit:

  • VBoxManage list vms - seznam dostupných vms
  • rdesktop IP-ADDR:3389 nebo rdesktop-vrdp IP-ADDR:3389 - když chcete GUI (i vzdáleně ), když běžíte v bezhlavém režimu: VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - začít s GUI pro lokální ladění

Související kapitola manuálu VirtualBox: Kapitola 7. Vzdálené virtuální počítače - Krok za krokem: vytváření virtuálního počítače na bezhlavém server

P.S. Pokud vás zajímají plně funkční, již implementovaná řešení, vypadá OpenStack zajímavou volbou.

10

Při pohledu na VirtualBox VM dokumentace pro správu na http://www.virtualbox.org/manual/ch08.html

Pro výpis virtuálních počítačů použijte příkaz VBoxManage list vms

Pro spuštění VM použijte příkaz VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

Pro ovládání VM použijte VBoxManage controlvm

Dílčí příkaz controlvm umožňuje změnit stav aktuálně spuštěného virtuálního počítače. Lze uvést:

VBoxManage controlvm <vm> pause dočasně pozastaví virtuální počítač, aniž by se jeho stav změnil navždy. Okno VM bude nakresleno šedě, což znamená, že VM je aktuálně pozastaveno. (To odpovídá vybrání položky „Pozastavit“ v položce „Stroj“). "nabídka GUI.)

Použijte VBoxManage controlvm <vm> resume pro zrušení předchozího příkazu pauzy. (To odpovídá vybrání položky „Pokračovat“ v nabídce „Stroj“ v uživatelském rozhraní.)

VBoxManage controlvm <vm> reset má na virtuální stroj stejný účinek jako stisknutí tlačítka „Reset“ na skutečném počítači: studený restart virtuálního počítače, který restartuje a okamžitě zavede hostovaný operační systém. Stav VM není předem uložen a data mohou být ztracena. (Toto je ekvivalentní výběru položky „Reset“ v nabídce „Machine“ v GUI.)

VBoxManage controlvm <vm> poweroff má na virtuální stroj stejný účinek jako tahání napájecího kabelu ve skutečném počítači. Opět platí, že stav VM není předem uložen a data mohou být ztracena. (Toto je ekvivalentní výběru položky „Zavřít“ v nabídce „Stroj“ v GUI nebo stisknutí tlačítka tlačítko zavřít okno a poté v dialogu vybrat možnost „Vypnout zařízení“.)

Poté bude stav VM vypnut.

10
Nikhil Mulley

V případě systému založeného na systému byste to mohli vyzkoušet.

Krok č. 1: vytvořte soubor služeb

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

Krok č. 2: Povolení souboru služeb

$ Sudo systemctl enable [email protected]_name.service

Reference

5
Jan Rüegg

Co takhle poslat příkaz přes ssh z hostitele hostovi?

Nejsem si jistý, jestli to funguje a jestli si můžete zkontrolovat stav stroje poté, nebo získat něco jako výstupní stav, ale mělo by to přinejmenším vyčistit.

3
Baarn

Spuštění vm:

VBoxManage startvm VMNAME --type headless

Zastavení vm:

VBoxManage controlvm VMNAME savestate

Seznam všech běžících VM:

VBoxManage list runningvms
1
VVB

Moje řešení: V tomto shellu je 'root' invoker a 'theuser' je vlastníkem 'thevm'

Vím, že vms skončily, když výstup příkazu VBoxManage list runningvms vrací prázdný řetězec.

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash theuser`" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...
1
Jorge Sanchez

Proč se nepřihlásíte ke svému hostovi a neodpojíte se odtud?

Pokud nemáte dobrý důvod, proč neinstalovat sshd a přistupovat k VM opravdu prostřednictvím VBoxu), půjdu pro skript, který vydá ssh shutdown -h now. Abych byl upřímný, vytvořil jsem skript pro každý počítač, který ho správně vypne a provedu na něm nějaké kontroly.

Stačí zabalit skript /etc/init.d/shutdown_vm, který volá druhý z hostitele, hovor bude blokován, dokud nebude připraven. Tento proces (jak je popsáno) přidá na hosta linuxovou závislost, ale odstraní závislost VBox na hostiteli.

Řezání do chase: nemusíte přistupovat k VBoxu, abyste stroj odstavili, pokud máte nějaké prostředky pro přístup k němu (tj. Ssh), pak OS bude mít pro to vždy nějaké prostředky (jeho zapnutí je samozřejmě jiné)

0
estani

Možná to pomůže v rámci řešení.

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done
0
user58380