什麼是 systemd-networkd 的 post-up 等價物?(動態網橋MAC配置)
在使用
/etc/network/interfaces
(例如 Debian)的 Linux 發行版中,我可以獲得一個(核心)網橋來使用其靜態網橋從介面之一的 MAC48 地址,例如內置的wlan0
、使用post-up
的,如:post-up ip link set br0 address `cat /sys/class/net/wlan0/address`
這確保了 1) 每個複製的系統都使用自己唯一的 MAC48(來自唯一 wlan0 的 MAC48),以及 2) 橋 MAC 保持穩定,即使在熱插拔具有較低 MAC48 的其他橋介面時也是如此。
post-up
systemd-networkd 是否支持在網路(或 netdev)啟動後可以執行的任何類型的命令?我試圖找到這樣的東西,但可能錯過了。還是 systemd 中的正確方法完全不同,即擁有一個設備單元和一個包裝
ip link...
命令並依賴於設備單元的服務?如果是這樣,設備單元和服務單元文件會是什麼樣子?
事實證明,由於繁重的模組化概念
systemd
和systemd-networkd
腳本問題需要從不同的角度來解決:與其尋找具有橋接.netdev
定義的腳本,systemd
方法是擁有一個(非常小的)一次性.service
單元,即橋邊通緝.netdev
。**附帶說明:**似乎在最近的 Linux 核心中,核心橋實際上不再為橋 MAC48 使用動態變化的最低 MAC48 方案。相反,他們為網橋本身創建了一個靜態 MAC48。因此,從非常嚴格的意義上說,這個解決方案不再需要,除非人們更喜歡使用“真正的”硬體 MAC48;這就是在下面的服務單元中所做的。
必要的新服務單元(代替舊的
post-up
from/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
這裡的中心點是
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
就是這樣!