Listar todas as regras do udev (por exemplo, para um dispositivo)?

8

Eu quero saber como posso listar todas as regras do udev.

Eu sei que eles podem ser potencialmente armazenados como linhas (uma linha = uma regra) em *.rules arquivos nesses diretórios

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

Portanto, apesar de poder encontrar todas as regras, basta concatenar todos os arquivos *.rules nesses diretórios. Isso parece não estar funcionando (porque algumas regras são executadas e eu não consigo encontrar nenhumware como regras nesses diretórios).

Na melhor das hipóteses, achei que existe um comando para a interface do udevadm que me permitirá imprimir todas as regras que o udev tem atualmente.

Para ter certeza, eu fiz uma revisão de man udevadm e, especialmente, a parte sobre udevadm info [parameters] não parece produzir nenhum resultado.

Dado que o udev permite uma grande quantidade de arquivos e regras, todos direcionados para o mesmo dispositivo, é frustrante não conhecer uma maneira eficiente / viável de compor todas as regras para um dispositivo.

    
por humanityANDpeace 01.02.2015 / 13:18

1 resposta

8

Se você usa:

udevadm monitor

você recebe uma entrada para cada ação tomada por KERNEL e UDEV. Normalmente adicionar, alterar, remover. Se você incluir a opção --property :

udevadm monitor --property

Você receberá uma listagem de quais propriedades são usadas.

Como alguém pode testar as regras do udev com o udevadm:

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

alguém poderia testar algo assim:

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

mas não tenho certeza de como isso é confiável. De qualquer forma, usando, e. video1 para <device> que poderia gerar 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"

Mas adivinhar que o teste como um todo é melhor. Observe também a mensagem:

This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run.

Você também pode definir

udev_log="debug"

em udev.conf e reinicie o udev ( reload udev ) para obter uma saída mais detalhada.

    
por 01.02.2015 / 19:12

Tags