启动过程卡在systemd-networkd-wait-online处。

当我想启动我的笔记本电脑时,它向我显示了这个错误信息:
[FAILED] Failed to start Dispatcher daemon for systemd-networkd

[这就是发生的事情]

1

请帮帮我。
2个回答

听起来你在`/etc/systemd/network`目录下有超过一个`systemd.network(5)`配置文件(或者有[Match]段指定了超过一个带通配符的接口),并且没有在[Link]段中使用`RequiredForOnline=false`指令进行设置。在这种情况下,`systemd-networkd-wait-online.service`将期望所有由`systemd-networkd`管理的接口都达到可路由操作状态。
虽然设置该指令也会使得`systemd-networkd-wait-online.service`完全忽略它,这可能也不是你想要的结果。如果你不关心与`network-online.target`的顺序,那么最好禁用或屏蔽该单元。
如果您希望保留针对`network-online.target`的依赖优势,那么我发现最简单的方法是使用`--any`开关。要么创建文件`/etc/systemd/system/systemd-networkd-wait-online.service.d/override.conf`,要么使用`sudo systemctl edit systemd-networkd-wait-online.service`(这也会创建相同的文件),并包含以下内容...
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any

后续使用sudo systemctl daemon-reloadsudo systemctl restart systemd-networkd-wait-online.service命令可以立即告诉您它是否起作用。
或者,您可以在systemd-networkd-wait-online命令中使用--interface=和/或--ignore=参数。这些参数可替代或与上述--any参数一起使用。如果与--any参数一起使用,则只会考虑通过--interface=传递的那些接口,或者未明确忽略的接口(不使用--ignore=参数)来确定计算机是否已达到联机状态。

为什么我们需要两次使用 ExecStart - daniel451
2这是一个“插入片段”,用于添加或替换服务文件中的指令。添加非常简单,只需包含您希望设置的单元部分和指令即可,但要替换可能只能使用一次的指令,则需要首先“清除”该指令。因此,第一个指令将清空现有的ExecStart=设置,而第二个指令则是我们要替换的内容。 - WonderWoofy
@WonderWoofy -> --任何工作都可以!!!希望您能编辑您的答案,以显示--interface=的正确语法。 - MarcoZen
我们需要将文本翻译成中文。请仅返回已翻译的文本内容:我们只需要添加一个--interface=吗?还是可以根据服务器上的网卡数量添加多个? - MarcoZen
@MarcoZen 每个 --interface 开关只能有一个接口名称,但你可以根据需要多次使用 --interface 开关。我会为你更新我的回答,因为其中还有一些细节。 - WonderWoofy
啊啊啊,我不知道如何在移动设备上进行编辑。 ¯\(ツ)/¯ 但要点是只允许一个界面,因为您还可以附加最小和最大操作状态(基本上是必须达到的“上行”状态,如果未指定则为'可路由')。就像-o或--operational开关一样,但只适用于一个接口。很高兴我的答案对您有帮助!等我有机会时,我会修复我的回答。 - WonderWoofy
@WonderWoofy - 谢谢! - MarcoZen
@WonderWoofy - NetworkManager-wait-online - 启动失败的语法是什么?它一定是类似的吧?这是因为有两个网卡吗?你如何确定要放入 ExecStart 的内容? - MarcoZen
@MarcoZen - 我不知道NetworkManager-wait-online需要什么,因为我不使用它。实际上,我只是阅读了man手册来弄清楚systemd-networkd-wait-online的参数。我想Network Manager可能也有一个man手册。¯\(ツ) - WonderWoofy
@WonderWoofy - 男人 /lib/systemd/system/NetworkManager-wait-online.service - MarcoZen
@MarcoZen 我对上一次的回应感到困惑。这不是你查看 man 页面的方式。在这种情况下,文档信息应该是服务文件中的指令。这意味着你应该可以执行 systemctl help NetworkManager-wait-online.service 命令,然后会跳转到相应的 man 页面。(对于该服务来说,似乎实际的 man 页面是 nm-online。所以你也可以使用 man nm-online 或者 man 1 nm-online。) - WonderWoofy
哎呀,这个工作方式完全不同。默认情况下,服务运行nm-online -s -q -t 30,其中-s(或--wait-for-startup)使其在NetworkManager正常启动时报告成功,-q--quiet的简写,-t 30等同于--timeout=30。因此,似乎删除-s开关应该使其对网络连接状态做出反应,而不是NetworkManager.service的状态。你也可以使用上面我描述的一个插入片段来实现这一点。 - WonderWoofy
没有帮助。不确定为什么。最后我使用 sudo systemctl disable systemd-networkd-wait-online.service 完全禁用了它,这样就解决了问题。 - undefined

你的系统在启动过程中并没有冻结,而是进入了等待状态,等待网络设备完全配置完成后才继续进行。最终的修复方法将通过检查/etc/systemd/network中的配置文件和由journalctl -xe | grep networkd显示的服务日志来实现,重点关注报告中状态不为"configured"的任何链接。这种情况可能发生在IPv6不可用或配置错误时,但也可能出于其他各种原因。

你应该通过引导加载程序(GRUB、rEFInd等)以恢复模式重新启动系统,并从出现的菜单中选择根选项。从那里,你可以使用上述命令检查系统和/或通过创建一个新目录mkdir /etc/systemd/system/systemd-networkd.service.d并在其中创建一个名为override.conf的新文件(例如sudoedit /etc/systemd/system/systemd-networkd.service.d/override.conf),内容如下:

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

你可以在恢复模式下使用命令/usr/lib/systemd/systemd-networkd-wait-online && echo $?来测试对/etc/systemd/network文件的修改是否成功。如果问题已经解决,输出结果将为0。如果一切都无法解决,你可以使用sudo systemctl disable systemd-netword-wait-online.service命令完全禁用该服务。
相关的 man 页面:

1我按照你说的做了(我禁用了systemctl),但没有起作用。 - Stefanx
如果你真的想让systemd-networkd-wait-online.service不启动,那么Peter建议使用systemctl disable ...应该可以解决。但是另一个systemd单元可能仍然作为依赖项启动它。如果你真的想强制阻止它启动,那么用systemctl mask systemd-networkd-wait-online.service来屏蔽它。只要注意network-online.target依赖于其中一个"wait-online"服务,并且network-online.target可能用于确保在启动其他服务之前具备网络连接。 - WonderWoofy
无论如何,如果你仍然在与某个问题作斗争,下面的回答将会解决你的问题。 - WonderWoofy