After= 不适用于 systemd 中的设备

After= 不适用于 systemd 中的设备

我想在将我的 wifi 接口wlp3s0添加到网桥之前将其置于 4addr 模式br0,因此我写入以下内容/etc/systemd/system/4addr2.service

[Unit]
Description=Put interface into 4addr mode
Before=sys-subsystem-net-devices-br0.device
After=sys-subsystem-net-devices-wlp3s0.device

[Service]
Type=oneshot
ExecStart=/sbin/iw dev wlp3s0 set 4addr on
RemainAfterExit=true

[Install]
WantedBy=sys-subsystem-net-devices-br0.device

但是我发现该服务在sys-subsystem-net-devices-wlp3s0.device单元之前运行:

在此处输入图片描述

jounalctl也没有解释为什么4addr2之前开始sys-subsystem-net-devices-wlp3s0.device

$ sudo journalctl -u 4addr2
-- Logs begin at Thu 2020-09-03 08:44:03 EDT, end at Thu 2020-09-03 08:48:53 EDT. --
Sep 03 08:44:05 router systemd[1]: Starting Put interfaces into 4addr mode...
Sep 03 08:44:05 router iw[393]: command failed: No such device (-19)
Sep 03 08:44:05 router systemd[1]: 4addr2.service: Main process exited, code=exited, status=237/KEYRING
Sep 03 08:44:05 router systemd[1]: 4addr2.service: Failed with result 'exit-code'.
Sep 03 08:44:05 router systemd[1]: Failed to start Put interfaces into 4addr mode.

我如何理解为什么我的服务在接口设备初始化之前启动?

答案1

Before= 和 After= 仅在对已经属于作业队列的作业进行排序时才有效,而 .device 单元通常不是其中的一部分 - 它们不是“启动的”,它们只是突然出现,因为它们只代表外部发生的事情。

因此,您还需要在以下位置列出相同的 wlp3s0.deviceRequires=甚至BindsTo=. 这样 systemd将要尝试“启动” .device 单元(定义为等待设备出现),这将使 After= 工作。

但出于相关原因,订购 Before=br0 服务不会有帮助。这样做将不会延迟创建 br0,也不延迟向其添加其他接口,因为这两件事都是在外部发生的,而不是通过 systemd。

如果您当前正在使用 systemd-networkd 执行此操作,则可能需要将其删除,而使用相同的自定义 .service 来分配桥接器:

ExecStart=/sbin/iw dev wlp3s0 set 4addr on
ExecStart=/sbin/ip link set wlp3s0 master br0

(可能还有其他方法,例如创造一个全新的无线设备,从一开始就已经启用了 4addr,并iw ... interface add在同一个 phy 上使用。)

相关内容