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]:

由上圖可知, 可分成下面五種命名方式

  1. 以 Firmware/ BIOS 提供的 index 編號來對 on-board devices 命名
    • eno1
  2. 以 Firmware/ BIOS 提供的PCIe 熱插拔 index 編號來命名
    • ens1
  3. 以硬體連接器實體位置來命名
    • enp2s0
  4. 以介面的 MAC 位址來命名
    • enx78e7d1ea46da
  5. 以傳統方法來命名
    • eth0
如何調整介面預設命名方式

如果想要調整 kernel/bios/path/MAC 預設命名方式, 可透過編輯 /etc/systemd/network/*.link  使用 NamePolicy 選項來進行命名調整 (預設則是會執行 /lib/systemd/network/99-default.link) 其他詳細用法可 man systemd.link


使用 Predictable Network Interface Names 的優缺點 [2]
優點
缺點
  1. 介面名稱統一, 不因下列因素而有所異動
    • 重開機
    • 新增移除硬體元件
    • 修改/ 更新kernels/ 驅動程式
    • 更換新的乙太網路卡片
  2. 介面名稱不需要使用者設定即可使用
  3. 事先可預知介面名稱
  4. 可相容於唯讀系統
  5. 可跨平台
  6. 可跨 Linux 發行版套件 (前提是要使用 udev + systemd v197之後的版本)
  1. 需要對以往網路介面相關程式進行修改移植的動作
  2. 操作上會帶來些許不便, 尤其是在只有一個網路介面的機器上. 以往只要操作 eth0 即可

向前相容 – 如何將新的網路介面架構導入到既有平台上
  1. 檢查 /etc/udev/rules.d/70-persistent-net.rules 中列出的網路介面
  2. 透過下列指令, 查找上個動作所列出的網路介面所相關的設定檔 (以 eth0 為例)
    • grep -r eth0 /etc
  3. 接著將設定檔內容替換成新的網路介面名稱
  4. 移除或重新命名 /etc/udev/rules.d/70-persistent-net.rules 檔案成 /etc/udev/rules.d/70-persistent-net.rules.old 
  5. 重啟系統,  查看並測試更新後的相關功能是否能正常運行

如何關閉 Predictable Network Interface Names

如果真的對新的命名方式很不習慣, 可透過下列兩種方法關閉 Predictable Network Interface Names  功能

  1. 使用以前的命名方式 (ex: eth0)
    • 在 kernel command line 中加入 net.ifnames=0 的參數
  2. 使用自訂的命名方式 (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

心得

根據韌體, 拓樸以及位置資訊來命名介面, 除了能讓介面命名自動化, 名字可預測, 也可讓系統不因硬體更換或者其他因素而影響介面名稱. 但對舊程式的相容性以及開發人員的習慣是另一個需要考量的地方.


其他方法

另外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