我正在使用 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 可以在启动依赖服务之前等待它出现。