如何确定网络接口的“可预测名称”

如何确定网络接口的“可预测名称”

我正在设置一台新服务器并安装了 Ubuntu Bionic,它使用可预测的网络接口名称

安装程序在救援系统上运行,该系统仍使用旧的接口名称,如eth0、,eth1但新安装的系统已将第一张网卡配置为enp8s0

使用lshw,此卡的公交信息是:

bus info: pci@0000:08:00.0

我想在不启动新安装的系统的情况下设置其他网络接口,但不知道如何确定其他卡的可预测网络接口名称。

使用lshw,我找到了另一张网卡,它目前已被禁用:

bus info: pci@0000:41:00.0

是否可以由此确定可预测的网络接口名称?它会是这样的吗enp41s0

我搜索了一段时间,没有找到任何可以简单列出所有设备及其可预测名称的工具。

编辑:为什么我不想启动新系统来查找?因为这会给设置过程增加一个额外的步骤。使用旧的接口命名,我可以运行脚本来从托管公司提供的救援系统设置服务器,然后就可以使用了。现在我必须先设置服务器,减去额外的网络配置。然后,我必须在新系统启动后手动设置网络,才能知道接口的名称。

答案1

命名方案的详细信息在源代码中:udev/udev-builtin-net_id.c之前,这有一个很好读的注释块来解释事情,但是由于重构删除了它,更好的参考资料位于man systemd.net-命名方案

一些常见的方案是 PCI 物理、PCI 热插拔和板载。您的 enp 接口表明是物理的。

从评论中去掉不寻常的和不相关的部分,留下以下规则:

 * Two character prefixes based on the type of interface:
 *   en — Ethernet
 *
 * Type of names:
 *   [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
 *                                         — PCI geographical location
 *
 * All multi-function PCI devices will carry the [f<function>] number in the
 * device name, including the function 0 device.
 *
 *
 * When using PCI geography, The PCI domain is only prepended when it is not 0.

该 PCI 总线名称的格式为域:总线:插槽.功能

假设它不是多功能设备,pci@0000:41:00.0显示为enp65s0,因为十六进制 41 转换为十进制 65。

答案2

有一些(新)方法可以直接找到可预测的网络接口名称。您可以使用udevadm info它。此外,您还可以获得更多信息,这可能会很有用。

该命令可以将其导出为键值对,以便在脚本中轻松使用。请参ID_NET_NAME见此示例:

# udevadm info --export --query=property --path=/sys/class/net/eth0
DEVPATH='/devices/pci0000:00/0000:00:0d.0/0000:02:00.0/net/eth0'
INTERFACE='eth0'
IFINDEX='2'
SUBSYSTEM='net'
USEC_INITIALIZED='3750679'
ID_NET_NAME_MAC='enx0012345678'
ID_OUI_FROM_DATABASE='Super Micro Computer, Inc.'
ID_NET_NAME_PATH='enp2s0f0'
ID_BUS='pci'
ID_VENDOR_ID='0x8086'
ID_MODEL_ID='0x10c9'
ID_PCI_CLASS_FROM_DATABASE='Network controller'
ID_PCI_SUBCLASS_FROM_DATABASE='Ethernet controller'
ID_VENDOR_FROM_DATABASE='Intel Corporation'
ID_MODEL_FROM_DATABASE='82576 Gigabit Network Connection'
ID_PATH='pci-0000:02:00.0'
ID_PATH_TAG='pci-0000_02_00_0'
ID_NET_DRIVER='igb'
ID_NET_LINK_FILE='/lib/systemd/network/99-default.link'
ID_NET_NAME='enp2s0f0'
SYSTEMD_ALIAS='/sys/subsystem/net/devices/eth0'
TAGS=':systemd:'

提醒:此示例适用于仍具有名称“eth[0-9]”的接口。否则可预测的名称是接口名称。

答案3

我们在公司中使用以下“单行代码”将现有接口映射到其各自可预测的名称:

echo; [ -e /etc/systemd/network/99-default.link ] && echo '!!! Predictable Network Interface Names are disabled - /etc/systemd/network/99-default.link exists! !!!' && ls -l /etc/systemd/network/99-default.link && echo; echo; [ -e /etc/udev/rules.d/80-net-setup-link.rules  ] && echo '!!! Predictable Network Interface Names are disabled - /etc/udev/rules.d/80-net-setup-link.rules  exists! !!!' && ls -l /etc/udev/rules.d/80-net-setup-link.rules && echo; for i in /sys/class/net/*; do udevadm info -q property "$i" | perl -Mwarnings -Mstrict -e 'my $res = {}; while(<>) { chomp; my @f = split /=/, $_, 2; $res->{$f[0]} = $f[1]; }; printf "%s: %s\n", $res->{DEVPATH}, $res->{ID_NET_NAME_FROM_DATABASE} // $res->{ID_NET_NAME_ONBOARD} // $res->{ID_NET_NAME_SLOT} // $res->{ID_NET_NAME_PATH} // $res->{ID_NET_NAME_MAC} // "???";'; done

它实现了https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/可以通过 SSH 快速复制粘贴。

我的机器的输出示例:

/devices/virtual/net/docker0: ???
/devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:09.0/0000:2a:00.0/net/enp42s0: enp42s0
/devices/virtual/net/lo: ???
/devices/virtual/net/tun0: ???
/devices/virtual/net/veth732bf87: ???
/devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:08.0/0000:29:00.0/net/wlo1: wlo1

相关内容