[systemd-devel] /usr vs /etc for default distro units enablement
Didier Roche
didrocks at ubuntu.com
Tue Dec 2 03:50:46 PST 2014
Just to sum up other branches of this thread: we are trying to avoid
having systemctl calls in debian/ubuntu postinst (or duplicated manual
symlinks logic as we currently have).
systemctl preset seems the cleanest path, but we want to ensure corner
cases can be handled.
d/u policy is to enable newly installed package by default (difference
from other distributions)
Le 02/12/2014 01:59, Lennart Poettering a écrit :
> On Fri, 28.11.14 11:15, Didier Roche (didrocks at ubuntu.com) wrote:
>
>> The distribution comes preinstalled with one dm, enable * -> enable it, have
>> the Alias=display-manager.service picking the right one.
>> However, let's say the user installed then another dm, what happens? Both
>> will be enabled if we systemctl preset <new_service> (as the discussion was
>> to remove our debian enable <service> that was conditioned on the
>> postinst).
> "systemctl preset" will fail if there are already conflicting
> symlinks. Hence the first installed DM wins, the second loses.
Ok, that works with the initial install case then.
However, if lightdm is installed and the admin install gdm, he will get
a prompt (from postinst) asking him which dm to choose. How would you
handle that (without messing manually with the symlinks or systemctl
enable --force in the postinst?). Writing new presets in /etc which
enables the chosen dm and disable other, then reloading preset file to
reset that display-manager.service alias?
>
>> I don't think we should have systemctl preset <new_service> running under
>> any condition as a wipe of /etc and then "systemctl preset-all" would give a
>> potential different result (I'm not even sure how this will work with those
>> alias, the first matching the alias wins and get the symlinks?)
> Dont follow? "wipe"?
I meant deleting the entire "/etc" content (or I guess as you told using
systemctl preset-all to reset to default):
1. lightdm and gdm were installed on my system.
2. gdm was enabled as the default display-manager.
3. I then use "systemctl preset-all"
-> how the behavior of selecting the display-manager will be determined?
See below implementing this with presets where enabling all services is
the default.
>
>> We can of course have an ubuntu-desktop.preset which disables all dms by
>> lightdm, and an ubuntu-gnome.preset which disables all dms but gdm (and
>> having those settings conflicting with each other), but it's seems that for
>> every aliases, we need to maintain such a list (as we enable * by
>> default)?
> Not following here. Different flavours of Ubuntu should probably just
> ship different preset files. (Or well, the main ubuntu should ship one
> that enables lightdm, and then the gnome flavour ship another preset
> file, with a lower name, tht overries the lightdm line, and enables
> gdm instead).
You meant disable, right? As our default is to enable all services.
So we need for any services shipping Aliases to have a preset list per
flavor (if their behaviors differs) with:
99-ubuntu-desktop.preset:
enable lightdm.service
disable kdm.service
disable gdm.service
disable nodm.service
(and whatnot… dm files in distro)
Then, we would have 01-ubuntu-gnome.preset:
enable gdm.service
disable lightdm.service
disable kdm.service
…
It seems maintaining this list in sync for all flavors would be a
growing pain (this is a positive effect of the disable by default: you
don't have to maintain such a list), or do you think we can come with
something better?
Finally, on the "know what the administrator did on this machine", here
are two cases that we can identify:
I. if the administrator removes the service package, we usually keep
current service state (enabled/disabled) on reinstall.
So:
<foo.service> enabled by default
1. systemctl disable foo.service
2. apt-get remove foo
3. apt-get install foo
-> foo should still be disabled. However, that won't be the case as on
reinstall, systemctl preset will re-enable the service as of the preset
policy.
Indeed, we don't have any record that the admin disabled it compared
default distro policy as there is no difference between: "no previous
installation state" and "service being disabled state" (no symlink).
Same for enabling a service that is by default disabled: next systemctl
call on reinstall will remove the symlinks (Alias included).
II. if the adminstrator purges the service package, we usually expect
that reinstalling it will reset the service to the default
enablement/disablement state.
So:
<foo.service> enabled by default
1. systemctl disable foo.service
2. apt-get remove --purge foo
3. apt-get install foo
-> foo should be enabled as this is the default state in distro.
This use case works because the previous one doesn't :)
So, I think we should really be able to fix case I. Also, we would have
to condition the systemctl preset call (we have idempotent postinst
script, and need to track new installs from upgrade, as we run those
during postinst configure). We proposed the separate /usr vs /etc as
this would have been a simple way to know what the admins changed
compared to the default. Any idea on how we can solve that with the
existing concepts?
Cheers,
Didier
More information about the systemd-devel
mailing list