Comprender la salida de `udevadm info -a -n / dev / sdb`

11

Conecto un disco duro externo en mi computadora portátil. Intento averiguar la información por

$ 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==""

Me pregunto qué es "la cadena de dispositivos principales", implicada por la salida. No entiendo muy bien qué looking at (parent) devicesignifica seguir cada uno . Por ejemplo,

¿Es el primero mi disco duro externo? ¿Qué son el resto?

¿Por qué todos excepto los dos últimos tienen "usb" dentro de '...'?

¿Está el que está al lado de las últimas ranuras PCI?

¿Cuál es el último que está tan vacío, aunque tenga pcisu nombre?

¿"Subir" significa desde el HDD externo a la CPU?

¡Gracias!

Tim
fuente

Respuestas:

11

La caminata es sobre los diferentes componentes de software (controladores) que manejan el dispositivo; esto corresponde en general a los dispositivos de hardware y buses que participan en la conexión al dispositivo. Esto no está relacionado con la disposición física de los dispositivos: la mayoría de ellos están dentro del mismo chip de todos modos.

Tomando este ejemplo desde arriba:

  • Primero tenemos un dispositivo de bloque (un dispositivo similar a un disco).
    Este es el dispositivo real, por lo que sus teclas no tienen ningún última S( KERNEL, ATTR, etc.). Un último S( KERNELS, ATTRS, etc.) se añade a las teclas antepasados en la udevadmsalida, para que coincida con lo que usted puede escribir en udev reglas.
  • El primer padre es un disco SCSI , manejado por el sdcontrolador (disco SCSI). Este es un disco conectado con el protocolo SCSI, no necesariamente a través de una conexión SCSI física; Los enlaces de almacenamiento más modernos (ATA, SCSI, USB, iSCSI) utilizan el protocolo SCSI sobre diferentes protocolos de comunicación física.
  • El direccionamiento SCSI está en capas: el dispositivo SCSI está conectado a un destino que está conectado a un host .
  • El host SCSI es un controlador de almacenamiento USB , manejado por el usb-storagecontrolador.
  • El controlador de almacenamiento USB está conectado a un controlador USB . Los dispositivos USB están conectados en forma de árbol (como SCSI, pero SCSI tiene un número fijo de puntos de ramificación, mientras que USB puede encadenar centros que aumentan la profundidad del árbol). No sé lo suficiente sobre USB para explicar los detalles de los pasos de USB.
  • Con el tiempo llegamos a la controladora de host USB: ATTRS{product}=="EHCI Host Controller". EHCI significa un controlador USB 2.0.
  • El controlador USB habla con la CPU a través de un bus PCI . 0000:00:1d.7es la dirección del bus en la que está conectado el controlador USB.
    Las tarjetas de extensión PCI están conectadas a este nivel. El chip que contiene el controlador USB no está conectado con nada tan voluminoso, sus conexiones están profundamente dentro del silicio.
  • La última entrada es el bus PCI en sí. Esta es la última entrada porque el punto final de ese bus es la CPU.
Gilles 'SO- deja de ser malvado'
fuente
2
@Tim El gabinete se traduce entre IDE y almacenamiento USB físicamente, eléctricamente y en el nivel inferior de la pila de protocolos. Tanto el almacenamiento IDE como el USB utilizan SCSI como protocolo de intercambio de datos (o variantes muy cercanas). Tu primera pregunta es un poco complicada; el sistema ve cosas diferentes en diferentes niveles (se podría decir que ve el disco duro en el nivel del dispositivo de bloque, el disco duro en el nivel SCSI y el gabinete en el nivel USB). El cable USB es invisible desde el software.
Gilles 'SO- deja de ser malvado'
2
@Tim Estos niveles son todas abstracciones creadas por los diseñadores del sistema operativo. La mayoría de estas abstracciones corresponden a alguna vista de una pieza de hardware (que puede no ser todos componentes separados, y puede haber más de un componente dentro de una pieza de hardware físicamente única), la correspondencia entre las abstracciones y el hardware es cerca pero no siempre perfecto.
Gilles 'SO- deja de ser malvado'
1
@Tim Hmmm, supongo que estas son cosas que solo entiendes realmente cuando has escrito el código del controlador en ambos lados (lo cual nunca he hecho). Puede comenzar desde Wikipedia, y hay libros sobre el tema (no tengo idea de qué recomendar), y puede leer los estándares (algunos están disponibles gratuitamente, otros requieren pagar, a veces una tarifa sustancial solo disponible para un medio a -grande organización).
Gilles 'SO- deja de ser malvado'
1
@Tim Es como si pudieras tener IP sobre Ethernet, o sobre PPP, o sobre Bluetooth, etc. Y puedes tener cosas como Ajax sobre HTTP sobre TCP sobre IP. Puede tener comandos SCSI sobre SCSI, sobre IDE, sobre USB, etc. Y el bus PCI transmite todo esto.
Gilles 'SO- deja de ser malvado'
1
@Tim 1) Reemplace IDE por almacenamiento USB , el gabinete se traduce entre los dos. 2) Comandos SCSI vs SCSI
Gilles 'SO- deja de ser malvado'