systemd-networkd 与 post-up 的对应关系是什么?(动态桥接 MAC 配置)

systemd-networkd 与 post-up 的对应关系是什么?(动态桥接 MAC 配置)

在使用 (例如 Debian) 的 Linux 发行版中,/etc/network/interfaces我可以让 (内核) 桥接器使用其静态桥接从属接口之一的 MAC48 地址,例如内置的wlan0,使用post-up,如下所示:

 post-up ip link set br0 address `cat /sys/class/net/wlan0/address`

这确保了:1)每个克隆系统都使用其自己独特的 MAC48(来自独特的 wlan0);2)即使在热插拔具有较低 MAC48 的进一步桥接接口时,桥接 MAC 也能保持稳定。

systemd-networkd 是否支持post-up在网络(或 netdev)启动后运行的任何类型的命令?我试图找到这样的东西,但可能错过了。

或者 systemd 中的正确方法完全不同,即拥有一个设备单元和一个包装命令ip link...并依赖于设备单元的服务? 如果是这样,设备单元和服务单元文件会是什么样子?

答案1

事实证明,由于模块化概念过于繁重systemdsystemd-networkd脚本问题需要从不同的角度来解决:不是寻找具有桥接.netdev定义的脚本,systemd而是使用一个(非常小的)一次性.service单元,想要.netdev

附注:似乎在较新的 Linux 内核中,内核桥实际上不再使用动态变化的最低 MAC48 方案作为桥 MAC48。相反,它们为桥本身创建静态 MAC48。因此,从非常严格的意义上讲,这种解决方案实际上不再需要,除非有人更喜欢使用“真正的”硬件 MAC48;这就是在以下服务单元中所做的。

必要的新服务单元(代替旧的post-up/etc/network/interfaces位于桥梁本身中并将 MAC48 分配给桥梁本身/etc/systemd/system/bridge-stable-mac.service(内置、固定) :wlan0

[Service]
Type=oneshot
ExecStart=/bin/bash -c "/bin/echo 'br0 available, setting MAC ' `/bin/cat /sys/class/net/wlan0/address`"
ExecStart=/bin/bash -c "/sbin/ip link set br0 address `/bin/cat /sys/class/net/wlan0/address`"

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

这里的核心点是WantedBy=子句:每当br0启动时,就应该运行此服务(仅一次Type=oneshot)。Systemd 在这里非常巧妙,因为它不需要编辑现有设备定义来添加我们的依赖项,而是使用我们的反向WantedBy=链接来计算此依赖项。我认为这才是真正systemd出色的地方。

上面的服务单元假设你的桥接器名为br0。你应该使用相应的.netdev文件来定义这个桥接器br0。例如,在 中/etc/systemd/network/10-br0.netdev

[NetDev]
Name=br0
Kind=bridge

当谈到热插拔桥接端口时,systemd实际上已经实现了开箱即用的功能,非常简洁;在/etc/systemd/network/10-br0-ports.network

[Match]
Name=eth0 wlan0

[Network]
Bridge=br0

就是这样!

相关内容