什么是system-networkd相当于post-up? (dynamic桥MACconfiguration)

在使用/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,由于systemdsystemd-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 

而已!