Udev - Как узнать, к какой подсистеме относится устройство?

19

Например, у меня есть устройство / dev / sdb. Как я узнаю, что это подсистема udev?

Rucent88
источник

Ответы:

12
$ udevadm info -q all -a /dev/sdb

ПРИМЕЧАНИЕ. Вышеприведенный запрос запрашивает информацию об устройстве в базе данных UDEV info, мы запрашиваем всю информацию -q allи проходим все атрибуты, /sysотносящиеся к этой метке устройства.

выдержка

   --attribute-walk|-a
       Print all sysfs properties of the specified device that can be used 
       in udev rules to match the specified device. It prints all devices
       along the chain, up to the root of sysfs that can be used in udev 
       rules.

пример

Вот мое /dev/sdaустройство.

$ udevadm info -q all -a /dev/sda | grep parent
walks up the chain of parent devices. It prints for every device
and the attributes from one single parent device.
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
  looking at parent device '/devices/pci0000:00':

Различия между этими 2 командами

Ответ @ sepero показывает информацию, относящуюся только к устройству UDEV на конечном узле.

Ответ Сеперо

$ udevadm info -q all -n /dev/sda > udevadm_info_1.txt

ответ СЛМ

Мой ответ показывает атрибуты, поскольку он проходит всю /sysцепочку иерархии устройств.

$ udevadm info -q all -a /dev/sda > udevadm_info_2.txt

Вы можете увидеть разницу между этими двумя.

$ diff -y udevadm_info_1.txt udevadm_info_2.txt  \
    > udevadm_info_diff.txt

ПРИМЕЧАНИЕ: я работаю на Fedora 19, используя версию 204 udevadm:

$ udevadm --version
204
SLM
источник
Почему эта сложная команда, а не udevadm info -a -n /dev/sdb?
Жиль "ТАК - перестань быть злым"
@Gilles - этот дамп сбрасывает все ATTRS для всех родительских узлов.
SLM
Так же и мой - вывод идентичен.
Жиль "ТАК - перестань быть злым"
Жиль - Вы на Debian? Какая версия отевадм? Когда я запускаю вышеупомянутые 2 команды, я получаю эти 2 файла. одиночный вывод udevadm против вложенного вывода udevadm . Глядя на выходные данные, я думаю, что единственная команда просто объединяет все выходные данные всех родителей, в то время как моя версия показывает, от каких родителей получены ATTRS.
SLM
pastebin.com/NHg9pydA - это выход из udevadm info -q all, а не из udevadm info -a. Я думаю, что -aэто ярлык для -q all --attribute-walk. Или это отличается от вашей версии? Я не помню, чтобы это изменилось, но тогда я не пользовался Fedora годами (но зачем дистрибутив исправлять это?).
Жиль "ТАК - перестань быть злым"
5

udevadm info предоставляет такую ​​информацию.

Если вам конкретно нужна подсистема:

udevadm info -n /dev/sdb -q property | sed -n 's/SUBSYSTEM=//p'

Когда вы пишете правила udev, самая полезная команда

udevadm info -a -n /dev/sdb

Это распечатывает правила, которые вы можете использовать, чтобы соответствовать устройству в правилах udev. Первый блок о самом устройстве, а последующие блоки о его предках в дереве устройств. Единственное предостережение в том, что вы не можете смешивать ключи, которые соответствуют разным предкам. Например, учитывая этот отрывок

KERNEL=="sdb"
SUBSYSTEM=="block"
…
KERNELS=="5:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{model}=="Yoyodyne Diskinator"
…
KERNELS=="0000:00:1f.2"
SUBSYSTEMS=="pci"
DRIVERS=="ahci"

тогда вы можете сопоставить это устройство с SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator"или с, SUBSYSTEM=="block", SUBSYSTEMS=="pci", DRIVERS="ahci"но не с SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator", DRIVERS="ahci".

Другой способ получить информацию для использования в правилах

udevadm info -q property -n /dev/sdb --export

Это печатает значения свойств устройства в форме, которую вы можете использовать как в правилах udev.KEY=VALUEENV{KEY}=="VALUE"

Если на вашем устройстве нет /devзаписи, вы можете обратиться к ней с помощью пути /sys, например

udevadm info -a -p /sys/block/sdb

(в данном случае это бесполезный пример - это полезно для устройств, категория которых не является общей и в которых еще нет записи /dev).

Когда вы меняете правила udev, они читаются автоматически; однако они применяются только к устройствам, которые впоследствии подключаются к системе. Чтобы применить новые правила к уже подключенному устройству, используйте udevadm trigger(с параметрами, позволяющими ограничить применение определенных устройств).

Жиль "ТАК - прекрати быть злым"
источник
4
$ udevadm info -q all -n /dev/sdb
Sepero
источник
Разница ч / б этого подхода и мой в том , что это показывает только листовой узел в /sysтечение /dev/sdb. Другой подход показывает всю иерархию дерева конечного узла вместе с ветвями.
SLM