Udev- Como descobrir a que subsistema um dispositivo pertence?

19

Por exemplo, eu tenho o dispositivo / dev / sdb. Como descubro que é o subsistema udev?

Rucent88
fonte

Respostas:

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

OBSERVAÇÃO: as opções acima consultam o banco de dados UDEV em busca de informações sobre o dispositivo, infoestamos consultando todas as informações -q alle analisamos todos os atributos /sysrelacionados a esse rótulo do dispositivo.

excerto

   --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.

Exemplo

Aqui está o meu /dev/sdadispositivo.

$ 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':

Diferenças entre estes 2 comandos

A resposta de @ sepero está mostrando informações referentes ao dispositivo UDEV no nó da folha.

Resposta de Sepero

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

resposta de slm

Minha resposta mostra os atributos à medida que percorre toda a /syshierarquia da cadeia de dispositivos.

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

Você pode ver a diferença entre esses dois.

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

NOTA: Estou executando o Fedora 19, usando a versão 204 do udevadm:

$ udevadm --version
204
slm
fonte
Por que esse comando complexo e não udevadm info -a -n /dev/sdb?
Gilles 'SO- stop be evil'
@ Gilles - Este despeja todos os ATTRS para todos os nós pais.
Slm
O mesmo acontece com o meu - a saída é idêntica.
Gilles 'SO- stop be evil'
Gilles - Você no Debian? Qual versão do udevadm? Quando executo os 2 comandos acima, recebo esses 2 arquivos. saída udevadm única vs. saída udevadm aninhada . Ao olhar para a saída, acho que o comando único está apenas combinando toda a saída de todos os pais, enquanto minha versão mostra de quais pais os ATTRS estão derivando.
slm
pastebin.com/NHg9pydA é a saída de udevadm info -q all, não de udevadm info -a. Eu acho que -aé um atalho para -q all --attribute-walk. Ou isso é diferente na sua versão? Não me lembro dessa mudança, mas depois não uso o Fedora há anos (mas por que uma distribuição corrige isso?).
Gilles 'SO- stop be evil'
5

udevadm info fornece esse tipo de informação.

Se você deseja especificamente o subsistema:

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

Ao escrever regras do udev, o comando mais útil é

udevadm info -a -n /dev/sdb

Isso imprime as regras que você pode usar para corresponder ao dispositivo nas regras do udev. O primeiro bloco é sobre o próprio dispositivo e os blocos subseqüentes são sobre seus ancestrais na árvore de dispositivos. A única ressalva é que você não pode misturar chaves que correspondem a diferentes ancestrais. Por exemplo, dado esse trecho

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"

você pode combinar este dispositivo com SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator"ou com SUBSYSTEM=="block", SUBSYSTEMS=="pci", DRIVERS="ahci"mas não com SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator", DRIVERS="ahci".

Outra maneira de obter informações para uso em regras é com

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

Isso imprime os valores de propriedade do dispositivo do formulário que você pode usar como nas regras do udev.KEY=VALUEENV{KEY}=="VALUE"

Se o seu dispositivo não tiver uma /deventrada, você poderá consultá-lo com um caminho abaixo /sys, por exemplo,

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

(neste caso, não é um exemplo útil - é útil para dispositivos cuja categoria não é comum e ainda não tem uma entrada /dev).

Quando você altera as regras do udev, elas são lidas automaticamente; no entanto, eles são aplicados apenas a dispositivos que são subsequentemente conectados ao sistema. Para aplicar as novas regras a um dispositivo já conectado, use udevadm trigger(com opções para restringir o aplicativo a determinados dispositivos).

Gilles 'SO- parar de ser mau'
fonte
4
$ udevadm info -q all -n /dev/sdb
Sepero
fonte
A diferença b / w esta abordagem eo meu é que isso mostra apenas o nó folha em /syspara /dev/sdb. A outra abordagem mostra toda a hierarquia da árvore do nó folha junto com os ramos.
Slm