Redhat 网络设备一致性命名一

概述

本文档旨在解疑Linux操作系统对网络设备命名过程以及提供网络设备命名故障排除方法。
本文档仅适用于Redhat7/Redhat8。

命令利弊

Red Hat Enterprise Linux 7 提供在网络接口中使用一致且可预期的网络设备命名方法。这些功能会更改系统中的网络接口名称,以便定位和区分这些接口。
通常 Linux 中的网络接口枚举如下 eth[0123…],但这些名称不一定与底盘实际标签对应。使用多个网络适配器的现代服务器平台会有不确定和不直观的接口命名。这会影响主板内嵌的网络适配器(集成网卡主板(Lan-on-Motherboard),或 LOM)及外接(单个或多个)适配器。
在 Red Hat Enterprise Linux 7 中,udev 支持大量不同的命名方案。默认是根据固件、拓扑及位置信息分配固定名称。这样做的优点是命名可完全自动进行,并可预期,即使添加或删除硬件后也会保留其名称(不会出现重复枚举的情况),同时可顺利更换损坏的硬件。不足之处是,相比传统的名称,比如 eth0 或 wlan0,这些名称有时会比较难理解。例如:enp5s0。

术语说明

udev(7) man page — 描述 Linux 动态设备管理守护进程 udevd。
    udev supplies the system software with device events, manages permissions of device nodes and may create additional symlinks in the /dev directory, or renames
           network interfaces. The kernel usually just assigns unpredictable device names based on the order of discovery. Meaningful symlinks or network device names
           provide a way to reliably identify devices based on their properties or current configuration.
           The udev daemon, systemd-udevd.service(8), receives device uevents directly from the kernel whenever a device is added or removed from the system, or it
           changes its state. When udev receives a device event, it matches its configured set of rules against various device attributes to identify the device. Rules
           that match may provide additional device information to be stored in the udev database or to be used to create meaningful symlink names.
           All device information udev processes is stored in the udev database and sent out to possible event subscribers. Access to all stored data and the event
           sources is provided by the library libudev.
systemd(1) man page — 描述 systemd 系统和服务管理器。
biosdevname(1) man page — 描述获取 BIOS 给定设备名称的程序。
    biosdevname takes a kernel device name as an argument, and returns the BIOS-given name it "should" be.

网络设备重命名过程

设备命名过程如下:Redhat7/Redhat8使用biosdevname\systemd-udev\rules配置文件来完成对设备的命名以及重启后的重命名。

Biosdevname

  1. 系统要求
    biosdevname 程序使用来自系统BIOS 的信息,特别是 SMBIOS 中包含。type 9(系统插槽)和 type 41(板载设备扩展信息)字段。如果系统的 BIOS 没有 SMBIOS 版本 2.6 或更高版本和这个数据,则不会使用新的命名规则。大多数老硬件不支持这个功能,因为缺少有正确 SMBIOS 版本的 BIOS 和字段信息。有关 BIOS 和 MSBIOS 版本信息,请联络您的硬件销售商。
    必须安装 biosdevname 软件包方可或使用这个功能。要安装这个软件包,请作为 root 用户运行以下命令:
    ~]# yum install biosdevname
  2. 启用和禁用该功能
    要禁用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:
    biosdevname=0
    要启用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:
    biosdevname=1
    除非系统达到最低要求,否则会忽略这个选项,同时系统会使用 systemd 命名方案,如本章开始部分所述。
    如果指定 biosdevname 安装选项,那么它就必须在该系统的声明周期内作为其引导选项使用。
  3. 命名惯例
    通过 biosdevname udev 帮助程序实施此功能,可将所有内嵌网络接口名称、PCI 卡网络接口名称、以及现有 eth[0123…] 的虚拟功能网络接口名称改为新的命名规范,如 表 8.3 “biosdevname 命名惯例” 所示。注:除非使用 Dell 系统,或特别明确说明启用 biosdevname(如 第 8.6.2 节 “启用和禁用该功能” 所述),否则会优先使用 systemd 命名惯例。


    image.png

Systemd-udev

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

  • 方案 1:如果固件或 BIOS 信息适用且可用,则使用整合了为板载设备提供索引号的固件或 BIOS 的名称(例如:eno1),否则请使用方案 2。
  • 方案 2:如果固件或 BIOS 信息适用且可用,则使用整合了为 PCI 快速热插拔插槽提供索引号的固件或 BIOS 名称(例如 ens1),否则请使用方案 3。
  • 方案 3:如果硬件连接器物理位置信息可用,则使用整合了该信息的名称(例如:enp2s0),否则请使用方案 5。
  • 方案 4: 默认不使用整合接口 MAC 地址的名称(例如:enx78e7d1ea46da),但用户可选择使用此方案。
  • 方案 5:传统的不可预测的内核命名方案,在其他方法均失败后使用(例如: eth0)。
    这个策略(如上所述)是默认策略。如果该系统已启用 biosdevname,则会使用该方案(biosdevname)。
    注:启用 biosdevname 需要添加 biosdevname=1 作为命令行参数(Dell 系统除外),此时只要安装 biosdevname,就会默认使用该方案。如果用户已添加 udev 规则,该规则会更高内核设备名称,则会优先使用这些规则。

可预期网络接口设备名称

根据接口类型以两个字母开头:
1. en 代表以太网,
2. wl 代表无线局域网(WLAN),
3. ww 代表无线广域网(WWAN)。
名称有以下类型:


image.png

• 所有多功能 PCI 设备都在其设备名称中包含 [f<function>] 号,其中包括 function 0 设备。
• 在 USB 设备中会组成集线器端口号完整链。如果该名称超过 15 个字符上限,则无法导出该名称。
• 已取消 USB configuration descriptors == 1 和 USB interface descriptors == 0(如果只有一个 USB 配置或接口存在,则默认值为 configuration == 1 及 interface == 0)。

设备重命名过程

  • /usr/lib/udev/rules.d/60-net.rules 文件中的规则会让 udev 帮助工具 /lib/udev/rename_device 查看所有 /etc/sysconfig/network-scripts/ifcfg-suffix 文件。如果发现包含 HWADDR 条目的 ifcfg 文件与某个接口的 MAC 地址匹配,它会将该接口重命名为 ifcfg 文件中由 DEVICE 指令给出的名称。
  • /usr/lib/udev/rules.d/71-biosdevname.rules 中的规则让 biosdevname 根据其命名策略重命名该接口,即在上一步中没有重命名该接口、已安装 biosdevname、且在 boot 命令行中将 biosdevname=0 作为内核命令给出。
  • /lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH。注:有些设备属性可能处于未定义状态。
  • /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,如 第 8.1 节 “命名方案层级结构” 所述。第 2 步在 第 8.6 节 “使用 biosdvname 保持网络设备命名一致” 中有详细论述。

实际测试

udev守护进程默认开启

[root@localhost ~]# systemctl status systemd-udevd
● systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/usr/lib/systemd/system/systemd-udevd.service; static; vendor preset: disabled)
   Active: active (running) since 一 2020-07-06 11:14:35 CST; 5min ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 1151 (systemd-udevd)
   Status: "Processing with 136 children at max"
   CGroup: /system.slice/systemd-udevd.service
           └─1151 /usr/lib/systemd/systemd-udevd

7月 06 11:14:35 localhost systemd[1]: Starting udev Kernel Device Manager...
7月 06 11:14:35 localhost systemd-udevd[1151]: starting version 219
7月 06 11:14:35 localhost systemd[1]: Started udev Kernel Device Manager.

dmidecode查看网卡设备

[root@localhost ~]# lspci |grep net
0000:08:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
0000:08:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
0000:08:00.2 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
0000:08:00.3 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
[root@localhost ~]# dmidecode |grep -i "onboard lan*"
        Reference Designation: Onboard LAN1
        Reference Designation: Onboard LAN2
        Reference Designation: Onboard LAN3
        Reference Designation: Onboard LAN4

系统下查看网卡名称


image.png

总结
eno1-eno4分别对应LAN1-LAN4,可以通过mac地址来进行对应。

实际测试-使用biosdevname

biosdevname修改前


image.png

启用biosdevname


image.png

image.png

总结:
修改成biosdevname后,将使用biosdevname的命名规则。
eno1没有改名称的原因是,eno1的网卡配置文件编入了HWADDR跟devicename的对应关系,这个优先级更高一点;

实际测试-测试ifcfg-suffix的优先级

image.png

总结:
修改ifcfg配置文件,重启网络服务,不会对网卡设备名称生效,需要reboot server来生效;

补充信息

下面有些信息可能对你有用:

  • CentOS 中用udev来对网卡设备命名。
  • udev 网卡规则文件及顺序
    从 /lib/udev/rules.d 可提取出网卡名称相关的配置文件,执行顺序如下:

/usr/lib/udev/rules.d/60-net.rules
/usr/lib/udev/rules.d/71-biosdevname.rules
/lib/udev/rules.d/75-net-description.rules
/usr/lib/udev/rules.d/80-net-name-slot.rules
/usr/lib/udev/rules.d/80-net-setup-link.rules
/usr/lib/udev/rules.d/99-systemd.rules

  1. 60-net.rules
    使用/lib/udev/rename_device这个程序,去查询/etc/sysconfig/network-scripts/下所有以ifcfg-开头的文件
    如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数的网卡接口
    则选取DEVICE=yyyy中设置的名字作为网卡名称。
    ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?", NAME="$result"
    在不修改 udev 规则的条件下,/etc/sysconfig/network-scripts/的 ifcfg-* 文件的优先最高。在ifcfg-*文件中将DEVICE 和 mac 绑定后重命名网卡名称和避免网卡乱序。
  2. 71-biosdevname.rules
    如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。
    主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (OnboardDevices Extended Information)
    不过要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序。
    SUBSYSTEMS=="pci", PROGRAM="/sbin/biosdevname --smbios 2.6 --nopirq --policy physical -i %k", NAME="%c" OPTIONS+="string_escape=replace"
  3. 75-net-description.rules
    udev通过检查网卡信息,填写很多设备属性值,包括如下这些udev的属性值,
    udevadm test-builtin net_id /sys/class/net/xxx 网络接口比如eth0 看其中值。
    ID_NET_NAME_MAC=enx000000000316
    ID_NET_NAME_ONBOARD=eno1
    ID_NET_LABEL_ONBOARD=enOnboard LAN1
    ID_NET_NAME_PATH=enp176s0f2
    通过udevadm info -e | grep -A 20 ^P.*enp 也可看到信息
    ID_NET_NAME_ONBOARD
    ID_NET_NAME_SLOT
    ID_NET_NAME_PATH
    ID_NET_NAME_MAC
  4. 80-net-name-slot.rules
    如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数
    则udev依次尝试使用以下属性值来命名网卡,这些属性值来自udev规则文件75-net-description.rules
    如果这些属性值都没有,则网卡不会被重命名,沿用内核给定的ethx来命名
    NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="env{ID_NET_NAME_ONBOARD}" NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="env{ID_NET_NAME_SLOT}"
    NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}"
  5. 80-net-setup-link.rules
    用内建的的path_id 和net_setup_link来查询 键值ID_NET_NAME,并赋给设备名字
    NAME=="", ENV{ID_NET_NAME}!="", NAME="$env{ID_NET_NAME}"
  6. 99-systemd.rules
    用sysctl 改变内核的一些默认参数。
    /usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/name --prefix=/net/ipv4/neigh/name --prefix=/net/ipv6/conf/name --prefix=/net/ipv6/neigh/name'
    所以针对60-net.rules, 可以添加类似如下规则文件去固定命名。
    /# PCI device 0x8086:0x100e (e1000)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:84:f3:82", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth2"
    /# PCI device 0x8086:0x100e (e1000)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:b0:c8:7f", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth0"
    /# PCI device 0x8086:0x100e (e1000)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:63:bd:f1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth1"
    也可以修改/etc/sysconfig/network-scripts/下的 ifcfg-* 文件,在ifcfg-*文件中将DEVICE 和 mac 绑定,固定网卡名称,其中device条目即为设备名字,如DEVICE=eno2

如下是一下补充信息

查看网卡的biosdevname
biosdevname -i eno1
新的命名规则如下:
em[1-N] 表示主板(嵌入式)NIC(# 对应机箱标签)
pci<slot>#<port> 表示 PCI 插槽中的卡,端口 1 至 N
NPAR & SR-IOV 设备增加后缀 _<vf>,从 0 至 N,取决于各端口可用的分区或虚拟功能的数量。
其他 Linux 命名规则,如 .<vlan> 和 :<alias> 后缀,保持不变且仍然适用。
由此,Linux 网络接口名称与外部可见的网络端口(RJ-45 机架)之间建立了明确的对照。

网卡命名规范

在 CentOS 中,systemd 和 udevd 支持大量不同的命名方案。默认行为是根据固件、拓扑及位置信息分配固定名称。这个命名方法的优点是完全自动且可预测,即使添加或者删除硬件也不会变化(未发生重新列举),且可以在不产生任何影响的情况下替换破坏的硬件。这个行为的缺点是名称有时比之前使用的名称难读,例如使用 enp5s0 替换 eth0。
目前 udevd 本身就支持下列命名方案。

  • 方案 1
    合并固件或者 BIOS 的名称为板载设备提供索引号的名称,例如:eno1。如果固件信息适用且可用,则 systemd 默认情况下根据这个方案命名接口,同时使用方案 2 作为备选。
  • 方案 2
    合并固件或者 BIOS 的名称提供 PCI 快捷热插拔插槽索引号的名称,例如 ens1。如果固件信息适用且可用,则 systemd 默认情况下根据这个方案命名接口,同时使用方案 3 作为备选。
  • 方案 3
    合并硬件连接器物理位置的名称,例如:enp2s0。如果固件信息适用且可用,则 systemd 默认情况下根据这个方案命名接口,同时使用方案 5 作为备选。
  • 方案 4
    合并接口 MAC 地址的名称,例如:enx78e7d1ea46da。默认情况下 systemd 不会根据这个方案命名接口,但如果需要可以启用这个功能。
  • 方案 5
    传统的不可预测内核属性 ethX 命名,例如:eth0。如果其他所有方法都失败,systemd 就根据这个方案命名接口。
    如果该系统启用了 BIOSDEVNAME,或者用户已添加更改内核设备名称的 udevd 规则,则这些规则将替代默认的 systemd 策略。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容