简介
Red Hat Enterprise Linux为网络接口提供了一致且可预测的网络设备命名方法。这些特性更改系
统上网络接口的名称,以便更容易地定位和区分这些接口。传统上,Linux中的网络接口被枚举为
eth[0123…],但是这些名称不一定对应于机箱上的实际标签。具有多个网络适配器的现代服务器平
台可能会遇到这些接口的不确定性和违反直觉的命名。这影响到板载网卡(LOM)和外接的网络适配器
(PCIe独立网卡)。在Red Hat Enterprise Linux中,udev支持许多不同的命名方案。默认值是根据
固件、拓扑和位置信息分配固定名称。这样做的好处是,这些名称是完全自动的、完全可预测的,即
使添加或删除了硬件,它们仍然是固定的(不需要重新枚举),而且坏掉的硬件可以无缝地替换。缺点
是,它们有时比传统使用的eth0或wlan0名称更难读。例如:enp5s0。
为什么需要网卡一致性命名规则呢,简单一句话解释就是服务器通常有多块网卡,有板载集成的,同
时也有插在PCIe插槽的,例如下图中这台服务器,除了板载网卡外,还安装有两张PCIe接口的4口千
兆网卡和两张双口的10Gb光口网卡,这样加上板载的4个千兆网口,这台服务器现在一共有16个网络
端口,如果以传统方式命名网卡,名称混乱的问题对于管理员使用者来说都是一件头疼的事情。因为
传统的Linux系统的命名往往不一定准确对应网卡接口的物理顺序。比如eth0有可能不是第一块网卡
的第一个网口,有可能对应的是第二块网卡的某一个网口,这样就会造成混乱。为解决这类问题,就
需要网卡一致性命名规则。
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规则,那么这些规则将
具有优先级。
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
传统的不可预测的内核命名方案
内核参数(net.ifnames=0 biosdevname=0)
从下图中可以看出,同一台服务器和相同的操作系统,两次安装过程中,网卡设备的顺序并不相同。
这种变化是不可预知的且没有规律可寻。
可预测的网络接口设备名称
net.ifnames的命名规范为: 设备类型+设备位置+数字可预测的网络接口设备名称。默认内核参数
(biosdevname=0,net.ifnames=1)
从下图中可以看出,采用网卡一致性命名规则,板载网卡以eno1这样的方式命名,PCI独立网卡以
ens2f0的方式进行命名。并且顺序符合通常的预期。根据接口类型,名称有两个字符前缀:
● en for Ethernet,
● wl for wireless LAN (WLAN),
● ww for wireless wide area network (WWAN).
使用BIOSDEVNAME命名一致的网络设备
该特性通过biosdevname udev helper实用程序实现,将所有嵌入式网络接口、PCI卡网络接口和虚拟
函数网络接口的名称从现有的eth[0123…]更改为新的命名约定,如下图所示。请注意,除非系统是
Dell系统,或者biosdevname被启用,否则systemd命名方案将优先使用。
biosdevname程序使用来自系统BIOS的信息,特别是SMBIOS中包含的type 9(系统插槽)和type 41
(机载设备扩展信息)字段。如果系统的BIOS没有SMBIOS 2.6或更高版本,并且该数据不使用新的命名
约定。由于缺少具有正确SMBIOS版本和字段信息的bios,大多数较老的硬件不支持该特性。有关BIOS
或SMBIOS版本信息,请与硬件供应商联系。要使此功能生效,还必须安装biosdevname包,使用以下命
令进行安装。
yum install -y biosdevname
如下图,在安装时将内核参数设置为(biosdevname=1,net.ifnames=0),板载网卡以em1这样的方式
命名,PCI独立网卡以p2p1的方式进行命名。并且顺序符合通常的预期。
● em for Embedded network interface
● p2p1 is a PCIe network interface
● usb0 is for usb network interface
设备命名可以通过以下方式控制
● 通过识别网络接口设备
使用HWADDR指令在ifcfg文件中设置MAC地址,使udev能够识别它。该名称将取自设备指令给出的字
符串,按照惯例,该字符串与ifcfg后缀相同。例如,根据。
● 通过打开或关闭biosdevname
将使用biosdevname提供的名称(如果biosdevname可以确定一个名称)。
● 通过打开或关闭system -udev命名方案
将使用system -udev提供的名称(如果system -udev能够确定一个名称)。
使用传统命名方式时产生网卡乱序和漂移的问题
许多用户还是习惯使用传统的网卡命名方式,比如在安装系统时使用内核参数(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时。
案例分析
下面我们来看一个实际的例子,客户的服务器具有板载网卡,同时又安装了PCIe独立网卡,OS版本为
CentOS7.6并在安装系统时使用了内核参数(biosdevname=0,net.ifnames=0)。安装完系统后发现每
次系统重启后,网卡名称所对应的网卡都会发生变化,这将导致先前配置的网络接口不可用,最直接
的感受就是IP无法Ping通。如下图,安装完成后与第一次重启和第二次重启后网卡顺序都发生了变化
。这就是传统命名方式所带来的困扰,特别是在加装了PCIe网卡后,这种问题司空见惯,非常普遍。
1、对于网卡顺序不符合通常预期的问题,这个是没有办法解决的,我们前面已经介绍过了。
2、对于每次系统重启后网卡顺序发生漂移编号的问题,我们可以通过以下方式来解决。
3、通过“udevadm test /sys/class/net/eth0”查看系统中实际实际执行udev的rule。
4、根据规则,75-net-description.rules和80-net-name-slot.rules实际执行Scheme 1,2,3
5、60-net.rules 使用/lib/udev/rename_device这个程序,去查询/etc/sysconfig/network-
scripts/下所有以ifcfg-开头的文件,如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数
的网卡接口则选取DEVICE=yyyy中设置的名字作为网卡名称。
6、所以对于这个问题,起到影响作用的是60-net.rules。
7、修改udev rules文件,在/usr/lib/udev/rules.d/60-net.rules文件中将原有内容删除,然后将
每块网卡对应的MAC地址及修改后的名称依次写入/usr/lib/udev/rules.d/60-net.rules文件。
8、修改网卡配置文件,修改/etc/sysconfig/network-scripts/目录下的网卡配置文件,只需要修
改HWADDR对应的MAC地址即可。
9、将所有网卡配置文件修改完成后,重启系统。
10、修改后,反复重启系统10次,网卡漂移问题没有再发生,问题解决。