![Linux 上意外一致的网络设备名称](https://linux22.com/image/1597688/Linux%20%E4%B8%8A%E6%84%8F%E5%A4%96%E4%B8%80%E8%87%B4%E7%9A%84%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87%E5%90%8D%E7%A7%B0.png)
我有一个安装了最少 Linux 的单个 SSD 磁盘,我在其中配置了 GRUB 以启动 Linux(内核版本 4.15.0),并启用了一致的网络设备命名功能(通过设置net.ifnames=1
)。我把这个 SSD 放入两台几乎完全相同的 PC 中(主板相同,只是处理器版本略有不同)。我在两台 PC 上运行lshw -class network
。
PC1上的输出:
*-network
description: Ethernet interface
product: Ethernet Connection I219-LM
vendor: Intel Corporation
physical id: 1f.6
bus info: pci@0000:00:1f.6
logical name: enp0s31f6
version: 21
serial: 00:13:95:2a:e4:5c
size: 1Gbit/s
capacity: 1Gbit/s
width: 32 bits
clock: 33MHz
capabilities: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=3.2.6-k duplex=full firmware=0.2-4 ip=192.168.0.171 latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
resources: irq:126 memory:df200000-df21ffff
PC2 的输出:
*-network
description: Ethernet interface
product: Ethernet Connection (7) I219-LM
vendor: Intel Corporation
physical id: 1f.6
bus info: pci@0000:00:1f.6
logical name: eno1
version: 10
serial: 00:13:95:33:8c:4c
size: 1Gbit/s
capacity: 1Gbit/s
width: 32 bits
clock: 33MHz
capabilities: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=3.2.6-k duplex=full firmware=0.5-4 ip=192.168.0.171 latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
resources: irq:126 memory:a1300000-a131ffff
两台 PC 都在 PCI 总线上安装了以太网适配器00:1f.6
。PC1 上的接口名为enp0s31f6
,这正是我所期望的。但在 PC2 上,接口名为eno1
,这让我很困惑。
所以有两个问题:
- 为什么它们的名字不同?我在两者上使用相同的 SSD,因此软件配置完全相同。
- 是否可以根据 PCI 位置强制使用名称(
enp0s31f6
)?
biosdevname
未安装(emX
无论如何都应该使用名称)
答案1
简称eno#
和ens#
名称是根据您提供的插槽信息生成的固件:o
表示板载 LAN 端口,s
表示热插拔插槽号。请参阅手册页systemd.net 命名方案了解更多详细信息(当前仅在线,v243 中的新功能)。
(udev 内置网络 ID主要从 中获取插槽信息/sys/class/pci/slots
,记录为“ACPI _SUN - 插槽用户编号”。板载索引从/sys/class/net/eth0
属性device/acpi_index
(ACPI _DSM)、device/index
(SMBIOS)、dev_port
、中读取phys_port_name
。)
要强制基于 PCI 拓扑的名称,请使用 systemd.link(5) 将名称策略设置为path
,
# /etc/systemd/network/50-names.link
[Match]
OriginalName=*
[Link]
NamePolicy=keep path
# Default is "keep kernel database onboard slot path"
# (set in /lib/systemd/network/99-default.link)
...或者使用 81-something.rules 中的 udev 规则分配NAME="$env{ID_NET_NAME_PATH}"
给网络接口(您不需要这样做,因为 udev 总是读取 .link 文件):
# /etc/udev/rules.d/81-net-names.rules
SUBSYSTEM=="net", ENV{ID_NET_NAME_PATH}=="?*", NAME="$env{ID_NET_NAME_PATH}"