Ich verwende Ubuntu 9.10 (Karmic Koala) auf einem Laptop und möchte, dass NumLock automatisch umschaltet, je nachdem, ob meine USB-Tastatur angeschlossen (numlock on) oder nicht angeschlossen (numlock off) ist.
Um dies zu erreichen, habe ich zuerst das "numlockx" -Paket installiert. numlockx on
und numlockx off
funktioniert gut.
Um mich an das Gerätesystem anzuschließen, dachte ich, ich würde udev verwenden. Ich habe "Schreiben von udev-Regeln" gelesen , aber ich habe Probleme, die udev-Regel zum Laufen zu bringen.
Hier ist zunächst ein Beispiel für die dmesg
Ausgabe:
[20906.985102] USB 3-2: Neues USB-Gerät mit niedriger Geschwindigkeit unter Verwendung von uhci_hcd und Adresse 6 [20907.166403] USB 3-2: Konfiguration Nr. 1 aus 1 Auswahl ausgewählt [20907.192904] Eingabe: Microsoft Natural® Ergonomic Keyboard 4000 als /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 [20907.193100] Microsoft 0003: 045E: 00DB.000B: Eingabe, Hidraw1: USB HID v1.11-Tastatur [Microsoft Natural® Ergonomic Keyboard 4000] auf USB-0000: 00: 1a.0-2 / Eingabe0 [20907.217810] Eingabe: Microsoft Natural® Ergonomic Keyboard 4000 als /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 [20907.217979] Microsoft 0003: 045E: 00DB.000C: Eingabe, Hidraw2: USB HID v1.11-Gerät [Microsoft Natural® Ergonomic Keyboard 4000] auf USB-0000: 00: 1a.0-2 / Eingabe1
Ich habe udevadm info
die Geräteinformationen gesammelt:
> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 Betrachten des Geräts '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': KERNEL == "input21" SUBSYSTEM == "Eingabe" DRIVER == "" ATTR {phys} == "usb-0000: 00: 1a.0-2 / input1" ATTR {uniq} == "" ATTR {modalias} == "Eingabe: 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 " Betrachten des übergeordneten Geräts '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': KERNELS == 3-2: 1.1 SUBSYSTEMS == "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 {support_autosuspend} == "1" Betrachten des übergeordneten Geräts '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS == "3-2" SUBSYSTEMS == "usb" DRIVERS == "usb" ATTRS {configuration} == "" 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 {Geschwindigkeit} == "1,5" ATTRS {busnum} == "3" ATTRS {devnum} == "6" ATTRS {version} == "2.00" ATTRS {maxchild} == "0" ATTRS {Macken} == "0x0" ATTRS {autorisiert} == "1" ATTRS {Hersteller} == "Microsoft" Betrachten des übergeordneten Geräts '/devices/pci0000:00/0000:00:1a.0/usb3': KERNELS == "usb3" SUBSYSTEMS == "usb" DRIVERS == "usb" ATTRS {configuration} == "" 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 {Geschwindigkeit} == "12" ATTRS {busnum} == "3" ATTRS {devnum} == "1" ATTRS {version} == "1.10" ATTRS {maxchild} == "2" ATTRS {Macken} == "0x0" ATTRS {autorisiert} == "1" ATTRS {Hersteller} == "Linux 2.6.31-16-generic uhci_hcd" ATTRS {product} == "UHCI Host Controller" ATTRS {serial} == "0000: 00: 1a.0" ATTRS {autorisierter_Default} == "1" Betrachten des übergeordneten Geräts '/devices/pci0000:00/0000:00:1a.0': KERNELS == 0000: 00: 1a.0 SUBSYSTEMS == "pci" DRIVERS == "uhci_hcd" ATTRS {vendor} == "0x8086" ATTRS {Gerät} == "0x2937" ATTRS {subsystem_vendor} == "0x1558" ATTRS {subsystem_device} == "0x0860" ATTRS {class} == "0x0c0300" ATTRS {irq} == "16" ATTRS {local_cpus} == "ff" ATTRS {local_cpulist} == "0-7" ATTRS {modalias} == "pci: v00008086d00002937sv00001558sd00000860bc0Csc03i00" ATTRS {gebrochener_Paritätsstatus} == "0" ATTRS {msi_bus} == "" Betrachten des übergeordneten Geräts '/ Geräte / pci0000: 00': KERNELS == "pci0000: 00" SUBSYSTEMS == "" DRIVERS == ""
Also habe ich eine Datei namens erstellt /etc/udev/rules.d/usb-keyboard.rules
:
# Schalten Sie NumLock ein, wenn die Tastatur angeschlossen ist. ACTION == "add", ATTRS {Hersteller} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx on" # Schalten Sie NumLock aus, wenn die Tastatur nicht angeschlossen ist. ACTION == "remove", ATTRS {Hersteller} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx off"
Ich habe verwendet udevadm test
, um zu überprüfen, ob die Regeln korrekt sind:
> udevadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command: Aufruf: test udevadm_test: Version 147 [...] parse_file: Lesen von '/etc/udev/rules.d/usb-keyboard.rules' als Regeldatei udev_rules_new: Regeln verwenden 180864-Byte-Token (15072 * 12 Byte), 31614-Byte-Puffer udev_rules_new: Temporärer Index verwendet 49760 Bytes (2488 * 20 Bytes) udev_device_new_from_syspath: Gerät 0x28d7d80 hat 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.rules:5 udev_rules_apply_to_event: RUN 'Socket: @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath: Gerät 0x28d8560 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: Gerät 0x28d8708 hat den Devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'. udev_rules_apply_to_event: RUN '/ usr / bin / numlockx auf' /etc/udev/rules.d/usb-keyboard.rules:7 udevadm_test: UDEV_LOG = 6 udevadm_test: DEVPATH = / device / pci0000: 00/0000: 00: 1a.0 / usb3 / 3-2 / 3-2: 1.1 / input / input21 udevadm_test: PRODUCT = 3 / 45e / db / 111 udevadm_test: NAME = "Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test: PHYS = "usb-0000: 00: 1a.0-2 / input1" udevadm_test: UNIQ = "" udevadm_test: EV == 10001f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe udevadm_test: REL == 40 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = Eingabe: 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 = add udevadm_test: SUBSYSTEM = Eingabe udevadm_test: run: '/ sbin / modprobe -b Eingabe: 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: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx on'
Und hier ist der "Entfernen" -Test:
> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command: Aufruf: test udevadm_test: Version 147 [...] parse_file: Lesen von '/etc/udev/rules.d/usb-keyboard.rules' als Regeldatei udev_rules_new: Regeln verwenden 180864-Byte-Token (15072 * 12 Byte), 31614-Byte-Puffer udev_rules_new: Temporärer Index verwendet 49760 Bytes (2488 * 20 Bytes) udev_device_new_from_syspath: Gerät 0xd2fd80 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' udev_rules_apply_to_event: RUN 'Socket: @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath: Gerät 0xd2fff8 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: Gerät 0xd30690 hat den 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 = / device / pci0000: 00/0000: 00: 1a.0 / usb3 / 3-2 / 3-2: 1.1 / input / input21 udevadm_test: PRODUCT = 3 / 45e / db / 111 udevadm_test: NAME = "Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test: PHYS = "usb-0000: 00: 1a.0-2 / input1" udevadm_test: UNIQ = "" udevadm_test: EV == 10001f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe udevadm_test: REL == 40 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = Eingabe: 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 = entfernen udevadm_test: SUBSYSTEM = Eingabe udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx off'
Das Problem ist, dass sich der NumLock-Status nicht ändert, wenn die Tastatur ein- oder ausgesteckt ist. Ich habe versucht, den udev-Dienst ohne Glück neu zu starten. Sind meine udev-Regeln falsch? Gehe ich falsch vor?
Antworten:
Das Problem ist, dass Sie wahrscheinlich numlockx in einer X-Umgebung getestet haben (wie der Name schon sagt). X-Clients (GUI-Programme, die eine Verbindung zum X-Server herstellen, z. B. Firefox oder GEdit) müssen den Server kennen, zu dem eine Verbindung hergestellt werden soll, und eine Berechtigung übergeben. Versuchen Sie, sich von der einfachen Konsole aus anzumelden, unabhängig davon, ob es sich um einen Root- oder einen einfachen Benutzer handelt, und starten Sie eine GUI-Anwendung: Es werden einige DISPLAY-bezogene Fehler angezeigt, da dies nicht bekannt ist.
Um dies zu beheben, müssen Sie die Umgebungsvariable DISPLAY festlegen. Wenn Sie nur einen X-Server haben, hat dieser fast immer die Adresse: 0.
Versuchen Sie dies an der einfachen Konsole: Geben Sie ein
numlockx on
und es wird "Fehler beim Öffnen der Anzeige!" Angezeigt. TippeDISPLAY=:0 numlockx on
, und es wird funktionieren (hat zumindest für mich funktioniert).Sie können diese Umgebungsvariable also in udev festlegen oder einfach starten
sh -c 'DISPLAY=:0 numlockx <state>'
.quelle
/bin/sh -c '...'
Diese beiden Befehle können verwendet werden, um udev-Probleme häufig zu debuggen:
Beachten Sie, dass sich die Argumente in verschiedenen Versionen ändern können ...
quelle
udevd --debug
war alles, was ich brauchte, um das Problem aufzuspüren.Es mag ein reiner Zufall sein, aber meine udev-Regel begann zu funktionieren, als ich sie mit einer Zahl begann, z.
80-usb-keyboard.rules
.quelle