Debian systemd network-online.target无法正常工作?


24

我正在尝试在Debian Jessie上创建systemd服务。network-online.target到达后,我需要它开始。

问题是network-online.target在同时network.target还没有配置我的接口的同时触发,只是启动了DHCP查询。

看来此问题特定于Debian,因为它使用旧版网络配置。

如何绕开这个问题或如何使network-online.target工作?


输出是systemctl list-dependencies network-online.target什么?另外,请注意,network-online.target可能不一定意味着可以访问Internet。请参阅页面以获取更多信息。
saiarcot895

该命令的输出是:network-online.target ● └─systemd-networkd-wait-online.service 我已经阅读了该页面,我了解那里的基本概念,但是仍然没有定义可以启动网络关键服务的定义点,这仍然很奇怪。至少它可以等待正确的DHCP分配。
10robinho

这意味着,network-online.target仅取决于systemd-networkd-wait-online.service已准备就绪的说法。它不依赖于NetworkManager表示已准备就绪,也不依赖于检查是否ifup成功启动了所有链接(如果您使用该方法来配置网络)。另一方面,Ubuntu依赖ifup和NetworkManager,但不依赖systemd-networkd-wait-online.
saiarcot895 2015年

您如何配置网络:/etc/network/interfaces,systemd .network文件或NetworkManager?
saiarcot895

您是正确的,network-online.targetnetwork.target在之后立即被触发ifup。我默认使用debian,所以/etc/network/interfaces使用dhcp地址。联网似乎是更好的解决方案,但实施起来并不容易。
10robinho 2015年

Answers:


18

由于您正在使用/etc/network/interfaces,因此需要一个systemd服务来监视每个接口的状态。检查是否已/lib/systemd/system/ifup-wait-all-auto.service安装(由ifupdownUbuntu 15.04中的软件包安装)。如果不是,请创建/etc/systemd/system/ifup-wait-all-auto.service,然后粘贴以下内容:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

这是Ubuntu 15.04系统上存在的服务文件,但是[Install]添加了本节的内容,使事情变得容易一些。我希望ifupUbuntu 15.04中的行为与ifupDebian Jessie中的行为相同。如果没有,则需要进行一些修改(尤其是最后一行)。

然后,运行sudo systemctl enable ifup-wait-all-auto.service。重新启动计算机network-online.target后,至少在启动接口后,您应该会看到已达到。


感谢您的努力,让我现在尝试一下,我会给您反馈
10robinho 2015年

我最终运行了稍微修改的版本ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'。取决于hostname检查是否已分配IP地址。
luka5z

不要尝试旋转医生。这不是因为他正在使用/ etc / network / interfaces。这是因为systemd如此草率,并且将工作分担给每个用户,而不是解决创建它的问题。
Florian Heigl

1
首先,该版本ifup-wait-all-auto.service已删除:“丢弃ifup-wait-all-auto.service。这已经通过使network-online.target希望= networking.service直接实现更优雅“。[更改日志 ]ifupdown0.8.5ubuntu1
myrdd

0

注意!刚在Raspbian Jessie上发现它:删除/ etc / network接口中的所有注释行,它将起作用!这似乎是一个解析错误=)在我的特定情况下,我在iface eth0 inet dhcp不久前就发表评论并忘记了它,但是在升级到Raspbian Jessie并重建内核后,我的行为很奇怪:它使用了DHCP,并拒绝了从/ etc / network / interfaces进行调整。因此,我删除了所有注释,仅删除工作线,重新启动即可,并且一切正常!无需脚本打补丁/编辑!


Interestin,我需要尝试一下。尽管没有什么大不了:)
10robinho

2
您对此有任何参考吗?我想阅读错误报告,并查看错误代码。
ʇsәɹoɈ

不,我还没有打开错误票。要重现它,只需在/etc/network/interfaces文件中添加一些注释-如果它仍然存在,它将启动。
阿列克谢·韦斯宁

0

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/启动服务的推荐的方式AFTER网络是水平是用“ network-online.target在” 。服务文件:

 "After=network-online.target"
 "Wants=network-online.target"

但是在使用“ network-online.target ”并且由于网络不完全处于水平状态而导致服务失败后,我发现有一个错误(https://github.com/coreos/bugs/issues/1966):不能保证是100%可靠的。

确实,在这种情况下使用动态网络配置工具(例如“ NetworkManager ”)时,网络状态永远不可能是100%精确或可预测的。显然,从描述该错误的链接来看,“ network-online.target ”的行为可能会不一致,具体取决于所使用的不同应用程序。

解决方法
您需要分析服务的启动顺序,并使用比“ network-online.target ” 晚的启动顺序:

 systemd-analyze plot > /home/pi/graph.svg

这是一个反复的过程,逐步将目标更改为以后的服务,直到找到确保网络水平且服务启动没有错误的目标为止。就我自己而言,我什至必须sleep 10在脚本中放入SystemD服务调用的内容。


0

我曾经在Github上找到一个答案,通过不断尝试ping服务器来解决了这个问题。仅当ping通过时,服务才会继续:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

google.com用自己的服务器替换了,因为我的主脚本需要连接到服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.