1、问题
传统上,Linux中的网络接口被枚举为eth[0123…],但是这些名称不一定对应于机箱上的实际标签。
具有多个网络适配器的现代服务器平台可能会遇到这些接口的不确定性和违反直觉的命名。
这影响到板载网卡(LOM)和外接的网络适配器(PCIe独立网卡)。
在Red Hat Enterprise Linux中,udev支持许多不同的命名方案。
默认值是根据固件、拓扑和位置信息分配固定名称。
这样做的好处是,这些名称是完全自动的、完全可预测的,即使添加或删除了硬件,它们仍然是固定的(不需要重新枚举),
而且坏掉的硬件可以无缝地替换。缺点是,它们有时比传统使用的eth0或wlan0名称更难读。例如:enp5s0。
2、 引出
为什么需要网卡一致性命名规则呢,简单一句话解释就是服务器通常有多块网卡,有板载集成的,同
时也有插在PCIe插槽的,例如一台服务器,除了板载网卡外,还安装有两张PCIe接口的4口千兆网卡和两张双口的10Gb光口网卡,
这样加上板载的4个千兆网口,这台服务器现在一共有16个网络端口,
如果以传统方式命名网卡,名称混乱的问题对于管理员使用者来说都是一件头疼的事情。
因为传统的Linux系统的命名往往不一定准确对应网卡接口的物理顺序。
比如eth0有可能不是第一块网卡的第一个网口,有可能对应的是第二块网卡的某一个网口,这样就会造成混乱。
为解决这类问题,就需要网卡一致性命名规则。
3、Centos7中命名方案层次结构
默认情况下,systemd将使用以下策略为接口命名,以应用支持的命名方案:
● Scheme1
如果固件或BIOS提供的索引号(例如:eno1)适用且可用,则应用包含固件或BIOS的名称, 否则退回
到Scheme2。
● Scheme2
包含固件或BIOS提供的PCI Express热插拔插槽索引号(例如:ens1)的名称,如果固件或BIOS提供的
信息是可用的,则应用这些名称,否则将回到Scheme3。
● Scheme3
包含硬件连接器的物理位置的名称(例如:enp2s0),如果适用,将被应用,否则在所有其他情况下直
接回到Scheme5。
● Scheme4
包含接口MAC地址的名称(例如:enx78e7d1ea46da),默认情况下不使用,但如果用户选择,则可用。
● Scheme5
如果所有其他方法都失败,则使用传统的不可预测内核命名方案(例如:eth0)。
上面概述的这个策略是默认的。如果系统启用了biosdevname,就会使用它。注意,启用biosdevname
需要将biosdevname=1作为内核命令行参数传递,除非在戴尔系统中,在戴尔系统中,只要安装了bios
devname,就默认使用biosdevname。如果用户添加了更改内核设备名称的udev规则,那么这些规则将
具有优先级。
4、systemd设备重命名过程
1、在/usr/lib/udev/rules.d/60-net.rules中有一条规则指示udev助手实用程序/lib/udev/rename_
device查看所有/etc/sysconfig/network-scripts/ifcfg后缀文件。如果它发现一个带有HWADDR条目
的ifcfg文件与一个接口的MAC地址匹配,它将该接口重命名为DEVICE指令在ifcfg文件中给出的名称。
2、在/usr/lib/udev/rules.d/71-biosdevname.rules中指示biosdevname根据其命名策略重命名接口,
前提是在前面的步骤中没有重命名接口,安装了biosdevname,并且在引导命令行上没有将biosdevname
=0作为内核命令给出。
3、在/lib/udev/rules.d/75-net-description.rules中的规则指示udev通过检查网络接口设备来填充
内部udev设备属性值id_net_name_board、ID_NET_NAME_SLOT、ID_NET_NAME_PATH、ID_NET_NAME_MAC
。注意,有些设备属性可能是未定义的。
4、在/usr/lib/udev/rules.d/80-net-name-slot.rules中有一条规则指示udev重命名接口(前提是在
第1步或第2步中没有重命名接口)和内核参数net。根据以下优先级:id_net_name_board、ID_NET_NAME
_SLOT、ID_NET_NAME_PATH,没有指定ifnames=0。如果其中一个未设置,则它将进入列表中的下一个。
如果没有设置这些参数,则不会重命名接口。
步骤2实际执行的是biosdevname的policy
步骤3和4实际执行的是Scheme1、2、3
5、传统的不可预测的内核命名方案
内核参数(net.ifnames=0 biosdevname=0)
同一台服务器和相同的操作系统,两次安装过程中,网卡设备的顺序并不相同。
这种变化是不可预知的且没有规律可寻。
内核参数文件:/boot/efi/EFI/centos/grub.cfg
6、可预测的网络接口设备名称
net.ifnames的命名规范为: 设备类型+设备位置+数字可预测的网络接口设备名称。默认内核参数
(biosdevname=0,net.ifnames=1)
修改内核参数文件:/boot/efi/EFI/centos/grub.cfg,之后重启reboot。
[root@simon network-scripts]# ifconfig enp182s0f0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:00:00:00:07:14 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp182s0f1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:00:00:00:07:15 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp182s0f2: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:00:00:00:07:16 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp182s0f3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:00:00:00:07:17 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp7s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.57 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::5c96:a206:c19d:f82b prefixlen 64 scopeid 0x20<link> ether 00:a2:c9:00:00:00 txqueuelen 1000 (Ethernet) RX packets 272 bytes 23333 (22.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 72 bytes 18771 (18.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0xaae00000-aae7ffff lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 480 bytes 38976 (38.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 480 bytes 38976 (38.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@CENTOS57 network-scripts]# udevadm info /sys/class/net/enp7s0 P: /devices/pci0000:00/0000:00:1d.6/0000:07:00.0/net/enp7s0 E: DEVPATH=/devices/pci0000:00/0000:00:1d.6/0000:07:00.0/net/enp7s0 E: ID_BUS=pci E: ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection E: ID_MODEL_ID=0x153 E: ID_NET_DRIVER=igb E: ID_NET_NAME_MAC=enx00a0c9000000 E: ID_NET_NAME_PATH=enp7s0 E: ID_OUI_FROM_DATABASE=Intel Corporation E: ID_PATH=pci-0000:07:00.0 E: ID_PATH_TAG=pci-0000_07_00_0 E: ID_PCI_CLASS_FROM_DATABASE=Network controller E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_VENDOR_ID=0x8086 E: IFINDEX=6 E: INTERFACE=enp7s0 E: SUBSYSTEM=net E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp7s0 E: TAGS=:systemd: E: UDEV_BIOSDEVNAME=0 E: USEC_INITIALIZED=318913 E: biosdevname=0 E: net.ifnames=1
7、使用传统命名方式时产生网卡乱序和漂移的问题
许多用户还是习惯使用传统的网卡命名方式,比如在安装系统时使用内核参数(biosdevname=0,
net.ifnames=0)。根据RedHat官方文档,如果禁用systemd可预测接口命名(net.ifnames)和biosde
vname命名方案,则网络接口将继续使用内核最初给出的不可预测且可能不一致的ethX名称。内核在
启动时枚举网络设备时总是使用ethX命名约定。由于并行化,内核接口枚举的顺序在重新引导时可
能会有所不同。Red Hat Enterprise Linux依赖于systemd可预测接口命名方案或biosdevname命名方
案,以可预测的方式将内核不可预测的ethX接口重命名为在重新引导时始终一致的名称。
Red Hat Enterprise Linux没有提供一致应用ethX命名约定的方法,除非在非常特殊的情况下。
udev规则将接口设置为特定的名称,如果请求的名称已经被其他接口使用,则该规则将失败。这包
括/usr/lib/udev/rules.d/60-net.rules文件提供的功能。内核在启动时枚举网络设备时使用ethX
命名约定。在不同的重新引导中,ethx名称是不一致的,因此它们是不可预测的。因此,尝试使用
udev将接口重命名为ethX名称或重新排列内核给出的不可预测的ethX名称将失败。使用ethX名称可
以正确地用于以下场景:
● 系统只有一个网络接口。
● 当用于Red Hat Enterprise Linux 7虚拟机来宾中的virtio nic时。
参考引用:
KClouder(Linux, Virtualization, Management, OpenSource & Networking)
https://www.kclouder.cn/centos-consistent-networkdevice-naming/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming