Список всех правил udev (например, для устройства)?

10

Я хочу знать, как я могу перечислить все правила udev.

Я знаю, что они могут быть потенциально сохранены в виде строк (одна строка = одно правило) в *.rulesфайлах в этих каталогах

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

Поэтому я, хотя и могу найти все правила, просто объединяя все *.rulesфайлы в этих каталогах. Это, кажется, не работает (потому что некоторые правила выполняются, и я не могу найти ничего, как правила в этих каталогах).

В лучшем случае я подумал, что есть команда для интерфейса udevadm, которая позволит мне распечатать все правила, которые в настоящее время есть у udev.

Чтобы быть уверенным, что я сделал обзор, man udevadmи особенно часть о udevadm info [parameters], кажется, не дает никакого результата.

Учитывая, что udev допускает множество файлов и правил, предназначенных для одного и того же устройства, очень неприятно не знать эффективный / выполнимый способ составления всех правил для устройства.

humanityANDpeace
источник
4
К сожалению, если вы используете systemd, в его версии udev есть сложная «постоянная схема именования», которая жестко запрограммирована в udevd , так что вы правы, просто анализ всего этого rules.dможет оставить много загадок.
Златовласка

Ответы:

11

Если вы используете:

udevadm monitor

Вы получаете запись для каждого действия, предпринятого KERNEL и UDEV. Обычно добавляют, меняют, удаляют. Если вы включите --propertyопцию:

udevadm monitor --property

Вы получите список того, какие свойства используются.


Как можно проверить правила udev с помощью udevadm:

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

можно было проверить что-то как это:

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

но не уверен, насколько это надежно. В любом случае использование eg video1для <device>этого может привести к чему-то вроде:

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"

Но угадайте, глядя на тест в целом лучше. Также обратите внимание на сообщение:

Эта программа предназначена только для отладки, она не запускает никаких программ, указанных ключом RUN. Он может показывать неверные результаты, потому что некоторые значения могут отличаться или не быть доступными во время симуляции.


Вы также можете установить

udev_log="debug"

в udev.confи рестарт Udev ( reload udev) , чтобы получить несколько более подробный вывод.

Runium
источник