在使用 (例如 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
事实证明,由于模块化概念过于繁重systemd
,systemd-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
就是这样!