更新时间:2025-07-21 GMT+08:00

网卡重命名

前言

在早期版本的操作系统(如Fedora 13、Ubuntu 15、CentOS 6及更早版本)中,网络接口的命名方式为eth0、eth1、eth2等。Linux内核通过组合固定前缀和索引为网络接口分配名称。在系统初始化时,内核会根据索引顺序为网络设备分配名称,例如eth0代表系统启动时检测到的第一个以太网接口。如果添加了额外的网络接口,设备名称的分配顺序则不再固定,因为系统重启后设备可能会按不同的顺序初始化。

为了解决这一问题并提高网络设备的可识别性和一致性,现代Linux发行版采用了一致的网络设备命名规范,并通过udev设备管理器来实现这一规范。udev支持多种命名方案,默认情况下,它根据固件信息、拓扑结构及设备物理位置分配网络接口的名称。系统中的网卡设备重命名服务由systemd-udevd提供支持,以确保网络设备名称的一致性和稳定性。

一致的网络命名规则

命名规范为:设备类型 + 设备位置。

设备类型

  • en:以太网
  • wl:无线局域网
  • ww:无线广域网

设备位置

表1 一致的网络命名规则设备位置含义表

格式

含义

o<on-board_index_number>

主板bios内置的网卡

s<hot_plug_slot_index_number>[f<function>][d<device_id>]

主板bios内置的PCI-E网卡

x<MAC>

MAC地址

p<bus>s<slot>[f<function>][d<device_id>]

PCI-E独立网卡

P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][.][c<config>][i<interface>]

USB网卡

网卡重命名步骤

本小节详细介绍网卡重命名方法。以将ens5修改为eth0为例。

  1. 修改网卡配置文件。

    • 如果网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ens5存在,将原配置文件ifcfg-ens5重命名为ifcfg-eth0:
      mv /etc/sysconfig/network-scripts/ifcfg-ens5 /etc/sysconfig/network-scripts/ifcfg-eth0

      编辑ifcfg-eth0配置文件,将NAME和DEVICE参数的值修改为新网卡名eth0。

    • 如果网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ens5不存在,请直接创建配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,并添加以下内容:
      DEFROUTE=yes
      BOOTPROTO=dhcp
      NAME=eth0
      DEVICE=eth0
      ONBOOT=yes

  2. 修改GRUB配置。

    编辑/etc/default/grub,添加net.ifnames=0 biosdevname=0到GRUB_CMDLINE_LINUX项中。修改完成后,执行以下命令重新加载GRUB配置:
    grub2-mkconfig -o /boot/grub2/grub.cfg

  3. 创建持久化规则文件。

    在/etc/udev/rules.d/中创建70-persistent-net.rules文件,并添加以下规则内容:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="eth0"

  4. 重启节点。

此外,用户也可以通过执行以下脚本来修改网卡名称。执行脚本后,按照提示输入修改前的网卡名称和修改后的网卡名称。完成操作后,重新启动系统,网卡将被重命名为新的名称。

#!/bin/bash

function check_networkcard() {
    while true; do
        echo "请输入要修改的网卡名称(例如:ens33):"
        read interface_name
        if [[ -z "$interface_name" ]]; then
            echo "输入不能为空,请重新输入"
            continue
        fi
        ifconfig -a | grep -q "$interface_name"
        if [[ $? -eq 0 ]]; then
            break
        else
            echo "网卡 $interface_name 不存在,请重新输入"
        fi
    done
}
function modify_grub() {
    sed -i 's/resume/net.ifnames=0 biosdevname=0 &/' /etc/sysconfig/grub
    grub2-mkconfig -o /boot/grub2/grub.cf
}
function modify_adaptername() {
    while true; do
        echo "请输入修改后的网卡名称(例如:eth0):"
        read new_interface_name
        if [[ -z "$new_interface_name" ]]; then
            echo "输入不能为空,请重新输入"
            continue
        else
            break
        fi
    done
    cd /etc/sysconfig/network-scripts/
    if [[ -e ifcfg-$interface_name ]]; then
        mv ifcfg-$interface_name ifcfg-$new_interface_name
        sed -i "s/$interface_name/$new_interface_name/g" ifcfg-$new_interface_name
    else
       sudo cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-$new_interface_name
DEFROUTE=yes
BOOTPROTO=dhcp
NAME="$new_interface_name"
DEVICE="$new_interface_name"
ONBOOT=yes
EOF
    fi
}
function reload_network() {
    mac=$(ip link show $interface_name | awk '/ether/{print $2}')
    echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$mac\", NAME=\"$new_interface_name\"" >> /etc/udev/rules.d/70-persistent-net.rules
}
function clear_variable() {
    unset interface_name
    unset interface_cardname
    unset mac
}
function main() {
    check_networkcard
    modify_adaptername
    modify_grub
    reload_network
    clear_variable
    echo "网卡名称修改完成,请使用reboot命令重启节点后生效"
}
main

在修改网卡名称的过程中,如果原网卡的配置文件不存在,在新配置文件中将默认添加DHCP配置。如果用户需要设置静态IP地址,需在执行完脚本后手动修改网络配置文件以进行相应调整。