ฉันใช้ Ubuntu 9.10 (Karmic Koala) บนแล็ปท็อปและต้องการให้ NumLock เปิดใช้งานโดยอัตโนมัติขึ้นอยู่กับว่าแป้นพิมพ์ USB ของฉันเสียบอยู่ (เปิด numlock) หรือถอดปลั๊ก (ปิด Numlock)
เพื่อให้บรรลุสิ่งนี้ฉันต้องติดตั้งแพคเกจ "numlockx" ก่อน numlockx on
และnumlockx off
ทำงานได้ดี
หากต้องการเชื่อมต่อเข้ากับระบบอุปกรณ์ฉันคิดว่าฉันจะใช้ udev ฉันได้อ่าน"การเขียนกฎ udev"แต่ฉันมีปัญหาในการทำให้กฎ udev ทำงาน
ก่อนอื่นนี่เป็นตัวอย่างของdmesg
ผลลัพธ์:
[20906.985102] usb 3-2: อุปกรณ์ USB ความเร็วต่ำใหม่โดยใช้ uhci_hcd และที่อยู่ 6 [20907.166403] usb 3-2: การกำหนดค่า # 1 เลือกจาก 1 ตัวเลือก อินพุต [20907.192904]: Microsoft Natural® Ergonomic Keyboard 4000 เป็น /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 [20907.193100] microsoft 0003: 045E: 00DB.000B: อินพุต, hidraw1: คีย์บอร์ด USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] บน usb-0000: 00: 1a.0-2 / อินพุต 0 อินพุต [20907.217810]: Microsoft Natural® Ergonomic Keyboard 4000 เป็น /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 [20907.217979] microsoft 0003: 045E: 00DB.000C: อินพุต, hidraw2: อุปกรณ์ USB v1.11 HID [Microsoft Natural® Ergonomic Keyboard 4000] บน usb-0000: 00: 1a.0-2 / อินพุต 1
ฉันเคยudevadm info
รวบรวมข้อมูลอุปกรณ์:
> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 ดูที่อุปกรณ์ '/ อุปกรณ์ / pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': เมล็ด == "input21" ย่อย == "ป้อนข้อมูล" DRIVER == "" ATTR {สรวง} == "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 พ.ศ. , 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" ดูอุปกรณ์หลัก '/ อุปกรณ์ / pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': เมล็ด == "3-2: 1.1" ระบบย่อย == "USB" DRIVERS == "usbhid" ATTRS {bInterfaceNumber} == "01" ATTRS {bAlternateSetting} == "0" ATTRS {bNumEndpoints} == "01" ATTRS {bInterfaceClass} == "03" ATTRS {bInterfaceSubClass} == "00" ATTRS {bInterfaceProtocol} == "00" ATTRS {modalias} == "USB: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" ATTRS {supports_autosuspend} == "1" ดูอุปกรณ์หลัก '/ อุปกรณ์ / pci0000:00/0000:00:1a.0/usb3/3-2': เมล็ด == "3-2" ระบบย่อย == "USB" DRIVERS == "USB" ATTRS {} กำหนดค่า == "" ATTRS {bNumInterfaces} == "2" ATTRS {bConfigurationValue} == "1" ATTRS {bmAttributes} == "A0" ATTRS {bMaxPower} == "100mA" ATTRS {urbnum} == "532" ATTRS {idVendor} == "045e" ATTRS {idProduct} == "00db" ATTRS {bcdDevice} == "0173" ATTRS {bDeviceClass} == "00" ATTRS {bDeviceSubClass} == "00" ATTRS {bDeviceProtocol} == "00" ATTRS {bNumConfigurations} == "1" ATTRS {bMaxPacketSize0} == "8" ATTRS {} ความเร็ว == "1.5" ATTRS {BUSNUM} == "3" ATTRS {DEVNUM} == "6" ATTRS {version} == "2.00" ATTRS {maxchild} == "0" ATTRS {นิสัยใจคอ} == "0x0" ATTRS {} อนุญาต == "1" ATTRS {ผลิต} == "Microsoft" ดูอุปกรณ์หลัก '/ อุปกรณ์ / pci0000:00/0000:00:1a.0/usb3': เมล็ด == "USB3" ระบบย่อย == "USB" DRIVERS == "USB" ATTRS {} กำหนดค่า == "" ATTRS {bNumInterfaces} == "1" ATTRS {bConfigurationValue} == "1" ATTRS {bmAttributes} == "e0" ATTRS {bMaxPower} == "0mA" ATTRS {urbnum} == "127" ATTRS {idVendor} == "1d6b" ATTRS {idProduct} == "0001" ATTRS {bcdDevice} == "0206" ATTRS {bDeviceClass} == "09" ATTRS {bDeviceSubClass} == "00" ATTRS {bDeviceProtocol} == "00" ATTRS {bNumConfigurations} == "1" ATTRS {bMaxPacketSize0} == "64" ATTRS {} ความเร็ว == "12" ATTRS {BUSNUM} == "3" ATTRS {DEVNUM} == "1" ATTRS {version} == "1.10" ATTRS {maxchild} == "2" ATTRS {นิสัยใจคอ} == "0x0" ATTRS {} อนุญาต == "1" ATTRS {ผู้ผลิต} == "Linux 2.6.31-16-generic uhci_hcd" ATTRS {product} == "ตัวควบคุมโฮสต์ UHCI" ATTRS {อนุกรม} == "0000: 00: 1a.0" ATTRS {authorized_default} == "1" ดูอุปกรณ์หลัก '/ อุปกรณ์ / pci0000:00/0000:00:1a.0': เมล็ด == "0000: 00: 1a.0" ระบบย่อย == "PCI" DRIVERS == "uhci_hcd" ATTRS {ผู้ขาย} == "0x8086" ATTRS {อุปกรณ์} == "0x2937" ATTRS {subsystem_vendor} == "0x1558" ATTRS {subsystem_device} == "0x0860" ATTRS {} ระดับ == "0x0c0300" ATTRS {IRQ} == "16" ATTRS {local_cpus} == "FF" ATTRS {local_cpulist} == "0-7" ATTRS {modalias} == "PCI: v00008086d00002937sv00001558sd00000860bc0Csc03i00" ATTRS {broken_parity_status} == "0" ATTRS {msi_bus} == "" ดูที่อุปกรณ์แม่ '/ devices / pci0000: 00': เมล็ด == "pci0000: 00" ระบบย่อย == "" DRIVERS == ""
ดังนั้นฉันจึงสร้างไฟล์ชื่อ/etc/udev/rules.d/usb-keyboard.rules
:
# เปิด NumLock เมื่อเสียบแป้นพิมพ์ ACTION == "เพิ่ม", ATTRS {ผู้ผลิต} == "Microsoft", ระบบย่อย == "อินพุต", RUN + = "/ usr / bin / numlockx บน" # ปิด NumLock เมื่อถอดปลั๊กแป้นพิมพ์ ACTION == "ลบ", ATTRS {ผู้ผลิต} == "Microsoft", ระบบย่อย == "อินพุต", RUN + = "/ usr / bin / numlockx off"
ฉันเคยudevadm test
ตรวจสอบว่ากฎถูกต้อง:
> 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: อุปกรณ์ 0x28d7d80 มี devpath '/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.rulesu 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 มี devpath '/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 บน' /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 / อินพุต / อินพุต 21 udevadm_test: PRODUCT = 3 / 45e / db / 111 udevadm_test: NAME = "Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test: PHYS = "usb-0000: 00: 1a.0-2 / อินพุต 1" udevadm_test: UNIQ = "" udevadm_test: EV == 1,0001f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff ffffffff udevadm_test: REL == 40 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = อินพุต: b0003v045Ep00DBe0111-e0,1,2,3,4,4,14, k71,72,73,73,74,75,77,79,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 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 พ.ศ. , 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,4,14, k71,72,73,74,75,77,79,7A, 7B, 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 พ.ศ. , 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: เรียกใช้: 'ซ็อกเก็ต: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx on'
และนี่คือการทดสอบ "ลบ":
> การทดสอบ udevadm --action = remove /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 มี devpath '/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 มี devpath '/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 / อินพุต / อินพุต 21 udevadm_test: PRODUCT = 3 / 45e / db / 111 udevadm_test: NAME = "Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test: PHYS = "usb-0000: 00: 1a.0-2 / อินพุต 1" udevadm_test: UNIQ = "" udevadm_test: EV == 1,0001f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff ffffffff udevadm_test: REL == 40 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = อินพุต: b0003v045Ep00DBe0111-e0,1,2,3,4,4,14, k71,72,73,73,74,75,77,79,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 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 พ.ศ. , 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 = remove udevadm_test: SUBSYSTEM = อินพุต udevadm_test: เรียกใช้: 'ซ็อกเก็ต: @ / org / freedesktop / hal / udev_event' udevadm_test: เรียกใช้: '/ usr / bin / numlockx off'
ปัญหาคือเมื่อเสียบปลั๊กหรือถอดปลั๊กสถานะ NumLock จะไม่เปลี่ยนแปลง ฉันได้ลองรีสตาร์ทบริการ evev แล้วโดยไม่มีโชค กฎ udev ของฉันผิดหรือเปล่า? ฉันจะไปในทางที่ผิดหรือเปล่า?