Estoy ejecutando Ubuntu 9.10 (Karmic Koala) en una computadora portátil y me gustaría que NumLock se active automáticamente dependiendo de si mi teclado USB está enchufado (bloqueo numérico activado) o desconectado (bloqueo numérico desactivado).
Para lograr esto, primero instalé el paquete "numlockx". numlockx on
y numlockx off
funciona bien
Para conectarme al sistema del dispositivo, pensé que usaría udev. He leído "Escribir reglas de udev" , pero tengo problemas para que la regla de udev funcione.
Primero, aquí hay un ejemplo de la dmesg
salida:
[20906.985102] usb 3-2: nuevo dispositivo USB de baja velocidad usando uhci_hcd y dirección 6 [20907.166403] usb 3-2: configuración # 1 elegida de 1 opción [20907.192904] entrada: Microsoft Natural® Ergonomic Keyboard 4000 como /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 Keyboard [Microsoft Natural® Ergonomic Keyboard 4000] en usb-0000: 00: 1a.0-2 / input0 [20907.217810] entrada: Microsoft Natural® Ergonomic Keyboard 4000 como /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: Dispositivo USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] en usb-0000: 00: 1a.0-2 / input1
Solía udevadm info
recopilar la información del dispositivo:
> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 mirando el dispositivo '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': KERNEL == "input21" SUBSISTEMA == "entrada" CONDUCTOR == "" ATTR {phys} == "usb-0000: 00: 1a.0-2 / input1" ATTR {uniq} == "" ATTR {modalias} == "entrada: 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 " mirando el dispositivo principal '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': KERNELS == "3-2: 1.1" SUBSISTEMA == "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" mirando el dispositivo principal '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS == "3-2" SUBSISTEMA == "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 {speed} == "1.5" ATTRS {busnum} == "3" ATTRS {devnum} == "6" ATTRS {versión} == "2.00" ATTRS {maxchild} == "0" ATTRS {quirks} == "0x0" ATTRS {autorizado} == "1" ATTRS {fabricante} == "Microsoft" mirando el dispositivo principal '/devices/pci0000:00/0000:00:1a.0/usb3': KERNELS == "usb3" SUBSISTEMA == "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 {speed} == "12" ATTRS {busnum} == "3" ATTRS {devnum} == "1" ATTRS {versión} == "1.10" ATTRS {maxchild} == "2" ATTRS {quirks} == "0x0" ATTRS {autorizado} == "1" ATTRS {manufacturer} == "Linux 2.6.31-16-generic uhci_hcd" ATTRS {product} == "Controlador de host UHCI" ATTRS {serial} == "0000: 00: 1a.0" ATTRS {Authorized_default} == "1" mirando el dispositivo principal '/devices/pci0000:00/0000:00:1a.0': KERNELS == "0000: 00: 1a.0" SUBSISTEMA == "pci" DRIVERS == "uhci_hcd" ATTRS {proveedor} == "0x8086" ATTRS {dispositivo} == "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} == "" mirando el dispositivo principal '/ devices / pci0000: 00': KERNELS == "pci0000: 00" SUBSISTEMA == "" CONDUCTORES == ""
Entonces creé un archivo llamado /etc/udev/rules.d/usb-keyboard.rules
:
# Active NumLock cuando el teclado esté enchufado. ACTION == "add", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx on" # Apague NumLock cuando el teclado esté desconectado. ACTION == "remove", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx off"
Solía udevadm test
verificar que las reglas son correctas:
> prueba de udevadm --acción = agregar /dispositivos/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command: llamando: prueba udevadm_test: versión 147 [...] archivo_parse: lectura '/etc/udev/rules.d/usb-keyboard.rules' como archivo de reglas udev_rules_new: las reglas usan tokens de 180864 bytes (15072 * 12 bytes), búfer de 31614 bytes udev_rules_new: índice temporal utilizado 49760 bytes (2488 * 20 bytes) udev_device_new_from_syspath: el dispositivo 0x28d7d80 tiene 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: el dispositivo 0x28d8560 tiene devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: el dispositivo 0x28d8708 tiene devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' udev_rules_apply_to_event: RUN '/ usr / bin / numlockx en' /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 = agregar udevadm_test: SUBSYSTEM = input 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: ejecutar: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx on'
Y aquí está la prueba de "eliminar":
> prueba udevadm --acción = eliminar /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command: llamando: prueba udevadm_test: versión 147 [...] archivo_parse: lectura '/etc/udev/rules.d/usb-keyboard.rules' como archivo de reglas udev_rules_new: las reglas usan tokens de 180864 bytes (15072 * 12 bytes), búfer de 31614 bytes udev_rules_new: índice temporal utilizado 49760 bytes (2488 * 20 bytes) udev_device_new_from_syspath: el dispositivo 0xd2fd80 tiene 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: el dispositivo 0xd2fff8 tiene devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: el dispositivo 0xd30690 tiene 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 = eliminar udevadm_test: SUBSYSTEM = input udevadm_test: ejecutar: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx off'
El problema es que cuando el teclado está enchufado o desenchufado, el estado de NumLock no cambia. He intentado reiniciar el servicio udev, sin suerte. ¿Están equivocadas mis reglas de udev? ¿Voy por esto de la manera incorrecta?
Respuestas:
El problema es que probablemente hayas probado numlockx en (como su nombre lo indica) en algún entorno X. Los clientes X (programas GUI que se conectan al servidor X, por ejemplo, Firefox o GEdit) necesitan conocer el servidor al que conectarse y también deben pasar algún tipo de autorización. Intente iniciar sesión desde la consola simple, sin importar por usuario root o simple, e iniciar alguna aplicación GUI: mostrará algunos errores relacionados con DISPLAY porque no lo sabe.
Para solucionar esto, necesita establecer la variable de entorno DISPLAY; si solo tiene un servidor X, casi siempre tiene la dirección: 0.
Pruebe esto en la consola simple: escriba
numlockx on
, y mostrará "¡Error al abrir la pantalla!". EscribaDISPLAY=:0 numlockx on
, y funcionará (al menos funcionó para mí).Entonces puede configurar esta variable de entorno en udev o simplemente iniciarla
sh -c 'DISPLAY=:0 numlockx <state>'
.fuente
/bin/sh -c '...'
Estos dos comandos se pueden usar para depurar muchos problemas de udev:
Tenga en cuenta que los argumentos pueden cambiar en diferentes versiones ...
fuente
udevd --debug
era todo lo que necesitaba para localizar el problema.Puede ser pura coincidencia, pero mi regla de udev comenzó a funcionar cuando la llamé comenzando con un número, por ejemplo.
80-usb-keyboard.rules
.fuente