¿Enumerar todas las reglas de udev (por ejemplo, para un dispositivo)?

10

Quiero saber cómo puedo enumerar todas las reglas de udev.

Sé que pueden almacenarse potencialmente como líneas (una línea = una regla) en *.rulesarchivos en estos directorios

/etc/udev/rules.d
/lib/udev/rules.d
/run/udev/rules.d
/var/run/udev/rules.d

Por lo tanto, creo que puedo encontrar todas las reglas simplemente concatenando todos los *.rulesarchivos en esos directorios. Esto parece no funcionar (porque se ejecutan algunas reglas que no puedo encontrar ningún software como reglas en estos directorios).

En el mejor de los casos, pensé que hay un comando para la interfaz udevadm que me permitirá imprimir todas las reglas que udev tiene actualmente.

Para estar seguro, hice una revisión man udevadmy, especialmente, la parte sobre udevadm info [parameters]no parece dar ningún resultado.

Dado que udev permite una multitud de archivos y reglas, todos dirigidos al mismo dispositivo, es frustrante no conocer una forma eficiente / factible de componer todas las reglas para un dispositivo.

humanidad y paz
fuente
44
Desafortunadamente, si está usando systemd, su versión de udev tiene un complejo "esquema de nombres persistentes" que está codificado en udevd , por lo que tiene razón, solo analizar las rules.dcosas podría dejar muchos misterios.
Ricitos de Oro

Respuestas:

11

Si utiliza:

udevadm monitor

obtienes una entrada para cada acción realizada por KERNEL y UDEV. Por lo general, agregar, cambiar, eliminar. Si incluye la --propertyopción:

udevadm monitor --property

Obtendrá una lista de las propiedades que se utilizan.


Como uno puede probar las reglas de udev con udevadm:

udevadm test $(udevadm info -q path -n <device>)

uno podría probar algo como esto:

udevadm test $(udevadm info -q path -n <device>) 2>&1 | \
sed -n 's/.* \(\/[^ ]*\)\.rules:\([0-9]\+\)/\1.rules \2/p' | \
while read -r f n; do printf "%03d:%-50s " $n "$f"; sed -n ${n}p $f; done

pero no estoy seguro de cuán confiable es esto. De todos modos, usar, por ejemplo, video1para <device>eso podría producir algo como:

031:/lib/udev/rules.d/50-udev-default.rules            SUBSYSTEM=="video4linux", GROUP="video"
007:/lib/udev/rules.d/60-persistent-v4l.rules          IMPORT{program}="v4l_id $devnode"
009:/lib/udev/rules.d/60-persistent-v4l.rules          SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
010:/lib/udev/rules.d/60-persistent-v4l.rules          KERNEL=="video*", ENV{ID_SERIAL}=="?*", SYMLINK+="v4l/by-id/$env{ID_BUS}-$env{ID_SERIAL}-video-index$attr{index}"
016:/lib/udev/rules.d/60-persistent-v4l.rules          IMPORT{builtin}="path_id"
017:/lib/udev/rules.d/60-persistent-v4l.rules          ENV{ID_PATH}=="?*", KERNEL=="video*|vbi*", SYMLINK+="v4l/by-path/$env{ID_PATH}-video-index$attr{index}"
015:/lib/udev/rules.d/73-seat-late.rules               TAG=="uaccess", ENV{MAJOR}!="", RUN{builtin}+="uaccess"
006:/etc/udev/rules.d/83-webcam.rules                  KERNEL=="video[0-9]", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c45", SYMLINK+="video-webcam1"

Pero supongo que mirar la prueba en su conjunto es mejor. También tenga en cuenta el mensaje:

Este programa es solo para depuración, no ejecuta ningún programa especificado por una tecla RUN. Puede mostrar resultados incorrectos, porque algunos valores pueden ser diferentes o no estar disponibles en una ejecución de simulación.


También puedes configurar

udev_log="debug"

en udev.confy udev restart ( reload udev) para obtener un poco más detallado de salida.

Runium
fuente