[systemd-devel] /usr vs /etc for default distro units enablement
Didier Roche
didrocks at ubuntu.com
Tue Nov 18 03:11:33 PST 2014
Fedora doesn't enable and start all units on package installation: there
are some preset files, based on flavors, which is basically the policy
stating which units to enable/disable by default. Some other units are
always enabled (unless masked), by using symlinks directly shipped with
the package like in /usr/lib/systemd/system/multi-users.target.wants/
for intance. Contrary to that, Debian/Ubuntu has the policy to
enable/start services and facilities on package installation during
postinst. This is done (indirectly) via "systemctl enable", which
creates symlinks in /etc/systemd/system/*.wants/.
This has 3 drawbacks:
- Duplicate symlinks for the same targets between /etc and units enabled
in /usr/lib for units which are already enabled via /usr/lib, if the
admin runs "enable"
- Wrt. the "golden image, /etc reset" approach of reducing base os
installation defaults in /etc, this is another instance of "always needs
to be there" clutter in /etc. If the package default is to start the
service, then it's better to just ship that wants.d/ symlink in the
package (and thus in /usr) instead of always having to create the
symlink in /etc at package install time or after a factory reset.
- We are mixing sys admin information and distro default choices in the
same directories, and can't tell apart what is what.
We were thus thinking about having all default distro choices shipping
target symlinks in /usr/lib, and having the administrator overrides this
in /etc via systemctl. This could look similar to masking a unit, i. e.
a symlink "/etc/.../wants.d/foo -> /dev/null" overrides
"/usr/lib/.../wants.d/foo -> ../foo.service", and would be an explicit
representation of "the admin does not want foo.service to autostart" in
/etc.
However, we did notice the following: taking an unit, with an [Install]
section and a symlink to enable in via that target in /usr/lib:
- systemctl status <unit> will report "disabled", where it's actually
enabled and starting for that unit. This is a bug which should be fixed
in any case, as "disabled" is outright wrong. On IRC it was suggested
that those are "static" units, but then it should say at least that.
- systemctl enable <unit> will duplicate the symlink in /etc
- If we ln -s /dev/null /etc/<…>/<…>.wants/<unit>, then systemctl status
<unit> will display the unit as being enabled, and it will activated
once the target is reached. This is also counterintuitive, as usually
this means to mask/completely disable the unit.
Part of the discussion on #systemd pointed out that the admin should
then use systemctl mask <unit>. However, that means:
- The admin can't retarget a default installed unit without recreating
another unit file
- There are 2 commands to "disable" an unit: mask for some, disable for
others, this can bring confusion and admins won't know the semantic
difference between the two (and indeed this is rather technical and
unintuitive)
- The status reported with systemctl is still disabled when it's not.
Tested with systemd 216 on fedora 21 and systemd 215 on ubuntu vivid.
It will be great if we can come to some common grounds on how we should
separate admin choices and default distro choices, while still working
on the "remove /etc default distro configuration" . I'm happy to give a
hand on the desired solutions there.
Cheers,
Didier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20141118/82127d17/attachment-0001.html>
More information about the systemd-devel
mailing list