一致性网络设备命名,即 Consistent Network Device Naming 。
服务器通常有多块网卡,有板载集成(集成网卡主板(Lan-on-Motherboard),或 LOM)的,同时也有插在 PCIe 插槽的。Linux 系统的命名原来是 eth0
,eth1
这样的形式,但是这个编号往往不一定准确对应网卡接口的物理顺序。为解决这类问题,Dell 开发了 biosdevname
方案。systemd v197 版本中将 Dell 的方案作了进一步的一般化拓展。目前的 CentOS 7 既支持 Dell 的 biosdevname
,也支持 systemd
的方案。
在 CentOS 7 中,udev 支持大量不同的命名方案。默认是根据固件、拓扑及位置信息分配固定名称。这样做的优点是命名可完全自动进行,并可预期,即使添加或删除硬件后也会保留其名称(不会出现重复枚举的情况),同时可顺利更换损坏的硬件。不足之处是,相比传统的名称,比如 eth0
或 wlan0
,这些名称有时会比较难理解。例如:enp5s0
。
命名方案层级结构
默认情况下,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 。
了解可预期网络接口设备名称
根据接口类型以两个字母开头:
1、en 代表以太网,
2、wl 代表无线局域网(WLAN),
3、ww 代表无线广域网(WWAN)。
名称有以下类型:
设备名称类型
所有多功能 PCI 设备都在其设备名称中包含
[f<function>]
号,其中包括 function 0 设备。在 USB 设备中会组成集线器端口号完整链。如果该名称超过 15 个字符上限,则无法导出该名称。
已取消 USB configuration descriptors == 1 和 USB interface descriptors == 0(如果只有一个 USB 配置或接口存在,则默认值为 configuration == 1 及 interface == 0)。
使用 BIOSDVNAME 保持网络设备命名一致
通过 biosdevname udev 帮助程序实施此功能,可将所有内嵌网络接口名称、PCI 卡网络接口名称、以及现有eth[0123…]
的虚拟功能网络接口名称改为新的命名规范。
注:除非使用 Dell 系统,或特别明确说明启用 biosdevname,否则会优先使用 systemd
命名惯例。
biosdevname 命名惯例
系统要求
biosdevname 程序使用来自系统BIOS 的信息,特别是 SMBIOS 中包含。type 9(系统插槽)和 type 41(板载设备扩展信息)字段。如果系统的 BIOS 没有 SMBIOS 版本 2.6 或更高版本和这个数据,则不会使用新的命名规则。大多数老硬件不支持这个功能,因为缺少有正确 SMBIOS 版本的 BIOS 和字段信息。
必须安装 biosdevname 软件包方可或使用这个功能。要安装这个软件包,请作为 root 用户运行以下命令:
1 | ~]# yum install biosdevname |
启用和禁用该功能
要禁用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:
1 | biosdevname=0 |
要启用这个功能,请在安装过程中及安装后,在 boot 命令行中使用以下选项:
1 | biosdevname=1 |
除非系统达到最低要求,否则会忽略这个选项,同时系统会使用 systemd
命名方案。
如果指定 biosdevname
安装选项,那么它就必须在该系统的声明周期内作为其引导选项使用。
控制网络设备名称选择
可以如下方式控制设备命名:
根据网络接口设备识别
在 ifcfg
文件中使用 HWADDR
指令设定 MAC 地址,这样就可由 udev 识别。会从 DEVICE
指令提供的字符串中提取该名称,根据惯例,该名称应使用与 ifcfg
相同的后缀。例如:ifcfg
-eth0。
通过打开或关闭 biosdevname
可使用由 biosdevname 提供的名称(如果 biosdevname 可确定)。
通过打开或关闭 systemd-udev
的命名方案
可使用由 systemd-udev
提供的名称(如果 systemd-udev
可确定)。
禁用一致网络设备命名
请选择以下方法之一禁用一致网络设备命名:
- 通过屏蔽默认策略中的 udev 规则文件,禁止分配固定名称,以便重新使用不可预期的内核名称。可为
/dev/null
生成一个符号链接完成“屏蔽”。请作为 root 用户运行以下命令:
1 | ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules |
创建自己的手动命名方案。例如:将接口命名为 “internet0”、“dmz0” 或 “lan0”。要创建自己的 udev 规则文件,并为那些设备设置 NAME 属性。确定在使用默认策略文件前使用该文件。例如:将其命名为
/etc/udev/rules.d/70-my-net-names.rules
。修改策略文件,使其选择不同的命名方案后。例如:默认根据接口的 MAC 地址命名所有接口。作为
root
复制默认策略文件,如下:
1 | cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-slot.rules |
在 /etc/udev/rules.d/
目录中编辑文件,并根据需要修改。
- 在 GRUB 2 菜单的内核命令行中添加以下指令:
1 | net.ifnames=0 |
更新所有 GRUB 2 内核菜单条目,作为 root 用户输入以下命令:
1 | ~]# grubby --update-kernel=ALL --args=net.ifnames=0 |
原文链接: