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

常用指令
為所有還沒有 .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 以上,保持安裝程式的預設勾選即可;舊節點建議找個維護時段補做;日後加裝網路卡時,記得對新網路卡再做一次。
參考資料
- Proxmox VE 官方文件:Network Configuration
https://pve.proxmox.com/wiki/Network_Configuration - systemd.net-naming-scheme 說明
https://www.freedesktop.org/software/systemd/man/latest/systemd.net-naming-scheme.html - systemd.link 說明
https://www.freedesktop.org/software/systemd/man/latest/systemd.link.html



