![如何确定网络接口的“可预测名称”](https://linux22.com/image/737419/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E7%9A%84%E2%80%9C%E5%8F%AF%E9%A2%84%E6%B5%8B%E5%90%8D%E7%A7%B0%E2%80%9D.png)
我正在设置一台新服务器并安装了 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