当前位置: 首页 > news >正文

Linux 网络接口命名规则

非常好的问题 👏——eth0ens33enp4s0eno1这些名字确实让人一开始很困惑,其实它们的区别来自于Linux 的“可预测网络接口命名规则(Predictable Network Interface Names)”的演进。

下面我系统讲清楚它们的来源、命名逻辑和演变历史 👇


🧩 一、历史背景:从 eth0 到 enpXsY

早期(比如 CentOS 6 / Ubuntu 14):

  • 所有网卡默认叫eth0,eth1,eth2……
  • 命名顺序取决于内核识别设备的先后次序

但问题是:

顺序不稳定—— 一旦加拔网卡或硬件顺序改变,接口名也会变。

比如:

  • 第一次启动:eth0 → 网卡A,eth1 → 网卡B
  • 下次启动顺序变了:eth0 → 网卡B,eth1 → 网卡A
    😱 结果网络配置全错。

⚙️ 二、systemd 引入“可预测命名”(Predictable Interface Names)

systemd v197 (约 2015 年)开始,引入了“基于硬件拓扑的命名规则”:

按照设备在主板上的物理位置、总线拓扑等信息生成稳定名称。


🧠 三、命名规则逻辑(核心)

前缀来源示例含义
enEthernet通用前缀
wlWireless无线网卡(Wi-Fi)
wwWWAN移动宽带(3G/4G)

接着后缀说明设备位置:

类型格式示例说明
onboard (板载)enoXeno1主板上集成的网卡(BIOS 固定序号)
PCI slot indexensXens3插在主板插槽的 PCI-E 网卡
PCI bus pathenpXsYenp4s0PCI 总线号与插槽号(最常见)
MAC-based (fallback)enx<MAC>enx001122334455当其他信息不可用时使用 MAC 命名
传统方式(旧)ethXeth0旧版 udev 风格,不可预测

🔍 四、示例说明

接口名含义
eno1Onboard 网卡 #1(板载)
ens3PCI slot 3 上的网卡
enp4s0位于 PCI 总线 4、插槽 0 的网卡
enx00e04c680001按 MAC 地址命名
eth0旧命名方式(随机)

🧩 五、为什么有些系统还是 eth0?

取决于发行版是否启用了 predictable 命名:

系统默认命名
Ubuntu 14 / CentOS 6eth0
Ubuntu 16+ / CentOS 7+ / Debian 9+ensX/enpXsY/enoX
Kubernetes 节点(cloud-init / containerd 环境)多为eth0(容器命名固定)

⚙️ 六、如何控制命名方式

可以通过内核启动参数udev 规则控制:

1️⃣ 禁用可预测命名,恢复传统eth0

/etc/default/grub里添加:

ini

代码解读

复制代码

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

然后:

bash

代码解读

复制代码

sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo reboot

启动后恢复旧命名(eth0、eth1)。


🧠 七、运维角度总结

命名方式稳定性可读性推荐
eth0❌ 不稳定✅ 简洁不推荐
ensX/enpXsY/enoX✅ 稳定⚙️ 略长✅ 推荐
enxMAC✅ 稳定❌ 冗长临时用
自定义(udev rename)✅ 稳定✅ 灵活高级用法

总结一句话:

eth0是旧的“按顺序命名”,
ensX/enpXsY/enoX是新的“按物理位置命名”,
它们的不同只是命名策略的变化,功能上完全等价。


一张图,展示从 BIOS → PCI bus → systemd → 内核 → 接口命名 的整个生成流程?那样你会一眼看懂为什么有enp4s0eno1

非常好 👍 我来接着讲,并帮你画清楚整个接口命名生成流程图,让你彻底理解为什么有eth0enp4s0eno1ens3等不同命名。


🧭 一、命名生成全过程(从 BIOS 到内核)

下面这张逻辑流程图展示了Linux 启动时是如何决定网卡名字的:

bash

代码解读

复制代码

┌──────────────────────────────┐ │ BIOS / 主板固件 │ │ ↳ 记录板载网卡序号 (onboard index) │ └──────────────┬──────────────┘ │ ▼ ┌──────────────────────────────┐ │ 内核探测硬件(PCI 总线扫描) │ │ ↳ 每块网卡都有 Bus ID,如 0000:04:00.0 │ └──────────────┬──────────────┘ │ ▼ ┌──────────────────────────────┐ │ systemd-udevd 启动时读取: │ │ • /sys/class/net/* │ │ • /sys/devices/pci... │ │ • BIOS/固件信息(onboard flag) │ └──────────────┬──────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────┐ │ 根据规则匹配并生成接口名: │ │ │ │ ① 如果是板载:enoX │ │ ② 如果是PCI插槽:ensX │ │ ③ 如果可确定PCI路径:enpXsY │ │ ④ 如果以上都失败:enx<MAC> │ │ ⑤ 如果Predictable命名关闭:ethX │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 最终接口名注册到内核网络命名空间 │ └──────────────────────────────┘


🧠 二、命名规则来源文件

Linux 中的这套规则主要来自:

文件/工具作用
/lib/udev/rules.d/60-net.rulesudev 默认规则
/lib/udev/rules.d/80-net-setup-link.rulessystemd 网络命名规则核心
/etc/systemd/network/99-default.link默认链路命名策略
/etc/systemd/network/*.link可以自定义接口名映射(高级用法)

示例:

ini

代码解读

复制代码

[Match] Driver=e1000e [Link] NamePolicy=kernel database onboard slot path MACAddressPolicy=persistent


⚙️ 三、不同前缀的含义对照

前缀含义典型来源
enoXOnboard(板载)BIOS 固定序号
ensXPCI slot 编号PCI 插槽
enpXsYPCI bus + slot 路径多总线系统最常见
enx...MAC 地址命名无法探测拓扑时
ethX旧式命名Predictable 命名关闭

🧩 四、实际例子

例 1:主板板载网卡

bash

代码解读

复制代码

/sys/devices/pci0000:00/0000:00:1f.6/net/eno1

命名规则:onboardeno1


例 2:PCI-E 插卡型网卡

bash

代码解读

复制代码

/sys/devices/pci0000:00/0000:00:1c.0/0000:04:00.0/net/enp4s0

命名规则:path-basedenp4s0


例 3:虚拟机中的网卡(如 KVM)

通常 BIOS 里没有 on-board 信息,PCI 插槽信息也可能是虚拟的,结果:

代码解读

复制代码

enp0s3

虚拟机内常见路径 →enp0s3


例 4:Docker / Containerd 容器

容器里命名通常强制为:

代码解读

复制代码

eth0

原因:容器命名由runc/netns直接固定写死,不走 udev/systemd 命名逻辑。


🔧 五、怎么查看当前接口命名来源

你可以在系统中执行:

javascript

代码解读

复制代码

udevadm test-builtin net_id /sys/class/net/enp4s0 2>/dev/null | grep ID_NET_NAME

输出类似:

ini

代码解读

复制代码

ID_NET_NAME_PATH=enp4s0 ID_NET_NAME_SLOT=ens3

这表示该接口是通过pathslot命名的。


🧭 六、禁用或修改命名规则(可选)

禁用 predictable 命名:

ini

代码解读

复制代码

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

效果:恢复传统eth0命名。

自定义名称(例如改成 public0)

创建/etc/udev/rules.d/70-custom-net-names.rules

ini

代码解读

复制代码

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:11:22:33:44:55", NAME="public0"


✅ 七、总结

名称示例类型来源稳定性备注
eth0传统内核顺序❌ 不稳定老版本
eno1板载BIOS on-board✅ 稳定服务器常见
ens3插槽PCI slot✅ 稳定云主机常见
enp4s0路径PCI bus path✅ 稳定新系统最常见
enx001122334455MAC 地址唯一标识✅ 稳定临时命名

如果你想,我可以帮你结合你的真实ip link输出(或/sys/class/net目录)画一张结构图,标出每个网卡是板载、PCI 插卡还是虚拟设备。

作者:bobz965
链接:https://juejin.cn/post/7569547273115467826
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.cnnetsun.cn/news/4086059.html

相关文章:

  • auto-value-parcel是什么?Android开发者告别手写Parcelable的终极利器
  • 三个平台一套手感:跨平台文本编辑器 Notepad-- 从安装到上手的实战笔记
  • 网页视频只能看不能存?N_m3u8DL-RE让流媒体下载一学就会
  • Esp-radio 硬件清单终极指南:DIY 网络收音机必需的 8 类元件选购建议
  • 代码评审看性能数据,先确认测试测到了什么
  • JoliCi 服务管理实战:一键启动 MySQL、Redis 等 10 种测试依赖服务
  • 百度ERNIE-Image本地部署指南:如何在ComfyUI中十几分钟跑通文生图模型
  • 一致性协议实现升级前的兼容性检查
  • 为什么选择 awesome-deepseek-agent?DeepSeek V4 接入的 10 大优势
  • Glance项目深度解读:macOS上最全能的Quick Look插件为何值得每个开发者安装
  • 参与Zeal 8-bit OS开源贡献:路线图、贡献规范与提PR完整指南
  • 探秘 babel-plugin-istanbul 源码:Babel 插件如何在编译期完成代码插桩
  • Parabolic视频下载工具完整上手指南:一个界面搞定200+网站的视频与音频下载
  • r3f-game-demo移动系统揭秘:Moveable组件如何实现基于瓦片的平滑移动与碰撞检测
  • terraform-provider-snowflake 用户与角色管理指南:构建企业级访问控制体系的 8 个步骤
  • 视频生成显存占用高怎么解决?LightVAE 与 LightTAE 让速度、画质、显存兼得
  • Drawnix 新手入门完整教程:界面布局与核心操作一网打尽
  • GreatSQL入门完全指南:开源免费金融级数据库的五大核心特性一网打尽
  • LXMusic音源配置完整指南:5分钟零门槛免费听遍全网音乐
  • NCM转MP3快速免费方案:ncmdump免安装用法与批量转换步骤
  • DSML 工具调用格式完全指南:在 DeepSeek-V4-Pro-0813 中定义工具的 4 个步骤
  • Node.js入门教程(二十九):util 模块
  • Duo Navigation Drawer API 速查手册:核心方法与接口一网打尽
  • VBrowser-Android是什么?一款全网视频嗅探缓存APP的完整入门指南
  • SingGuard-NSFA-0.8B 的7个分类头详解:每个风险域如何独立检测与输出风险概率
  • 让AI控制电脑成为日常:UI-TARS Desktop零代码自动化工具完整上手攻略
  • 基于Python的旅游攻略分享平台系统网站(源代码+文档+PPT+调试+讲解)
  • 显卡频繁崩溃别再猜了:GPU显存测试免费工具 memtest_vulkan,5分钟锁定真凶
  • 为什么我建议每个 Mac 用户都试试 Topit?窗口置顶 30 分钟上手全记录
  • DotNetIsolator序列化原理深挖:MessagePack如何跨越宿主与沙箱传递任意对象