Ahoj,
řeším tu takový problém, pravděpodobně týkající se systemd v Debianu 10. Jde o to, že se mi při vypínání/rebootu systému unmountuje partition (/var/lib/xen/save), na kterou se má uložit stav Xen guestů dříve, než to služba xendomains.service uloží, tudíž se uložení provede přímo do root filesystemu, kde ale není místo. Při spuštění se ještě k tomu ta partition namontuje pro změnu dříve, než se spustí xendomains.service, která je v tu chvíli prázdná, takže by se ty Xen guests neobnovily ani kdyby bylo na root fs místo.
Zkoušel jsem i namísto fstabem připojit tu partition pomocí systemd mount a vzhledem k tomu, že xendomains.service je v Debianu 10 automaticky generovaná z initu, zkusil jsem ji vytvořit (zkopírovat vygenerovanou service) do /etc/systemd/system a přidat Wants=var-lib-xen-save.mount a After=var-lib-xen-save.mount.
Výsledek je pořád stejnej, partition se odpojí dříve než se spustí /etc/init.d/xendomains stop
Nemáte prosím někdo nějakej nápad? Díky za případné rady.
fstab:
/dev/mapper/nvm-sys / ext4 errors=remount-ro 0 1
/dev/mapper/vg1--xensave / ext4 auto 0 1
/dev/mapper/nvm-swap none swap sw 0 0
/etc/systemd/system/var-lib-xen-save.mount
[Unit]
Description=Xensave Directory mount (/var/lib/xen/save)
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target
[Mount]
What=/dev/vg1/xensave
Where=/var/lib/xen/save
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
/etc/systemd/system/xendomains.service
[Unit]
SourcePath=/etc/init.d/xendomains
Description=LSB: Start/stop secondary xen domains
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target
Before=corosync.service
Before=heartbeat.service
Before=libvirtd.service
After=network-online.target
After=remote-fs.target
After=xen.service
After=drbd.service
After=iscsi.service
After=openvswitch-switch.service
After=nfs-kernel-server.service
After=var-lib-xen-save.mount
Wants=network-online.target
Wants=var-lib-xen-save.mount
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/xendomains start
ExecStop=/etc/init.d/xendomains stop
ExecReload=/etc/init.d/xendomains reload
[Install]
WantedBy=multi-user.target
Wants= je měkká závislost, Vaše aplikace ale vyžaduje závislost tvrdou :-)
After=var-lib-xen-save.mount
BindsTo=var-lib-xen-save.mount
BindsTo= spolu s After= mají význam, že běží-li xendomains.service, musí být aktivní var-lib-xen-save.mount. After= je tam kvůli potlačení paralelní aktivace obou (téměř) naráz.
A samozřejmě to platí i naopak, After= zajistí, že při vypínání sekvencer nejprve zastaví službu, a až pak povolí umount :)
Citace od: Křišťan Surname kdy 05. 01. 2020, 23:45:31
After=var-lib-xen-save.mount
BindsTo=var-lib-xen-save.mount
Díky za odpověď, každopádně teď už to neuloží do root fs, ale pro změnu nikam, přijde mi, že se systém rebootuje dřív než se ta služba ukončí, v syslogu je vidět Stopping, ale už ne Stopped, přitom když pustím ručně systemctl stop xendomains, tak je tam jednak Stopping, tak i Stopped a proběhne to v pořádku.
Ta služba teď vypadá takhle:
[Unit]
SourcePath=/etc/init.d/xendomains
Description=Start/stop secondary xen domains
After=network-online.target
After=remote-fs.target
After=xen.service
After=drbd.service
After=iscsi.service
After=openvswitch-switch.service
After=nfs-kernel-server.service
After=var-lib-xen-save.mount
BindsTo=var-lib-xen-save.mount
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/xendomains start
ExecStop=/etc/init.d/xendomains stop
ExecReload=/etc/init.d/xendomains reload
[Install]
WantedBy=multi-user.target
Pokud je služba závislá na tom, že je přimountován nějaký svazek, použijte RequiresMountsFor=. Služba se pak nastartuje teprve po namountování svazku a svazek bude odpojen teprve po ukončení služby.
Ještě je možné, že do toho nějak vstupují ty SysV věci, navíc když je to Type=forking. To je pro mě úplně cizí.
ExecStop=/etc/init.d/xendomains stop
Jestli tohle jde nějak asynchronně (vrátí to ještě než to ukončí službu), tak to může být ono.
Nedavno mi pan Filip Jirsak poradil zavislost RequiresMountFor, ktera pravdepodobne muze resit i Vas problem. Odkaz na diskuzi :
https://www.root.cz/clanky/co-nam-dal-rok-2019-intel-vs-amd-nastup-5g-a-boj-o-systemd-a-wayland/nazory/1033753/
Hmmm... nepostrehl jsem, ze to uz sem dokonce napsal. Tak nic...
Citace od: Filip Jirsák kdy 06. 01. 2020, 19:05:21
... použijte RequiresMountsFor=. Služba se pak nastartuje teprve po namountování svazku a svazek bude odpojen teprve po ukončení služby.
To jsem zkusil, efekt pořád stejný, služba jako se začne ukončovat a systém se rebootuje podle mě dřív než se ukončí, na ten svazek se neuloží nic co by mělo. Ještě s tím budu laborovat a když něco vymyslím, dám vědět, každopádně díky za nápady.
Potřebujete, aby systemd věděl, že ta služba pořád běží. Pokud se služba odforkuje a prnví proces skončí, nemá systemd jak jednoduše zjistit, že služba ve skutečnosti dál běží na pozadí. Spusťte tu službu na popředí, ať se nedémonizuje.