udev匹配规则的编写

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.069743] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)
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"

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值