[systemd-devel] multi-user.target only wants network.service if I'm doing 'systemct show runlevel3.target'

Francis Moreau francis.moro at gmail.com
Wed Dec 10 01:19:13 PST 2014


On 12/10/2014 07:23 AM, Ivan Shapovalov wrote:
> On Tuesday 09 December 2014 at 17:25:48, Francis Moreau wrote:	
>> Hello Lennart,
>> Thanks for answering !
>> On 12/09/2014 02:10 PM, Lennart Poettering wrote:
>>> On Tue, 09.12.14 11:19, Francis Moreau (francis.moro at gmail.com) wrote:
>>>> Hello,
>>>> I've a very weird behaviour with systemd 217:
>>>> # systemctl show -p Wants multi-user.target | grep network.service
>>>> # systemctl show -p Wants runlevel3.target | grep network.service
>>>> Wants= ... network.service ...
>>>> # systemctl show -p Wants multi-user.target | grep network.service
>>>> Wants=... network.service ...
>>>> So basically the network.service is not part of the multi-user target
>>>> dependencies. But if I'm showing the state of the runlevel3 target, the
>>>> network service magically becomes a dep of multi-user.target.
>>>> The network.service is an sysv service which is started by rc[345].d and
>>>> has in its LSB:
>>>> Provide: $network
>>>> Could anybody clarify what I'm facing ?
>>> systemd lazy loads services from the file system as they are
>>> referenced. This includes symlinked aliases, which are only loaded when
>>> a unit is referenced by that specific name.
>> Sorry but I don't really understand.
>> Do you mean that the network.service wasn't loaded although the
>> runlevel3.target, which is an alias for multi-user target (default
>> target) wants it ?
>> I would be glad if you could enlight me because I'm confused.
> Apparently, network.service gets pulled in only via runlevel3.target, i. e.
> there is a symlink of kind
> /{etc,usr/lib,run}/systemd/system/runlevel3.target.wants/network.service -> network.service
> That is, the Wants= dependency is generated for runlevel3.target only, not for
> multi-user.target.
> And, because systemd loads units lazily, systemd does not know about runlevel3.target
> (and its dependencies) before anything forces systemd to load that unit.
> After you issue `systemctl show runlevel3.target`, systemd loads that unit,
> loads its dependencies and merges them to multi-user.target (because runlevel3.target
> is an alias for multi-user.target).

That helps, thanks !

However that seems a bit weird to have a target with 'hidden'
dependencies that can appears magically when poking another one, at
least from my point of (user) view.

Was the lazy load mechanism integrated recently ? I'm asking because
systemd 208 doesn't show the same behaviour.

What's the recommanded way to make sure that the Wants= dependencies
generated for runlevel3 target get pplied as soon as possible to its
alias target 'multi-user' ?

Thanks for your help.

More information about the systemd-devel mailing list