สคริปต์ในกฎ udev ไม่ทำงาน


8

ฉันใช้ 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 ของฉันผิดหรือเปล่า? ฉันจะไปในทางที่ผิดหรือเปล่า?


แก้ไขแล้ว! ขอบคุณ tony-p-lee และ whitequark ที่ชี้ให้ฉันในทิศทางที่ถูกต้อง
Eric Heikes

คำตอบ:


5

ปัญหาคือคุณอาจทดสอบ numlockx ใน (ตามที่ชื่อแนะนำ) บางสภาพแวดล้อม X ไคลเอนต์ X (โปรแกรม GUI ที่เชื่อมต่อกับเซิร์ฟเวอร์ X เช่น Firefox หรือ GEdit) จำเป็นต้องรู้เซิร์ฟเวอร์เพื่อเชื่อมต่อและต้องผ่านการอนุญาตบางประเภท ลองเข้าสู่ระบบจากคอนโซลธรรมดาไม่ว่าโดยผู้ใช้รูทหรือธรรมดาและเริ่มใช้งานแอปพลิเคชัน GUI: จะแสดงข้อผิดพลาดที่เกี่ยวข้องกับ DISPLAY เนื่องจากไม่ทราบ

ในการแก้ไขปัญหานี้คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม DISPLAY; หากคุณมีเซิร์ฟเวอร์ X เพียงเซิร์ฟเวอร์เดียวมักจะมีที่อยู่: 0

ลองใช้สิ่งนี้ที่คอนโซลธรรมดา: พิมพ์numlockx onแล้วมันจะแสดง "ข้อผิดพลาดในการเปิดจอแสดงผล!" พิมพ์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
เคล็ดลับที่ยอดเยี่ยม - แม้ว่าจะไม่มีตัวเลือก "verbose" ใน udevd ของฉัน udevd --debugคือทั้งหมดที่ฉันต้องการเพื่อติดตามปัญหา
Eric Heikes

@EricHeikes: ในที่สุดก็จัดการเพื่อให้ได้ผลลัพธ์ที่มีประโยชน์ว่าทำไม udev shell script ไม่ทำงาน ขอบคุณ!
Mikko Ohtamaa

0

อาจเป็นเรื่องบังเอิญแท้ๆ แต่กฎของ udev ของฉันเริ่มทำงานเมื่อฉันตั้งชื่อมันว่าเริ่มต้นด้วยตัวเลขเช่น 80-usb-keyboard.rules.


ฉันคิดว่าเช่นกัน แต่ก็ไม่ได้สร้างความแตกต่างเลย
Eric Heikes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.