“可预测的网络接口名”英文“Redictable Network Interface Names”,简称“可预测接口名”英文“Redictable Interface Names”
从systemd v197 版本开始,systemd/udev 为所有的网络接口自动分配可预测,稳定的网络接口名(如:enp4s0d1v7)。

为什么要开发可预测接口名

传统的接口命名方式是内核driver在探测到所有的接口之后,简单的按照数字编号分配作为eth的后缀的方式命名(如:eth0)。如果你的机器具有多个接口,每次重启系统,网卡的接口名都有可能变化。现在有一个物理网卡的接口名是 eth0,重启主机后,接口名就有可能变成 eth1

在某些时候,网卡接口名不固定会出大问题,比如你正在配置链路聚合,但是你的多个网卡接口名每次重启都会变化,每次启动系统后,你都可能需要重新配置你的网络设置。又例如防火墙规则对不可预测的接口名非常敏感,接口名称改变会带来很大的安全隐患。

为了解决接口名变化的问题,udev 曾支持通过 MAC 地址来绑定接口名,但是仍然存在一些问题。例如虚拟化环境的 MAC 地址就不是固定的。最大的问题是用户空间和内核空间在分配名字上存在竞争。所以这种支持很快就被去掉了。
后来,“可预测的网络接口名”的出现彻底解决了这个问题。

命名规则

目前, systemd 有以下五种命名策略:

  • 传统的接口名 ethX 、wifiX……
  • 固件、BIOS提供的不可插拔的板载设备,接口名 enoX
  • 固件、BIOS提供的 PCIe 可热插拔设备,接口名 ensX
  • 根据硬件物理/地理地址,接口名 enpXsYdZvM
  • 根据硬件物理地址(MAC),接口名 enxFFFF0000AAAA

最后一个策略不会被系统采用,除非用户手动选择,如果用户有自定义的 udev 规则,那么优先按照 udev 来执行。
通过阅读相关文档源码,我们可以了解具体的命名方式,我以的我一张双口洋垃圾网卡 NVIDIA Mellanox 342A 端口 2 的接口名来举例

1
2
3
4
5
6
7
enp4s0d1v7
en - 前两个字母"en"说明这个接口是以太网接口
p - PCI Bus 号,"p4"意味着这是我机器上的第四张网卡
s - PCI Slot 号,大多数设备所有网卡都为 "s0"
d - 设备端口号,"d0"意味着这是我这张网卡的第二个口
第一个口呢?第一个口不存在该参数
v - SR-IOV 虚拟功能(VF)编号,"v7"意味着这是该网口的第八个 VF

优点

接口名不会因为系统重启、硬件更改、系统更新而改变,在生产环境中这很棒!

缺点

如果你的设备只有一个网口,你在对网口进行操作之前,你必须先查看网口的接口名,而不是使用 eth0

如何启用/禁用

启用

  • 确保/etc/systemd/network/99-default.link没有指向/dev/null
  • 确保没有使用/etc/systemd/network/中自定义的命名规则文件(扩展名为.link的文件)。
  • /etc/default/grup配置文件中,参数GRUB_CMDLINE_LINUX_DEFAULT=""中移除net.ifnames=0
  • update-grub
  • 重启设备

禁用

  • ln -s /dev/null /etc/systemd/network/99-default.link
  • 重启设备