Systemd a Qemu i łagodne zamykanie OS na gościu

38 views
Skip to first unread message

bojleros

unread,
Sep 3, 2013, 3:22:26 PM9/3/13
to archl...@googlegroups.com
Witam.

Nie wiem do końca czy to jest odpowiednie miejsce dlatego w razie konieczności proszę o odpowiednią moderację.



Od dwóch dni walczę z systemd. Mam sobie qemu a na nim system gościa. Ten system wypada wyłączać w cywilizowany sposób a nie poprzez ubijanie procesu qemu. W przeciwnym razie skutki dla fs na gościu mogą być opłakane.

Aby to uczynić stosuję metodę 'net rpc ....' lub wysyłam polecenie zamknięcia via acpi konsolą zarządzania qemu. Obydwie metody działają poprawnie i stabilnie w momencie wywoływania z konsoli.

Problem jest dwojaki:


1. Nie potrafię zmusić systemd aby oczekiwał na zamknięcie się procesu qemu w sposób łagodny nawet przy wywołaniu systemctl stop z konsoli. Oto plik serwisu:

[Unit]
Description=QEMU virtual machine %i
After=network.target
Before=shutdown.target reboot.target poweroff.target halt.target

[Service]
Type=forking
KillMode=none
SendSIGKILL=yes
#Environment="type=system-x86-
64" "haltcmd=kill -INT $MAINPID"

PIDFile=/run/qemu/%i.pid
EnvironmentFile=/etc/conf.d/qemu.d/%i
ExecStart=/usr/bin/qemu-system-x86_64 -name %i -daemonize -pidfile /run/qemu/%i.pid -nographic $options
ExecStop=/bin/sh -c ${haltcmd}


TimeoutStartSec=10
TimeoutStopSec=120



[Install]
WantedBy=multi-user.target

haltcmd="/usr/bin/echo 'system_powerdown' | /usr/bin/nc localhost $port"



2. Wykonałem zatem obejście. Stworzyłem sobie skrypt 'qemu' który startuje daemona qemu a gdy się mu nakaże to go wyłącza w cywilizowany sposób. Skrypt wyłączając daemona pozostaje aktywny aż do czasu zniknięcia procesu lub timeouta. Oto plik serwisu:


[Unit]
Description=QEMU virtual machine %i
After=network.target
Before=shutdown.target reboot.target poweroff.target halt.target

[Service]
#Type=oneshot
ExecStart=/etc/rc.d/qemu start %i
ExecStop=/etc/rc.d/qemu stop %i
RemainAfterExit=true
KillMode=none

#TimeoutStartSec=10sec
TimeoutSec="80sec"



[Install]
WantedBy=multi-user.target



To nieczyste obejście problemu zdaje się działać w trzech przypadkach:
-start systemu
-start z linii poleceń z systemctl
-stop z linii poleceń z systemctl

W moemencie wywołania poweroff/reboot występują dwa problemy:

a) systemd zdaje się ignorować opcję TimeoutSec="80sec" i czeka jedynie 10 sekund co jest stanowczo za mało
b) bardziej uciążliwy - systemd najpierw ubija interfejsy sieciowe a potem qemu przez co sygnał o zamknięciu nie dociera do gościa!

W normalnym systemie z rc.d zachowanie sekwencji startowej i powerdown było poprawne i problem nie występował ... Swoją drogą takie rzeczy rozwiązywało się w 10 minut edytując miłe skrypty startowe a w systemd staje się z tego nie wiadomo jaki problem :/


Czy może ktoś jest w stanie naprowadzić na rozwiązanie problemów opisanych powyżej ?? Może mam błędne założenia co do sposobu wyłączania gościa a może powinienem zastosować libvirt ?

Jeżeli jest tu jakaś tęższa głowa to uprzejmie i pokornie proszę o jakiekolwiek wsparcie. Proszę tylko nie kierować mnie do manuali bo tu raczej idzie o praktykę z systemd.

PS. W razie konieczności uzupełnię zawartość zmiennych.

Z poważaniem
Bartek


Krzysztof Warzecha

unread,
Sep 11, 2013, 1:36:15 PM9/11/13
to archl...@googlegroups.com
Hej,

W dniu 3 września 2013 21:22 użytkownik bojleros <bojl...@gmail.com> napisał:
> Od dwóch dni walczę z systemd. Mam sobie qemu a na nim system gościa. Ten
> system wypada wyłączać w cywilizowany sposób a nie poprzez ubijanie procesu
> qemu. W przeciwnym razie skutki dla fs na gościu mogą być opłakane.

Nie wiem czy to zadziała w twoim wypadku, ale możesz opóźnić /
zablokować wyłączanie systemu przez systemd z systemd-inhibit:

http://www.freedesktop.org/software/systemd/man/systemd-inhibit.html
http://www.freedesktop.org/wiki/Software/systemd/inhibit/

Coś w stylu `systemd-inhibit --type=delay qemu ...` powinno pomóc.

> 1. Nie potrafię zmusić systemd aby oczekiwał na zamknięcie się procesu qemu
> w sposób łagodny nawet przy wywołaniu systemctl stop z konsoli. Oto plik
> serwisu:

hm. Możesz też zablokować zamykanie systemu przy użyciu hooka dla systemd:

man systemd-shutdown:

Immediately before executing the actual system
halt/poweroff/reboot/kexec systemd-shutdown will run all executables
in /usr/lib/systemd/system-shutdown/ and pass one arguments to them:
either "halt", "poweroff", "reboot" or "kexec", depending on the
chosen action. All executables in this directory are executed in
parallel, and execution of the action is not continued before all
executables finished.

--
Krzysztof Warzecha
Reply all
Reply to author
Forward
0 new messages