为什么我的 udev 规则不起作用

为什么我的 udev 规则不起作用

我查看了论坛和谷歌,但没有找到答案。我尝试添加 udev 规则以在鼠标连接时禁用触摸板。首先,我编写了一般规则来检查它是否正常工作,但没有。这是规则:

ACTION=="add", SUBSYSTEM=="input", RUN+="/usr/local/bin/touchpadtoggle.sh"
ACTION=="remove", SUBSYSTEM=="input", RUN+="/usr/local/bin/touchpadtoggle.sh"

该规则位于 /etc/udev/rules.d/00-touchpad.rules

这是测试 bash 脚本:

#!/bin/bash
notify-send "Test"

Bash 脚本运行良好。如果我在命令行中输入“/usr/local/bin/touchpadtoggle.sh”,则会显示通知。

答案1

问题是 udev 以 root 身份运行,因此以 root 身份运行脚本,而不是以你的身份运行。你会希望你的真实脚本也这样,但这就是为什么notify-send不发送由 udev 运行时的通知。此外,DISPLAY由于 udev 在最小环境中运行,因此需要手动设置环境变量。

将您的脚本更改为以下内容,替换$USER为您的用户名:

#!/bin/bash
sudo -u $USER DISPLAY=:0 notify-send "Test"

另外,为了确保之前已(重新)阅读过新规则,请运行:

sudo udevadm control -R

答案2

您的udev规则可能 (i) 无法将您的鼠标识别为 USB 设备,或 (ii) 包含某种显示 (stdout) 通知,而规则在其中运行的最小 udev 环境无法理解这种通知。(其中一个例子是,默认情况下,它们不知道您的显示器存在。)

为了消除后者的疑虑,请出示/usr/local/bin/touchpadtoggle.sh)。

对于前者,打开终端并使其窗口聚焦,拔下鼠标并在终端中执行以下操作:

 $ lsusb
 $ udevadm monitor --property

然后插入鼠标紧接着Ctrl使用+退出终端中的 cmd C。快速执行此操作,无需触摸鼠标本身。这样做无害但很麻烦,如果你操作不正确,屏幕上会显示大量输出。你将看到以下输出(此处为我自己的鼠标):

 $ lsusb
 Bus 002 Device 004: ID 192f:0916 Avago Technologies, Pte.

我的鼠标在总线 002 上。接下来是供应商 ID 192f 和型号 ID 0916。当可用且已知时,产品和供应商 ID 是两个可用于在规则中明确识别特定设备的属性udev。我更喜欢它们,而不是过于简单的测试SUBSYSTEM=="input",我发现后者无法区分设备。使用第二个 cmd 的输出确认并改进这一点:

$ udevadm monitor --property
[.......]
UDEV  [25696.403834] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/event4 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-192f_USB_Optical_Mouse-event-mouse /dev/input/by-path/pci-0000:00:1d.7-usb-0:3.4:1.0-event-mouse
DEVNAME=/dev/input/event4
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/event4
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=0916
ID_PATH=pci-0000:00:1d.7-usb-0:3.4:1.0
ID_PATH_TAG=pci-0000_00_1d_7-usb-0_3_4_1_0
ID_REVISION=0200
ID_SERIAL=192f_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=192f
ID_VENDOR_ENC=192f
ID_VENDOR_ID=192f
MAJOR=13
MINOR=68
SEQNUM=2567
SUBSYSTEM=input
USEC_INITIALIZED=5875811

UDEV  [25696.407470] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-192f_USB_Optical_Mouse-mouse /dev/input/by-path/pci-0000:00:1d.7-usb-0:3.4:1.0-mouse
DEVNAME=/dev/input/mouse0
       *^^^ that's my device name ! ^^^*
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0  
*^^^ that's my device path ! ^^^*
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=0916
^^^^^^^^^^^^^^^^
ID_PATH=pci-0000:00:1d.7-usb-0:3.4:1.0
ID_PATH_TAG=pci-0000_00_1d_7-usb-0_3_4_1_0
ID_REVISION=0200
ID_SERIAL=192f_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=192f
ID_VENDOR_ENC=192f
ID_VENDOR_ID=192f
^^^^^^^^^^^^^^^^^
MAJOR=13
MINOR=32
SEQNUM=2566
SUBSYSTEM=input
USEC_INITIALIZED=5875565

[我使用 CTRL-C 停止了此处的监控]

通过以上内容,您知道内核将我的输入设备识别为 或/dev/input/event4/dev/input/mouse0请注意,您再次找到以进行确认: ID_MODEL_ID=0916ID_VENDOR_ID=192f。这样,我就可以编写一条udev规则来识别该特定设备。只需在上述规则中ID_MODEL_ID=="0916",ID_VENDOR_ID=="192f"添加就足以解决问题。SUBSYSTEM=="input"udev

还有另一种方法,我比较喜欢。因为我知道我的设备名称(来自上面),所以我在终端中执行以下操作:

$ udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse0)
                                                         ^^^^^^^
                                                   may be different for you
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:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0':
    KERNEL=="mouse0"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22':
    KERNELS=="input22"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{name}=="USB Optical Mouse"
    ATTRS{phys}=="usb-0000:00:1d.7-3.4/input0"
    ATTRS{uniq}==""
    ATTRS{properties}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003':
    KERNELS=="0003:192F:0916.0003"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0':
    KERNELS=="2-3.4:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4':
    KERNELS=="2-3.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="3.4"
    ATTRS{idVendor}=="192f"
    ATTRS{speed}=="1.5"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="8"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="98mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0200"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="62095"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0916"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB Optical Mouse"

因此,如果我不想在屏幕上显示任何内容,udev规则就变成:

ACTION=="add",SUBSYSTEMS=="usb",ATTRS{idVendor}=="192f",ATTRS{idProduct}=="0916",RUN+="/usr/local/bin/touchpadtoggle.sh"

更改值“192f”和“0916”以适合您的硬件。
HTH。欢迎反馈。

相关内容