udev rules 编写,关联,device,linux,systemd

hello rules

以USB键盘为例:

  1. lsusb 查看当前插入USB设备,可以看到厂商和产品代码

    1
    2
    3
    4
     $ lsusb
     Bus 001 Device 004: ID 8087:0aa7 Intel Corp. Wireless-AC 3168 Bluetooth
     Bus 001 Device 005: ID 046d:c52f Logitech, Inc. Unifying Receiver
     Bus 001 Device 002: ID 05ac:024f Apple, Inc. Aluminium Keyboard (ANSI)
    

    其中,Bus 001 Device 002: 就是一个键盘,厂家编码 ATTRS{idVendor}05ac,产品编码 ATTRS{idProduct}024f

  2. 创建rules文件

    sudo vim /etc/udev/rules.d/10-keyboard.rules

    1
     ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
    
  3. 创建对应的rule触发时,执行的脚本

    sudo vim /tmp/test.sh

    这个脚本主要打印些设备信息,要加什么功能,可以自己添加,注意不要加耗时任务。

    1
    2
    3
    4
    5
    6
    7
    8
     #! /bin/sh
    
     env >>/tmp/test.log
     file "/sys${DEVPATH}" >> /tmp/test.log
    
     if [ "${ACTION}" = add -a -d "/sys${DEVPATH}" ]; then
     echo "add ${DEVPATH}" >> /tmp/test.log
     fi
    
  4. 重载rules : sudo udevadm control --reload-rules

  5. 在命令窗口开启监视: sudo udevadm monitor

    可以在命令开头加上 unbuffer : unbuffer udevadm monitor ,这样的话,就不用到4K的缓冲慢了,才输入到命令行窗口。

  6. 手动触发,来测试 rules 和 脚本 : sudo udevadm trigger

debug

查看日志

修改日志级别: udevadm control --log-priority=info

然后在 system log(journalctl -f) 或者 kernel log(dmesg)中看到所有日志。

  • 如果要永久修改 log 级别 :

    /etc/udev/udev.conf 保存了日志级别,默认是 error

    1
    2
    3
    4
      vi /etc/udev/udev.conf
      # edit the log level as described in "man udev.conf"
      systemctl restart systemd-udevd
      journalctl -f
    

查看 device 的信息

  • udevadm monitor
    udev有变动,就会输出到命令行窗口。 ctrl + c 退出。

  • udevadm info

知道设备名称,查询设备相关信息: udevadm info --name /dev/sda1 --query all

知道设备path,查看设备所有相关属性: udevadm info --attribute-walk --path=/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:05.0/0000:05:00.0/usb1/1-3/1-3:1.0

  • 注意: 根据 /devcies/xxx 开头的path,在文件系统会 找不到文件,实际应该在 /sys 目录下找 /sys/devices/xxxx