
# 网卡重命名
#### 前言
在早期版本的操作系统（如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.cfg
}
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
```
