ubuntuusers.de

Init Script beendet VirtualBox nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Thomas_Do Team-Icon

Moderator
Avatar von Thomas_Do

Anmeldungsdatum:
24. November 2009

Beiträge: 8808

sonyandi schrieb:

Was meinst du mit cronjob?

Sorry, war ein Fehler, das geht ja nur beim Start.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Ich werf mal kurz was rein ☺ Du brauchst eine Unit, welche before: shutdown.target ausgeführt wird, um die VM zu beenden.

TomLu

Anmeldungsdatum:
23. August 2014

Beiträge: 603

ChickenLipsRfun2eat schrieb:

Ich werf mal kurz was rein ☺ Du brauchst eine Unit, welche before: shutdown.target ausgeführt wird, um die VM zu beenden.

Nee, das funktioniert nicht, weil der Trigger fehlt.... es wird ja gar kein Shutdown angestoßen, sondern, wenn ich das richtig verstanden habe, i.ü.S. von außerhalb "der Strom abgeschaltet". Da kann eine solche Unit nicht funktionieren. Diese Unit reagiert auf einen bereits angestoßenen Shutdown, sie löst aber keinen aus. Man muss die VM selber benachrichtigen, damit sie einen Shutdown initiiert... dann würde auch diese Unit gestartet werden... was aber bei den gegebenen Umständen unnütz ist.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Die Unit muss im Host laufen. Wenn dieser runterfährt, soll er doch die VM beenden - oder habe ich das falsch verstanden? Im Client braucht gar nichts laufen.

TomLu

Anmeldungsdatum:
23. August 2014

Beiträge: 603

ChickenLipsRfun2eat schrieb:

Die Unit muss im Host laufen. Wenn dieser runterfährt, soll er doch die VM beenden - oder habe ich das falsch verstanden? Im Client braucht gar nichts laufen.

Ja, richtig... aber das entspricht dann dem von "außen Strom in der VM abschalten". Das funktioniert, nimmt aber keinerlei Rücksicht auf den Zustand der VM oder was die da gerade tut und liest und schreibt und strickt und kocht.....

Anscheinend geht das unter bestimmten Vorraussetzungen: https://hosting.de.inter.net/blog/technik/272-virtuelle-server-und-acpi-shutdown

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

TomLu schrieb:

Ja, richtig... aber das entspricht dann dem von "außen Strom in der VM abschalten". Das funktioniert, nimmt aber keinerlei Rücksicht auf den Zustand der VM oder was die da gerade tut und liest und schreibt und strickt und kocht.....

Dann wäre ein vboxmanage guestcontrol -exe "myShutDownScript" --wait wohl die bessere Exec-Zeile.

Habe das auch noch nie ausprobiert, deswegen blanke Theorie. Aber man kann so von extern ein Script in der VM starten. Der shutdown des hosts sollte nur ein ausreichendes Timeout für die Units haben, damit das Script auch durchläuft.

TomLu

Anmeldungsdatum:
23. August 2014

Beiträge: 603

ChickenLipsRfun2eat schrieb:

Aber man kann so von extern ein Script in der VM starten. Der shutdown des hosts sollte nur ein ausreichendes Timeout für die Units haben, damit das Script auch durchläuft.

Na ja, nicht direkt starten... aber die VM informieren, dass sie sich selber runterfahren soll... und das geht doch total easy. Probiers aus in 2 Terminals auf einer Linux-Maschine:

Quasi als Server:

nc -l -p 65000 &

Quasi als Client:

echo -e "hallo\n" | nc -w1 localhost 65000

Statt localhost geht das auch via IP an jeden Client im Lan. Und das funktioniert auch auf einem VM-Windows-client. Dafür bastelt man sich schnell ein kleines Mini-Powershell-Script, welches bei systemstart gestartet wird. Dafür gibts mehrere Beispiele im Web.

Der ganze Weg bei 2 Linux-Systemen wäre dann (bei Windows als 1 Teilnehmer entsprechend anpassen):

  • Host startet beim Booten eine Unit, die bei Shutdown anzieht und die Nachricht sendet.

  • VM startet beim Booten eine Unit, die einen kleinen Mini-Daemon (bash-Script) startet, welcher auf dem Port lauscht und bei ankommender richtiger Nachricht systemctl poweroff startet

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Man kann eine VM auch einfach schlafen legen anstatt einen Shutdown in der VM anzustoßen. Dann ist man sicher, dass man keinen Zustand verliert.

sonyandi

(Themenstarter)

Anmeldungsdatum:
20. August 2019

Beiträge: 15

Die Unit muss im Host laufen. Wenn dieser runterfährt, soll er doch die VM beenden - oder habe ich das falsch verstanden? Im Client braucht gar nichts laufen.

Völlig korrekt, so ist meine Wunschvorstellung.

Wenn ich in der Hostkonsole das eingebe

1
/usr/lib/virtualbox/VBoxManage controlvm Win10ToGo acpipowerbutton

dann fährt der virtuelle Windows-Gast auch sauber runter.

Dieser Befehl muss nur im Host bei einem shutdown bzw. reboot einfach ausgeführt werden undzwar soll dann der Ubuntu-Host solange warten, bis der Gast tatsächlich runtergefahren ist und erst bei erfolgreichem Abschluß dieses Befehls seinen shutdown fortführen.

Gibt es hierfür keine einfache Lösung? Evtl. ist ja meine Unit einfach fehlerhaft, oder es fehlt ein Parameter. Ist evtl. der Typ forking bzw. PIDFile das Problem?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=VirtualBox Power Control
Wants=vboxautostart-service.service

[Service]
User=andi
Type=forking
ExecStart=/usr/lib/virtualbox/VBoxManage startvm Win10ToGo --type headless
ExecStop=/usr/lib/virtualbox/VBoxManage controlvm Win10ToGo acpipowerbutton
PIDFile=/home/andi/VirtualBox/vboxpower.pid

[Install]
WantedBy=multi-user.target

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[Unit]
Description=VirtualBox Power Control
Wants=vboxautostart-service.service
Before=shutdown.target reboot.target halt.target #eingefügt

[Service]
User=andi
# Type=forking #auskommentiert.
ExecStart=/usr/lib/virtualbox/VBoxManage startvm Win10ToGo --type headless
ExecStop=/usr/lib/virtualbox/VBoxManage controlvm Win10ToGo acpipowerbutton
PIDFile=/home/andi/VirtualBox/vboxpower.pid
RemainAfterExit=true #eingefügt
KillMode=none #eingefügt
 
[Install]
WantedBy=multi-user.target

Versuch es mal damit. Das before hatte ich ja erwähnt, könnte auch alleine reichen. Ein KillMode=none untersagt theoretisch das "abschiessen" des Prozesses.

Wie rklm schon schrieb, könntest du dein acpipowerbutton gegen ein savestate tauschen.

Wieso hast du forking drin? Startet die Unit Dienste mehrfach? Theoretisch kann das raus, oder hatte das einen Grund?

/edit: Schon spät. Sinn in den mittleren Satz reinkorrigiert^^

sonyandi

(Themenstarter)

Anmeldungsdatum:
20. August 2019

Beiträge: 15

Hallo ChickenLipsRfun2eat,

danke für Deine Unit, ich habe noch Group=andi hinzugefügt sowie die Zeile mit PIDFile entfernt. Jetzt funktioniert das so wie es soll.

Beim hochfahren startet die VM automatisch und beim reboot wird die VM automatisch mit runtergefahren. Laut der Windows-Ereignisprotokolle ist es auch ein sauberer Shutdown.

Danke an alle die mitgewirkt haben.

Antworten |