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

10

Quero saber como posso listar todas as regras do udev.

Eu sei que eles podem ser potencialmente armazenados como linhas (uma linha = uma regra) nos *.rulesarquivos desses diretórios

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

Portanto, embora eu possa encontrar todas as regras, basta conciliar todos os *.rulesarquivos desses diretórios. Isso parece não estar funcionando (porque algumas regras são executadas e não consigo encontrar nenhum software como regras nesses diretórios).

Na melhor das hipóteses, pensei que havia um comando na interface do udevadm que me permite imprimir todas as regras que o udev possui atualmente.

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

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

humanidade e paz
fonte
4
Infelizmente, se você estiver usando o systemd, sua versão do udev possui um "esquema de nomenclatura persistente" complexo que é codificado no udevd , então você está certo, apenas analisar o rules.dmaterial pode deixar muitos mistérios.
GOLDILOCKS

Respostas:

11

Se você usar:

udevadm monitor

você recebe uma entrada para cada ação executada por KERNEL e UDEV. Normalmente adicione, altere, remova. Se você incluir a --propertyopção:

udevadm monitor --property

Você obterá uma lista de quais propriedades são usadas.


Como se pode testar as regras do udev com o udevadm:

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

alguém poderia testar algo como isto:

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

mas não tenho certeza de quão confiável é isso. De qualquer forma, usar eg video1para <device>isso pode render 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 acho que olhar para o teste como um todo é melhor. Observe também a mensagem:

Este programa é apenas para depuração, não executa nenhum programa especificado por uma chave RUN. Pode mostrar resultados incorretos, porque alguns valores podem ser diferentes ou não estão disponíveis em uma execução de simulação.


Você também pode definir

udev_log="debug"

in udev.confe reinicie o udev ( reload udev) para obter uma saída um pouco mais detalhada.

Runium
fonte