本页内容

  • 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)设备,将被命名为 " pp[_]"

更多细节:

  • 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

结果如下。

在 CentOS 上将网络接口重命名为 eth0

因此,我们有两块网络接口 '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

保存并退出。

在 CentOS 上将网络接口重命名为 eth0

之后,使用如下 'grub2-mkconfig' 命令生成新的 grub 配置。

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

你将得到如下结果。

在 CentOS 上将网络接口重命名为 eth0

编辑网络脚本

接下来,我们需要在位于 '/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

在 CentOS 上将网络接口重命名为 eth0

测试

重新登录后,使用以下命令查看可用的网络接口。

ifconfig
ip addr

你将看到如下结果。

在 CentOS 上将网络接口重命名为 eth0

CentOS 8 系统上的两块网络接口都已被更改,现在使用传统的命名约定。这些网络接口是通过在系统启动期间禁用 'biosdevname' 来实现更改的。

可选步骤

如果你想查看系统启动过程中更改的详细信息,可以运行以下命令。

dmesg | grep -i eth

你会看到默认的接口名称已更改为传统名称 'ethX',这是通过自定义 udev 规则更改的。

在 CentOS 上将网络接口重命名为 eth0

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"

保存并退出。

在 CentOS 上将网络接口重命名为 eth0

编辑网络脚本

接下来,进入 '/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

在 CentOS 上将网络接口重命名为 eth0

测试

重新登录后,使用以下命令查看所有可用的网络接口。

ifconfig
ip addr

你将看到已分配的新接口 'ethX'。

在 CentOS 上将网络接口重命名为 eth0

可选步骤

如果你想查看系统启动过程中更改的详细信息,可以运行以下命令。

dmesg | grep -i eth

你会看到 'ensX' 名称已更改为传统名称 'ethX',这是通过自定义 udev 规则更改的。

在 CentOS 上将网络接口重命名为 eth0

参考

  • https://access.redhat.com/documentation/