Debian 9 更改網路介面預設命名方式
https://szlin.me/2017/07/19/debian-9-release/
2017 年 07 月 19 日szlin
Debian 9 開始, 網路介面命名方式開始有所差異.
以往有線網路介面使用 eth0, eth1 等等的命名, 但這樣的機制容易因為 driver 初始化順序不同而導致介面順序不固定, 進而造成使用上的問題. (例: 防火牆設定, 或者其他與介面名稱緊密相關的應用等等) 這問題尤其在嵌入式相關領域非常容易碰到.
systemd v197 開始, 引入Predictable Network Interface Names [2] 的設計. 其範圍包含有線, 無線等等的網路介面 (local Ethernet, WLAN and WWAN) 並在 systemd v220 成預設選項
而 Debian 9 使用 systemd v232, 所以想當然爾, 預設使用 Predictable Network Interface Names (Debian 8 使用 systemd v215)
Predictable Network Interface Names 命名規則如下 [5]:
由上圖可知, 可分成下面五種命名方式
- 以 Firmware/ BIOS 提供的 index 編號來對 on-board devices 命名
- eno1
- 以 Firmware/ BIOS 提供的PCIe 熱插拔 index 編號來命名
- ens1
- 以硬體連接器實體位置來命名
- enp2s0
- 以介面的 MAC 位址來命名
- enx78e7d1ea46da
- 以傳統方法來命名
- eth0
如何調整介面預設命名方式
如果想要調整 kernel/bios/path/MAC 預設命名方式, 可透過編輯 /etc/systemd/network/*.link 使用 NamePolicy 選項來進行命名調整 (預設則是會執行 /lib/systemd/network/99-default.link) 其他詳細用法可 man systemd.link
使用 Predictable Network Interface Names 的優缺點 [2]
優點 |
缺點 |
---|---|
|
|
向前相容 – 如何將新的網路介面架構導入到既有平台上
- 檢查 /etc/udev/rules.d/70-persistent-net.rules 中列出的網路介面
- 透過下列指令, 查找上個動作所列出的網路介面所相關的設定檔 (以 eth0 為例)
grep -r eth0 /etc
- 接著將設定檔內容替換成新的網路介面名稱
- 移除或重新命名 /etc/udev/rules.d/70-persistent-net.rules 檔案成 /etc/udev/rules.d/70-persistent-net.rules.old
- 重啟系統, 查看並測試更新後的相關功能是否能正常運行
如何關閉 Predictable Network Interface Names
如果真的對新的命名方式很不習慣, 可透過下列兩種方法關閉 Predictable Network Interface Names 功能
-
使用以前的命名方式 (ex: eth0)
- 在 kernel command line 中加入 net.ifnames=0 的參數
-
使用自訂的命名方式 (ex: eth-dmz)
- 可透過編輯 udev rules 來自定介面名稱, 以下圖為例
詳情可 man udev(7). 這邊要注意的是, udev rules 檔案編號需要大於 75 (75-net-description.rules), 小於 80 (80-net-setup-link.rules).note: 此方法需要考量下列議題
1. 根目錄必須為可寫狀態
2. 若做成 image 進行大量佈署時會造成問題
3. user space 和 kernel space 同時配置同一介面名稱
- 也可透過編輯 /etc/systemd/network/*.link file, 以下圖為例
代表將路徑 pci-0000:00:1a.0-* 的介面命名為 internet0 並存檔成 /etc/systemd/network/10-internet.link 即可生效. 其他詳細用法可 man systemd.link
- 可透過編輯 udev rules 來自定介面名稱, 以下圖為例
心得
根據韌體, 拓樸以及位置資訊來命名介面, 除了能讓介面命名自動化, 名字可預測, 也可讓系統不因硬體更換或者其他因素而影響介面名稱. 但對舊程式的相容性以及開發人員的習慣是另一個需要考量的地方.
其他方法
另外Dell 則提出 biosdevname 的解決方案 [3] biosdevname 使用來自系统 BIOS 的資訊, 詳細對應如下表
img src: [4]
ref:
[1] https://packages.debian.org/jessie/systemd
[2] https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
[3] https://linux.dell.com/files/whitepapers/consistent_network_device_naming_in_linux.pdf
[4] https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Consistent_Network_Device_Naming_Using_biosdevname.html
[5] https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L20