Step1. 在终端中执行:
udevadm monitor --environment --udev 【后面的--environment --udev参数可以不加】
然后手动触发需要监听的事件,例如拔插USB设备等,udevadm 会打印监听到的event信息;
Step2. 在上一条的打印信息中选择则感兴趣的设备执行:
udevadm info -a -p /path/to/device
在输出中查找需要的匹配信息即可
--------
下面以热插拔显示器为例。
root@firefly:~# udevadm monitor --environment --udev
monitor will print the received events for:UDEV - the event which udev sends out after rule processing
UDEV [578.459699] change /devices/platform/display-subsystem/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/platform/display-subsystem/drm/card0
DEVTYPE=drm_minor
DISPLAY=:0
HOTPLUG=1
ID_FOR_SEAT=drm-platform-display-subsystem
ID_PATH=platform-display-subsystem
ID_PATH_TAG=platform-display-subsystem
MAJOR=226
MINOR=0
SEQNUM=2309
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=2820333
XAUTHORITY=/home/firefly/.Xauthority
UDEV [581.586035] change /devices/platform/display-subsystem/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/platform/display-subsystem/drm/card0
DEVTYPE=drm_minor
DISPLAY=:0
HOTPLUG=1
ID_FOR_SEAT=drm-platform-display-subsystem
ID_PATH=platform-display-subsystem
ID_PATH_TAG=platform-display-subsystem
MAJOR=226
MINOR=0
SEQNUM=2310
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=2820333
XAUTHORITY=/home/firefly/.Xauthority
root@firefly:~# udevadm info -a -p /devices/platform/display-subsystem/drm/card0
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/platform/display-subsystem/drm/card0':
KERNEL=="card0"
SUBSYSTEM=="drm"
DRIVER==""
looking at parent device '/devices/platform/display-subsystem':
KERNELS=="display-subsystem"
SUBSYSTEMS=="platform"
DRIVERS=="rockchip-drm"
ATTRS{driver_override}=="(null)"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
在上面例子的第1步中,查询到了要关注的设备:/devices/platform/display-subsystem/drm/card0;
然后在第2步中执行udevadm info 查询操作,查到了匹配内容,最后根据该内容编写udev规则即可。
我根据匹配内容编写规则如下:
root@firefly:/etc/udev/rules.d# cat 95-monitor-hotplug.rules
KERNEL=="card0",KERNELS=="display-subsystem",RUN+="/usr/local/bin/hotplug_monitor.sh"
其中,/usr/local/bin/hotplug_monitor.sh内容如下:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/firefly/.Xauthority
function connect(){
xrandr --output HDMI-1 --mode 1600x900 --rotate left
}
function disconnect(){
#xrandr --output HDMI-1 --off
echo ""
}
xrandr | grep "HDMI-1 connected" &> /dev/null && connect || disconnect
上面HDMI-1和1600x900模式需要通过xrandr查看来确定。
-----
以下为插入USB串口的监听和查询数据。
root@OptiPlex-7040:~#udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[239093.070106] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
KERNEL[239093.070168] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0 (usb-serial)
KERNEL[239093.070630] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0/tty/ttyUSB0 (tty)
UDEV [239093.090998] add /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)
UDEV [239094.098705] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
UDEV [239094.101487] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0 (usb-serial)
UDEV [239094.105826] add /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0/tty/ttyUSB0 (tty)
root@OptiPlex-7040:~#udevadm info -a -p /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0/tty/ttyUSB0
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-2/1-2:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="ch341-uart"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0':
KERNELS=="1-2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ch341"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bInterfaceProtocol}=="02"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bNumEndpoints}=="03"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2':
KERNELS=="1-2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="ff"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{bMaxPower}=="98mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bcdDevice}=="0262"
ATTRS{bmAttributes}=="80"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="7"
ATTRS{devpath}=="2"
ATTRS{idProduct}=="7523"
ATTRS{idVendor}=="1a86"
ATTRS{ltm_capable}=="no"
ATTRS{maxchild}=="0"
ATTRS{product}=="USB2.0-Serial"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{speed}=="12"
ATTRS{urbnum}=="15"
ATTRS{version}==" 1.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}=="0415"
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.15.14-041514-generic xhci-hcd"
ATTRS{maxchild}=="16"
ATTRS{product}=="xHCI Host Controller"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{serial}=="0000:00:14.0"
ATTRS{speed}=="480"
ATTRS{urbnum}=="323"
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}=="0xa12f"
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}=="0x31"
ATTRS{subsystem_device}=="0x06b9"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{vendor}=="0x8086"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
udev规则可以这么写:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="tty_ch341"