我正在创建 udev 规则以将我的 USB 设备 (ttyUSB*) 映射到它们所连接的 USB 端口。通常的方法是查看以下输出:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
这是我的输出(我删除了ATTRS
没有意义的行):
looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="ftdi_sio"
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0':
KERNELS=="1-1.5.6:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ftdi_sio"
ATTRS{interface}=="USB-RS485 Cable"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6':
KERNELS=="1-1.5.6"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{idProduct}=="6001"
ATTRS{idVendor}=="0403"
ATTRS{manufacturer}=="FTDI"
ATTRS{product}=="USB-RS485 Cable"
ATTRS{serial}=="FTY48GF2"
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5':
KERNELS=="1-1.5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{product}=="USB 2.0 Hub [MTT]"
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{manufacturer}=="Linux 4.9.41-v7+ dwc_otg_hcd"
ATTRS{product}=="DWC OTG Controller"
looking at parent device '/devices/platform/soc/3f980000.usb':
KERNELS=="3f980000.usb"
SUBSYSTEMS=="platform"
DRIVERS=="dwc_otg"
looking at parent device '/devices/platform/soc':
KERNELS=="soc"
SUBSYSTEMS=="platform"
DRIVERS==""
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
这里的连接:Raspberry Pi -> USB HUB -> FTDI dongle。我的规则如下:
$ cat /etc/udev/rules.d/99-usb.rules
KERNEL=="1-1.5.6", SUBSYSTEM=="usb", SYMLINK+="rs485"
但:
# ls -l /dev/rs485
lrwxrwxrwx 1 root root 15 Oct 4 07:04 /dev/rs485 -> bus/usb/001/009
我原本期望应该创建指向 /dev/ttyUSB0 的符号链接。现在,我了解到我的加密狗位于该 USB 位置:
$ lsusb
Bus 001 Device 006: ID 046d:c062 Logitech, Inc. M-UAS144 [LS1 Laser Mouse]
Bus 001 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...
但当然它不是串行端口(即我不能echo
使用它)。尝试用作1-1.5.6:1.0
KERNEL 键不起作用 - 未创建符号链接。
我应该使用什么值?
答案1
如果您查看man udev
,KERNELS
则搜索设备路径,同时KERNEL
匹配设备本身,并SUBSYSTEM
表示生成事件的内核部分。当您的 USB 加密狗插入时,一些当内核的一部分发现设备并做出相应反应时,就会创建 udev 事件。
您希望您的规则在设备本身的操作上触发(SUBSYSTEM=="tty"
,因为您需要 的链接/dev/ttyUSB0
),但对于SUBSYSTEMS=="usb"
,它会在发现 USB 设备本身时触发,而不是在启动 USB 设备的驱动程序时触发。这就是为什么您会获得从 USB 子系统看到的 USB 设备的链接bus/usb/001/009o
。
所以你需要的是
KERNELS=="1-1.5.6", SUBSYSTEM=="tty", SYMLINK+="rs485"
(注意S
和tty
)。