更改 Ubuntu 16.04 中的内核设备节点(基于插入的端口的静态 USB 接口名称)

更改 Ubuntu 16.04 中的内核设备节点(基于插入的端口的静态 USB 接口名称)

我正在 Raspberry Pi 上使用 USB 网络接口(USB 上的以太网)。目标基本上是使用 Raspberry Pi 提供的四个 USB 端口通过 TFTP U-boot 同时刷新多台 Linux 机器。

现在,我已经定义了四个USB接口,每个接口都有一个IP地址。我已经设置好了tftp服务器。它工作正常,但是如果我尝试同时插入多台 Linux 机器,似乎 DHCP 混合了接口(例如,旧的usb0变成新的usb1,旧的usb1变成新的usb0),并且我相信这会在租约中造成混乱,因此 TFTP交易所似乎陷入了软锁定状态。

嗯,这不可能发生。因此,我设置了四个 udev 规则,根据它们插入的 USB 端口为这些设备提供固定名称。如下所示:

SUBSYSTEM=="usb", ACTION=="add", DEVPATH=="*.2", NAME="usb0"

(我使用得到这些值udevadm info

显然我需要重命名该设备,因为它将是我的网络接口的名称。因此,在这种情况下,符号链接没有任何用处(除非有我不知道的事情)。

但是,systemd-udevd不允许我重命名设备:

Feb 28 17:25:01 pi systemd-udevd[3749]: NAME="usb2" 被忽略,内核设备节点无法重命名;请在 /lib/udev/rules.d/99-systemd.rules:49 中修复它

我在网上读到这在版本 15.04 之前是可能的,所以我相信应该有办法恢复这种旧行为?

任何建议将不胜感激。

答案1

有几点需要澄清:

  1. 设备有一个树形层次结构。您的 USB 以太网适配器显示为多种的不同子系统中的“设备”,代表不同的层:

    • 子系统usb, devtype usb_device– 连接到某个端口的 USB 设备;
    • 子系统usb, devtype usb_interface– USB 设备提供的特定功能(术语“接口”与网络中的含义不同!);
    • 子系统net– 实际的网络接口(这次是常规网络意义上的)。

    (网络设备是 usb_interface 的子级,而 usb_interface 本身又是 usb_device 的子级,等等)

  2. 并非所有设备都有“设备节点”,例如网络接口不要出现在/dev.(这很不幸,但除此之外。)

  3. 仅网络接口可以重命名。其他设备则不能。当 Linux 从 udev 创建设备节点切换到内核本身创建设备节点时,该策略变得更加严格。 (是的,技术上mv /dev/foo /dev/bar仍然有效,但是政策udev 不会弄乱内核导出的内容。)

因此,第 1 点很重要:您的整篇文章都在讨论网络接口(属于子系统net),但您的 udev 规则与子系统相匹配usb- 因此您尝试重命名 /sys 中的某些抽象 USB 设备。

您的规则需要特别具有SUBSYSTEM=="net".如果您想另外匹配父设备,可以使用(注意“S”)。SUBSYSTEMS=="usb"

相关内容