在使用/etc/network/interfaces (例如Debian)的Linux发行版中,我可以使用(内核)桥来使用其静态桥接从属接口之一的MAC48地址,例如内置的wlan0 ,如下所示:
post-up ip link set br0 address `cat /sys/class/net/wlan0/address`
这确保了1)每个克隆系统使用其独特的MAC48(独特的wlan0中的一个),并且2)即使热插拔更低MAC48的桥接器,桥MAC也保持稳定。
systemd-networkd是否支持在networking(或netdev)启动后可以运行的任何types的post-up命令? 我试图find这样的事情,但可能错过了。
或者是systemd中完全不同的正确方法,即有一个设备单元和一个包装ip link...命令并依赖于设备单元的服务? 如果是这样,设备单元和服务单元文件将如何?
事实certificate,由于systemd和systemd-networkd这个沉重的模块化概念,脚本问题需要从另外一个angular度来解决:不是用.netdev定义来寻找脚本,系统的方式是有一个(非常小的) 由 bridge .netdev所要求的一次性.service单元。
作为一个方面说明:似乎在更新的Linux内核中,内核桥接实际上不再使用dynamic改变的最低MAC48scheme用于桥MAC48。 相反,他们为桥本身创build一个静态MAC48。 所以,从严格的意义上说,这个解决scheme不再是真正需要的,除非人们喜欢使用“真正的”硬件MAC48。 这是在以下服务单位完成的。
在/etc/systemd/system/bridge-stable-mac.service ,必要的新服务单元(替代/etc/network/interfaces中的旧post-up位于/etc/network/interfaces中,并从(内置的,固定的) 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=是WantedBy=子句:只要br0开始,就应该运行这个服务(一次, Type=oneshot )。 Systemd在这里是非常整洁的,因为它不需要编辑现有的设备定义来添加我们的依赖关系,而是使用我们的反WantedBy=链接来计算这个依赖关系。 这真的是我认为systemd确实发光的地方。
上面的服务单元假定你的网桥被命名为br0 。 你应该使用相应的.netdev文件来定义这个桥br0 。 例如,在/etc/systemd/network/10-br0.netdev :
[NetDev] Name=br0 Kind=bridge
说到hotplugging网桥端口, systemd实际上已经开箱即用,非常整齐; 在/etc/systemd/network/10-br0-ports.network :
[Match] Name=eth0 wlan0 [Network] Bridge=br0
而已!