[systemd-devel] Private network namespace and /etc/resolv.conf

Thomas Köller thomas at koeller.dyndns.org
Wed Sep 18 09:10:42 UTC 2024


Thank you very much for pointing this out! The systemd man pages are 
quite a large body of text, and it isn't always obvious where to look 
when confronted with a particular problem, so I missed that.

Am 18.09.24 um 06:08 schrieb serenissi:
> man systemd.exec:
> 
>     PrivateMounts=
>     Takes a boolean parameter.
>     When turned on, this executes three operations for each invoked
>     process: a new CLONE_NEWNS namespace is created, after which all
>     existing mounts are remounted to MS_SLAVE to disable propagation
>     from the unit's processes to the host (but leaving propagation in
>     the opposite direction in effect). Finally, the mounts are remounted
>     again to the propagation mode configured with MountFlags=, see below.
> 
>     *File system namespaces are set up individually for each process
>     forked off by the service manager. Mounts established in the
>     namespace of the process created by ExecStartPre= will hence be
>     cleaned up automatically as soon as that process exits and will not
>     be available to subsequent processes forked off for ExecStart= (and
>     similar applies to the various other commands configured for units).
>     *Similarly, JoinsNamespaceOf= does not permit sharing kernel mount
>     namespaces between units, it only enables sharing of the /tmp/ and /
>     var/tmp/ directories.
> 
>     Other file system namespace unit settings — PrivateTmp=,
>     PrivateDevices=, ProtectSystem=, ProtectHome=, ReadOnlyPaths=,
>     InaccessiblePaths=, ReadWritePaths=, BindPaths=, BindReadOnlyPaths=,
>     … — also enable file system namespacing in a fashion equivalent to
>     this option. Hence it is primarily useful to explicitly request this
>     behaviour if none of the other settings are used.
> 
>     This option is only available for system services, or for services
>     running in per-user instances of the service manager in which case
>     PrivateUsers= is implicitly enabled (requires unprivileged user
>     namespaces support to be enabled in the kernel via the
>     "kernel.unprivileged_userns_clone=" sysctl).
> 
> 
> And TemporaryFileSystem implies PrivateMounts ofc.
> 
> 
> On 9/14/24 17:06, Thomas Köller wrote:
>> I am writing a service that does the following:
>>
>> 1. Uses 'NetworkNamespacePath = /var/run/netns/vpnlink'
>>
>> 2. Uses 'TemporaryFileSystem = %E' to create it's own /etc
>>
>> 3. Runs the 'dhclient' command to configure a network interface
>>
>> The dhclient command is supposed to create (or modifiy) /etc/ 
>> resolv.conf, but it does not:
>>
>> Sep 14 13:18:53 yoga dhclient[10128]: DHCPACK of 10.33.56.46 from 
>> 10.33.63.254 (xid=0xa148446c)
>> Sep 14 13:18:53 yoga dhclient[10159]: DHCP action:
>> Sep 14 13:18:53 yoga dhclient[10159]:   Reason = BOUND, interface = 
>> wlan_builtin, media type = *unset*
>> Sep 14 13:18:53 yoga dhclient[10159]:   new address = 10.33.56.46, old 
>> address = *unset*, requested address = *unset*
>> Sep 14 13:18:55 yoga dhclient[10128]: bound to 10.33.56.46 -- renewal 
>> in 1602 seconds.
>> Sep 14 13:18:55 yoga cat[10191]: cat: /etc/resolv.conf: No such file 
>> or directory
>>
>> The lines generating the above output are:
>>
>> ExecStartPre = dhclient -4 -pf ${PID} -lf ${LEASES} %i
>> ExecStartPre = cat /etc/resolv.conf
>>
>> In an attempt at diagnosing the problem, I changed the dhclient 
>> command to a simple 'echo':
>>
>> #ExecStartPre = dhclient -4 -pf ${PID} -lf ${LEASES} %i
>> ExecStartPre = sh -c 'echo \'test\' >%E/resolv.conf'
>> ExecStartPre = cat %E/resolv.conf
>>
>> Again, the file is not created, although the echo command executes 
>> without error.
>>
>>     Process: 10980 ExecStartPre=sh -c echo 'test' >/etc/resolv.conf 
>> (code=exited, status=0/SUCCESS)
>>     Process: 10981 ExecStartPre=cat /etc/resolv.conf (code=exited, 
>> status=1/FAILURE)
>>
>> I suspect the file /etc/resolv.conf is somehow treated as special, is 
>> this correct? The interface I am trying to set up lives in the 
>> 'vpnlink' network namespace and must do so. What are my options?
>>
>>

-- 
Thomas Köller
Solitüder Bogen 18
24944 Flensburg
Mobil +49 176 48154684



More information about the systemd-devel mailing list