Networking

什麼是 systemd-networkd 的 post-up 等價物?(動態網橋MAC配置)

  • August 22, 2017

在使用/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-upsystemd-networkd 是否支持在網路(或 netdev)啟動後可以執行的任何類型的命令?我試圖找到這樣的東西,但可能錯過了。

還是 systemd 中的正確方法完全不同,即擁有一個設備單元和一個包裝ip link...命令並依賴於設備單元的服務?如果是這樣,設備單元和服務單元文件會是什麼樣子?

事實證明,由於繁重的模組化概念systemdsystemd-networkd腳本問題需要從不同的角度來解決:與其尋找具有橋接.netdev定義的腳本,systemd方法是擁有一個(非常小的)一次性.service單元,即橋邊通緝.netdev

**附帶說明:**似乎在最近的 Linux 核心中,核心橋實際上不再為橋 MAC48 使用動態變化的最低 MAC48 方案。相反,他們為網橋本身創建了一個靜態 MAC48。因此,從非常嚴格的意義上說,這個解決方案不再需要,除非人們更喜歡使用“真正的”硬體 MAC48;這就是在下面的服務單元中所做的。

必要的新服務單元(代替舊的post-upfrom /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

就是這樣!

引用自:https://serverfault.com/questions/869756