udev 규칙의 스크립트가 실행되지 않습니다


8

랩톱에서 Ubuntu 9.10 (Karmic Koala)을 실행 중이며 USB 키보드가 연결되어 있는지 (numlock on) 또는 연결되어 있지 않은지 (numlock off)에 따라 NumLock이 자동으로 전환되도록하고 싶습니다.

이를 위해 먼저 "numlockx"패키지를 설치했습니다. numlockx on그리고 numlockx off잘 작동합니다.

장치 시스템에 연결하기 위해 udev를 사용할 것이라고 생각했습니다. "udev 규칙 작성" 을 읽었 지만 udev 규칙을 작동시키는 데 문제가 있습니다.

먼저 dmesg출력 의 예는 다음과 같습니다.

[20906.985102] usb 3-2 : uhci_hcd 및 주소 6을 사용하는 새로운 저속 USB 장치
[20907.166403] usb 3-2 : 구성 1 번 1 가지 선택
[20907.192904] 입력 : /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20으로 Microsoft Natural® Ergonomic Keyboard 4000
[20907.193100] Microsoft 0003 : 045E : 00DB.000B : 입력, hidraw1 : usb-0000 : 00 : 1a.0-2 / input0의 USB HID v1.11 키보드 [Microsoft Natural® 인체 공학적 키보드 4000]
[20907.217810] 입력 : /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21과 같은 Microsoft Natural® Ergonomic Keyboard 4000
[20907.217979] Microsoft 0003 : 045E : 00DB.000C : 입력, hidraw2 : usb-0000 : 00 : 1a.0-2 / input1의 USB HID v1.11 장치 [Microsoft Natural® 인체 공학적 키보드 4000]

udevadm info장치 정보를 수집하는 데 사용 했습니다.

> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

  장치 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'을보고 :
    KERNEL == "input21"
    SUBSYSTEM == "입력"
    DRIVER == ""
    ATTR {phys} == "usb-0000 : 00 : 1a.0-2 / input1"
    ATTR {uniq} == ""
    ATTR {modalias} == "입력 : b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 80 , 81,82,83,84,85,86,87,88,89,8A, 8B, 8C, 8E, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6 , A7, A8, A9, AB, AC, AD, AE, B0, B1, B2, B3, B4, B5, B6, B8, B9, BA, BB, BC, BD, BE, BF, C0, C1, C2 CE, CF, D0, D1, D2, D5, D9, DB, DF, E2, E7, E8, E9, EA, EB, F0,100,162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F , 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20 , lsfw "

  부모 장치 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'을 보는 중 :
    KERNELS == "3-2 : 1.1"
    SUBSYSTEMS == "usb"
    DRIVERS == "usbhid"
    공격자 {bInterfaceNumber} == "01"
    공격자 {bAlternateSetting} == "0"
    공격자 {bNumEndpoints} == "01"
    공격자 {bInterfaceClass} == "03"
    ATTRS {bInterfaceSubClass} == "00"
    공격자 {bInterfaceProtocol} == "00"
    ATTRS {modalias} == "usb : v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"
    공격자 {supports_autosuspend} == "1"

  부모 장치 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'를보고 :
    KERNELS == "3-2"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {configuration} == ""
    공격자 {bNumInterfaces} == "2"
    ATTRS {bConfigurationValue} == "1"
    ATTRS {bmAttributes} == "a0"
    공격자 {bMaxPower} == "100mA"
    공격자 {urbnum} == "532"
    ATTRS {idVendor} == "045e"
    ATTRS {idProduct} == "00db"
    ATTRS {bcdDevice} == "0173"
    공격자 {bDeviceClass} == "00"
    공격자 {bDeviceSubClass} == "00"
    공격자 {bDeviceProtocol} == "00"
    공격자 {bNumConfigurations} == "1"
    공격자 {bMaxPacketSize0} == "8"
    공격자 {speed} == "1.5"
    공격자 {busnum} == "3"
    공격자 {devnum} == "6"
    공격자 {version} == "2.00"
    공격자 {maxchild} == "0"
    공격자 {quirks} == "0x0"
    공격자 {authorized} == "1"
    ATTRS {manufacturer} == "Microsoft"

  부모 장치 '/devices/pci0000:00/0000:00:1a.0/usb3'을보고 :
    KERNELS == "usb3"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {configuration} == ""
    공격자 {bNumInterfaces} == "1"
    ATTRS {bConfigurationValue} == "1"
    ATTRS {bmAttributes} == "e0"
    공격자 {bMaxPower} == "0mA"
    공격자 {urbnum} == "127"
    공격자 {idVendor} == "1d6b"
    공격자 {idProduct} == "0001"
    공격자 {bcdDevice} == "0206"
    공격자 {bDeviceClass} == "09"
    공격자 {bDeviceSubClass} == "00"
    공격자 {bDeviceProtocol} == "00"
    공격자 {bNumConfigurations} == "1"
    공격자 {bMaxPacketSize0} == "64"
    공격자 {speed} == "12"
    공격자 {busnum} == "3"
    공격자 {devnum} == "1"
    공격자 {version} == "1.10"
    공격자 {maxchild} == "2"
    공격자 {quirks} == "0x0"
    공격자 {authorized} == "1"
    ATTRS {manufacturer} == "리눅스 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "UHCI 호스트 컨트롤러"
    공격자 {serial} == "0000 : 00 : 1a.0"
    공격자 {authorized_default} == "1"

  부모 장치 '/devices/pci0000:00/0000:00:1a.0'을보고 :
    KERNELS == "0000 : 00 : 1a.0"
    SUBSYSTEMS == "pci"
    DRIVERS == "uhci_hcd"
    공격자 {vendor} == "0x8086"
    ATTRS {device} == "0x2937"
    ATTRS {subsystem_vendor} == "0x1558"
    ATTRS {subsystem_device} == "0x0860"
    공격자 {class} == "0x0c0300"
    공격자 {irq} == "16"
    공격자 {local_cpus} == "ff"
    공격자 {local_cpulist} == "0-7"
    ATTRS {modalias} == "pci : v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    공격자 {broken_parity_status} == "0"
    ATTRS {msi_bus} == ""

  부모 장치 '/ devices / pci0000 : 00'을보고 :
    KERNELS == "pci0000 : 00"
    SUBSYSTEMS == ""
    DRIVERS == ""

그래서 나는 다음과 같은 파일을 만들었습니다 /etc/udev/rules.d/usb-keyboard.rules.

# 키보드가 연결되면 NumLock을 켭니다.
ACTION == "추가", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "입력", RUN + = "/ usr / bin / numlockx on"

# 키보드가 분리되면 NumLock을 끕니다.
ACTION == "제거", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "입력", RUN + = "/ usr / bin / numlockx 꺼짐"

udevadm test규칙이 올바른지 확인하는 데 사용 했습니다.

> udevadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command : 호출 : 테스트
udevadm_test : 버전 147

[...]
parse_file : '/etc/udev/rules.d/usb-keyboard.rules'를 규칙 파일로 읽기
udev_rules_new : 규칙은 180864 바이트 토큰 (15072 * 12 바이트), 31614 바이트 버퍼를 사용합니다.
udev_rules_new : 사용 된 임시 인덱스 49760 바이트 (2488 * 20 바이트)
udev_device_new_from_syspath : 장치 0x28d7d80에는 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'경로가 있습니다.
udev_rules_apply_to_event : RUN '/ sbin / modprobe -b $ env {MODALIAS}'/lib/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event : RUN '소켓 : @ / org / freedesktop / hal / udev_event'/lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath : 장치 0x28d8560에 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'경로가 있습니다.
udev_device_new_from_syspath : 장치 0x28d8708에 devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'가 있습니다
udev_rules_apply_to_event : RUN '/ usr / bin / numlockx on'/etc/udev/rules.d/usb-keyboard.rules:7
udevadm_test : UDEV_LOG = 6
udevadm_test : DEVPATH = / devices / pci0000 : 00/0000 : 00 : 1a.0 / usb3 / 3-2 / 3-2 : 1.1 / input / input21
udevadm_test : 제품 = 3 / 45e / db / 111
udevadm_test : NAME = "Microsoft Natural® 인체 공학적 키보드 4000"
udevadm_test : PHYS = "usb-0000 : 00 : 1a.0-2 / input1"
udevadm_test : UNIQ = ""
udevadm_test : EV == 10001f
udevadm_test : 키 == 837fff 2c3027 bf00444401 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udevadm_test : REL == 40
udevadm_test : ABS == 1 0
udevadm_test : MSC == 10
udevadm_test : MODALIAS = 입력 : b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 80,81, 82,83,84,85,86,87,88,89,8A, 8B, 8C, 8E, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B0, B1, B2, B3, B4, B5, B6, B8, B9, BA, BB, BC, BD, BE, BF, C0, C1, C2, CE, CF, D0, D1, D2, D5, D9, DB, DF, E2, E7, E8, E9, EA, EB, F0,100,162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F, 180,181,182,185, 18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20, m4, lsfw
udevadm_test : ACTION = 추가
udevadm_test : SUBSYSTEM = 입력
udevadm_test : 실행 : '/ sbin / modprobe -b 입력 : b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E , 7F, 80,81,82,83,84,85,86,87,88,89,8A, 8B, 8C, 8E, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4 , A5, A6, A7, A8, A9, AB, AC, AD, AE, B0, B1, B2, B3, B4, B5, B6, B8, B9, BA, BB, BC, BD, BE, BF, C0 , C1, C2, CE, CF, D0, D1, D2, D5, D9, DB, DF, E2, E7, E8, E9, EA, EB, F0,100,162,166,16A, 16E, 178,179,17A, 17B, 17C , 17D, 17F, 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B6,1B7, r1 , a20, m4, lsfw '
udevadm_test : 실행 : 'socket : @ / org / freedesktop / hal / udev_event'
udevadm_test : 실행 : '/ usr / bin / numlockx on'

다음은 "제거"테스트입니다.

> udevadm test --action = / devices / pci0000 : 00/0000 : 00 : 1a.0 / usb3 / 3-2 / 3-2 : 1.1 / input / input21 제거

run_command : 호출 : 테스트
udevadm_test : 버전 147

[...]
parse_file : '/etc/udev/rules.d/usb-keyboard.rules'를 규칙 파일로 읽기
udev_rules_new : 규칙은 180864 바이트 토큰 (15072 * 12 바이트), 31614 바이트 버퍼를 사용합니다.
udev_rules_new : 사용 된 임시 인덱스 49760 바이트 (2488 * 20 바이트)
udev_device_new_from_syspath : 장치 0xd2fd80에는 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'경로가 있습니다.
udev_rules_apply_to_event : RUN '소켓 : @ / org / freedesktop / hal / udev_event'/lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath : 장치 0xd2fff8에 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'경로가 있습니다.
udev_device_new_from_syspath : 장치 0xd30690에 devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'가 있습니다
udev_rules_apply_to_event : RUN '/ usr / bin / numlockx off'/etc/udev/rules.d/usb-keyboard.rules:10
udevadm_test : UDEV_LOG = 6
udevadm_test : DEVPATH = / devices / pci0000 : 00/0000 : 00 : 1a.0 / usb3 / 3-2 / 3-2 : 1.1 / input / input21
udevadm_test : 제품 = 3 / 45e / db / 111
udevadm_test : NAME = "Microsoft Natural® 인체 공학적 키보드 4000"
udevadm_test : PHYS = "usb-0000 : 00 : 1a.0-2 / input1"
udevadm_test : UNIQ = ""
udevadm_test : EV == 10001f
udevadm_test : 키 == 837fff 2c3027 bf00444401 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udevadm_test : REL == 40
udevadm_test : ABS == 1 0
udevadm_test : MSC == 10
udevadm_test : MODALIAS = 입력 : b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 80,81, 82,83,84,85,86,87,88,89,8A, 8B, 8C, 8E, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B0, B1, B2, B3, B4, B5, B6, B8, B9, BA, BB, BC, BD, BE, BF, C0, C1, C2, CE, CF, D0, D1, D2, D5, D9, DB, DF, E2, E7, E8, E9, EA, EB, F0,100,162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F, 180,181,182,185, 18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20, m4, lsfw
udevadm_test : ACTION = 제거
udevadm_test : SUBSYSTEM = 입력
udevadm_test : 실행 : 'socket : @ / org / freedesktop / hal / udev_event'
udevadm_test : 실행 : '/ usr / bin / numlockx off'

문제는 키보드를 꽂거나 뽑을 때 NumLock 상태가 변경되지 않는다는 것입니다. 운없이 udev 서비스를 다시 시작하려고했습니다. 내 udev 규칙이 잘못 되었습니까? 나는 이것에 대해 잘못 가고 있습니까?


결정된! 올바른 방향으로 나를 가리켜 준 tony-p-lee와 whitequark 덕분에.
Eric Heikes

답변:


4

문제는 아마도 이름에서 알 수 있듯이 일부 X 환경에서 numlockx를 테스트했을 것입니다. X 클라이언트 (X 서버에 연결하는 GUI 프로그램 (예 : Firefox 또는 GEdit))는 연결할 서버를 알고 있어야하며 또한 일종의 인증을 통과해야합니다. 루트 또는 일반 사용자에 관계없이 일반 콘솔에서 로그인하고 일부 GUI 응용 프로그램을 시작하십시오. 알 수 없기 때문에 일부 DISPLAY 관련 오류가 표시됩니다.

이 문제를 해결하려면 환경 변수 DISPLAY를 설정해야합니다. X 서버가 하나만 있으면 거의 항상 주소가 : 0입니다.

일반 콘솔에서 시도하십시오 : type numlockx on, "Error opening display!"가 표시됩니다. 을 입력 DISPLAY=:0 numlockx on하면 작동합니다 (적어도 나를 위해 일했습니다).

따라서이 환경 변수를 udev에서 설정하거나 그냥 시작할 수 sh -c 'DISPLAY=:0 numlockx <state>'있습니다.


네가 옳아! numlockx에 X 환경이 필요하다고 생각하지 않았습니다. 불행히도 DISPLAY 설정은 오류 메시지를 제거하지만 콘솔이나 udev를 통해 작동하지 않습니다.
Eric Heikes

너무 빨리 스포크. 전체 경로를 사용하여 쉘을 실행하면 작동합니다./bin/sh -c '...'
Eric Heikes

4

이 두 명령은 udev 문제를 많이 디버깅하는 데 사용할 수 있습니다.

 udevd --debug-trace --verbose
 strace -p pid_of_udevd -f -e trace=open,exec

args는 다른 버전에서 변경 될 수 있습니다.


3
훌륭한 팁-내 udevd에는 "verbose"옵션이 없지만. udevd --debug문제를 추적하는 데 필요한 전부였습니다.
Eric Heikes

@EricHeikes : 마침내 udev 쉘 스크립트가 작동하지 않는 유용한 출력을 얻을 수있었습니다. 감사합니다!
Mikko Ohtamaa 2016 년

0

순수한 우연의 일치 일 수도 있지만 예를 들어 숫자로 시작하여 이름을 지정하면 udev 규칙이 작동하기 시작했습니다. 80-usb-keyboard.rules.


나는 또한 그것을 고려했지만 아무런 차이가 없습니다.
Eric Heikes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.