it-swarm.com.de

Wie kann ich VirtualBox-Maschinen automatisch starten und herunterfahren?

Ich muss ein Softwaresystem ausführen, das als Appliance auf einem dedizierten Computer installiert werden soll. Um Energie zu sparen, plane ich, das System stattdessen auf einer VirtualBox VM) auszuführen.

Der Host ist eine Standard-Linux-Box mit einem SysV-Init-System, der Gast ist ein stark modifiziertes Linux und ich würde es vorziehen, es nicht weiter ändern zu müssen. VirtualBox wird in der OSE-Version verwendet.

Ich habe bereits herausgefunden, wie man die VM, wenn der Host startet (Edit :) dies geschieht, wie Nikhil unten erwähnte, über den Befehl VBoxManager startvm), aber wie kann ich die VM ordnungsgemäß herunterfahren? Jedes Skript, das auf dem Host ausgeführt wird, muss warten, bis der Gast vollständig heruntergefahren ist.

Kann jemand vorschlagen, wie beispielsweise eine Servicedatei aussehen müsste, die dies tut?

52
jstarek

Haben Sie acpipowerbutton über diesen Befehlssatz ausprobiert?

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

Nach dem Lesen der Kommentare bearbeiten:

Sie können acpid oder andere acpi-Dienstprogramme verwenden, um es elegant zu gestalten. Können Sie auch weitere Informationen darüber bereitstellen, wie Sie die Maschine im Moment herunterfahren?

Plain shutdown würde nicht auf unvollendete Jobs warten, eine Zeitverzögerung kann zu lang sein.

Ich gehe davon aus, dass Sie keinen Fenstermanager verwenden. Versuchen Sie also this tool.

Gerade gesehen dieser Daemon . Vielleicht finden Sie es nützlich.

34

Anstatt dies selbst zu codieren, sollten Sie Vagrant verwenden, das zum Instanziieren und Steuern von Virtualbox-Instanzen entwickelt wurde. Die Dokumentation ist ausgezeichnet und ich schlage vor, dass Sie sie überprüfen, anstatt zu versuchen, Ihre eigene zu rollen.

Das lange und kurze daran ist, dass Sie eine einfache Steuerdatei erstellen und dann vagrant up Ausführen, um so viele VirtualBox-Instanzen zu starten, wie Sie möchten. Sie können vagrant ssh Verwenden, um sich bei den Hosts anzumelden, und vagrant halt, Um den Host herunterzufahren (ohne zu beenden). vagrant destroy Entfernt die Instanzen.

Es unterstützt die Bereitstellung mit Puppet, Ansible oder Chef und ermöglicht Ihnen die Steuerung der meisten exponierten VBox-Konfigurationseinstellungen.

16
Aaron Brown

Ich habe eine ähnliche Anwendung wie Sie, mit einem Unterschied: Ich muss das System neu starten und mich vom Snapshot erholen.

Was Sie interessiert, ist Headless-Modus .

Ich habe einige solcher Dienste, daher verwende ich das folgende 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

wie kann ich die VM ordnungsgemäß herunterfahren?

WENN Sie VM ordnungsgemäß deaktivieren möchten), haben Sie je nach Anwendung zwei Optionen:

  • Emulieren Sie "Shutdown Button" oder "Sleep Button" und bereiten Sie VM vor, um darauf zu reagieren (um ordnungsgemäß zu schließen) )
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Speichern VM Status, um danach wiederherzustellen
    • VBoxManage controlvm <uuid>|<VMname> savestate

TIPPS: Vielleicht finden Sie Folgendes nützlich:

  • VBoxManage list vms - Liste der verfügbaren vms
  • rdesktop IP-ADDR:3389 oder rdesktop-vrdp IP-ADDR:3389 - wenn Sie eine GUI (auch remote ) möchten, wenn Sie im kopflosen Modus ausgeführt werden: VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - Beginnen Sie mit der GUI für das lokale Debuggen

Verwandte Kapitel des VirtualBox-Handbuchs: Kapitel 7. Virtuelle Remote-Maschinen - Schritt für Schritt: Erstellen einer virtuellen Maschine auf einem Headless-Server

P.S. Wenn Sie an bereits implementierten Lösungen mit vollem Funktionsumfang interessiert sind, scheint OpenStack eine interessante Wahl zu sein.

10

Betrachten von VirtualBox VM Verwaltungsdokumentation unter http://www.virtualbox.org/manual/ch08.html

Verwenden Sie zum Auflisten der VMs den Befehl VBoxManage list vms

Verwenden Sie zum Starten der VM den Befehl VBoxManage startvm

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

Verwenden Sie zur Steuerung der VM VBoxManage controlvm

Mit dem Unterbefehl controlvm können Sie den Status einer virtuellen Maschine ändern, die gerade ausgeführt wird. Folgendes kann angegeben werden:

VBoxManage controlvm <vm> pause hält eine virtuelle Maschine vorübergehend in der Warteschleife, ohne ihren Status endgültig zu ändern. Das Fenster VM wird grau dargestellt, um anzuzeigen, dass das VM derzeit angehalten ist.) Dies entspricht der Auswahl des Elements "Pause" auf dem Computer "Menü der GUI.)

Verwenden VBoxManage controlvm <vm> resume, um einen vorherigen Pausenbefehl rückgängig zu machen. (Dies entspricht der Auswahl des Elements "Fortsetzen" im Menü "Maschine" der GUI.)

VBoxManage controlvm <vm> reset hat auf einer virtuellen Maschine den gleichen Effekt wie das Drücken der Schaltfläche "Zurücksetzen" auf einem realen Computer: ein Kaltstart der virtuellen Maschine, der das Gastbetriebssystem sofort neu startet und neu startet. Der Status von VM wird nicht im Voraus gespeichert, und Daten können verloren gehen. (Dies entspricht der Auswahl des Elements "Zurücksetzen" im Menü "Maschine" der GUI.)

VBoxManage controlvm <vm> poweroff hat auf einer virtuellen Maschine den gleichen Effekt wie das Ziehen des Stromkabels auf einem realen Computer. Auch hier wird der Status von VM nicht im Voraus gespeichert, und es können Daten verloren gehen.) Dies entspricht der Auswahl des Elements "Schließen" im Menü "Maschine" der GUI oder dem Drücken von Klicken Sie auf die Schaltfläche zum Schließen des Fensters und wählen Sie dann im Dialogfeld "Maschine ausschalten".)

Danach wird der Status der VM "Ausschalten".

10
Nikhil Mulley

Bei einem systemd-basierten System können Sie dies versuchen.

Schritt 1: Erstellen Sie eine Servicedatei

[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

Schritt 2: Aktivieren Sie die Servicedatei

$ Sudo systemctl enable [email protected]_name.service

Verweise

5
Jan Rüegg

Wie wäre es, den Befehl per ssh vom Host an den Gast zu senden?

Ich bin mir nicht sicher, ob es funktioniert und ob Sie den Status der Maschine danach überprüfen oder so etwas wie einen Exit-Status erhalten können, aber es sollte mindestens sauber sein.

3
Baarn

So starten Sie vm:

VBoxManage startvm VMNAME --type headless

So stoppen Sie vm:

VBoxManage controlvm VMNAME savestate

Listen Sie alle laufenden VMs auf:

VBoxManage list runningvms
1
VVB

Meine Lösung: In diesem Shellscript ist 'root' der Aufrufer und 'theuser' der Besitzer von 'thevm'.

Ich weiß, dass die vms beendet wurden, als die Ausgabe des Befehls VBoxManage list runningvms gibt eine leere Zeichenfolge zurück.

...
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

Warum melden Sie sich nicht bei Ihrem Gast an und fahren von dort aus herunter?

Wenn Sie keinen guten Grund haben, sshd nicht zu installieren und auf die VM wirklich über VBox zuzugreifen), würde ich mich für ein Skript entscheiden, das nur ein ssh shutdown -h now. Um ehrlich zu sein, würde ich für jeden Computer ein Skript erstellen, das ihn ordnungsgemäß herunterfährt und dabei einige Überprüfungen durchführt.

Packen Sie einfach ein /etc/init.d/shutdown_vm-Skript, das das andere vom Host aufruft. Der Aufruf wird blockiert, bis er fertig ist. Dieser Prozess (wie beschrieben) fügt dem Gast eine Linux-Abhängigkeit hinzu, entfernt jedoch die VBox-Abhängigkeit auf dem Host.

Auf den Punkt gebracht: Sie müssen nicht auf VBox zugreifen, um einen Computer herunterzufahren. Wenn Sie über Zugriffsmöglichkeiten verfügen (d. H. SSH), verfügt das Betriebssystem immer über einige Mittel dafür (das Einschalten ist natürlich anders).

0
estani

Vielleicht hilft dies als Teil der Lösung.

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