[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


Hello,

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