eth0 变 enp0s3 是因 systemd-udevd 启用可预测网卡命名;可通过禁用 net.ifnames=0 或 udev 规则重命名恢复,但需同步更新网络配置、NetworkManager、Docker 及云平台缓存。

为什么 eth0 突然变 enp0s3 了?
不是你改的,是 systemd-udevd 默认启用了可预测网卡命名(Predictable Network Interface Names)。它按硬件路径、插槽位置等生成稳定名称,避免热插拔或多网卡时 eth0/eth1 错乱。但老脚本、监控工具或 Docker 配置里硬写 eth0 就会失效。
想改回去,核心就两条路:关掉可预测命名,或手动映射。前者简单粗暴,后者更可控。
永久禁用可预测命名(最常用)
本质是让内核启动时跳过 net.ifnames=0 这个参数,退回到传统 ethX 命名。
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX行,在引号内追加net.ifnames=0 biosdevname=0 - 运行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS/RHEL)或sudo update-grub(Ubuntu/Debian) - 重启生效。下次开机就是
eth0、eth1了
注意:biosdevname=0 是防止某些 Dell/HP 服务器 BIOS 自己再起一遍名;不加可能在部分机器上仍出现奇怪名字。
用 udev 规则重命名指定网卡(精准控制)
适合多网卡环境,比如只想把某块 Intel 千兆卡固定叫 lan0,而保留其他接口用可预测名。
- 先查目标网卡 MAC:
ip link show或cat /sys/class/net/enp0s3/address - 新建规则文件:
/etc/udev/rules.d/10-network-renaming.rules - 写入:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"(MAC 换成你的真实值) - 执行
sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=net
不用重启,但新名字要等下次接口 up 才生效(比如 sudo ip link set enp0s3 down && sudo ip link set lan0 up)。如果设备已启用,得先 down 原接口。
改完发现网络起不来?检查这三处
常见故障不是改名失败,而是配套配置没同步更新:
-
/etc/sysconfig/network-scripts/ifcfg-eth0(RHEL/CentOS)或/etc/network/interfaces(Debian/Ubuntu)里还写着旧接口名 - NetworkManager 的连接配置仍绑定原名:
nmcli connection show→ 找到对应连接 →nmcli connection modify "System eth0" connection.interface-name lan0 - Docker 的
--network=host或自定义桥接默认用docker0,但容器内路由若硬写eth0出口,得进容器里改/etc/network/interfaces或启动参数
最易被忽略的是:某些云平台(如阿里云 ECS)的初始化脚本会在首次启动时写死网卡名到 /etc/cloud/cloud.cfg 或 /var/lib/cloud/instances/ 下,删掉这些缓存再重跑 cloud-init clean && cloud-init init 才能彻底刷新。










