Ubuntu 17.04:如何基于Path重命名USB网络接口? (不基于MAC)

不,这不是重复为什么我的Wi-Fi适配器在16.04中不显示为wlan0? ,这解释了如何恢复eth0命名,而不是如何单独命名特定接口。

我不想根据MAC匹配进行分配。 我只需要根据USB路径分配名称。

当我插入USB网络适配器时,在Ubuntu 17.04上,它会根据其MAC分配一个网络接口名称,例如encx000000000000 。 现在我想根据它的ID_PATH = pci-000:02:03.0-usb-0:1:1.0将它重命名为更有说服力的东西。 特别是,我不想基于MAC地址进行匹配 。 理由是,在更换接口之后,所有这些都会中断,但如果有人简单地更换网络接口硬件以使新硬件与旧硬件位于同一位置,则系统将无需IT和重新配置支持。

所以我创建了一个文件/etc/systemd/network/50-my-island.link

 [Match] Path=pci-000:02:03.0-usb-0:1:1.0 [Link] Name=island0 

不幸的是,这个名字从未被分配过。 使用udevadm info我可以看到设置了ID_NET_NAME=island0 ,但它不适用。 在[Link]部分下尝试NamePolicy=NamePolicy=name也无济于事。

我迷路了! 如何将.link文件中的名称分配给USB网络适配器? 这是否可行而不诉诸某些udev规则? 为什么然后在我的情况下似乎没有.link文件呢? 我在哪里犯了错误?

所以我终于弄明白自己到底发生了什么。

唉,我看到重命名基于USB的网络接口不起作用的问题实际上是由Ubuntu / Debian上的udev规则/lib/udev/rules.d/73-usb-net-by-mac.rules引起的(因此也是Raspbian)。 它的罪魁祸首在于:

 ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \ ATTR{address}=="?[014589cd]:*", \ TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \ TEST!="/etc/systemd/network/99-default.link", \ IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}" 

请注意此特定规则如何检查/etc /udev/rules.d/80-net-setup-link.rules是否存在; 如果不是,那么NAME将被设置为基于MAC48的名称,后来的默认安装规则/lib /udev/rules.d/80-net-setup-link.rules永远不会有机会分配NAME 。 现在那很难过。 再次。

为了能够将用户定义的名称分配给USB网络接口,我们需要/etc /udev/rules.d/80-net-setup-link.rules ,因为这是规则集73-usb-net-by-mac.rules在分配NAME之前进行检查。

这意味着只需从/etc/udev/rules.d/80-net-setup-link.rules链接到/lib/udev/rules.d/80-net-setup-link.rules就可以避免这种情况用户指定的网络接口名称将被忽略。

 sudo ln -s /lib/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-setup-link.rules 

重启。 完成。

请注意,设置73-usb-net-by-mac.rules方式会产生73-usb-net-by-mac.rules ,这会导致所有基于USB的网络接口假定为“旧”命名eth0等,除非在a中明确命名.link文件。

我不知道为什么规则已经按原样编写,因为没有明确命名的所有USB网络适配器都可以使用基于MAC的命名。 第二个想法…… ,使用基于MAC48的名称没有任何意义,除非您碰巧标记所有USB网络加密狗并不断交换它们; 但也许基于MAC的名称与扩展坞一起使用,它实际上是有意义的……?

根据这个post ,尤其是这个段落:

自定义网络接口命名…规则文件的名称需要具有小于“80”的前缀,以便它在/lib/udev/rules.d/80-net-setup-link.rules之前运行,并且应该具有大于“75”的前缀使其在75-net-description.rules之后运行,因此您可以在ID_VENDOR和类似属性上使用匹配。 …

我确实创建了这个文件: /etc/udev/rules.d/76-netnames.rules

有这个内容

 # USB device by path # get ID_PATH if not present yet ENV{ID_PATH}=="", IMPORT{builtin}="path_id" SUBSYSTEM=="net", ACTION=="add", ENV{ID_PATH}=="*-usb-0:1.*", NAME="eth%n" 

它工作正常,没有你提供的解决方法。

我在debian preseed.cfg中创建了这个文件,以便在Debian全自动安装中设置我的目标网络配置。
在Intel NUC上执行此操作,我的内部NIC现在由Debian 9.5命名为eno1 (拉伸)