[systemd-devel] How to specify dynamic services/requirements

Luiz Angelo Daros de Luca luizluca at gmail.com
Wed Sep 13 04:08:22 UTC 2017


Hello,

I'm facing a problem with Xen machines that depends on MD devices.
As I'm new to systemd world, I might not be seeing the clean solution.
That's why I'm asking for an advice.

MD devices are automatically detect by udev. If device state is safe,
/dev/md/myraid is started. However, if the state is not safe (like a raid
with a missing disk), udev starts mdadm-last-resort at .timer that tries to
start the device anyway after 30s. As mdadm-last-resort conflicts with the
device presence, it will not run if the required disk appears before 30s.
Even with mdadm-last-resort running, MD device might still be usable,
although degraded.

Xen VM are started by xendomains.service, that simply calls a shell script
like in SysV times. It start a bunch of VM in sequence. xendomains.service
has only generic dependencies that let it run at a very early stage.

Now the problem: If for any reason, a MD device takes some seconds to
appear (or even 30s as the last resort), xendomains will fail to start any
machine that depends on that MD device.

I'm extending manually xendomains.service to depend on a series of MD
devices, that fixed the start order problem. However, I created new
problems. First I had to frequently regenerate those "Requires" as machines
are frequently started/migrated between hosts (I also consider using
systemd generators). But worse, whenever a single MD device permanently
fails, xendomains is never started and all those VM that does not use the
failed MD never start.

I though that maybe I could use instances (xendomains at vm1.service) to
launch VM individually, each of them depending on those devices it uses.
However, these instances would have to be dynamically generated based on
its configuration (systemd generators from /etc/xen/vm/xxx.cfg?), either on
boot, shutdown or simply periodically. The stop procedure will still be the
same, calling the SysV script as systemd will not know about VM (re)started
after boot.

I even though about simply create an alternative xendomains.service that
does not depend on any MD device and launch it using a systemd timer if the
xendomains that depends on MD devices isn't started after 30s. It looks
ugly but it might work.

Regards,
-- 

Luiz Angelo Daros de Luca
luizluca at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20170913/f07c5e9e/attachment.html>


More information about the systemd-devel mailing list