Entenda a saída do `udevadm info -a -n / dev / sdb`

11

Conecto um disco rígido externo ao meu laptop. Eu tento descobrir as informações

$ udevadm info -a -n /dev/sdb

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host10/target10:0:0/10:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{range}=="16"
    ATTR{ext_range}=="256"
    ATTR{removable}=="0"
    ATTR{ro}=="0"
    ATTR{size}=="312581808"
    ATTR{alignment_offset}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{capability}=="50"
    ATTR{stat}=="     322    11207    13259     2196        2        0       16        0        0     1524     2196"
    ATTR{inflight}=="       0        0"
    ATTR{events}==""
    ATTR{events_async}==""
    ATTR{events_poll_msecs}=="-1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host10/target10:0:0/10:0:0:0':
    KERNELS=="10:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="0"
    ATTRS{vendor}=="USB 2.0 "
    ATTRS{model}=="Storage Device  "
    ATTRS{rev}=="0100"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x165"
    ATTRS{iodone_cnt}=="0x165"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{evt_media_change}=="0"
    ATTRS{dh_state}=="detached"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host10/target10:0:0':
    KERNELS=="target10:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host10':
    KERNELS=="host10"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0':
    KERNELS=="2-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1':
    KERNELS=="2-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="1076"
    ATTRS{idVendor}=="0402"
    ATTRS{idProduct}=="5621"
    ATTRS{bcdDevice}=="0103"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="8"
    ATTRS{devpath}=="1"
    ATTRS{product}=="USB 2.0 Storage Device"
    ATTRS{serial}=="00042222200000064007"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="382"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0302"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="6"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 3.2.0-27-generic-pae ehci_hcd"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.7"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7':
    KERNELS=="0000:00:1d.7"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x293a"
    ATTRS{subsystem_vendor}=="0x17aa"
    ATTRS{subsystem_device}=="0x20f1"
    ATTRS{class}=="0x0c0320"
    ATTRS{irq}=="19"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""
    ATTRS{companion}==""
    ATTRS{uframe_periodic_max}=="100"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Gostaria de saber o que é "a cadeia de dispositivos pai", implícita na saída? Não entendo bem o que looking at (parent) devicesignifica seguir cada um. Por exemplo,

O primeiro é meu HDD externo? Quais são os outros?

Por que todos, exceto os dois últimos, têm "usb" dentro de '...'?

É o próximo aos últimos slots PCI?

Qual é o último que está tão vazio, apesar de ter pciem seu nome?

"Subir" significa do disco rígido externo para a CPU?

Obrigado!

Tim
fonte

Respostas:

11

A caminhada é sobre os diferentes componentes de software (drivers) que manipulam o dispositivo; isso corresponde em geral aos dispositivos de hardware e barramentos envolvidos na conexão com o dispositivo. Isso não tem relação com o arranjo físico dos dispositivos: a maioria deles está dentro do mesmo chip.

Tomando este exemplo de cima:

  • Primeiro, temos um dispositivo de bloco (um dispositivo semelhante a disco).
    Este é o dispositivo real, então suas teclas não têm finais S( KERNEL, ATTR, etc.). Um final S( KERNELS, ATTRSetc.) é adicionado às chaves dos antepassados ​​na udevadmsaída, para corresponder ao que você pode escrever nas regras do udev .
  • O primeiro pai é um disco SCSI , tratado pelo sddriver (disco SCSI). Este é um disco conectado ao protocolo SCSI, não necessariamente por uma conexão SCSI física; os links de armazenamento mais modernos (ATA, SCSI, USB, iSCSI) usam o protocolo SCSI em diferentes protocolos de comunicação física.
  • O endereçamento SCSI está em camadas: o dispositivo SCSI está conectado a um destino que está conectado a um host .
  • O host SCSI é um controlador de armazenamento USB , tratado pelo usb-storagedriver.
  • O controlador de armazenamento USB está conectado a um controlador USB . Os dispositivos USB são conectados em forma de árvore (como o SCSI, mas o SCSI possui um número fixo de pontos de ramificação, enquanto o USB pode encadear hubs que aumentam a profundidade da árvore). Não sei o suficiente sobre USB para explicar os detalhes das etapas do USB.
  • Eventualmente chegamos ao controlador de host USB: ATTRS{product}=="EHCI Host Controller". EHCI significa um controlador USB 2.0.
  • O controlador USB fala com a CPU através de um barramento PCI . 0000:00:1d.7é o endereço do barramento no qual o controlador USB está conectado.
    As placas de extensão PCI estão conectadas neste nível. O chip que contém o controlador USB não está conectado a nada tão volumoso, suas conexões estão profundamente dentro do silício.
  • A última entrada é o próprio barramento PCI. Esta é a última entrada porque o ponto final desse barramento é a CPU.
Gilles 'SO- parar de ser mau'
fonte
2
@Tim O gabinete converte entre o armazenamento IDE e USB fisicamente, eletricamente e no nível mais baixo da pilha de protocolos. O armazenamento IDE e USB usa SCSI como protocolo de troca de dados (ou variantes muito próximas). Sua primeira pergunta é um pouco complicada; o sistema vê coisas diferentes em níveis diferentes (você pode dizer que vê o disco rígido no nível do dispositivo de bloco, o disco rígido no nível SCSI e o gabinete no nível USB). O cabo USB é invisível do software.
Gilles 'stop SO estar mal'
2
@ Tim Esses níveis são todas as abstrações criadas pelos designers do SO. A maioria dessas abstrações corresponde a alguma visão de uma peça de hardware (que pode não ser todos os componentes separados, e pode haver mais de um componente dentro de uma peça de hardware fisicamente única), a correspondência entre as abstrações e o hardware é perto, mas nem sempre perfeito.
Gilles 'SO- stop be evil' (
1
@ Tim Hmmm, suponho que essas são coisas que você realmente só entende quando escreve o código do driver nos dois lados (o que nunca fiz). Você pode começar na Wikipedia, e há livros sobre o tema (não tenho idéia do que recomendar), e você pode ler os padrões (alguns estão disponíveis gratuitamente, outros requerem pagamento, às vezes uma taxa substancial disponível apenas para pessoas de médio a organização).
Gilles 'SO- stop be evil' (
1
@ Tim É como se você pudesse ter IP sobre Ethernet, PPP ou Bluetooth, etc. E pode ter coisas como Ajax sobre HTTP sobre TCP sobre IP. Você pode ter comandos SCSI sobre SCSI, IDE, USB, etc. E o barramento PCI retransmite tudo isso.
Gilles 'SO- stop being evil'
1
@ Tim 1) Substitua o IDE pelo armazenamento USB , o gabinete é convertido entre os dois. 2) Comandos SCSI vs SCSI
Gilles 'SO- stop be evil'