내 udev 규칙에 어떤 문제가 있나요?

내 udev 규칙에 어떤 문제가 있나요?

특정 키보드가 연결되었을 때 스크립트를 실행하고 싶습니다. 여기에 내 시도와 내가 수집한 데이터가 있습니다.

요리를 하고 난 후에도 여전히 겪는 가장 작은 문제는 다음과 같습니다.

/etc/udev/rules.d/99-kinesis-testing-high-number.rules:

ACTION=="add", RUN+="/bin/sh -c '/bin/echo UDEV > /tmp/layout_kinesis.log'"

다시 로드하고 트리거합니다.

 sudo udevadm control --reload-rules && sudo udevadm trigger

/tmp/layout_kinesis.logUSB 장치를 연결한 후 파일에 아무런 변화가 없습니다.

이 최소 규칙에 문제가 있나요?

우분투 20.04.


출처 /var/log/syslog:

Mar 30 08:24:25 ionian mtp-probe: checking bus 2, device 96: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2"
Mar 30 08:24:25 ionian mtp-probe: bus: 2, device: 96 was not an MTP device
Mar 30 08:24:25 ionian systemd-udevd[59515]: 2-1.1.2: /etc/udev/rules.d/99-kinesis-testing-high-number.rules:1 Failed to write ATTR{/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/idProduct}, ignoring: Permission denied
Mar 30 08:24:25 ionian systemd-udevd[59515]: 2-1.1.2: Process '/bin/sh -c '/bin/echo UDEV > /tmp/layout_kinesis.log'' failed with exit code 2.
Mar 30 08:24:25 ionian systemd-udevd[59515]: 2-1.1.2:1.0: /etc/udev/rules.d/99-kinesis-testing-high-number.rules:1 Failed to write ATTR{/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.0/idProduct}, ignoring: No such file or directory
Mar 30 08:24:25 ionian systemd-udevd[59513]: 2-1.1.2:1.1: /etc/udev/rules.d/99-kinesis-testing-high-number.rules:1 Failed to write ATTR{/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.1/idProduct}, ignoring: No such file or directory
Mar 30 08:24:25 ionian systemd-udevd[59515]: 2-1.1.2:1.0: Process '/bin/sh -c '/bin/echo UDEV > /tmp/layout_kinesis.log'' failed with exit code 2.
Mar 30 08:24:25 ionian systemd-udevd[59513]: 2-1.1.2:1.1: Process '/bin/sh -c '/bin/echo UDEV > /tmp/layout_kinesis.log'' failed with exit code 2.

규칙이 실행되는 것 같습니다(왜 세 번 나타나는지 잘 모르겠습니다). 내가 하나 찾았어숫자~의질문 온라인~에 대한읽기 전용 문서udev 시스템.

이러한 모든 링크에는 udev의 파일 시스템을 읽기 전용으로 마운트하는 데 문제가 있는 것 같습니다. 하지만 그것이 나에게도 해당되는지는 확실하지 않습니다.

$ ps aux|grep udev
root       61004  0.0  0.0  23816  7416 ?        Ss   09:00   0:00 /lib/systemd/systemd-udevd
$ less /proc/61004/mounts
/dev/sda1 / ext4 rw,relatime,errors=remount-ro 0 0

라고 되어 있지만 rw, 또한 errors=remount-ro


내가 거기까지 어떻게 왔는지에 대한 자세한 내용은 다음과 같습니다.


lsusb버스와 장치(002 및 048)를 알려주세요.

$ lsusb
Bus 002 Device 008: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 002 Device 007: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 010: ID 045e:0b12 Microsoft Corp. 
Bus 002 Device 048: ID 05f3:0007 PI Engineering, Inc. Kinesis Advantage PRO MPC/USB Keyboard
Bus 002 Device 047: ID 05f3:0081 PI Engineering, Inc. Kinesis Integrated Hub

거기에서 udevadm다음과 같은 속성이 주어졌습니다.

$ sudo udevadm info --attribute-walk /dev/bus/usb/002/048

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.0/usb2/2-1/2-1.1/2-1.1.2':
    KERNEL=="2-1.1.2"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{devpath}=="1.1.2"
    ATTR{bcdDevice}=="0320"
    ATTR{devnum}=="48"
    ATTR{bMaxPower}=="64mA"
    ATTR{bMaxPacketSize0}=="8"
    ATTR{quirks}=="0x0"
    ATTR{tx_lanes}=="1"
    ATTR{bNumInterfaces}==" 2"
    ATTR{idProduct}=="0007"
    ATTR{speed}=="12"
    ATTR{bConfigurationValue}=="1"
    ATTR{configuration}==""
    ATTR{busnum}=="2"
    ATTR{bDeviceClass}=="00"
    ATTR{maxchild}=="0"
    ATTR{bNumConfigurations}=="1"
    ATTR{idVendor}=="05f3"
    ATTR{ltm_capable}=="no"
    ATTR{bDeviceSubClass}=="00"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bmAttributes}=="a0"
    ATTR{urbnum}=="427"
    ATTR{bDeviceProtocol}=="00"
    ATTR{removable}=="fixed"
    ATTR{version}==" 1.10"
    ATTR{rx_lanes}=="1"
    ATTR{authorized}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1':
    KERNELS=="2-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{devnum}=="77"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bcdDevice}=="0320"
    ATTRS{idVendor}=="05f3"
    ATTRS{urbnum}=="31"
    ATTRS{manufacturer}=="PI Engineering"
    ATTRS{devpath}=="1.1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}=="50mA"
    ATTRS{idProduct}=="0081"
    ATTRS{ltm_capable}=="no"
    ATTRS{configuration}==""
    ATTRS{bConfigurationValue}=="1"
    ATTRS{maxchild}=="4"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{tx_lanes}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{busnum}=="2"
    ATTRS{rx_lanes}=="1"
    ATTRS{speed}=="12"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{removable}=="unknown"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{product}=="Kinesis Keyboard Hub"
    ATTRS{quirks}=="0x0"
...

그래서 내가 얻는 udev 규칙은 다음과 같습니다 /etc/udev/rules.c/90-kinesis-advantage.rules.

SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="05f3", ATTR{idProduct}=="0007", RUN+="/bin/echo aaa >> /tmp/layout_kinesis.log"

그런 다음 규칙을 다시 로드합니다.

$ sudo udevadm control --reload-rules && sudo udevadm trigger

그리고 출력 파일을 모니터링합니다.

$ tail -f /tmp/layout_kinesis.log

그러나 키보드를 분리했다가 다시 연결해도 아무런 효과가 없습니다.


나는 또한 부모를 일치시키려고 시도했지만 운이 없었습니다.

SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="05f3", RUN+="/bin/sh -c 'echo aaa >> /tmp/layout_kinesis.log'"

또한 삭제를 시도 sh하고 이것을 시도했지만 작동하지 않았습니다.RUN+="/bin/echo aaa >> /tmp/layout_kinesis.log"


마지막 add항목 udevadm monitor -e은 다음과 같습니다.

UDEV  [51347.305368] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.1/0003:05F3:0007.003C/input/input112/event6 (input)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.1/0003:05F3:0007.003C/input/input112/event6
SUBSYSTEM=input
DEVNAME=/dev/input/event6
SEQNUM=26402
USEC_INITIALIZED=51347305171
ID_INPUT=1
ID_INPUT_KEY=1
ID_VENDOR=05f3
ID_VENDOR_ENC=05f3
ID_VENDOR_ID=05f3
ID_MODEL=0007
ID_MODEL_ENC=0007
ID_MODEL_ID=0007
ID_REVISION=0320
ID_SERIAL=05f3_0007
ID_TYPE=hid
ID_BUS=usb
ID_USB_INTERFACES=:030101:030000:
ID_USB_INTERFACE_NUM=01
ID_USB_DRIVER=usbhid
ID_PATH=pci-0000:00:1d.0-usb-0:1.1.2:1.1
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_1_2_1_1
XKBMODEL=pc105
XKBLAYOUT=us
XKBVARIANT=
XKBOPTIONS=
BACKSPACE=guess
LIBINPUT_DEVICE_GROUP=3/5f3/7:usb-0000:00:1d.0-1.1
MAJOR=13
MINOR=70
DEVLINKS=/dev/input/by-path/pci-0000:00:1d.0-usb-0:1.1.2:1.1-event /dev/input/by-id/usb-05f3_0007-event-if01
TAGS=:power-switch:

그래서 나는 몇 가지 추억이 있었기 때문에 이것을 시도했습니다.

ACTION=="add", ENV{ID_SERIAL}=="05f3_0007", RUN+="/bin/echo aaa >> /tmp/layout_kinesis.log"

아직 아무것도 없습니다.


udevadm 테스트는 run최소한 채워져 있음을 보여줍니다(이 출력은 ENV{ID_SERIAL}위 버전과 동일합니다).

$ udevadm test $(udevadm info -q path -n /dev/bus/usb/002/062)
# ... the end here:
Reading rules file: /etc/udev/rules.d/90-kinesis-advantage.rules
Reading rules file: /lib/udev/rules.d/90-libgpod.rules
Reading rules file: /lib/udev/rules.d/90-libinput-fuzz-override.rules
Reading rules file: /lib/udev/rules.d/90-nm-thunderbolt.rules
Reading rules file: /lib/udev/rules.d/90-pulseaudio.rules
Reading rules file: /lib/udev/rules.d/95-cd-devices.rules
Reading rules file: /lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /lib/udev/rules.d/95-upower-csr.rules
Reading rules file: /lib/udev/rules.d/95-upower-hid.rules
Reading rules file: /lib/udev/rules.d/95-upower-hidpp.rules
Reading rules file: /lib/udev/rules.d/95-upower-wup.rules
Reading rules file: /lib/udev/rules.d/96-e2scrub.rules
Reading rules file: /lib/udev/rules.d/97-hid2hci.rules
Reading rules file: /lib/udev/rules.d/99-systemd.rules
Invalid inotify descriptor.
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2
DEVNAME=/dev/bus/usb/002/062
DEVTYPE=usb_device
DRIVER=usb
PRODUCT=5f3/7/320
TYPE=0/0/0
BUSNUM=002
DEVNUM=062
MAJOR=189
MINOR=189
ACTION=add
SUBSYSTEM=usb
ID_VENDOR=05f3
ID_VENDOR_ENC=05f3
ID_VENDOR_ID=05f3
ID_MODEL=0007
ID_MODEL_ENC=0007
ID_MODEL_ID=0007
ID_REVISION=0320
ID_SERIAL=05f3_0007
ID_BUS=usb
ID_USB_INTERFACES=:030101:030000:
ID_VENDOR_FROM_DATABASE=PI Engineering, Inc.
ID_MODEL_FROM_DATABASE=Kinesis Advantage PRO MPC/USB Keyboard
ID_PATH=pci-0000:00:1d.0-usb-0:1.1.2
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_1_2
USEC_INITIALIZED=51523126321
run: '/bin/echo aaa >> /tmp/layout_kinesis.log'
Unload module index
Unloaded link configuration context.

또한 장치의 속성을 상위 속성과 결합해 보았습니다.

SUBSYSTEMS=="usb", ATTRS{idVendor}=="05f3", ATTR{idProduct}="0007", ACTION=="add", RUN+="/bin/sh -c '/bin/echo UDEV > tmp/layout_kinesis.log'"

여전히 작동하지 않습니다.


샌드박스 정보:

$ systemctl cat systemd-udevd.service
# /lib/systemd/system/systemd-udevd.service
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=udev Kernel Device Manager
Documentation=man:systemd-udevd.service(8) man:udev(7)
DefaultDependencies=no
After=systemd-sysusers.service systemd-hwdb-update.service
Before=sysinit.target
ConditionPathIsReadWrite=/sys

[Service]
Type=notify
# Note that udev also adjusts the OOM score internally and will reset the value internally for its workers
OOMScoreAdjust=-1000
Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
Restart=always
RestartSec=0
ExecStart=/lib/systemd/systemd-udevd
ExecReload=udevadm control --reload --timeout 0
KillMode=mixed
TasksMax=infinity
PrivateMounts=yes
ProtectHostname=yes
MemoryDenyWriteExecute=yes
RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
RestrictRealtime=yes
RestrictSUIDSGID=yes
LockPersonality=yes
IPAddressDeny=any
WatchdogSec=3min

답변1

최신 시스템에서는 udev RUN키와 관련된 몇 가지 주의 사항이 있습니다.

첫째, 동일한 장치 또는 이에 의존하는 장치가 다른 udev 이벤트를 처리하지 못하게 할 수 있으므로 장시간 실행되는 프로세스를 시작하는 데 이를 사용해서는 안 됩니다.

systemd-udevd.service두 번째 경고는샌드박스 처리된최신 배포판에서는 기본적으로 배포판에 적용된 정확한 샌드박스 옵션을 보려면 systemctl cat systemd-udevd.serviceSANDBOXING섹션을 참조하세요. man 5 systemd.exec그러나 최종 결과는 udev의 임시 파일이 자체 네임스페이스에 숨겨져 있을 수 있으며, 이는 해당 파일이 표시되지 않는 이유를 설명할 수 있습니다.

답변2

여전히 규칙 자체를 작성할 수는 없지만 echooneshot systemd 서비스를 시작하면 작동합니다./tmp/

/etc/udev/rules.d/99-kinesis.rules:

SUBSYSTEM=="usb", ATTRS{idVendor}=="05f3", ATTR{idProduct}=="0007", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="kinesis_custom.service"

/etc/sytemd/system/kinesis_custom.service:

[Unit]
Description=Autorun actions for Kinesis keyboard

[Service]
Type=oneshot
ExecStart=sh -c "/bin/echo UDEVSYSTEMD >> /tmp/layout_kinesis.log"
RemainAfterExit=true
StandardOutput=journal

@telcoM이 언급한 샌드박싱을 토대로 보면 이게 의도한 것인지는 모르겠지만 사용해 볼 수는 있을 것 같습니다.

관련 정보