Diese beiden Befehle können verwendet werden, um udev-Probleme häufig zu debuggen:
udevd --debug-trace --verbose strace -p pid_of_udevd -f -e trace=open,exec
Beachten Sie, dass sich args bei verschiedenen Versionen ändern kann ...
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 ein) oder nicht angeschlossen ist (Numlock aus).
Um dies zu erreichen, habe ich zuerst das Paket "numlockx" installiert. numlockx on
und numlockx off
funktioniert gut.
Um mich in das Gerätesystem einzuhaken, dachte ich, ich würde udev verwenden. Ich habe "Udev-Regeln schreiben" gelesen, aber ich habe Schwierigkeiten, die Udev-Regel zum Laufen zu bringen.
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: input, hidraw1: USB HID v1.11 Tastatur [Microsoft Natural® Ergonomic Keyboard 4000] unter usb-0000: 00: 1a.0-2 / input0 [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: input, hidraw2: USB HID v1.11-Gerät [Microsoft Natural® Ergonomic Keyboard 4000] unter usb-0000: 00: 1a.0-2 / input1
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 Blick auf Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': KERNEL == "input21" SUBSYSTEM == "Eingabe" FAHRER == "" ATTR == "usb-0000: 00: 1a.0-2 / input1" ATTR == "" ATTR == "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, 17D, 17F 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20, m4, lsfw " Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': KERNELS == 3-2: 1.1 SUBSYSTEMS == "usb" FAHRER == "usbhid" ATTRS == "01" ATTRS == "0" ATTRS == "01" ATTRS == "03" ATTRS == "00" ATTRS == "00" ATTRS == "usb: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" ATTRS == "1" Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS == "3-2" SUBSYSTEMS == "usb" FAHRER == "usb" ATTRS == "" ATTRS == "2" ATTRS == "1" ATTRS == "a0" ATTRS == "100mA" ATTRS == "532" ATTRS == "045e" ATTRS == "00db" ATTRS == "0173" ATTRS == "00" ATTRS == "00" ATTRS == "00" ATTRS == "1" ATTRS == "8" ATTRS == "1,5" ATTRS == "3" ATTRS == "6" ATTRS == "2.00" ATTRS == "0" ATTRS == "0x0" ATTRS == "1" ATTRS == "Microsoft" Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3': KERNELS == "usb3" SUBSYSTEMS == "usb" FAHRER == "usb" ATTRS == "" ATTRS == "1" ATTRS == "1" ATTRS == "e0" ATTRS == "0mA" ATTRS == "127" ATTRS == "1d6b" ATTRS == "0001" ATTRS == "0206" ATTRS == "09" ATTRS == "00" ATTRS == "00" ATTRS == "1" ATTRS == "64" ATTRS == "12" ATTRS == "3" ATTRS == "1" ATTRS == "1.10" ATTRS == "2" ATTRS == "0x0" ATTRS == "1" ATTRS == "Linux 2.6.31-16-generic uhci_hcd" ATTRS == "UHCI Host Controller" ATTRS == "0000: 00: 1a.0" ATTRS == "1" Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0': KERNELS == "0000: 00: 1a.0" SUBSYSTEMS == "pci" FAHRER == "uhci_hcd" ATTRS == "0x8086" ATTRS == "0x2937" ATTRS == "0x1558" ATTRS == "0x0860" ATTRS == "0x0c0300" ATTRS == "16" ATTRS == "ff" ATTRS == "0-7" ATTRS == "pci: v00008086d00002937sv00001558sd00000860bc0Csc03i00" ATTRS == "0" ATTRS == "" Blick auf das übergeordnete Gerät '/ devices / pci0000: 00': KERNELS == "pci0000: 00" SUBSYSTEMS == "" FAHRER == ""
Also habe ich eine Datei mit dem Namen erstellt /etc/udev/rules.d/usb-keyboard.rules
:
# Schalten Sie NumLock ein, wenn die Tastatur angeschlossen ist. ACTION == "Hinzufügen", ATTRS == "Microsoft", SUBSYSTEM == "Eingabe", RUN + = "/ usr / bin / numlockx on" # Deaktivieren Sie NumLock, wenn die Tastatur nicht angeschlossen ist. ACTION == "remove", ATTRS == "Microsoft", SUBSYSTEM == "Eingabe", RUN + = "/ usr / bin / numlockx off"
Ich habe mich udevadm test
vergewissert, dass 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 Bytes Token (15072 * 12 Bytes) und 31614 Bytes 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 ' /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 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 = / devices / pci0000: 00/0000: 00: 1a.0 / usb3 / 3-2 / 3-2: 1.1 / input / input21 udevadm_test: PRODUKT = 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, 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,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 ein'
Und hier ist der "Entfernen" -Test:
> udevadm test --action = /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 entfernen 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 Bytes Token (15072 * 12 Bytes) und 31614 Bytes 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 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: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: PRODUKT = 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, 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 der NumLock-Status nicht geändert wird, wenn die Tastatur angeschlossen oder entfernt wird. Ich habe versucht, den Udev-Dienst neu zu starten, ohne Glück. Sind meine udev-Regeln falsch? Mache ich das falsch?
Diese beiden Befehle können verwendet werden, um udev-Probleme häufig zu debuggen:
udevd --debug-trace --verbose strace -p pid_of_udevd -f -e trace=open,exec
Beachten Sie, dass sich args bei verschiedenen Versionen ändern kann ...
Das Problem ist, dass Sie Numlockx wahrscheinlich in einer X-Umgebung getestet haben (wie der Name schon sagt). X-Clients (GUI-Programme, die eine Verbindung zu einem X-Server herstellen, z. B. Firefox oder GEdit) müssen den Server kennen, zu dem eine Verbindung hergestellt werden soll, und sie müssen auch über eine Art Autorisierung verfügen. Versuchen Sie, sich über eine einfache Konsole anzumelden, egal ob von einem Benutzer mit Rootberechtigung oder einem einfachen Benutzer, und eine GUI-Anwendung zu starten: Einige DISPLAY-bezogene Fehler werden angezeigt, da sie es nicht wissen.
Um dies zu beheben, müssen Sie die Umgebungsvariable DISPLAY setzen. Wenn Sie nur einen X-Server haben, hat er fast immer die Adresse: 0.
Versuchen Sie dies bei normaler Konsole: Geben Sie ein numlockx on
, und es wird "Fehler beim Öffnen der Anzeige!" Angezeigt. Typ DISPLAY=:0 numlockx on
, und es wird funktionieren (zumindest für mich gearbeitet).
Sie können diese Umgebungsvariable also in udev setzen oder einfach starten sh -c 'DISPLAY=:0 numlockx <state>'
.
Es könnte ein reiner Zufall sein, aber meine udev-Regel begann zu funktionieren, als ich sie mit einer Zahl benannte, z. 80-usb-keyboard.rules
.