在使用/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
而已!