我正在 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
有几点需要澄清:
设备有一个树形层次结构。您的 USB 以太网适配器显示为多种的不同子系统中的“设备”,代表不同的层:
- 子系统
usb
, devtypeusb_device
– 连接到某个端口的 USB 设备; - 子系统
usb
, devtypeusb_interface
– USB 设备提供的特定功能(术语“接口”与网络中的含义不同!); - 子系统
net
– 实际的网络接口(这次是常规网络意义上的)。
(网络设备是 usb_interface 的子级,而 usb_interface 本身又是 usb_device 的子级,等等)
- 子系统
并非所有设备都有“设备节点”,例如网络接口不要出现在
/dev
.(这很不幸,但除此之外。)仅网络接口可以重命名。其他设备则不能。当 Linux 从 udev 创建设备节点切换到内核本身创建设备节点时,该策略变得更加严格。 (是的,技术上
mv /dev/foo /dev/bar
仍然有效,但是政策udev 不会弄乱内核导出的内容。)
因此,第 1 点很重要:您的整篇文章都在讨论网络接口(属于子系统net
),但您的 udev 规则与子系统相匹配usb
- 因此您尝试重命名 /sys 中的某些抽象 USB 设备。
您的规则需要特别具有SUBSYSTEM=="net"
.如果您想另外匹配父设备,可以使用(注意“S”)。SUBSYSTEMS=="usb"