通过 udev 获取 USB NIC 的网络接口名称

通过 udev 获取 USB NIC 的网络接口名称

我有一台笔记本电脑“服务器”(出于某种原因,这是客户端的要求),上面连接了 6 个 USB3 以太网 NIC。最近,这台笔记本电脑不得不随工程师一起出差,USB NIC 经常被移除,然后重新插入。当 Linux(Ubuntu 18.04)在此系统上启动时,ip/报告的 NIC 名称ifconfig现在被“打乱”。当每个都插入时,我们会看到类似以下内容dmesg

[7690167.101961] usb 2-5: new SuperSpeed USB device number 4 using xhci_hcd
[7690167.125624] usb 2-5: New USB device found, idVendor=0b95, idProduct=1790
[7690167.125634] usb 2-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[7690167.125640] usb 2-5: Product: AX88179
[7690167.125646] usb 2-5: Manufacturer: ASIX Elec. Corp.
[7690167.125651] usb 2-5: SerialNumber: 0000249B0D6D54
[7690167.478989] ax88179_178a 2-5:1.0 eth0: register 'ax88179_178a' at usb-0000:00:14.0-5, ASIX AX88179 USB 3.0 Gigabit Ethernet, 00:24:9b:0d:6d:54
[7690167.480240] usbcore: registered new interface driver ax88179_178a
[7690167.487172] ax88179_178a 2-5:1.0 enx00249b0d6d54: renamed from eth0

问题

我如何(即通过udev规则)配置系统以:

  1. 给所有这些网络接口命名一个更简单的名称(例如,enx00249b0d6d54,我更喜欢startech_en0)。
  2. “稳定”后缀/编号,所以如果我插入 6 个 StarTech USB NIC,报告的接口名称ifconfig对于特定的 USB NIC 始终是相同的,即使我将它插入不同的 USB 插头/插孔或以不同的/随机的顺序插入 NIC?

答案1

您是指“不断变化”中的“改组”,还是“看起来像垃圾”?

名称稳定性

您的日志显示的当前命名方案基于MAC地址网络接口的xMAC 地址,即 systemd-udev 命名方案中的第三个字母。MAC 地址,又称“硬件地址”,几乎就是最稳定这是网卡标识符(实际上,您的 USB NIC 甚至也使用它作为序列号)。

如果您想为接口分配自定义名称而不考虑它们连接的顺序或物理 USB 端口,那么您最终将把每个名称映射到 MAC 地址。

所以如果 MAC 地址在每个插件上都不断变化,那么你真的运气不好。我希望是这样不是你的意思是。

名称格式

MAC 地址命名方案虽然在 systemd-udev 中随处可见,但必须手动激活。对于您的情况,它由 Debian/Ubuntu systemd 打包团队安装的 udev 规则为 USB 设备激活。

您可以停用此功能,但默认的 systemd-udev 命名方案实际上是基于物理端口号的,这与您所要求的正好相反。完全停用 systemd-udev 的命名将为您提供简单的基于计数器的名称,如 usb0/usb1/usb2,这些名称基于 USB NIC 的连接顺序 - 这再次与您的要求相反。

相反,您可以创建自定义规则(udev 规则或 systemd-udev .link 文件),根据接口的 MAC 地址分配确切的名称。您可以在 中找到说明/usr/share/doc/udev/README.Debian.gz,但总结如下:

  • 如果使用 systemd-udev .link 文件,请创建 /etc/systemd/network/10-en0.link(每个接口一个单独的文件):

    [Match]
    MACAddress=00:24:9b:0d:6d:54
    
    [Link]
    Name=startech_en0
    
  • 如果使用 udev 规则,请创建/etc/udev/rules.d/70-persistent-net.rules(所有规则一个文件):

    ACTION=="add", SUBSYSTEM=="net", DEVTYPE!="?*", ATTR{address}=="00:24:9b:0d:6d:54", NAME="startech_en0"
    

    ATTR 匹配区分大小写和格式(它只是一个字符串比较),因此必须提供一个小写的冒号分隔的地址。

    需要 DEVTYPE 反匹配以避免意外重命名 VLAN 接口(如果使用的话),因为它们具有与父设备相同的 MAC 地址。我不确定这是否是最好的方法,ENV{ID_BUS}=="?*"或者ENV{ID_BUS}=="usb"也可能有效。

相关内容