我想在将我的 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 上使用。)