如何使用 systemd-networkd 强制 network.target 等待 DHCP?

如何使用 systemd-networkd 强制 network.target 等待 DHCP?

我正在使用 systemd-networkd 来配置我的接口:

[Match]
Name=enp3s0

[Network]
DHCP=v4    

它工作得很好,只是在启动时,某些服务不等待 DHCP 完成。例如,我的 NFS 安装目录和 nginx 失败,因为它们启动时没有网络。

有没有办法强制network.target等待DHCP?


编辑的注释。根据文档:

很多网管方案都提供了无条件拉入network-online.target的方式,从而将network.target的效果升级为network-online.target的效果。

如果您使用 systemd-networkd,您可以通过启用 systemd-networkd-wait-online.service 来做到这一点:

systemctl enable systemd-networkd-wait-online.service

不过我尝试过这个没有使服务依赖于network.target等待 DHCP。它只提供明确依赖于network-online.target等待 DHCP 的服务,事实上,它是使该工作正常运行所必需的。

答案1

使用 systemd-networkd 时,要确保所有接口均已启动并已分配 IP 地址,请使用:

systemctl enable systemd-networkd-wait-online.service

其他人可能正在使用 NetworkManager,在这种情况下将是:

systemctl enable NetworkManager-wait-online.service

看:http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

答案2

实际上,在此上下文中“在线”的定义是在.network文件中定义的。

[Link]
RequiredForOnline=routable

https://www.freedesktop.org/software/systemd/man/systemd.network.html#RequiredForOnline= https://www.freedesktop.org/software/systemd/man/systemd.network.html#RequiredFamilyForOnline= RequiredForOnline有一个默认值yes,我找不到它的定义。但您应该设置为此处列出的值之一:https://www.freedesktop.org/software/systemd/man/networkctl.html 我选择是routable因为它会等待IP。

答案3

根据手册页systemd-networkd-wait-online.service:

默认情况下,它将等待所有它知道的、由 systemd-networkd.service(8) 管理的链接完全配置或失败,并等待至少一个链接在线。这里,在线意味着链路的运行状态等于或高于“降级”。阈值可以通过--operational-state=选项配置。

因此,如果您希望完全配置特定链接并可路由以被视为“在线”,您可以编辑/lib/systemd/system/systemd-networkd-wait-online.service并更改ExecStart为:

ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --operational-state=routable

答案4

大多数 Linux 变体使用网络管理器来systemd确定NetworkManager-wait-online.service网络是否正常。如果是这种情况,您可以编辑/lib/systemd/system/NetworkManager-wait-online.service和更改:

ExecStart=/usr/bin/nm-online -s -q --timeout=30

到:

ExecStart=/usr/bin/nm-online -q --timeout=30

-s 选项的含义是:等待 NetworkManager 启动完成,而不是专门等待网络连接。

删除它可以更好地指示网络状态,并且 systemd 可以在启动依赖服务之前等待它出现。

相关内容