Linux 如何找到未应用udev规则的原因?

Linux 如何找到未应用udev规则的原因?,linux,linux-kernel,usb,tty,udev,Linux,Linux Kernel,Usb,Tty,Udev,我添加了一个udev规则来生成一个到特殊tty设备的单独链接。我从lsusb获取了供应商和产品id: Bus 001 Device 016: ID abcd:1234 Foo Device 设备的dmesg输出为: [ 369.384850] usb 1-1.1: new full-speed USB device number 4 using xhci_hcd [ 369.470492] usb 1-1.1: New USB device found, idVendor=09d8, id

我添加了一个udev规则来生成一个到特殊tty设备的单独链接。我从lsusb获取了供应商和产品id:

Bus 001 Device 016: ID abcd:1234 Foo Device
设备的
dmesg
输出为:

[  369.384850] usb 1-1.1: new full-speed USB device number 4 using xhci_hcd
[  369.470492] usb 1-1.1: New USB device found, idVendor=09d8, idProduct=0420
[  369.470506] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  369.470515] usb 1-1.1: Product: TWN4/B1.06/CCL3.12/PRS1.04
[  369.470522] usb 1-1.1: Manufacturer: OEM
[  369.475188] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
通常,Debian系统会为此设备生成ACM*tty:

$ ls /dev/ttyACM*
/dev/ttyACM0
所以我创建了
/ect/udev/rules.d/99 bizrid.rules

ACTION=="add", ATTRS{idVendor}=="09d8", ATTRS{idProduct}=="0420", SYMLINK+="ttyMyDevice"
但是
ls/dev/tty*
不显示
ttyMyDevice

我迄今为止所做的尝试没有成功:

  • 正在运行udevadm触发器。这应适用新的udev规则
  • 我重新启动了
  • 我查看了udevadm test/dev/ttyACM0。我的udevrule显示在末尾。因此,我确信它没有被推翻。但我想知道“无法打开”的提示。然而,对于其他TTY,例如tty0或ttyS0,也存在此提示
  • 我重新连接了USB设备
  • 我尝试了另一个udev规则。此规则是100%正确的,因为我已将此规则用于其他设备。但它不适用于ttyACM0:
  • 我想知道为什么这不起作用。
    如何找到未应用udev规则的原因?

    根据注释I,可以尝试以下方法来调试问题:

    检查驱动程序

    使用
    dmesg
    检查您正在使用的驱动程序,并确保它是通用驱动程序。如果是自定义编译的,问题可能在自定义实现内部。如果它是通用的,请继续执行第二步。我在最后一行找到了驱动程序名:
    cdc\u acm

    [  369.384850] usb 1-1.1: new full-speed USB device number 4 using xhci_hcd
    [  369.470492] usb 1-1.1: New USB device found, idVendor=09d8, idProduct=0420
    [  369.470506] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [  369.470515] usb 1-1.1: Product: TWN4/B1.06/CCL3.12/PRS1.04
    [  369.470522] usb 1-1.1: Manufacturer: OEM
    [  369.475188] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
    
    检查用户权限

    确保您的udev规则的权限正确:

    chmod 644 99-myrule.rules
    chown root:root 99-myrule.rules
    
    为添加操作执行测试运行

    检查udevadm test-a add$(udevadm info-q path-n/dev/ttyACM0)的输出。我的输出如下所示:

    呼叫:测试

    version 232
    This program is for debugging only, it does not run any program
    specified by a RUN key. It may show incorrect results, because
    some values may be different, or not available at a simulation run.
    
    === trie on-disk ===
    tool version:          232
    file size:         8447696 bytes
    header size             80 bytes
    strings            1849040 bytes
    nodes              6598576 bytes
    Load module index
    Found container virtualization none
    timestamp of '/etc/systemd/network' changed
    timestamp of '/usr/lib/systemd/network' changed
    timestamp of '/lib/systemd/network' changed
    Parsed configuration file /lib/systemd/network/99-default.link
    Created link configuration context.
    timestamp of '/etc/udev/rules.d' changed
    Skipping overridden file: /lib/udev/rules.d/99-bizrfid.rules.
    Reading rules file: /lib/udev/rules.d/50-firmware.rules
    
    ...
    
    Reading rules file: /lib/udev/rules.d/98-systemd.rules
    Reading rules file: /etc/udev/rules.d/99-bizrfid.rules
    rules contain 49152 bytes tokens (4096 * 12 bytes), 12900 bytes strings
    4244 strings (40114 bytes), 3517 de-duplicated (27942 bytes), 728 trie nodes used
    GROUP 20 /lib/udev/rules.d/50-udev-default.rules:26
    IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:7
    IMPORT builtin 'usb_id' /lib/udev/rules.d/60-serial.rules:8
    /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0: if_class 2 protocol 0
    IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:8
    IMPORT builtin 'path_id' /lib/udev/rules.d/60-serial.rules:15
    LINK 'serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' /lib/udev/rules.d/60-serial.rules:16
    IMPORT builtin skip 'usb_id' /lib/udev/rules.d/60-serial.rules:19
    LINK 'serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' /lib/udev/rules.d/60-serial.rules:23
    LINK 'ttyMyDevice' /etc/udev/rules.d/99-bizrfid.rules:1
    handling device node '/dev/ttyACM0', devnum=c166:0, mode=0660, uid=0, gid=20
    preserve permissions /dev/ttyACM0, 020660, uid=0, gid=20
    preserve already existing symlink '/dev/char/166:0' to '../ttyACM0'
    found 'c166:0' claiming '/run/udev/links/\x2fserial\x2fby-id\x2fusb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00'
    creating link '/dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' to '/dev/ttyACM0'
    preserve already existing symlink '/dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' to '../../ttyACM0'
    found 'c166:0' claiming '/run/udev/links/\x2fserial\x2fby-path\x2fpci-0000:00:14.0-usb-0:1.1:1.0'
    creating link '/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' to '/dev/ttyACM0'
    preserve already existing symlink '/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' to '../../ttyACM0'
    creating link '/dev/ttyMyDevice' to '/dev/ttyACM0'
    creating symlink '/dev/ttyMyDevice' to 'ttyACM0'
    created db file '/run/udev/data/c166:0' for '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/tty/ttyACM0'
    ACTION=add
    DEVLINKS=/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0 /dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00 /dev/ttyMyDevice
    DEVNAME=/dev/ttyACM0
    DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/tty/ttyACM0
    ID_BUS=usb
    ID_MODEL=TWN4_B1.06_CCF3.00_PRS1.04
    ID_MODEL_ENC=TWN4\x2fB1.06\x2fCCF3.00\x2fPRS1.04
    ID_MODEL_FROM_DATABASE=Atom Processor Z36xxx/Z37xxx, Celeron N2000 Series USB xHCI
    ID_MODEL_ID=0420
    ID_PATH=pci-0000:00:14.0-usb-0:1.1:1.0
    ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_1_1_0
    ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
    ID_PCI_INTERFACE_FROM_DATABASE=XHCI
    ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
    ID_REVISION=0200
    ID_SERIAL=OEM_TWN4_B1.06_CCF3.00_PRS1.04
    ID_TYPE=generic
    ID_USB_CLASS_FROM_DATABASE=Communications
    ID_USB_DRIVER=cdc_acm
    ID_USB_INTERFACES=:020201:0a0000:
    ID_USB_INTERFACE_NUM=00
    ID_VENDOR=OEM
    ID_VENDOR_ENC=OEM
    ID_VENDOR_FROM_DATABASE=Intel Corporation
    ID_VENDOR_ID=09d8
    MAJOR=166
    MINOR=0
    SUBSYSTEM=tty
    TAGS=:systemd:
    USEC_INITIALIZED=71480300178
    Unload module index
    Unloaded link configuration context.
    

    对于
    udev
    规则
    /ect/udev/rules.d/99 bizrid.rules
    我将添加
    子系统

    ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="09d8", ATTRS{idProduct}=="0420", SYMLINK+="ttyMyDevice"
    
    您还可以添加
    ATTRS{manufacturer}=
    ,但是
    idVendor
    idProduct
    就足够了

    否则,它看起来是正确的,测试运行将创建符号链接:


    创建链接“/dev/ttyMyDevice”到“/dev/ttyACM0”

    您能否与我们共享
    dmesg
    输出的有效部分?它还将帮助我们了解它是什么类型的USB设备以及实际值。谢谢。现在你用什么驱动程序?你有通用的还是自定义编译的?我询问的原因是,如果您检查-我看不到您的
    idVendor=09d8,idProduct=0420
    supported.Ok。如果您执行
    udevadm测试-a add$(udevadm info-q path-n/dev/ttyACM0)
    返回什么?您应该将信息添加到问题中,而不是作为问题的答案。啊,你是以root用户身份运行的,那么应该可以了。原因是
    无效的规则/etc/udev/rules.d/99。规则:1:无效的操作操作
    。请给我们看一下实际的
    99 bizrfid。规则
    规则不像您在问题中所做的那样是存根。@tukan非常感谢您的帮助。A现在添加了
    99.bizrfid.rules
    cat
    。这几乎是一样的。发生“无效规则…”错误是因为我今天早上尝试了其他操作,但忘记了
    =
    。规则现在与引用的规则完全相同,我更新了udevadm测试的输出…。很抱歉搞混了,太好了!这管用!但是运行udevadm触发器是不够的。我需要运行
    udevadm触发器
    udevadm测试-添加…
    。或者完全重新启动。您是如何找到udev规则不适用的原因的?@eDeviser Great;)。是的,
    udevadm触发器
    是不够的。您需要添加规则,否则大多数人会在之后重新启动。我是怎么发现的?我想说的是经验和排除所有其他可能性。对于此类基于linux/unix的问题,您会发现更适合。请不要忘记接受它-。如果
    udevadm触发器
    不起作用,它就不是解决方案。还有别的地方不对劲…@0andriy他把规则写错了。重新启动后它是否工作?为什么会出错?因为你需要重新启动。这是违反Unix方式的。
    version 232
    This program is for debugging only, it does not run any program
    specified by a RUN key. It may show incorrect results, because
    some values may be different, or not available at a simulation run.
    
    === trie on-disk ===
    tool version:          232
    file size:         8447696 bytes
    header size             80 bytes
    strings            1849040 bytes
    nodes              6598576 bytes
    Load module index
    Found container virtualization none
    timestamp of '/etc/systemd/network' changed
    timestamp of '/usr/lib/systemd/network' changed
    timestamp of '/lib/systemd/network' changed
    Parsed configuration file /lib/systemd/network/99-default.link
    Created link configuration context.
    timestamp of '/etc/udev/rules.d' changed
    Skipping overridden file: /lib/udev/rules.d/99-bizrfid.rules.
    Reading rules file: /lib/udev/rules.d/50-firmware.rules
    
    ...
    
    Reading rules file: /lib/udev/rules.d/98-systemd.rules
    Reading rules file: /etc/udev/rules.d/99-bizrfid.rules
    rules contain 49152 bytes tokens (4096 * 12 bytes), 12900 bytes strings
    4244 strings (40114 bytes), 3517 de-duplicated (27942 bytes), 728 trie nodes used
    GROUP 20 /lib/udev/rules.d/50-udev-default.rules:26
    IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:7
    IMPORT builtin 'usb_id' /lib/udev/rules.d/60-serial.rules:8
    /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0: if_class 2 protocol 0
    IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:8
    IMPORT builtin 'path_id' /lib/udev/rules.d/60-serial.rules:15
    LINK 'serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' /lib/udev/rules.d/60-serial.rules:16
    IMPORT builtin skip 'usb_id' /lib/udev/rules.d/60-serial.rules:19
    LINK 'serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' /lib/udev/rules.d/60-serial.rules:23
    LINK 'ttyMyDevice' /etc/udev/rules.d/99-bizrfid.rules:1
    handling device node '/dev/ttyACM0', devnum=c166:0, mode=0660, uid=0, gid=20
    preserve permissions /dev/ttyACM0, 020660, uid=0, gid=20
    preserve already existing symlink '/dev/char/166:0' to '../ttyACM0'
    found 'c166:0' claiming '/run/udev/links/\x2fserial\x2fby-id\x2fusb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00'
    creating link '/dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' to '/dev/ttyACM0'
    preserve already existing symlink '/dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00' to '../../ttyACM0'
    found 'c166:0' claiming '/run/udev/links/\x2fserial\x2fby-path\x2fpci-0000:00:14.0-usb-0:1.1:1.0'
    creating link '/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' to '/dev/ttyACM0'
    preserve already existing symlink '/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0' to '../../ttyACM0'
    creating link '/dev/ttyMyDevice' to '/dev/ttyACM0'
    creating symlink '/dev/ttyMyDevice' to 'ttyACM0'
    created db file '/run/udev/data/c166:0' for '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/tty/ttyACM0'
    ACTION=add
    DEVLINKS=/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.1:1.0 /dev/serial/by-id/usb-OEM_TWN4_B1.06_CCF3.00_PRS1.04-if00 /dev/ttyMyDevice
    DEVNAME=/dev/ttyACM0
    DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/tty/ttyACM0
    ID_BUS=usb
    ID_MODEL=TWN4_B1.06_CCF3.00_PRS1.04
    ID_MODEL_ENC=TWN4\x2fB1.06\x2fCCF3.00\x2fPRS1.04
    ID_MODEL_FROM_DATABASE=Atom Processor Z36xxx/Z37xxx, Celeron N2000 Series USB xHCI
    ID_MODEL_ID=0420
    ID_PATH=pci-0000:00:14.0-usb-0:1.1:1.0
    ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_1_1_0
    ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
    ID_PCI_INTERFACE_FROM_DATABASE=XHCI
    ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
    ID_REVISION=0200
    ID_SERIAL=OEM_TWN4_B1.06_CCF3.00_PRS1.04
    ID_TYPE=generic
    ID_USB_CLASS_FROM_DATABASE=Communications
    ID_USB_DRIVER=cdc_acm
    ID_USB_INTERFACES=:020201:0a0000:
    ID_USB_INTERFACE_NUM=00
    ID_VENDOR=OEM
    ID_VENDOR_ENC=OEM
    ID_VENDOR_FROM_DATABASE=Intel Corporation
    ID_VENDOR_ID=09d8
    MAJOR=166
    MINOR=0
    SUBSYSTEM=tty
    TAGS=:systemd:
    USEC_INITIALIZED=71480300178
    Unload module index
    Unloaded link configuration context.
    
    ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="09d8", ATTRS{idProduct}=="0420", SYMLINK+="ttyMyDevice"