udev - 在一个符号链接下收集 USB 类

问题描述

我有一个 4 端口 USB 集线器,它连接了多个具有相同/相似(一个或多个类可能/可能不可用)功能的 USB 设备,我想在一个符号链接目录下收集设备类,并带有端口/路径标识

它应该看起来像:

/dev/usb_port0
└── tty*
└── hidraw*
└── sd*
└── ...

/dev/usb_port1
└── tty*
└── hidraw*
└── sd*
└── ...

 /dev/usb_port-n
└── tty*
└── hidraw*
└── sd*
└── ...   

设备-A 连接到端口 2 - hidraw 类:

$ udevadm info --attribute-walk /dev/hidraw0
  looking at device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.3/0003:0D28:0204.0016/hidraw/hidraw0':
    KERNEL=="hidraw0"
    SUBSYstem=="hidraw"
    DRIVER==""

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.3/0003:0D28:0204.0016':
    KERNELS=="0003:0D28:0204.0016"
    SUBSYstemS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.3':
    KERNELS=="1-1.4.2:1.3"
    SUBSYstemS=="usb"
    DRIVERS=="usbhid"
    ...

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2':
    KERNELS=="1-1.4.2"
    SUBSYstemS=="usb"
    DRIVERS=="usb"
    ...
    ATTRS{product}=="DAPLink CMSIS-DAP"

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4':
    KERNELS=="1-1.4"
    SUBSYstemS=="usb"
    DRIVERS=="usb"
    ...
    ATTRS{product}=="USB2.0 Hub             "
    ATTRS{manufacturer}=="VIA Labs,Inc.         "

设备-A 连接到端口 2 - tty 类:

udevadm info --attribute-walk /dev/ttyACM0
    looking at device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.1/tty/ttyACM0':
        KERNEL=="ttyACM0"
        SUBSYstem=="tty"
        DRIVER==""

      looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.1':
        KERNELS=="1-1.4.2:1.1"
        SUBSYstemS=="usb"
        DRIVERS=="cdc_acm"
        ...

      looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2':
        KERNELS=="1-1.4.2"
        SUBSYstemS=="usb"
        DRIVERS=="usb"
        ...
        ATTRS{product}=="DAPLink CMSIS-DAP"

      looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4':
        KERNELS=="1-1.4"
        SUBSYstemS=="usb"
        DRIVERS=="usb"
        ...
        ATTRS{manufacturer}=="VIA Labs,Inc.         "
        ATTRS{product}=="USB2.0 Hub     

    "

我的 udev 规则:/etc/udev/rules.d/90-port-2.rules

ACTION!="add|change",GOTO="debug_rules"
DEVPATH!="*1-1.4.2",GOTO="debug_rules"

ACTION=="add",GROUP="usb",MODE="0666",SYMLINK+="usbdev/%k-%n"

LABEL="debug_rules"

$ journalctl -f | grep usbdev 说:

systemd-udevd[5608]: 1-1.4.2: /etc/udev/rules.d/90-port-2.rules:4 LINK 'usbdev/1-1.4.2-2'
systemd-udevd[5608]: 1-1.4.2: Creating symlink '/dev/usbdev/1-1.4.2-2' to '../bus/usb/001/029'
systemd-udevd[5612]: 1-1.4.2: Updating old name,'/dev/usbdev/1-1.4.2-2' no longer belonging to '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/1-1.4.2'
systemd-udevd[5612]: 1-1.4.2: No reference left,removing '/dev/usbdev/1-1.4.2-2'

请问,你知道如何实现这个方法吗?

解决方法

在对 udev 联机帮助页和调试注销进行了一些挖掘后,我找到了答案。

我之前的规则未命中绑定动作

ACTION!="add|bind",GOTO="debug_rules"

进入

KERNELS=="1-1.4.2:*",SUBSYSTEM=="hidraw|tty|scsi_generic",OWNER="ubuntu",GROUP="usb",SYMLINK+="usbport/2/%k",MODE="0666",OPTIONS+="last_rule",GOTO="debug_rules"

整个规则也应该看起来:

/dev/usbport/
└── 2
    ├── hidraw0 -> ../../hidraw0
    ├── sg0 -> ../../sg0
    └── ttyACM0 -> ../../ttyACM0

和符号链接是(树视图)

{
    "id": 1,"name": "Sample name","attributes": {
        "age": 10
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...