本页内容
- 1. 传统命名约定
- 2. Biosdevname
- 3. Systemd Udev 规则
- 设置 Grub2
- 编辑网络脚本
- 测试
- 可选步骤
- 创建自定义 Udev 规则
- 编辑网络脚本
- 测试
- 可选步骤
在本文中,我们将了解 Linux 的接口命名方式。本文面向基于 RHEL 的 Linux 发行版,如 AlmaLinux、CentOS 和 Rocky Linux。你将了解 Linux 上的网络接口是如何命名为 eth(X)、ens(X)、eno(X) 等的。
首先,我们将了解 Linux 系统上网络接口的命名概念,包括经典命名方案、biosdevname 以及 system udev 策略。
1. 传统命名约定
传统命名约定(Traditional Naming Convention)是 Linux 内核驱动提供的默认传统接口命名方案。众所周知,在传统命名约定下,以太网设备命名为 eth(n),无线局域网设备命名为 wlan(n),usbnet 命名为 usb(n)。
在传统命名约定下,内核驱动会将所有网络硬件同等对待。它足以告诉我们连接的类型,但对于你所使用的硬件本身,提供的信息十分有限。
2. Biosdevname
Biosdevname 是戴尔(Dell)发起的一个项目,旨在为网络设备提供一致的命名。Biosdevname 是一个 udev 辅助工具,它根据系统 BIOS 建议的硬件物理位置,为网络设备提供一致的命名机制。
以下是 biosdevname 提供的默认命名方案策略:
- 对于板载网络设备,将被命名为 " em
[_ ] " - 对于附加网卡(add-on NIC)设备,将被命名为 " p
p [_ ]"
更多细节:
- em = 板载网络设备
= 对应的 PCI 插槽 = 网卡端口号(如果是多端口网卡) = SRIOV 和/或 NPAR 实例索引 - 附加网卡(add-on NIC)上的 ' p ' 分别代表 pci 插槽和端口
3. Systemd Udev 规则
如今,一些流行的 Linux 发行版(如 Ubuntu、CentOS 和 Debian)都使用 Systemd 作为系统和服务管理器。自 197 版本起,systemd 加入了与原生网络接口命名策略类似的命名方案和策略,类似于 Biosdevname。
以下是基于 Systemd 的系统中网络接口命名的 5 种策略:
- 对于板载网络设备,将被命名为 'eno1'、'eno2' 等。
- 对于包含固件/BIOS 提供的 PCI Express 热插拔插槽索引号的,命名为 'ens1'。当第一种策略失败时适用,主要用于 VMWare 和 KVM 等虚拟机。
- 包含硬件连接器物理位置的名称(例如:enp2s0),在适用时采用,否则在所有其他情况下直接回退到方案 5。
- 包含接口 MAC 地址的名称(例如:enx78e7d1ea46da),默认不启用,但用户可以选择使用。
- 当所有其他方法都失败时,将使用传统的、不可预测的内核命名方案(例如:eth0)。
现在我们已经了解了 Linux 接口命名约定。
接下来,我们将向你展示如何将网络接口名称更改为传统的 'et0'、eth1 等。有两种方法可以实现:通过 'biosdevname' 以及通过 'systemd udev rules' 来更改网络接口名称。
1. 通过禁用 Biosdevname 将接口名称改为 eth0
正如开头所述,biosdevname 是戴尔(Dell)创建的一个 udev 工具,用于根据系统 BIOS 的建议为网络接口命名。默认情况下,Linux 系统上已安装 biosdevname 软件包。
要在 Linux 系统上禁用 biosdevname,你需要通过编辑系统上的 grub 配置,在引导级别将其禁用。
在继续之前,我们先使用以下命令查看系统当前的接口。
ifconfig -a
ip addr
结果如下。

因此,我们有两块网络接口 'ens3' 和 'ens8'。
接下来,我们将在 CentOS 8 系统上,通过编辑每个接口的 grub 配置和网络配置,将这两块接口分别重命名为 'eth0' 和 'eth1'。
设置 Grub2
进入 '/etc/sysconfig/' 目录,并使用 vim 编辑器编辑 'grub' 配置。
cd /etc/sysconfig/
vim grub
在 'GRUB_CMDLINE_LINUX' 配置项中,添加以下配置以禁用 biosdevname 和 net.ifnames 内核参数。
net.ifnames=0 biosdevname=0
保存并退出。

之后,使用如下 'grub2-mkconfig' 命令生成新的 grub 配置。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
你将得到如下结果。

编辑网络脚本
接下来,我们需要在位于 '/etc/sysconfig/network-scripts/' 目录的配置中重命名这两块网络接口。
进入 '/etc/sysconfig/network-scripts/' 目录。
cd /etc/sysconfig/network-scripts/
将两块接口的名称重命名为 'ifcfg-ethX'。
mv ifcfg-enp0s3 ifcfg-eth0
mv ifcfg-enp0s8 ifcfg-eth1
之后,使用以下 sed 命令将两块文件中的接口都改为 'ethX'。
sed -i -e 's/enp0s3/eth0/g' ifcfg-eth0
sed -i -e 's/enp0s8/eth1/g' ifcfg-eth1
现在重启 CentOS 8 系统。
sudo reboot

测试
重新登录后,使用以下命令查看可用的网络接口。
ifconfig
ip addr
你将看到如下结果。

CentOS 8 系统上的两块网络接口都已被更改,现在使用传统的命名约定。这些网络接口是通过在系统启动期间禁用 'biosdevname' 来实现更改的。
可选步骤
如果你想查看系统启动过程中更改的详细信息,可以运行以下命令。
dmesg | grep -i eth
你会看到默认的接口名称已更改为传统名称 'ethX',这是通过自定义 udev 规则更改的。

2. 使用 Udev 规则将接口名称改为 eth0
另一种将网络接口名称更改为 eth0 等传统命名的方式是创建自定义 udev 规则。通过使用自定义 udev 规则,网络接口的更改将在系统启动后生效。
创建自定义 Udev 规则
现在进入 '/etc/udev/rules.d/' 目录,并使用 vim 编辑器创建名为 '70-persistent-net.rules' 的自定义规则。
cd /etc/udev/rules.d/
vim 70-persistent-net.rules
将其中的 MAC 地址和默认接口 'ens3'、'ens8' 替换为你自己的,然后粘贴进去。
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:6c:a8:e6", ATTR{type}=="1", KERNEL=="ens3", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:97:cf:33", ATTR{type}=="1", KERNEL=="ens8", NAME="eth1"
保存并退出。

编辑网络脚本
接下来,进入 '/etc/sysconfig/networ-scripts' 目录。
cd /etc/sysconfig/network-scripts/
将两块接口的名称重命名为 'ifcfg-ethX'。
mv ifcfg-enp0s3 ifcfg-eth0
mv ifcfg-enp0s8 ifcfg-eth1
之后,使用以下 sed 命令将两块文件中的接口都改为 'ethX'。
sed -i -e 's/enp0s3/eth0/g' ifcfg-eth0
sed -i -e 's/enp0s8/eth1/g' ifcfg-eth1
现在重启 CentOS 8 服务器。
sudo reboot

测试
重新登录后,使用以下命令查看所有可用的网络接口。
ifconfig
ip addr
你将看到已分配的新接口 'ethX'。

可选步骤
如果你想查看系统启动过程中更改的详细信息,可以运行以下命令。
dmesg | grep -i eth
你会看到 'ensX' 名称已更改为传统名称 'ethX',这是通过自定义 udev 规则更改的。

参考
- https://access.redhat.com/documentation/