Linux网络接口命名, Predictable Network Interface Names

可预测的网络接口命名

systemd/udev的第197版(v197)会自动为所有的本地以太网,WLAN和WWAN接口自动地分配可预测且稳定的网络接口名。这虽然与传统的接口命名模式(“eth0”, “eth1”, “wlan0”, …)不一样,但是可以解决实际问题。

为什么?

系统内核使用传统的网络接口命名模式,比如以 “eth0”, “eth1”, …顺序给所有被驱动所探测到的网络接口命名,以此简化对网络接口的命名。就现有技术来说,驱动探测到的是一般的(generally) 而非可预测的(predictable)(设备),这意味着,只要有多个网络接口,分配的接口名如"eth0", “eth1"等通常是不固定的(fixed),在下次的启动中"eth0"很可能变成了"eth1”。这可能会产生严重的安全隐患,例如,防火墙规则中都是以确定的(certain)命名模式来编码,所以它对非预测性的改变名字非常敏感。

为了解决这个问题,提出并实现了很多方法。长期以来,udev支持基于其MAC地址的确定(certain)的网络接口永久命名成"ethX"。然后这导致了很多问题,包括:它需要一个可写的根目录,然后这个根目录通常是不可用的;由于在系统中启动操作系统镜像会导致镜像的配置发生改变,所以statelessness of the system会丢失;在很多系统中,MAC地址不是固定的,比如在许多嵌入式设备和所有的虚拟化解决方案中;最重要的一个问题是,用户空间组件(userspace components)尝试着为接口分配名字与系统内核从同一“ethX”命名空间分配的名字竞争,有时候名称分配会失败。所以前段时间把这项功能从systemd/udev中删除了。

另一个解决方案是实现“biosdevname",它尝试着从确定的固件接口中找出固定的插槽拓扑信息并用来为接口分配固定的名字,并且这个名字包含有接口在主板上的物理位置。某种程度上说,这中命名模式与之前在udev原生的为多种设备节点通过/dev/*/by-path符号连接实现的类似。许多情况下,biosdevname与low-level内核设备标识模式原则相左,因为udev通常使用这些符号链接而不是自己创造自己的设备枚举标识模式。

最终,许多发行版支持使用用户自定义名字(think: “internet0”, “dmz0”, …)对接口进行重命名,并将MAC地址或者是物理位置作为网络脚本(networking scripts)的一部分。这是个非常好的选择但是也确实存在问题,它意味着用户愿意并有能力选择和分配这些名字。

我们认为将biosdevname开辟的命名模式进行一般化是一个很好的默认选择。基于固件/拓扑/位置( firmware/topology/location)信息分配固定名字有很大的好处,名字可以完全自动化被分配,可预测,他们仍然是固定的尽管硬件被添加或者移除 (i.e. no reenumeration takes place),损坏的硬件可以被无缝切换。也就是说,它们确实有时比大家习惯的“eth0”或“wlan0”更难读。如:“enp5s0”。

v197中到底发生了什么变化?

在systemd 197中我们为systemd/udev添加了许多不同的命名策略的原生支持,使方案与biosdevname类似(但通常更强大,更接近内核内部设备标识方案)。下列对网络接口的不同命名方案现在被udev原生支持:

  1. 包含固件/ BIOS的名称为板载设备提供了索引号(例如:eno1)
  2. 包含固件/ BIOS的名称提供的PCIE热插拔插槽索引号(例如:ens1)
  3. 包含硬件连接器的物理/地理位置的名称(例如:enp2s0)
  4. 包含接口的MAC地址的名称(例如:enx78e7d1ea46da)
  5. 经典的,不可预测的内核原生ethX命名(例如:eth0)

默认情况下,如果固件信息适用和可用的(applicable and available),systemd v197现在将按照策略1)命名接口;如果固件信息适用和可用的(applicable and available)跳转到策略2);如果是适用的(applicable),跳转到策略3),其他情况跳转到策略5);策略4)不是默认设置的,但是可以手动被用户选用。

此组合策略仅作为最后手段使用。也就是说,如果系统安装了biosdevname,它将优先被使用。如果用户已经添加了改变内核设备名字的udev规则,那么它(自定义规则)也将优先被使用。此外,任何特定于分布的命名方案通常具有优先级。

再说一遍,这有什么用呢?

有了这个新方案,你将:

  • 重启后接口名不变
  • 添加或移除硬件接口名不变,i.e. 不会进行重新枚举(到固件允许的级别)
  • 内核或者驱动更新/更改接口名不变
  • 更换网卡后接口名不变
  • 不需要用户配置自动分配接口名
  • 完全无状态的操作,更改硬件配置不会导致 /etc 的更改
  • 与只读根(root)兼容性
  • 网络接口命名现在更紧密地遵循通过符号链接为/dev 中的块设备节点和其他设备节点命名方案
  • 适用于x86和非x86机器
  • 在所有采用systemd/udev的发行版一致
  • 退出该方案很容易(如下)

这有什么缺点吗?以前实际上可以保证主机配备单张以太网卡只有“eth0”接口,有了这个新方案,管理员现在必须首先检查本地接口名称是什么,然后他们才能在该接口上调用命令,以前他们很可能会以“ eth0”为正确的名称。

我不喜欢它,该如何关闭?

只需要三个基本操作:

  1. 关闭分配固定名称,不可预测的内核名称可以被再次使用。为此,只需要使用默认的策略掩盖(mask) udev的 .link文件:ln -s /dev/null /etc/systemd/network/99-default.link
  2. 创建自定义的命名方案,如将你的接口命名为“internet0”,“dmz0" 或者 ”lan0“。为此,在/etc/ systemd/network/ 中创建自己的.link文件,这些文件为一个,某些或所有接口选择一个显式名称或更好的命名方案。 有关更多信息,请参见systemd.link(5)
  3. 在命令行输入net.ifnames=0

新的命名方案到底是什么样子?

注释中详细记录了 the sources of the net_id built-in。 如果您想知道如何解码新的接口名称,请参考此内容。

END

来源:Predictable Network Interface Names
翻译不易,转载请注明

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值