跳到主要內容
節省工具箱Jason Tools
技術文章

Proxmox VE 固定網路介面名稱:避免升級後網路卡改名造成斷線

Jason Cheng 發布 瀏覽 2 次
Proxmox VE 固定網路介面名稱:避免升級後網路卡改名造成斷線
本文目錄
  1. 網路卡名稱為什麼會變
  2. 固定網路介面名稱的原理
  3. ISO 安裝時的預設行為
  4. 使用 pve-network-interface-pinning
  5. 日後新增網路卡
  6. 其他做法
  7. 結論
  8. 參考資料

Proxmox VE 有一支很重要、但光看官方說明很難看懂的工具:pve-network-interface-pinning,用來固定網路介面名稱。

沒有做這件事的節點,平常完全不會出問題,直到某一次升級之後,網路卡名稱突然變了,管理網路就斷了。這篇整理它在解決什麼問題、ISO 安裝時的預設行為,以及日後新增網路卡時要注意的地方。

網路卡名稱為什麼會變

PVE 5.0 之後的網路卡名稱,是由 systemd 依照網路卡的位置與屬性自動產生的,例如 eno1(主機板內建第一張)、enp3s0(PCI 匯流排 3、插槽 0)。

問題在於這套命名規則是有版本的,下列情況都可能讓同一張網路卡換了名字:

  • systemd 升級
    新版 systemd 可能採用新版命名規則,大版本升級(例如 PVE 8 升 9)時最常遇到
  • 核心或驅動更新
    即使固定了命名規則版本,核心或驅動改變回報的資訊,名稱一樣可能改變
  • 硬體異動
    新增擴充卡、調整 PCIe 插槽,都可能讓匯流排編號位移

而 PVE 的網路設定 /etc/network/interfaces 是用名稱來指定網路卡的。vmbr0 寫著 bridge-ports enp3s0,升級後網路卡變成 enp4s0,vmbr0 就沒有實體網路卡可以用,結果就是節點開機後管理介面連不上、VM 對外網路中斷,只能到機房接螢幕處理,如下圖。

沒有固定命名時,升級後網路卡改名造成管理網路中斷
沒有固定命名時,升級後網路卡改名造成管理網路中斷

固定網路介面名稱的原理

固定命名(pinning)的做法,是為每張實體網路卡寫一個 systemd 的 .link 檔,用 MAC 位址比對網路卡,直接指定名稱。MAC 位址不會因為軟體升級而改變,名稱也就跟著固定下來,例如:

[Match]
MACAddress=aa:bb:cc:dd:ee:ff
Type=ether

[Link]
Name=nic0

固定之後,介面名稱預設會變成 nic0、nic1……這種與硬體位置無關的名稱。

ISO 安裝時的預設行為

從 PVE 9.1 開始,ISO 安裝程式的管理網路設定頁多了「Pin network interface names」選項,而且預設是勾選的,旁邊的「Options」按鈕還可以自訂每張網路卡的名稱。

保持預設安裝,安裝程式就會順便替當時偵測到的所有網路卡做好固定命名,產生的檔案在 /usr/local/lib/systemd/network/,檔名像 50-pmx-nic0.link,網路設定裡用的也直接是 nic0 這類名稱。

注意:nic 後面的編號不代表速度或網路卡類型。實際案例中,nic1 可能是 10GbE,nic0 與 nic2 才是 2.5GbE,請以 MAC 位址或 ip -br link 的結果對照。

舊版安裝、或是安裝時取消勾選的節點,就沒有固定命名,要用下面的工具補做。

使用 pve-network-interface-pinning

pve-network-interface-pinning 會產生 .link 命名規則,並把下列設定檔中的舊介面名稱替換成新名稱:

  • /etc/network/interfaces
  • /etc/pve/nodes/<節點名稱>/host.fw
  • /etc/pve/sdn/controllers.cfg
  • /etc/pve/sdn/fabrics.cfg
pve-network-interface-pinning 的三個步驟:產生、檢查、重新開機
pve-network-interface-pinning 的三個步驟:產生、檢查、重新開機

常用指令

為所有還沒有 .link 檔的實體網路卡產生固定命名:

pve-network-interface-pinning generate

改用自訂的前置字串(預設是 nic):

pve-network-interface-pinning generate --prefix myprefix

只為特定介面產生:

pve-network-interface-pinning generate --interface enp1s0

為特定介面指定名稱:

pve-network-interface-pinning generate --interface enp1s0 --target-name if42

先檢查,再重新開機

工具不會直接改動正在使用的設定檔,而是在原檔旁邊另存一份 .new。重新開機前,先用 diff 確認改了哪些地方:

diff -y /etc/network/interfaces /etc/network/interfaces.new

確認沒問題後,重新開機才會生效。如果發現改錯了,在重新開機之前把所有 .new 檔,以及 /usr/local/lib/systemd/network/ 裡對應的 .link 檔刪掉,就等於沒做。

注意:命名對應是各節點自己的,資料中心層級的防火牆設定 /etc/pve/firewall/cluster.fw 不會自動替換。如果裡面有寫到介面名稱,要自己檢查修改。

日後新增網路卡

這是最容易忽略的地方:固定命名只對當時已經存在的網路卡生效。日後新插上的網路卡,不會自動被固定,它仍然使用 systemd 產生的名稱,例如 enp4s0。

所以加裝網路卡之後,記得再對它做一次固定命名。例如節點上已經有 nic0,新增了兩張網路卡 enp3s0 與 enp4s0,分別指定為 nic1、nic2:

# 將 enp3s0 指定為 nic1
pve-network-interface-pinning generate --interface enp3s0 --target-name nic1

# 將 enp4s0 指定為 nic2
pve-network-interface-pinning generate --interface enp4s0 --target-name nic2

一樣先檢查 .new 檔,再重新開機。直接執行 pve-network-interface-pinning generate 也可以,它只會處理還沒有 .link 檔的網路卡,已經固定的不會重複處理。

查目前的實體網路卡名稱與連線狀態:

ip -br link

其他做法

官方文件還提到兩種方式,供參考:

  • 固定命名規則版本
    在核心參數加上 net.naming-scheme=v252 這類設定,避免 systemd 升級時換用新版規則。但核心或驅動更新造成的名稱改變仍然擋不住
  • 自己手寫 .link 檔
    放在 /etc/systemd/network/,原理與工具相同,但要自己修改網路設定,並執行 update-initramfs -u -k all 更新 initramfs

手寫時,官方建議名稱以 en 或 eth 開頭,PVE 介面才會把它當成實體網路卡;同時要避免與 systemd 會自動產生的名稱重複。相較之下,直接使用 pve-network-interface-pinning 省事得多,也會順便幫你改好設定檔。

結論

網路卡名稱漂移平常完全感覺不到,一旦發生,就是升級後節點連不上,而且往往是在維護時段的半夜。固定網路介面名稱是一次設定、長期受用的事。

新安裝的 PVE 9.1 以上,保持安裝程式的預設勾選即可;舊節點建議找個維護時段補做;日後加裝網路卡時,記得對新網路卡再做一次。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀