El script en la regla de udev no se ejecuta

8

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 ony numlockx offfunciona 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 dmesgsalida:

[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 inforecopilar 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 testverificar 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?

Eric Heikes
fuente
¡Fijo! Gracias a tony-p-lee y whitequark por señalarme en la dirección correcta.
Eric Heikes el

Respuestas:

5

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!". Escriba DISPLAY=: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>'.

Whitequark
fuente
¡Tienes razón! No había considerado que numlockx requiere un entorno X. Desafortunadamente, aunque configurar DISPLAY elimina el mensaje de error, no funciona, ya sea en la consola o mediante udev.
Eric Heikes el
Habló demasiado pronto. Funciona si ejecuta el shell utilizando la ruta completa:/bin/sh -c '...'
Eric Heikes
4

Estos dos comandos se pueden usar para depurar muchos problemas de udev:

 udevd --debug-trace --verbose
 strace -p pid_of_udevd -f -e trace=open,exec

Tenga en cuenta que los argumentos pueden cambiar en diferentes versiones ...

tony-p-lee
fuente
3
Excelente consejo, aunque no hay una opción "detallada" en mi udevd. udevd --debugera todo lo que necesitaba para localizar el problema.
Eric Heikes el
@EricHeikes: Finalmente conseguí obtener resultados útiles por los que los scripts de shell udev no funcionan. ¡Gracias!
Mikko Ohtamaa
0

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.

Blorgbeard está fuera
fuente
También lo había considerado, pero no hace ninguna diferencia.
Eric Heikes el