sonyandi
Anmeldungsdatum: 20. August 2019
Beiträge: Zähle...
|
Hallo, mit einem einfachen Initscript möchte ich gerne eine virtuelle Maschine (Win10) in VirtualBox beim hochfahren des Hosts starten und beim runterfahren des Hosts, dies per acpi sauber herunterfahren. Das folgende Script habe ich unter /etc/init.d/ abgelegt und mit sudo update-rc.d vboxpower defaults aktiviert. Das Script funktioniert auch wenn ich es manuell mit den parametern start und stop aufrufe. Auch das automatische hochfahren der VM beim Starten des Hosts funktioniert. Allerdings wird das runterfahren beim shutdown des Hosts nicht durchgeführt. Hier bekomme ich im Log die Fehlermeldung:
VBoxManage: error: Machine 'Win10ToGo' is not currently running
Die Maschine läuft aber! Hat jemand Rat? Scheint als ob die Reihenfolge nicht stimmt, oder ? Was mir auch nicht klar ist, ist ob beim runterfahren des Hosts der init, solange wartet, bis die VM heruntergefahren ist, oder nicht. Müßte ich dann ggf. ein Sleep nach dem acpipowerbutton-Befehl einfügen, damit die stop-Funktion genügend Zeit hat die VM runterzufahren ? Hier nun mein Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 |
#!/bin/bash
### BEGIN INIT INFO
# Provides: vboxpower
# Required-Start: vboxdrv
# Required-Stop: vboxdrv
# Default-Start: 5
# Default-Stop: 0 1 2 3 4 6
# Short-Description: VirtualBox Poweroff
# Description: Vor dem Shutdown die virtuelle Maschine sauber runterfahren
### END INIT INFO
PATH=$PATH:/bin:/sbin:/usr/sbin
logdatei="/home/andi/VirtualBox/vboxpower.log"
stop(){
su -c "/usr/lib/virtualbox/VBoxManage controlvm Win10ToGo acpipowerbutton" -s /bin/bash andi >> $logdatei 2>&1
}
start(){
su -c "/usr/lib/virtualbox/VBoxManage startvm Win10ToGo --type headless" -s /bin/bash andi >> $logdatei 2>&1
}
case "$1" in
start)
if [ "`su -c '/usr/lib/virtualbox/VBoxManage list runningvms' -s /bin/bash andi`" = "" ] ; then
start
else
date "+%x %X Virtuelle Maschine ist bereits gestartet, Startabbruch!" >> $logdatei
fi
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
exit 0
|
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Welches System läuft auf dem Host? Ubuntu (und die meisten anderen Systeme) nutzen mittlerweile systemd, welches über systemd/units, bzw. in deinem Fall eher systemd/User Units gesteuert wird. Das alte Archiv/Upstart und das noch ältere Archiv/SysVinit kommen nicht mehr zum Einsatz. Daher würde ich vorschlagen den Dienst mittels systemd zu konfigurieren.
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
Hallo ChickenLipsRfun2eat, danke für Deinen Hinweis. Habe mich in systemd jetzt ein wenig eingelesen https://schroeffu.ch/2017/05/einfache-systemd-start-stopscripts-am-beispiel-teamspeak-3/ und würde jetzte eine Unit unter /etc/systemd/system wie folgt anlegen, die das vorhandene Script mit den entsprechenden Parametern aufrufen würde. 1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
[Unit]
Description=VirtualBox Power Control
Wants=vboxautostart-service.service
[Service]
User=andi
Type=forking
ExecStart=/etc/init.d/vboxpower start
ExecStop=/etc/init.d/vboxpower stop
PIDFile=/home/andi/VirtualBox/vboxpower.pid
[Install]
WantedBy=multi-user.target
|
Ich stelle mir nur die Frage, ob es sich anders beim runterfahren verhält. Es ist ja das gleiche Script nur dass es eben jetzt von systemd aufgerufen wird. Oder muss ich das ganze anders aufbauen? Stimmt die Unit überhaupt? Wie verhält sich systemd bei dieser Frage: Was mir auch nicht klar ist, ist ob beim runterfahren des Hosts der init, solange wartet, bis die VM heruntergefahren ist, oder nicht. Müßte ich dann ggf. ein Sleep nach dem acpipowerbutton-Befehl einfügen, damit die stop-Funktion genügend Zeit hat die VM runterzufahren ?
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
sonyandi schrieb: Oder muss ich das ganze anders aufbauen? Stimmt die Unit überhaupt?
Ja. Nein. Das Script in /etc/init.d ist überflüssig. Trag den Start- und Stopbefehl OHNE "su -c" direkt in in Service-Unit ein... und zwar so, als würdes Du das manuell mit vollen Pfandangaben in einer root-Shell (also wieder ohne su und sudo) durchführen. Äh... nachtrag.... und natürlich auch ohne ">> $logdatei 2>&1". systemd loggt automatisch in journald.
"
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
Also sieht das ganze dann so aus? 1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
[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
|
Und wartet systemd auch bis die virtuelle Maschine sauber runtergefahren ist?
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
Nach dem reboot und einer Statusabfrage, scheint das ganze nicht zu funktionieren, Maschine läuft nicht: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
andi@server1:~$ systemctl status vboxpowerctl.service
● vboxpowerctl.service - VirtualBox Power Control
Loaded: loaded (/etc/systemd/system/vboxpowerctl.service; enabled; vendor preset: enabled)
Active: failed (Result: timeout) since Thu 2019-08-22 00:07:25 CEST; 9min ago
Process: 803 ExecStart=/usr/lib/virtualbox/VBoxManage startvm Win10ToGo --type headless (code=exited, status=0/SUCCESS)
Aug 22 00:05:53 server1 systemd[1]: Starting VirtualBox Power Control...
Aug 22 00:05:54 server1 pulseaudio[1139]: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Aug 22 00:05:54 server1 pulseaudio[1139]: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Aug 22 00:05:54 server1 pulseaudio[1139]: [pulseaudio] backend-ofono.c: Failed to register as a handsfree audio agent with ofono: org.freedesktop.DBus.Error.ServiceUnknown: The name org.ofono was not provided by any .service files
Aug 22 00:05:54 server1 systemd[1]: vboxpowerctl.service: Can't open PID file /home/andi/VirtualBox/vboxpower.pid (yet?) after start: No such file or directory
Aug 22 00:07:23 server1 systemd[1]: vboxpowerctl.service: Start operation timed out. Terminating.
Aug 22 00:07:23 server1 pulseaudio[1139]: [pulseaudio] module.c: After module unload, module 'module-null-sink' was still loaded!
Aug 22 00:07:25 server1 systemd[1]: vboxpowerctl.service: Failed with result 'timeout'.
Aug 22 00:07:25 server1 systemd[1]: Failed to start VirtualBox Power Control.
|
Weiß jemand was hier das Problem ist?
|
Kleiner_Kobold_2
Anmeldungsdatum: 18. Januar 2019
Beiträge: 177
|
Mach systemctl poweroff im Terminal
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
Ich starte meine FTP-VM mit dieser Unit:
[Unit]
Description=thlu:start-ftpsrv-vm.service Start FTP-Server (Virtualbox)
Requires=systemd-modules-load.service
After=systemd-modules-load.service
[Service]
Type=idle
User=thomas
Group=thomas
ExecStart=/usr/bin/vboxheadless --startvm "FTPS" --vrde off
[Install]
WantedBy=multi-user.target --vrde off = Ohne RDT-Service
Runtergefahren wird sie allerdings manuell innerhalb der gestarteten VM mit systemctl poweroff.
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
@kleinerkobold Was soll das bringen, den Rechner auszuschalten?
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
@TomLu
Wie sieht’s mit dem automatischen runterfahren aus? Hast du dafür auch eine funktionierende Unit? Der Hintergrund ist, das die Vm automatisch mit runtergefahren werden soll, wenn de Host runterfährt. Ein manuelles runterfahren in der Vm kommt nicht in Frage.
|
Berlin_1946
Supporter, Wikiteam
Anmeldungsdatum: 18. September 2009
Beiträge: 8704
|
sonyandi schrieb: @kleinerkobold Was soll das bringen, den Rechner auszuschalten?
Sry, das verstehe ich anders, nicht den Rechner ausschalten, sondern
Runtergefahren wird sie allerdings manuell innerhalb der gestarteten VM mit systemctl poweroff
siehe das Unterstrichene
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
Ja, hab ich erst falsch verstanden, aber genau das will ich ja nicht
|
Thomas_Do
Moderator
Anmeldungsdatum: 24. November 2009
Beiträge: 8530
|
Du könntest über die systemd-Unit oder einen Cron-Job beim Herunterfahren ein "vboxmanage controlvm"-Kommando auslösen. Z.B. "vboxmanage controlvm <vm> savestate" oder "vboxmanage controlvm <vm> acpipowerbutton".
|
sonyandi
(Themenstarter)
Anmeldungsdatum: 20. August 2019
Beiträge: 15
|
Ja, das versuche ich ja ( siehe oben) allerdings klappts nicht. Was meinst du mit cronjob? Das wäre zeitgestesteueuert, was auch nicht in Frage kommt, oder gibts einen Befehl der beim shutdown ausgeführt wird?
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
sonyandi schrieb: @TomLu
Wie sieht’s mit dem automatischen runterfahren aus? Hast du dafür auch eine funktionierende Unit?
Ich würde das über ein entsprechendes ExecStop-Statement in der von mit geposteten Unit lösen, indem ich dort einfach eine kurze Schlüsselwort-Nachricht via TCP-Stack:Port an die VM senden würde. In der VM lauscht ein kleines Bash-Script als Daemon auf dem definierten Port und führt dann via "systemctl poweroff" einen lokalen Shutdown in der VM durch. Das funktioniert auf jeden Fall.
|