random-archer / mkinitcpio-systemd-tool

Provisioning tool for systemd in initramfs (systemd-tool)
https://www.archlinux.org/packages/community/any/mkinitcpio-systemd-tool/
Other
112 stars 27 forks source link

Instances of templated service units are currently not supported #100

Open kalehmann opened 1 year ago

kalehmann commented 1 year ago

Short description

mkinitcpio-systemd-tool does not support adding template service units (e.g. my-fancy-tool@.service) to the initrd yet.

Steps to reproduce

Let's assume I have a service called my-fancy-tool, that I need to run from the initial ramdisk during early boot. This service is expected to be executed multiple times with different configurations, so I have a template unit at /usr/lib/systemd/system/my-fancy-tool@.service with

...

[Service]
ExecStart=/usr/bin/unlocked-client --config /etc/my-fancy-tool/%i.conf

...

Now I enable my service for a specific config with systemctl enable my-fancy-tool@my-config.service and then try to recreate the initrd.

Expected behavior

Recreating the initrd succeeds and my service is added to the initrd image.

Actual behavior

Recreating the initrd fails with

==> ERROR: can not find service unit: my-fancy-tool@my-config.service

Technical details

In the function add_systemd_unit_X in src/mkinitcpio-install.sh the unit of my service is parsed as my-fancy-tool@my-config.service. Right after that, the tool tries to locate either /etc/systemd/system/my-fancy-tool@my-config.service or /usr/lib/systemd/system/my-fancy-tool@my-config.service. However both files do not exist, as my unit is /usr/lib/systemd/system/my-fancy-tool@.service and the tool failes.

Suggested solution

The unit name should be stripped from all arguments. So my-fancy-tool@my-config.service should become my-fancy-tool@.service and initrd-cryptsetup.service should remain initrd-cryptsetup.service.

The name of the symlink should still be stored, as it should still be added to the initrd image with its argument in the name.