Linux systemd 可预测的网络接口名
“可预测的网络接口名”英文“Redictable Network Interface Names”,简称“可预测接口名”英文“Redictable Interface Names”
从systemd v197 版本开始,systemd/udev 为所有的网络接口自动分配可预测,稳定的网络接口名(如:enp4s0d1v7)。
为什么要开发可预测接口名
传统的接口命名方式是内核driver在探测到所有的接口之后,简单的按照数字编号分配作为eth的后缀的方式命名(如:eth0)。如果你的机器具有多个接口,每次重启系统,网卡的接口名都有可能变化。现在有一个物理网卡的接口名是 eth0,重启主机后,接口名就有可能变成 eth1
在某些时候,网卡接口名不固定会出大问题,比如你正在配置链路聚合,但是你的多个网卡接口名每次重启都会变化,每次启动系统后,你都可能需要重新配置你的网络设置。又例如防火墙规则对不可预测的接口名非常敏感,接口名称改变会带来很大的安全隐患。
为了解决接口名变化的问题,udev 曾支持通过 MAC 地址来绑定接口名,但是仍然存在一些问题。例如虚拟化环境的 MAC 地址就不是固定的。最大的问题是用户空间和内核空间在分配名字上存在竞争。所以这种支持很快就被去掉了。
后来,“可预测的网络接口名”的出现彻底解决了这个问题。
命名规则
目前, systemd 有以下五种命名策略:
- 传统的接口名 ethX 、wifiX……
- 固件、BIOS提供的不可插拔的板载设备,接口名 enoX
- 固件、BIOS提供的 PCIe 可热插拔设备,接口名 ensX
- 根据硬件物理/地理地址,接口名 enpXsYdZvM
- 根据硬件物理地址(MAC),接口名 enxFFFF0000AAAA
最后一个策略不会被系统采用,除非用户手动选择,如果用户有自定义的 udev 规则,那么优先按照 udev 来执行。
通过阅读相关文档和源码,我们可以了解具体的命名方式,我以的我一张双口洋垃圾网卡 NVIDIA Mellanox 342A 端口 2 的接口名来举例
1 |
|
优点
接口名不会因为系统重启、硬件更改、系统更新而改变,在生产环境中这很棒!
缺点
如果你的设备只有一个网口,你在对网口进行操作之前,你必须先查看网口的接口名,而不是使用 eth0
如何启用/禁用
启用
- 确保
/etc/systemd/network/99-default.link
没有指向/dev/null
- 确保没有使用
/etc/systemd/network/
中自定义的命名规则文件(扩展名为.link
的文件)。 - 在
/etc/default/grup
配置文件中,参数GRUB_CMDLINE_LINUX_DEFAULT=""
中移除net.ifnames=0
update-grub
- 重启设备
禁用
ln -s /dev/null /etc/systemd/network/99-default.link
- 重启设备