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 die VM beim Booten des Hosts gestartet wird ( Bearbeiten: Dies geschieht, wie Nikhil weiter unten erwähnt, ü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 wurde.
Kann jemand vorschlagen, wie zum Beispiel eine Servicedatei aussehen müsste, die dies tut?
quelle
Antworten:
Haben Sie es mit
acpipowerbutton
diesem Befehlssatz versucht ?Bearbeiten Sie nach dem Lesen der Kommentare:
Sie können
acpid
oder andere acpi-Dienstprogramme verwenden, um es anmutig zu machen. Können Sie auch weitere Informationen darüber bereitstellen, wie Sie die Maschine im Moment herunterfahren?Plain
shutdown
würde nicht auf unfertige Jobs warten, eine Zeitverzögerung könnte zu lang sein.Ich gehe davon aus, dass Sie keinen Fenstermanager verwenden. Probieren Sie dieses Tool aus.
Habe gerade diesen Daemon gesehen . Vielleicht finden Sie es nützlich.
quelle
vboxmanage list runningvms
bis deine VM weg ist.Ziehen Sie die Verwendung von Vagrant in Betracht , um Virtualbox-Instanzen zu instanziieren und zu steuern, anstatt dies selbst zu codieren. Die Dokumentation ist ausgezeichnet und ich schlage vor, dass Sie es überprüfen, anstatt zu versuchen, Ihr eigenes zu rollen.
Das Entscheidende dabei ist, dass Sie eine einfache Steuerdatei erstellen und dann ausführen
vagrant up
, um so viele VirtualBox-Instanzen zu starten, wie Sie möchten. Sie können verwenden,vagrant ssh
um sich bei den Hosts anzumelden undvagrant halt
den Host herunterzufahren (ohne zu beenden).vagrant destroy
wird die Instanzen loswerden.Es unterstützt die Bereitstellung mit Puppet, Ansible oder Chef und ermöglicht es Ihnen, die meisten der freigelegten VBox-Konfigurationseinstellungen zu steuern.
quelle
Ich habe eine ähnliche Anwendung wie Sie, mit dem Unterschied, dass ich das System neu starten und einen Snapshot wiederherstellen muss.
Was Sie interessiert, ist der Headless-Modus .
Ich habe einige solcher Dienste und verwende daher folgendes Skript:
VBox_StopRestoreStart.sh
Wenn Sie die VM ordnungsgemäß deaktivieren möchten, haben Sie je nach Anwendung zwei Möglichkeiten:
VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
VBoxManage controlvm <uuid>|<VMname> savestate
TIPPS: Sie könnten nützlich finden:
VBoxManage list vms
- Liste der verfügbaren VMSrdesktop IP-ADDR:3389
oderrdesktop-vrdp IP-ADDR:3389
- wenn Sie eine grafische Benutzeroberfläche wünschen (auch aus der Ferne ), wenn Sie im Headless-Modus arbeiten:VBoxHeadless -s <uuid>|<VMname>
VBoxManage startvm
- Beginnen Sie mit der grafischen Benutzeroberfläche für das lokale DebuggenZugehöriges VirtualBox-Handbuch Kapitel: Kapitel 7. Virtuelle Remote-Maschinen - Schritt für Schritt: Erstellen einer virtuellen Maschine auf einem Headless-Server
PS Wenn Sie an bereits implementierten Lösungen mit vollem Funktionsumfang interessiert sind, scheint OpenStack eine interessante Wahl zu sein.
quelle
Informationen zur VirtualBox VM-Verwaltung finden Sie unter http://www.virtualbox.org/manual/ch08.html
Verwenden Sie den Befehl, um die VMs aufzulisten
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
controlvm
Unterbefehl können Sie den Status einer virtuellen Maschine ändern, die gerade ausgeführt wird. Folgendes kann angegeben werden:VBoxManage controlvm <vm> pause
Setzt eine virtuelle Maschine vorübergehend in die Warteschleife, ohne ihren Status endgültig zu ändern. Das VM-Fenster wird grau dargestellt, um anzuzeigen, dass die VM derzeit angehalten ist. (Dies entspricht der Auswahl des Elements "Pause" im Menü "Maschine" der GUI.)Verwenden Sie
VBoxManage controlvm <vm> resume
diese Taste, 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 die gleiche Auswirkung wie auf einem realen Computer auf die Schaltfläche "Zurücksetzen": Ein Kaltstart der virtuellen Maschine, der das Gastbetriebssystem sofort neu startet und erneut startet. Der Status der VM wird nicht vorab gespeichert, und es können Daten verloren gehen. (Dies entspricht der Auswahl des Elements "Zurücksetzen" im Menü "Maschine" der GUI.)VBoxManage controlvm <vm> poweroff
hat dieselbe Auswirkung auf eine virtuelle Maschine wie das Ziehen des Stromkabels an einem realen Computer. Auch hier wird der Status der VM nicht im Voraus gespeichert und es können Daten verloren gehen. (Dies entspricht der Auswahl des Elements "Schließen" im Menü "Maschine" der grafischen Benutzeroberfläche oder dem Drücken der Schaltfläche zum Schließen des Fensters und der Auswahl von "Maschine ausschalten" im Dialogfeld.)Danach lautet der VM-Status "Ausgeschaltet".
quelle
vboxmanage
Fall ist (alles in Kleinbuchstaben).VBoxManage controlvm
Unterbefehle macht das./etc/init.d/vboxvms-service
Skript auf dem Hostsystem schreiben , das beim Start alle VMs einschaltet und beim Stoppen alle VMs ausschaltet.VBoxManage controlvm savestate
ist eine andere Möglichkeit (zumindest Google sagt es mir), es speichert den Status des Rechners und fährt ihn sauber herunter, aber es gibt immer noch keine Möglichkeit, den Host zum Warten zu zwingen.Bei einem systembasierten System können Sie dies versuchen.
Schritt 1: Erstellen Sie eine Servicedatei
Schritt 2: Aktivieren Sie die Servicedatei
Verweise
quelle
VBoxHeadless -s %i
demVBoxManage controlvm %i savestate
die VM gestartet und gestoppt wird.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 bleiben.
quelle
Meine Lösung: In diesem Shellscript ist 'root' der Aufrufer und 'theuser' der Eigentümer von 'thevm'.
Ich weiß, dass die vms beendet wurden, wenn die Ausgabe des Befehls
VBoxManage list runningvms
eine leere Zeichenfolge zurückgibt.quelle
Vm starten:
Um vm zu stoppen:
Alle laufenden VMs auflisten:
quelle
Vielleicht hilft dies als Teil der Lösung.
quelle
Warum melden Sie sich nicht bei Ihrem Gast an und fahren von dort aus herunter?
Sofern Sie keinen triftigen Grund haben, sshd nicht zu installieren und wirklich über VBox auf die VM zuzugreifen, würde ich ein Skript verwenden, das nur eine ausführt
ssh shutdown -h now
. Um ehrlich zu sein, würde ich für jede Maschine ein Skript erstellen, das sie ordnungsgemäß herunterfährt und dabei einige Überprüfungen durchführt.Packen Sie einfach ein /etc/init.d/shutdown_vm-Skript, das das andere Skript 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 eine Maschine herunterzufahren. Wenn Sie über eine Möglichkeit verfügen, darauf zuzugreifen (z. B. ssh), hat das Betriebssystem immer eine Möglichkeit, dies zu tun (das Einschalten ist natürlich anders).
quelle