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

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

我想将某些 USB 端口专用于某些设备。我该怎么做?

例如:我希望 ttyUSB0 作为我的鼠标,ttyUSB1 作为我的键盘(始终)。我希望确保 Linux 启动时永远不会交换它们。

实际情况是,我有通常连接到 USB0 的 XBee 和连接到 USB1 的第二个 FTDI,出于安全原因,我始终希望它们在我正在运行的代码中具有相同的地址。

亲切的问候

答案1

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

但你可以看出udev创造符号链接用任意你选择的名字。事实上,在现代系统中,你应该已经有下的符号链接/dev/serial以设备路径及其唯一 ID 命名;例如:

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

  • /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00ttyACM0

  • /dev/disk/by-id/ata-ST9640320AS_5WX1ZH91-part1sda1

  • /dev/disk/by-partlabel/Archsda3

  • /dev/input/by-id/usb-PIXART_USB_OPTICAL_MOUSE-mousemouse1

等等。只是跑步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
. . .

...你可以写下这条规则:

SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:00:1d.0-usb-0:1.2:1.0", SYMLINK+="tty-xbee"

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


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

答案2

以下是我对 USB 串行设备的操作:

  1. cd /dev/serial/by-id
  2. ls -l

    例如:

    root@toaster:/dev/serial/by-id# ls -l

    total 0
    lrwxrwxrwx 1 root root 13 Jan 1 1970 usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 -> ../../ttyUSB0

  3. 从这个长名称创建一个符号链接,链接到您选择的目录中您选择的名称。在我的例子中,它是一个系统设备,只有 root 可以控制它,因此我在 中创建了一个链接/root,例如:

    ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 /root/easydigi
    
  4. 在您的程序或任何需要串行设备的设备名称的程序中,您只需使用您的链接(在我上面的例子中是“/root/easydigi”)作为“/dev/ttyUSB0”的替代。

相关内容