允许在只读 Yocto 文件系统中进行 systemd 静态 IP 编辑

允许在只读 Yocto 文件系统中进行 systemd 静态 IP 编辑

我有一个自定义配方,可以将 systemd .network 配置文件复制到 /etc/systemd/network 中,为我的系统设置静态 IP。

由于许多设备可以连接到同一网络,我希望用户能够编辑系统 IP 地址。

我的映像有一个只读根分区和一个可写主分区。我的想法是让 /etc/systemd/network 中的 .network 文件成为 home 中文件的链接,以便用户可以编辑它(显然,通过不会搞砸文件的远程软件)。

# ll /etc/systemd/network/20-wired.network
lrwxrwxrwx 1 root root 35 Sep 16 15:16 /etc/systemd/network/20-wired.network -> /home/root/systemd/20-wired.network*

这些是链接文件的权限

# ll /home/root/systemd/20-wired.network
-rwxrwxrwx 1 root root 107 Mar  9  2018 /home/root/systemd/20-wired.network*

糟糕的是,链接技巧不起作用:

# systemctl status systemd-networkd.service
* systemd-networkd.service - Network Service
         Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
         Active: active (running) since Fri 2022-09-16 15:19:31 UTC; 6min ago
TriggeredBy: * systemd-networkd.socket
             Docs: man:systemd-networkd.service(8)
     Main PID: 413 (systemd-network)
         Status: "Processing requests..."
            Tasks: 1 (limit: 520)
         Memory: 2.0M
         CGroup: /system.slice/systemd-networkd.service
                         `-413 /lib/systemd/systemd-networkd

Sep 16 15:19:31 imx8mpsolidrun systemd[1]: Starting Network Service...
Sep 16 15:19:31 imx8mpsolidrun systemd-networkd[413]: Failed to load /etc/systemd/network/20-wired.network, ignoring: Permission denied
Sep 16 15:19:31 imx8mpsolidrun systemd-networkd[413]: Enumeration completed
Sep 16 15:19:31 imx8mpsolidrun systemd[1]: Started Network Service.
Sep 16 15:19:31 imx8mpsolidrun systemd-networkd[413]: eth0: Link UP
Sep 16 15:19:36 imx8mpsolidrun systemd-networkd[413]: eth0: Gained carrier
Sep 16 15:19:37 imx8mpsolidrun systemd-networkd[413]: eth0: DHCPv4 address 10.0.10.240/24 via 10.0.10.1
Sep 16 15:19:37 imx8mpsolidrun systemd-networkd[413]: eth0: Gained IPv6LL

如果链接文件位于根分区而不是主分区,则链接技巧有效。但随后它将再次变为只读......

我认为这是由于 systemd-networkd 服务具有ProtectHome=yes.我尝试通过将其设置为 并对其进行评论来禁用此功能nofalse但到目前为止没有运气。我也尝试过将其设置为read-only并设置ReadOnlyPaths=path/to/linked/file,但仍然没有运气。

知道如何让它发挥作用吗?

当根分区为只读时,是否有更好的方法来获得可编辑的静态 IP?

编辑

我进一步测试,看来确实是文件权限访问问题。

我确认文件ProtectHome=no中需要该systemd-networkd.service文件,否则该服务无法访问主目录中的文件。

我注意到任何用户家中的文件(例如/home/weston/)都可以被 systemd 访问和使用,但/home/root就整个文件夹的权限设置而言,无法访问 中的文件。我尝试为所有/home/root/文件夹和子文件夹设置0777,但systemd仍然无法访问这些文件。事实上,systemd-network用户无权访问配置文件。

这里是文件权限(这两个文件似乎对任何人都可读)和test结果:

# namei -l /home/root/20-wired.network 
f: /home/root/20-wired.network
drwxr-xr-x root root /
drwxr-xr-x root root home
drwxr--r-- root root root
-rw-r--r-- root root 20-wired.network
# sudo -u systemd-network test -r /home/root/20-wired.network; echo $?
1
# namei -l /home/weston/20-wired.network 
f: /home/weston/20-wired.network
drwxr-xr-x root   root   /
drwxr-xr-x root   root   home
drwxr-xr-x weston weston weston
-rw-r--r-- weston weston 20-wired.network
# sudo -u systemd-network test -r /home/weston/20-wired.network; echo $?
0

我想我需要更好地研究root访问权限......

相关内容