图片

CentOS/RHEL7网卡命名规则介绍

图片

传统的Linux服务器网卡的名称命名方式是从eth0,eth1,eth2....这种方式命名的,但是这个编号往往不一定准确对应网卡接口的物理顺序,常规模式下我们使用的服务器设备可能只有一张网卡,若网卡较多的情况下可能存在网卡乱序的问题。

从CentOS/RHEL7 起,可预见的命名规则变成了默认,通过这一规则,接口名称被自动基于固件,拓补结构和位置信息来确定。即使添加或者移除网络设备,接口名称仍然可以保持固定,而无需重新枚举,换掉的硬件也可以做到无缝替换。

目前新的命名规则有两种方式:Biosdevname & net.ifnames

默认情况下,systemd 会使用以下策略,采用支持的命名方案为接口命名:

  • 方案 1:如果固件或 BIOS 信息适用且可用,则使用整合了为板载设备提供索引号的固件或 BIOS 的名称(例如:eno1),否则请使用方案 2。
  • 方案 2:如果固件或 BIOS 信息适用且可用,则使用整合了为 PCI 快速热插拔插槽提供索引号的固件或 BIOS 名称(例如 ens1),否则请使用方案 3。
  • 方案 3:如果硬件连接器物理位置信息可用,则使用整合了该信息的名称(例如:enp2s0),否则请使用方案 5。
  • 方案 4:默认不使用整合接口 MAC 地址的名称(例如:enx78e7d1ea46da),但用户可选择使用此方案。
  • 方案 5:传统的不可预测的内核命名方案,在其他方法均失败后使用(例如:eth0)。

这个策略(如上所述)是默认策略。如果该系统已启用 biosdevname,则会使用该方案。注:启用 biosdevname 需要添加 biosdevname=1 作为内核命令行参数(Dell 系统除外),此时只要安装 biosdevname,就会默认使用该方案。如果用户已添加 udev 规则,该规则会更改内核设备名称,则会优先使用这些规则。

了解设备重命名过程

设备命名过程如下:

1、/usr/lib/udev/rules.d/60-net.rules 文件中的规则会让 udev 帮助工具 /lib/udev/rename\_device 查看所有 /etc/sysconfig/network-scripts/ifcfg-suffix 文件。如果发现包含 HWADDR 条目的 ifcfg 文件与某个接口的 MAC 地址匹配,它会将该接口重命名为 ifcfg 文件中由 DEVICE 指令给出的名称。

2、/usr/lib/udev/rules.d/71-biosdevname.rules 中的规则让 biosdevname 根据其命名策略重命名该接口,即在上一步中没有重命名该接口、已安装 biosdevname、且在 boot 命令行中将 biosdevname=0 作为内核命令给出。

3、 /lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID\_NET\_NAME\_ONBOARD、ID\_NET\_NAME\_SLOT、ID\_NET\_NAME\_PATH。注:有些设备属性可能处于未定义状态。

4、 /usr/lib/udev/rules.d/80-net-name-slot.rules 中的规则让 udev 重命名该接口,优先顺序如下:ID\_NET\_NAME\_ONBOARD、ID\_NET\_NAME\_SLOT、ID\_NET\_NAME\_PATH。并提供如下信息:没有在步骤 1 或 2 中重命名该接口,同时未给出内核参数 net.ifnames=0。如果一个参数未设定,则会按列表的顺序设定下一个。如果没有设定任何参数,则不会重命名该接口。

第 3 步和第4 步采用命名规则 1、2、3,可自选方案 4 。

使用 BIOSDVNAME 保持网络设备命名一致

通过 biosdevname udev 帮助程序实施此功能,可将所有内嵌网络接口名称、PCI 卡网络接口名称、以及现有eth[0123…] 的虚拟功能网络接口名称改为新的命名规范。

biosdevname 命名惯例

图片

系统要求

biosdevname 程序使用来自系统BIOS 的信息,特别是 SMBIOS 中包含。type 9(系统插槽)和 type 41(板载设备扩展信息)字段。如果系统的 BIOS 没有 SMBIOS 版本 2.6 或更高版本和这个数据,则不会使用新的命名规则。大多数老硬件不支持这个功能,因为缺少有正确 SMBIOS 版本的 BIOS 和字段信息。

必须安装 biosdevname 软件包方可或使用这个功能。要安装这个软件包,请作为 root 用户运行以下命令:

yum install biosdevname

启用和禁用该功能

要禁用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:

biosdevname=0

要启用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:

biosdevname=1

除非系统达到最低要求,否则会忽略这个选项,同时系统会使用 systemd 命名方案。

如果指定 biosdevname 安装选项,那么它就必须在该系统的声明周期内作为其引导选项使用。

控制网络设备名称选择

可以如下方式控制设备命名:

根据网络接口设备识别

在 ifcfg 文件中使用 HWADDR 指令设定 MAC 地址,这样就可由 udev 识别。会从 DEVICE 指令提供的字符串中提取该名称,根据惯例,该名称应使用与 ifcfg 相同的后缀。例如:ifcfg-eth0。

通过打开或关闭 biosdevname

可使用由 biosdevname 提供的名称(如果 biosdevname 可确定)。

通过打开或关闭 systemd-udev 的命名方案

可使用由systemd-udev 提供的名称(如果 systemd-udev 可确定)。

禁用一致网络设备命名:

请选择以下方法之一禁用一致网络设备命名:

1、通过屏蔽默认策略中的 udev 规则文件,禁止分配固定名称,以便重新使用不可预期的内核名称。可为 /dev/null 生成一个符号链接完成“屏蔽”。请作为 root 用户运行以下命令:

ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules

2、创建自己的手动命名方案。例如:将接口命名为 “internet0”、“dmz0” 或 “lan0”。要创建自己的 udev 规则文件,并为那些设备设置 NAME 属性。确定在使用默认策略文件前使用该文件。例如:将其命名为 /etc/udev/rules.d/70-my-net-names.rules。

3、修改策略文件,使其选择不同的命名方案后。例如:默认根据接口的 MAC 地址命名所有接口。作为 root 复制默认策略文件,如下:

cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-slot.rules

4、在 /etc/udev/rules.d/ 目录中编辑文件,并根据需要修改。

在 GRUB 2 菜单的内核命令行中添加以下指令

net.ifnames=0

更新所有 GRUB 2 内核菜单条目,作为 root 用户输入以下命令:

grub2-mkconfig -o /boot/grub2/grub.cfg

PS:以上内容引用Redhat官方文章,并有做部分修改:

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming

若要使用旧的方式去命名网卡该如何处理?

图片

以上介绍了关于CentOS/RHEL7命名规则,但在某些应用场景下,客户还是需要在CentOS/RHEL7的系统下采用CentOS6的命名规则,但这种情况下CentOS/RHEL7不能很好的支持,大概率会产生乱序问题;

一般做法如下:

我们需要手动修改grub文件,增加 net.ifnames=0 biosdevname=0

GRUB_CMDLINE_LINUX="CRASHKERNEL=auto net.ifnames=0 biosdevname=0 rhgb quiet"

再执行:

grub2-mkconfig -o /boot/grub2/grub.cfg

重启系统

然后添加udev规则:

在”/etc/udev/rules.d“目录中创建一个网卡规则”70-persistent-net.rules“,并写入下面的语句:

SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{type}=="1" ,KERNEL=="0000:08:00.1",NAME="eth0"
SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{type}=="1" ,KERNEL=="0000:08:00.2",NAME="eth1"
SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{type}=="1" ,KERNEL=="0000:58:00.1",NAME="eth2"
SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{type}=="1" ,KERNEL=="0000:58:00.2",NAME="eth3"

busid的获取方式为(其他网卡同理):

ethtool -i eth0
bus-info:0000:58:00.0

但此时网卡依然乱序:

图片

我的某客户环境下,有4个网口(两个网卡,一个为intel x722,一个为博通千兆网卡),rules中无法使用eth0-eth3这几个命名(无效),目前猜测是由于系统有某些配置文件优先级高于70-persistent-net.rules(eth4之后的任何命名均不存在问题)。

从Redhat官方的解释来看,CentOS/RHEL7已经不支持这种命名方式,并不给与相关技术支持。

我们采取折中方法,根据客户实际机器网卡配置不同型号为切入口,调整驱动加载顺序,来解决客户的问题;

GRUB_CMDLINE_LINUX="CRASHKERNEL=auto net.ifnames=0 biosdevname=0 rdloaddriver=tg3 rdloaddriver=i40e rhgb quiet"

图片

综上:若客户采用CentOS/RHEL7以上的系统,我们强烈建议不采用旧的方法进行网卡命名,若一定要采用该方法,则建议使用不同品牌网卡通过调整网卡驱动加载顺序的方式规避问题。

文章转载联想TSE技术文档

本文二维码
最后修改:2023 年 11 月 06 日
如果觉得我的文章对你有用,请随意赞赏