固定网卡名称

固定网卡名称避免因pcie顺序发生变化造成网卡名称不一致

在Proxmox VE中,当 PCIe 设备发生变化时,网络接口名称可能会重新排序,这是一个已知问题。要解决这个问题,可以通过创建持久的网络接口命名规则来固定网卡名称。

解决问题的思路

基本思路就是在网卡命名时,不要绑定不稳定的 pcie 顺序,而且绑定其他固定的属性,最常用的方案就是绑定 MAC 地址。

通常情况下,一个 pve 设备中的网卡数量和网卡 mac 地址都是固定的,除非明确更换或者增减网卡,否则不会发生变化。

这样,不管网卡和其他 pcie 设备的增减和顺序调整,都不会影响到网卡的命名,然后基于网卡名称的各种设备也就稳定了。

因此,后面将根据网卡的 mac 地址,将网卡重新命名为,暂时定义的规则为类似 en25g1 这样:

  • en:前缀,表示 Ethernet 以太网网卡
  • 1g:网卡速度,根据实际情况可能有 1g/2g/10g/40g/100g,分别对应千兆,2.5g网卡,万兆,40g,100g网卡
  • 1:网卡序号,在同速度网卡中排列,方便起见,不以 0 开头,而是 1/2/3/4 这样表示第一/第二/第三/第四块网卡

按照这样的规则,上面的五块网卡,名称会固定为

  • en1g1
  • en25g1 / en25g2 / en25g3 / en25g4

这样 vmbr0 的 bridge-ports 就可以写成 en1g1 en25g1 en25g2 en25g3 en25g4,之后不管网卡顺序和pcie设备调整,都不会影响 vmbr0 的 bridge-ports 工作。

实现方案(pve9)

注意:在 Proxmox VE 9(基于 Debian 13)中,固定网卡名称的方式与 PVE 8(基于 Debian 12)有所不同,主要是因为 Debian 13 对 udev 规则的处理逻辑做了调整,传统的 70-persistent-net.rules 方式可能不再生效。

在 PVE 9 中,推荐通过 systemd 的 .link 配置文件 来固定网卡名称,这是更现代且兼容的方式。

步骤如下:

  1. 找出需要固定的网卡 MAC 地址

    $ ip addr
    
    2: enp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:e2:69:93:ff:a0 brd ff:ff:ff:ff:ff:ff
    altname enx00e26993ffa0
    3: nic1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether 8c:2a:8e:88:a1:36 brd ff:ff:ff:ff:ff:ff
    altname enx8c2a8e88a136
    
  2. 创建 .link 配置文件

    link 文件名用 enx8c2a8e88a136 这样的 altname 会方便和网卡进行对应:

    vi /etc/systemd/network/10-static-enx00e26993ffa0.link
    

    内容为:

    [Match]
    MACAddress=00:e2:69:93:ff:a0
    Type=ether
    
    [Link]
    Name=en1g1
    AlternativeNamesPolicy=mac
    
    vi /etc/systemd/network/10-static-enx8c2a8e88a136.link
    

    内容为:

    [Match]
    MACAddress=8c:2a:8e:88:a1:36
    Type=ether
    
    [Link]
    Name=en100g1
    AlternativeNamesPolicy=mac
    

    AlternativeNamesPolicy=mac 会保留 altname 名字,这样同样是为了方便对应。

    Type=ether 是为了避免隐患,因为 vmbr0 会继承物理网卡的 MAC,因此 Proxmox 官方建议在 [Match] 里加 Type=ether,避免这条 .link 误匹配到 bridge/bond/vlan 接口。

  3. 修改 vmbr0 的配置

    因为一般都是远程操作,为了安全起见,重命名前后的两个网卡名字都加入到 vmbr0,以防万一出错时无法连接管理网络:

    vi /etc/network/interfaces
    

    内容为:

    auto en1g1
    auto en100g1
    
    auto vmbr0
    iface vmbr0 inet static
       address 192.168.3.129/24
       gateway 192.168.3.1
       bridge-ports en100g1 en1g1 enp3s0 nic1
       bridge-stp off
       bridge-fd 0
    
  4. 执行更新

    update-initramfs -u -k all
    
  5. 重启

    reboot
    

    之后查看网卡名称发现已经固定:

    2: en1g1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master vmbr0 state DOWN group default qlen 1000
        link/ether 00:e2:69:93:ff:a0 brd ff:ff:ff:ff:ff:ff
        altname enx00e26993ffa0
    3: en100g1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
        link/ether 8c:2a:8e:88:a1:36 brd ff:ff:ff:ff:ff:ff
       altname enx8c2a8e88a136
    
  6. 验证成功之后,删除 vmbr0 中不再使用的旧网卡名称

    安全起见再执行一次 update-initramfs:

    update-initramfs -u -k all
    reboot