Linux启动后网卡名不是eth0而是ens33或enp0s3,是因为systemd和udev自2015年起默认启用可预测网络接口名机制,用固件/拓扑信息生成稳定名称以避免热插拔错乱;禁用需在GRUB添加net.ifnames=0 biosdevname=0、更新引导配置、清理udev规则并重启。

为什么 Linux 启动后网卡名不是 eth0 而是 ens33 或 enp0s3
这是 systemd 和 udev 在 2015 年后默认启用的「可预测网络接口名(Predictable Network Interface Names)」机制导致的。它用固件/拓扑信息生成稳定名称(如 ens33 表示 PCI Express bus 0, slot 3, function 3),避免传统 eth0 在多网卡热插拔时错乱。但很多脚本、文档、容器配置仍硬编码 eth0,直接改名最省事。
禁用可预测命名并恢复 eth0 的完整步骤
核心是关掉 systemd 的命名规则,并确保 udev 不生成 .link 文件干扰。操作需在 root 权限下进行:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX行,在引号内追加net.ifnames=0 biosdevname=0 - 运行
grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS/RHEL)或update-grub(Ubuntu/Debian) - 删除或重命名可能存在的 udev 规则:
rm -f /etc/systemd/network/99-default.link和/lib/systemd/network/99-default.link - 确认
/etc/udev/rules.d/80-net-setup-link.rules不存在,或注释掉其中所有SUBSYSTEM=="net"相关行 - 重启系统,启动后执行
ip link应看到eth0而非ens33
注意:若使用 VMware/VirtualBox,确保虚拟网卡类型为「E1000」而非「VMXNET3」,后者在旧内核下可能仍触发 ens 命名。
不重启临时把 ens33 改成 eth0(仅当前会话有效)
适合调试或临时适配脚本,但无法持久化,且部分服务(如 NetworkManager)可能拒绝接管已重命名的接口:
- 先关闭接口:
ip link set ens33 down - 重命名:
ip link set ens33 name eth0 - 启用新名:
ip link set eth0 up - 验证:
ip -br a应显示eth0状态为 UP
该方式绕过 udev 和内核命名逻辑,但下次 reboot 后自动还原为 ens33;若同时运行 systemctl restart systemd-udevd,可能触发 udev 再次重命名回原名。
ens33 和 eth0 在 ifconfig/ip 命令中的行为差异
本质无区别,都是内核网络设备对象,但工具链对名称敏感:
-
ifconfig eth0 up在禁用可预测命名后才有效;若系统仍用ens33,执行会报错eth0: error fetching interface information: Device not found -
ip link show ens33和ip link show eth0输出结构完全一致,只是设备名不同 - NetworkManager 默认按设备名匹配 connection 配置,若
nmcli connection show中 connection 名为System ens33,而你强行重命名为eth0,NM 可能断开连接且不自动恢复 - Docker 默认桥接网卡名是
docker0,但容器内route -n显示的出口设备取决于宿主机主接口名,硬编码eth0的容器启动脚本在此处容易失败
真正麻烦的不是名字本身,而是名字背后隐含的配置依赖链——从内核模块加载顺序,到 udev 规则触发时机,再到用户空间服务的缓存刷新策略,任何一个环节没清理干净,都会让 eth0 在某次重启后神秘消失。










