不,这不是重复的为什么我的 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
,但它不适用。尝试NamePolicy=
或NamePolicy=name
在该[Link]
部分下也无济于事。
我迷路了!我该如何在 .link 文件中将我的名字分配给我的 USB 网络适配器?如果不借助某些 udev 规则,这是否可行?那么,既然 .link 文件似乎在我的例子中不起作用,为什么还要使用它呢?我在哪里犯了错误?
答案1
所以我终于自己弄清楚了到底发生了什么。
唉,我看到的问题是重命名USB基于网络接口无法工作实际上是由/lib/udev/rules.d/73-usb-net-by-mac.rules
Ubuntu/Debian(以及 Raspbian)上的 udev 规则引起的。罪魁祸首在这里:
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
是,这会导致所有基于 USB 的网络接口采用“旧”命名eth0
等等,除非在.link
文件中明确命名。
我不知道为什么要这样写规则,因为对于所有未明确命名的 USB 网络适配器,使用基于 MAC 的命名方式是可以的。再想想……不,使用基于 MAC48 的名称没有任何意义,除非你碰巧标记了所有的 USB 网络加密狗并不断地交换它们;但也许基于 MAC 的名称与扩展坞一起使用,在那里它实际上是有意义的......?
答案2
按照此主题 尤其是这一段:
自定义网络接口命名...规则文件的名称需要有一个小于“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 (stretch)
命名eno1