如何将设备 ID 锁定到端口地址?

Chr*_*ian 5 linux usb path

我想将某些 USB 端口专用于某些设备。我怎样才能做到这一点?

例如:我希望 ttyUSB0 是我的鼠标,而 ttyUSB1 是我的键盘(总是)。我想确定 Linux 的启动永远不会交换它们。

实际上,问题是我有 XBee 通常去 USB0 和第二个 FTDI 去 USB1,出于安全原因,我总是希望它们在我正在运行的代码中具有相同的地址。

亲切的问候

use*_*686 8

内核分配的名称始终按照检测到设备的顺序分配,您无法更改它们。(无论如何,此功能已被删除,因为“持久名称”规则引起的各种竞争条件。)

但是您可以告诉udev使用您选择的任何名称创建符号链接。事实上,在现代系统上,您应该已经/dev/serial以设备路径及其唯一 ID 命名的符号链接下;例如:

  • /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0 ? ttyUSB0

  • /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00 ? ttyACM0

  • /dev/disk/by-id/ata-ST9640320AS_5WX1ZH91-part1 ? sda1

  • /dev/disk/by-partlabel/Arch ? sda3

  • /dev/input/by-id/usb-PIXART_USB_OPTICAL_MOUSE-mouse ? mouse1

等等。只需运行tree /devls -lR /dev找到您的设备。

您也可以运行udevadm info /dev/ttyUSB0,该设备的所有符号链接都将列为 S: ...行。


如果这还不够,您可以编写自己的 udev 规则。首先运行udevadm info /dev/ttyUSB0并选择任何识别属性(例如ID_PATHUSB 端口)。始终包含子系统也是一个好主意。

然后打开(或创建)一个文件/etc/udev/rules.d/(命名,例如,serial-symlinks.rules),并将 udev 规则放在那里。

例如,如果输出为ttyUSB0

$ udevadm info /dev/ttyUSB0
. . .
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.2:1.0
. . .
E: SUBSYSTEM=tty
. . .
Run Code Online (Sandbox Code Playgroud)

...你可以写这个规则:

SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:00:1d.0-usb-0:1.2:1.0", SYMLINK+="tty-xbee"
Run Code Online (Sandbox Code Playgroud)

...并且 udev 将始终符号链接/dev/tty-xbee到您连接到 USB 端口 #2 的任何 tty 设备。


(注意:不要对符号链接使用与内核用于设备节点相同的名称。使用SYMLINK+="ttyUSB0" 导致不好的事情发生。)