在systemd网络配置依赖项上
影响systemd的单元订购非常容易。另一方面,您需要注意已完成的设备所能提供的保证。
配置服务
在当前系统上,订购后network.target
仅能保证网络服务已启动,而不是有任何实际配置。您需要先订购network-online.target
然后拉入以实现该目标。
[Unit]
Wants=network-online.target
After=network-online.target
为了与旧系统兼容,您可能还需要在network.target之后订购。
[Unit]
Wants=network-online.target
After=network.target network-online.target
这用于服务的单位文件和systemd。
在当前版本的软件中实施
现在,您需要确保它能network-online.target
按预期运行(或至少可以使用network.target
)。
当前版本的NetworkManager提供了NetworkManager-wait-online.service
,network-online.target
因此可以通过您的服务获得。此特殊服务确保您的服务将等待,直到配置为自动启动的所有连接都成功,失败或超时。
当前版本的systemd-networkd会阻塞您的服务,直到按照要求配置了所有设备。更为容易的是,它目前仅支持在引导时(更具体地说是`systemd-networkd.service的启动时)应用的配置。
为了完整起见,/etc/init.d/network
Fedora中的服务(由systemd的当前版本解释)会阻塞network.target
,因此间接阻塞了network-online.target
您的服务。这是基于脚本的实现的示例。
如果您的实现(无论是基于守护程序还是基于脚本)均表现为上述网络管理服务之一,则它将延迟服务的启动,直到网络配置成功完成,有充分的理由失败或在合理的时间后超时框架完成。
您可能要检查netctl是否以相同的方式工作,而该信息将是对该答案的宝贵补充。
旧版软件中的实现
我认为您不会在systemd的旧版本中无法正常工作。但是您可以检查至少network-online.target
存在,并在之后进行排序network.target
。
以前,NetworkManager仅保证将应用至少一个连接。甚至为了使它起作用,您还必须NetworkManager-wait-online.service
显式启用该功能。这个问题在Fedora中已得到修复,但直到最近才在上游应用。
systemctl enable NetworkManager-wait-online.service
有关network.target和network-online.target实现的说明
你不应该在任何时候需要让你的软件依赖于NetworkManager.service
或NetworkManager-wait-online.service
或任何其他特定的服务。取而代之的是,所有网络管理服务应在订购之前network.target
(可选)进行订购network-online.target
。
一个基于脚本的简单网络管理服务应在退出之前完成网络配置,并应在此之前network.target
(因此间接在此之前)对其进行订购network-online.target
。
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
network.target
即使不是很有用,基于守护程序的网络管理服务也应该先订购自己。
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
等待守护程序完成的服务应在特定服务之后和之前对其进行订购network-online.target
。它应该Requisite
在守护程序服务上使用,以便在不使用相应的网络管理服务的情况下立即失败。
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
该软件包应在wants
目录中的等待服务上安装一个符号链接,network-online.target
以便希望等待已配置网络的服务将其引入。
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
相关文件
最后的笔记
我希望我不仅可以在您提出问题时回答您的问题,而且还有助于改善上游和Linux发行版中的情况,以便现在我能提供比编写原始问题时更好的答案。 。