랩톱에서 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 규칙이 잘못 되었습니까? 나는 이것에 대해 잘못 가고 있습니까?