网卡重命名
前言
在早期版本的操作系统(如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