我想将某些 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.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 /dev
或ls -lR /dev
查找您的设备。
您还可以运行udevadm info /dev/ttyUSB0
,到该设备的所有符号链接将列为 S: ...
行。
如果这还不够,您可以编写自己的 udev 规则。首先运行udevadm info /dev/ttyUSB0
并选择任何标识属性(例如ID_PATH
USB 端口)。最好始终包含子系统。
然后打开(或创建)一个文件/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 串行设备的操作:
cd /dev/serial/by-id
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
从这个长名称创建一个符号链接,链接到您选择的目录中您选择的名称。在我的例子中,它是一个系统设备,只有 root 可以控制它,因此我在 中创建了一个链接
/root
,例如:ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 /root/easydigi
在您的程序或任何需要串行设备的设备名称的程序中,您只需使用您的链接(在我上面的例子中是“/root/easydigi”)作为“/dev/ttyUSB0”的替代。