网卡重命名
前言
在早期版本的操作系统(如Fedora 13、Ubuntu 15、CentOS 6及更早版本)中,网络接口的命名方式为eth0、eth1、eth2等。Linux内核通过组合固定前缀和索引为网络接口分配名称。在系统初始化时,内核会根据索引顺序为网络设备分配名称,例如eth0代表系统启动时检测到的第一个以太网接口。如果添加了额外的网络接口,设备名称的分配顺序则不再固定,因为系统重启后设备可能会按不同的顺序初始化。
为了解决这一问题并提高网络设备的可识别性和一致性,现代Linux发行版采用了一致的网络设备命名规范,并通过udev设备管理器来实现这一规范。udev支持多种命名方案,默认情况下,它根据固件信息、拓扑结构及设备物理位置分配网络接口的名称。系统中的网卡设备重命名服务由systemd-udevd提供支持,以确保网络设备名称的一致性和稳定性。
一致的网络命名规则
命名规范为:设备类型 + 设备位置。
设备类型:
- en:以太网
 - wl:无线局域网
 - ww:无线广域网
 
设备位置
| 
       格式  | 
     
       含义  | 
    
|---|---|
| 
       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为例。
- 修改网卡配置文件。
   
   
- 如果网卡的配置文件/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
 
 - 如果网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ens5存在,将原配置文件ifcfg-ens5重命名为ifcfg-eth0:
     
 - 修改GRUB配置。
   
   编辑/etc/default/grub,添加net.ifnames=0 biosdevname=0到GRUB_CMDLINE_LINUX项中。修改完成后,执行以下命令重新加载GRUB配置:
grub2-mkconfig -o /boot/grub2/grub.cfg
 - 创建持久化规则文件。
   
   
在/etc/udev/rules.d/中创建70-persistent-net.rules文件,并添加以下规则内容:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="eth0" - 重启节点。
 
此外,用户也可以通过执行以下脚本来修改网卡名称。执行脚本后,按照提示输入修改前的网卡名称和修改后的网卡名称。完成操作后,重新启动系统,网卡将被重命名为新的名称。
#!/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