什么是 systemd-networkd 等价于 post-up?(动态网桥MAC配置)

The*_*veO 11 networking debian bridge linux-networking systemd

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

 post-up ip link set br0 address `cat /sys/class/net/wlan0/address`
Run Code Online (Sandbox Code Playgroud)

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

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

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

The*_*veO 17

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

附带说明:似乎在最近的 Linux 内核中,内核桥接器实际上不再对桥接器 MAC48 使用动态变化的最低 MAC48 方案。相反,他们为网桥本身创建了一个静态 MAC48。因此,从非常严格的意义上说,这种解决方案不再是真正需要的,除非人们更喜欢使用“真正的”硬件 MAC48;这是在以下服务单元中完成的操作。

必要的新服务单元(代替旧的post-upfrom /etc/network/interfaces)居住/etc/systemd/system/bridge-stable-mac.service并将 MAC48 from (内置,固定)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
Run Code Online (Sandbox Code Playgroud)

这里的中心点是WantedBy=条款:无论何时br0启动,都应该运行此服务(恰好一次,Type=oneshot)。Systemd 在这里真的很简洁,因为它不需要编辑现有的设备定义来添加我们的依赖项,而是使用我们的反向WantedBy=链接计算这个依赖项。这就是我认为systemd确实闪耀的地方。

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

[NetDev]
Name=br0
Kind=bridge
Run Code Online (Sandbox Code Playgroud)

说到热插拔桥接端口,systemd其实这个已经是开箱即用的了,非常简洁;在/etc/systemd/network/10-br0-ports.network

[Match]
Name=eth0 wlan0

[Network]
Bridge=br0
Run Code Online (Sandbox Code Playgroud)

就是这样!