Używam Ubuntu 9.10 (Karmic Koala) na laptopie i chciałbym, aby NumLock automatycznie przełączał się w zależności od tego, czy moja klawiatura USB jest podłączona (numlock wł.), Czy odłączona (numlock wył.).
Aby to osiągnąć, najpierw zainstalowałem pakiet „numlockx”. numlockx on
i numlockx off
działa dobrze.
Aby podłączyć się do systemu urządzeń, pomyślałem, że użyję udev. Przeczytałem „Pisanie reguł udev” , ale mam problem z uruchomieniem reguły udev.
Po pierwsze, oto przykład dmesg
wyniku:
[20906.985102] USB 3-2: nowe urządzenie USB o niskiej prędkości wykorzystujące uhci_hcd i adres 6 [20907.166403] USB 3-2: konfiguracja nr 1 wybrana spośród 1 opcji [20907.192904] dane wejściowe: Klawiatura Microsoft Natural® Ergonomic 4000 jako /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 [20907.193100] microsoft 0003: 045E: 00DB.000B: wejście, hidraw1: klawiatura USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] na USB-0000: 00: 1a.0-2 / input0 [20907.217810] wejście: Microsoft Natural® Ergonomic Keyboard 4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 [20907.217979] microsoft 0003: 045E: 00DB.000C: wejście, hidraw2: urządzenie USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] na USB-0000: 00: 1a.0-2 / input1
Kiedyś udevadm info
zbierałem informacje o urządzeniu:
> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 patrząc na urządzenie „/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21”: KERNEL == „input21” PODSYSTEM == „wejście” STEROWNIK == "" ATTR {phys} == "usb-0000: 00: 1a.0-2 / input1" ATTR {uniq} == "" ATTR {modalias} == "wejście: 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 ” patrząc na urządzenie nadrzędne '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': Jądra == "3-2: 1.1" PODSYSTEMY == „usb” KIEROWCY == „usbhid” ATTRS {bInterfaceNumber} == "01" ATTRS {bAlternateSetting} == „0” ATTRS {bNumEndpoints} == "01" ATTRS {bInterfaceClass} == "03" ATTRS {bInterfaceSubClass} == "00" ATTRS {bInterfaceProtocol} == "00" ATTRS {modalias} == "usb: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" ATTRS {obsługuje_autosuspend} == „1” patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0/usb3/3-2”: Jądra == „3-2” PODSYSTEMY == „usb” STEROWNIKI == „usb” ATTRS {konfiguracja} == "" 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 {prędkość} == "1,5" ATTRS {busnum} == "3" ATTRS {devnum} == "6" ATTRS {version} == "2.00" ATTRS {maxchild} == „0” ATTRS {dziwactwa} == "0x0" ATTRS {autoryzowany} == „1” ATTRS {producent} == „Microsoft” patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0/usb3”: KERNELS == "usb3" PODSYSTEMY == „usb” STEROWNIKI == „usb” ATTRS {konfiguracja} == "" 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 {speed} == "12" ATTRS {busnum} == "3" ATTRS {devnum} == "1" ATTRS {wersja} == "1.10" ATTRS {maxchild} == "2" ATTRS {dziwactwa} == "0x0" ATTRS {autoryzowany} == „1” ATTRS {producent} == "Linux 2.6.31-16-generic uhci_hcd" ATTRS {product} == "Kontroler hosta UHCI" ATTRS {serial} == "0000: 00: 1a.0" ATTRS {author_default} == „1” patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0”: Jądra == "0000: 00: 1a.0" PODSYSTEMY == "pci" STEROWNIKI == "uhci_hcd" ATTRS {sprzedawca} == "0x8086" ATTRS {device} == "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 {broken_parity_status} == „0” ATTRS {msi_bus} == "" patrząc na urządzenie nadrzędne '/ devices / pci0000: 00': KERNELS == "pci0000: 00" PODSYSTEMY == "" STEROWNIKI == ""
Więc stworzyłem plik o nazwie /etc/udev/rules.d/usb-keyboard.rules
:
# Włącz NumLock, gdy klawiatura jest podłączona. DZIAŁANIE == „dodaj”, ATTRS {producent} == „Microsoft”, SUBSYSTEM == „wejście”, RUN + = "/ usr / bin / numlockx on" # Wyłącz NumLock, gdy klawiatura jest odłączona. DZIAŁANIE == „usuń”, ATTRS {producent} == „Microsoft”, SUBSYSTEM == „wejście”, RUN + = „/ usr / bin / numlockx off”
Użyłem udevadm test
do sprawdzenia, czy reguły są prawidłowe:
> test udevadm --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 polecenie_ruchomienia: wywołanie: test udevadm_test: wersja 147 [...] plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł udev_rules_new: reguły używają tokenów 180864 bajtów (15072 * 12 bajtów), buforu 31614 bajtów udev_rules_new: używany indeks tymczasowy 49760 bajtów (2488 * 20 bajtów) udev_device_new_from_syspath: urządzenie 0x28d7d80 ma 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: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath: urządzenie 0x28d8560 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: urządzenie 0x28d8708 ma 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: 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 = input: 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 = wejście udevadm_test: run: '/ sbin / modprobe -b input: 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'
A oto test „usuń”:
> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 polecenie_ruchomienia: wywołanie: test udevadm_test: wersja 147 [...] plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł udev_rules_new: reguły używają tokenów 180864 bajtów (15072 * 12 bajtów), buforu 31614 bajtów udev_rules_new: używany indeks tymczasowy 49760 bajtów (2488 * 20 bajtów) udev_device_new_from_syspath: urządzenie 0xd2fd80 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' udev_rules_apply_to_event: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath: urządzenie 0xd2fff8 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: urządzenie 0xd30690 ma 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: 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 = input: 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 = usuń udevadm_test: SUBSYSTEM = wejście udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx off'
Problem polega na tym, że gdy klawiatura jest podłączona lub odłączona, status NumLock nie zmienia się. Próbowałem zrestartować usługę udev, ale bez powodzenia. Czy moje zasady udev są złe? Czy robię to w niewłaściwy sposób?
Odpowiedzi:
Problem polega na tym, że prawdopodobnie przetestowałeś numlockx w (jak sama nazwa wskazuje) środowisku X. Klienci X (programy GUI łączące się z serwerem X, np. Firefox lub GEdit) muszą znać serwer, z którym mają się połączyć, a także muszą przejść pewną autoryzację. Spróbuj zalogować się z poziomu zwykłej konsoli, bez względu na użytkownika root lub zwykłego użytkownika, i uruchomić jakąś aplikację GUI: pokaże kilka błędów związanych z WYŚWIETLACZEM, ponieważ nie wie.
Aby to naprawić, musisz ustawić zmienną środowiskową DISPLAY; jeśli masz tylko jeden serwer X, prawie zawsze ma on adres: 0.
Spróbuj tego na zwykłej konsoli: wpisz
numlockx on
, a wyświetli się „Błąd otwierania wyświetlacza!”. WpiszDISPLAY=:0 numlockx on
i zadziała (przynajmniej dla mnie zadziałało).Możesz więc ustawić tę zmienną środowiskową w udev lub po prostu uruchomić
sh -c 'DISPLAY=:0 numlockx <state>'
.źródło
/bin/sh -c '...'
tych dwóch poleceń można często używać do debugowania problemów z udev:
Pamiętaj, że argumenty mogą ulec zmianie w różnych wersjach ...
źródło
udevd --debug
było wszystkim, czego potrzebowałem, aby wyśledzić problem.To może być czysty zbieg okoliczności, ale moja reguła udev zaczęła działać, gdy nazwałem ją zaczynając od liczby, np.
80-usb-keyboard.rules
.źródło