ubuntuusers.de

Init Script beendet VirtualBox nicht

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

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 Team-Icon

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

Avatar von 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 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10420

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 Team-Icon

Moderator
Avatar von Thomas_Do

Anmeldungsdatum:
24. November 2009

Beiträge: 8808

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.

Antworten |