在我去的时候学习这个,所以请原谅我,如果我完全忽略了这一点。
我在ThinkPad X200上运行Arch,我想让底座工作,这样我就可以坐在办公桌前充电并显示到外接显示器上。我一直在研究这个问题近一个星期尝试了许多不同的事情和不同的方法,udev是我认为最有效的方法。
以下是停靠时的udev输出:
UDEV [7979.317053] add /devices/pci0000:00/0000:00:1a.7/usb1/1-5 (usb)
ACTION=add
BUSNUM=001
DEVNAME=/dev/bus/usb/001/027
DEVNUM=027
DEVPATH=/devices/pci0000:00/0000:00:1a.7/usb1/1-5
DEVTYPE=usb_device
DRIVER=usb
ID_BUS=usb
ID_FOR_SEAT=usb-pci-0000_00_1a_7-usb-0_5
ID_MODEL=1005
ID_MODEL_ENC=1005
ID_MODEL_ID=1005
ID_PATH=pci-0000:00:1a.7-usb-0:5
ID_PATH_TAG=pci-0000_00_1a_7-usb-0_5
ID_REVISION=0001
ID_SERIAL=17ef_1005
ID_USB_INTERFACES=:090001:090002:
ID_VENDOR=17ef
ID_VENDOR_ENC=17ef
ID_VENDOR_FROM_DATABASE=Lenovo
ID_VENDOR_ID=17ef
MAJOR=189
MINOR=26
PRODUCT=17ef/1005/1
SEQNUM=2995
SUBSYSTEM=usb
TAGS=:seat:
TYPE=9/0/2
USEC_INITIALIZED=7975952454
以下是取消停靠时的udev输出:
UDEV [7996.175393] remove /devices/pci0000:00/0000:00:1a.7/usb1/1-5 (usb)
ACTION=remove
BUSNUM=001
DEVNAME=/dev/bus/usb/001/027
DEVNUM=027
DEVPATH=/devices/pci0000:00/0000:00:1a.7/usb1/1-5
DEVTYPE=usb_device
MAJOR=189
MINOR=26
PRODUCT=17ef/1005/1
SEQNUM=3003
SUBSYSTEM=usb
TYPE=9/0/2
USEC_INITIALIZED=7996171763
这是我创建的udev规则:
SUBSYSTEM=="usb", ACTION=="add", ATTR{PRODUCT}=="17ef/1005/1", RUN+="/usr/local/bin/docked.sh"
这是我使用dockd处理监视器输出的/usr/local/bin/docked.sh
脚本:
#!/bin/bash
dockd --set docked
非常感谢任何和所有帮助,如果我遗漏了解决问题所需的任何内容,我会道歉。
答案 0 :(得分:0)
你非常接近,但这里有一些细微的调整。
首先:您看到的大多数值都不是ATTR
,而是ENV
。除了ENV
值之外,不要提前发生,所以请确保它们稍后发生。
换句话说,这应该是:
SUBSYSTEM=="usb", ACTION=="ADD", ENV{PRODUCT}=="17ef/1005/1", RUN+="/usr/local/bin/docked.sh"
你会注意到第二次改变。行动的大写ADD
。
唉,udev区分大小写。
进一步挖掘......
ATTR
值(唉)不直接引用udev值。相反,他们引用了 sysfs
值。让我们分解一下:
鉴于设备/devices/pci0000:00/0000:00:1a.7/usb1/1-5
和udev规则:
SUBSYSTEM=="usb", ACTION=="add", ATTR{PRODUCT}=="17ef/1005/1", RUN+="/usr/local/bin/docked.sh"
你将在那里搜索路径/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-5
(字面意思是文件系统上的路径),然后它会在一个名为PRODUCT
的文件中查找。有可能,该文件不存在(或者如果内容不是17ef/1005/1
)。鉴于类似的Thinkpad基座,这就是我所拥有的:
运行udevadm monitor -p -s usb
时,我在输出中得到了这个(缩写):
UDEV [199584.676830] add /devices/pci0000:00/0000:00:14.0/usb1/1-4 (usb)
ACTION=add
BUSNUM=001
DEVNAME=/dev/bus/usb/001/104
DEVNUM=104
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-4
DEVTYPE=usb_device
DRIVER=usb
ID_BUS=usb
ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_4
ID_MODEL=Lenovo_ThinkPad_Dock
ID_MODEL_ENC=Lenovo\x20ThinkPad\x20Dock\x20\x20\x20
ID_MODEL_ID=1012
ID_PATH=pci-0000:00:14.0-usb-0:4
ID_PATH_TAG=pci-0000_00_14_0-usb-0_4
ID_REVISION=5040
ID_SERIAL=LENOVO_Lenovo_ThinkPad_Dock
ID_USB_INTERFACES=:090000:
ID_VENDOR=LENOVO
ID_VENDOR_ENC=LENOVO\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_VENDOR_FROM_DATABASE=Lenovo
ID_VENDOR_ID=17ef
MAJOR=189
MINOR=103
PRODUCT=17ef/1012/5040
SEQNUM=6492
SUBSYSTEM=usb
TAGS=:seat:
TYPE=9/0/1
USEC_INITIALIZED=199583756948
另一方面,当我使用 sysfs 设备路径运行udevadm info -a -p
时,我会获得更多有用信息:
$ udevadm info -a -p /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-4':
KERNEL=="1-4"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{authorized}=="1"
ATTR{avoid_reset_quirk}=="0"
ATTR{bConfigurationValue}=="1"
ATTR{bDeviceClass}=="09"
ATTR{bDeviceProtocol}=="01"
ATTR{bDeviceSubClass}=="00"
ATTR{bMaxPacketSize0}=="64"
ATTR{bMaxPower}=="0mA"
ATTR{bNumConfigurations}=="1"
ATTR{bNumInterfaces}==" 1"
ATTR{bcdDevice}=="5040"
ATTR{bmAttributes}=="e0"
ATTR{busnum}=="1"
ATTR{configuration}==""
ATTR{devnum}=="104"
ATTR{devpath}=="4"
ATTR{idProduct}=="1012"
ATTR{idVendor}=="17ef"
ATTR{ltm_capable}=="no"
ATTR{manufacturer}=="LENOVO "
ATTR{maxchild}=="4"
ATTR{product}=="Lenovo ThinkPad Dock "
ATTR{quirks}=="0x0"
ATTR{removable}=="fixed"
ATTR{speed}=="480"
ATTR{urbnum}=="31"
ATTR{version}==" 2.10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{authorized_default}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bMaxPower}=="0mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bcdDevice}=="0413"
ATTRS{bmAttributes}=="e0"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{idProduct}=="0002"
ATTRS{idVendor}=="1d6b"
ATTRS{interface_authorized_default}=="1"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 4.13.16-100.fc25.x86_64 xhci-hcd"
ATTRS{maxchild}=="12"
ATTRS{product}=="xHCI Host Controller"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{serial}=="0000:00:14.0"
ATTRS{speed}=="480"
ATTRS{urbnum}=="2287"
ATTRS{version}==" 2.00"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{d3cold_allowed}=="1"
ATTRS{device}=="0x9d2f"
ATTRS{dma_mask_bits}=="64"
ATTRS{driver_override}=="(null)"
ATTRS{enable}=="1"
ATTRS{irq}=="123"
ATTRS{local_cpulist}=="0-3"
ATTRS{local_cpus}=="f"
ATTRS{msi_bus}=="1"
ATTRS{numa_node}=="-1"
ATTRS{revision}=="0x21"
ATTRS{subsystem_device}=="0x2233"
ATTRS{subsystem_vendor}=="0x17aa"
ATTRS{vendor}=="0x8086"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
当我深入了解该设备的sysfs目录时,我看到以下内容:
$ ls -l /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
total 0
drwxr-xr-x. 8 root root 0 Jan 18 13:27 1-4:1.0
drwxr-xr-x. 7 root root 0 Jan 18 13:27 1-4.4
-rw-r--r--. 1 root root 4096 Jan 18 13:49 authorized
-rw-r--r--. 1 root root 4096 Jan 18 13:49 avoid_reset_quirk
-r--r--r--. 1 root root 4096 Jan 18 13:27 bcdDevice
-rw-r--r--. 1 root root 4096 Jan 18 13:27 bConfigurationValue
-r--r--r--. 1 root root 4096 Jan 18 13:27 bDeviceClass
-r--r--r--. 1 root root 4096 Jan 18 13:49 bDeviceProtocol
-r--r--r--. 1 root root 4096 Jan 18 13:49 bDeviceSubClass
-r--r--r--. 1 root root 4096 Jan 18 13:49 bmAttributes
-r--r--r--. 1 root root 4096 Jan 18 13:49 bMaxPacketSize0
-r--r--r--. 1 root root 4096 Jan 18 13:49 bMaxPower
-r--r--r--. 1 root root 4096 Jan 18 13:49 bNumConfigurations
-r--r--r--. 1 root root 4096 Jan 18 13:49 bNumInterfaces
-r--r--r--. 1 root root 4096 Jan 18 13:27 busnum
-r--r--r--. 1 root root 4096 Jan 18 13:49 configuration
-r--r--r--. 1 root root 65553 Jan 18 13:27 descriptors
-r--r--r--. 1 root root 4096 Jan 18 13:49 dev
-r--r--r--. 1 root root 4096 Jan 18 13:27 devnum
-r--r--r--. 1 root root 4096 Jan 18 13:49 devpath
lrwxrwxrwx. 1 root root 0 Jan 18 13:27 driver -> ../../../../../bus/usb/drivers/usb
drwxr-xr-x. 3 root root 0 Jan 18 13:55 ep_00
-r--r--r--. 1 root root 4096 Jan 18 13:27 idProduct
-r--r--r--. 1 root root 4096 Jan 18 13:27 idVendor
-r--r--r--. 1 root root 4096 Jan 18 13:49 ltm_capable
-r--r--r--. 1 root root 4096 Jan 18 13:27 manufacturer
-r--r--r--. 1 root root 4096 Jan 18 13:49 maxchild
lrwxrwxrwx. 1 root root 0 Jan 18 13:49 port -> ../1-0:1.0/usb1-port4
drwxr-xr-x. 2 root root 0 Jan 18 13:27 power
-r--r--r--. 1 root root 4096 Jan 18 13:27 product
-r--r--r--. 1 root root 4096 Jan 18 13:49 quirks
-r--r--r--. 1 root root 4096 Jan 18 13:49 removable
--w-------. 1 root root 4096 Jan 18 13:49 remove
-r--r--r--. 1 root root 4096 Jan 18 13:27 speed
lrwxrwxrwx. 1 root root 0 Jan 18 13:27 subsystem -> ../../../../../bus/usb
-rw-r--r--. 1 root root 4096 Jan 18 13:27 uevent
-r--r--r--. 1 root root 4096 Jan 18 13:49 urbnum
-r--r--r--. 1 root root 4096 Jan 18 13:49 version
关键部分是将udevadm info
(而不是udevadm monitor
)数据与/sysfs
中的位置相关联。你会注意到我在info
输出中得到了:
ATTR{bcdDevice}=="5040"
...
ATTR{idProduct}=="1012"
ATTR{idVendor}=="17ef"
而且,低,看哪:
$ cd /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
$ cat bcdDevice
5040
$ cat idProduct
1012
$ cat idVendor
17ef
希望这足以让你超越终点线!