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