Udev

USB 串列“按路徑”的 udev 規則不起作用

  • October 9, 2019

我有超過 2 個由 FTDI 驅動程序列舉為 、 等的串列設備/dev/ttyUSB0/dev/ttyUSB1/dev/ttyUSB2重新啟動時,這些設備可能會以任何其他順序混亂。此外,我可以在這些設備之間或使用其他類似設備物理替換/交換這些設備。

現在,我想要對這些進行持久列舉。我希望根據設備連接到的物理 USB 埠(我可以直接連接到 PC 主機板上的 USB 埠或使用 USB 集線器)列舉設備名稱 - 比如說設備是否連接到USB 集線器,埠 1 應保留為命名為ttyUSB0,埠 2 為ttyUSB1,依此類推。

在進行了一些基本閱讀之後,我認為(如此所述)/dev/serial/by-path/將設備列為某種符號連結。因此,我創建了一個/etc/udev/rules.d/101-usb-serial.rules包含以下內容的文件:

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.1:1.0", SYMLINK+="ttyUSB000"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.2:1.0", SYMLINK+="ttyUSB001"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.3:1.0", SYMLINK+="ttyUSB002"

但這不起作用。在這樣做ls /dev/ttyUSB*時,我無法看到我創建的新符號連結。可能出了什麼問題?

從上面的評論中得到提示,我設法找到了上述問題的解決方案。

udevadm info /dev/ttyUSB0 | grep "ID_PATH="

上面列出了所/dev/ttyUSB0連接埠的 sysfs 路徑。使用此值在規則文件中為任意數量的設備 ( ttyUSB1, ttyUSB2….)創建規則,/etc/udev/rules.d/101-usb-serial.rules如下所示:

SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.1:1.0",SYMLINK+="ttyUSB001"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.2:1.0",SYMLINK+="ttyUSB002"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.3:1.0",SYMLINK+="ttyUSB003"

完成更改或創建文件後,執行以下命令:

sudo udevadm control --reload-rules
sudo /etc/init.d/udev restart

PS:上面的範例場景(我正在使用的場景)是使用 4 埠 Belkin USB 集線器。Device 1連接到port 1集線器Device 2連接到port 2等等。

引用自:https://unix.stackexchange.com/questions/541156