Comprendre la sortie de `udevadm info -a -n / dev / sdb`

11

Je branche un disque dur externe à mon ordinateur portable. J'essaie de trouver les informations par

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

Je me demande ce qu'est "la chaîne d'appareils parents", impliquée par la sortie? Je ne comprends pas très bien ce que looking at (parent) devicesignifie suivre chacun . Par exemple,

Le premier est-il mon disque dur externe? Quels sont les autres?

Pourquoi tous sauf les deux derniers ont "usb" dans "..."?

L'un est-il à côté des derniers emplacements PCI?

Quel est le dernier qui soit si vide, bien qu'ayant pcien son nom?

Est-ce que «monter» signifie du disque dur externe au processeur?

Merci!

Tim
la source

Réponses:

11

La promenade est sur les différents composants logiciels (pilotes) qui gèrent le périphérique; cela correspond en gros aux périphériques matériels et aux bus impliqués dans la connexion au périphérique. Ceci n'est en général pas lié à la disposition physique des appareils: la plupart d'entre eux sont de toute façon à l'intérieur de la même puce.

En prenant cet exemple d'en haut:

  • Nous avons d'abord un périphérique bloc (un périphérique de type disque).
    Ceci est le dispositif réel, de sorte que ses touches n'ont pas finale S( KERNEL, ATTR, etc.). Une finale S( KERNELS, ATTRS, etc.) est ajouté aux clés des ancêtres dans la udevadmsortie, pour correspondre à ce que vous pouvez écrire dans udev règles.
  • Le premier parent est un disque SCSI , géré par le sdpilote (disque SCSI). Il s'agit d'un disque connecté avec le protocole SCSI, pas nécessairement sur une connexion SCSI physique; les liaisons de stockage les plus modernes (ATA, SCSI, USB, iSCSI) utilisent le protocole SCSI sur différents protocoles de communication physiques.
  • L'adressage SCSI est en couches: le périphérique SCSI est attaché à une cible qui est attachée à un hôte .
  • L'hôte SCSI est un contrôleur de stockage USB , géré par le usb-storagepilote.
  • Le contrôleur de stockage USB est connecté à un contrôleur USB . Les périphériques USB sont connectés sous forme d'arborescence (comme SCSI, mais SCSI a un nombre fixe de points de branchement, tandis que l'USB peut chaîner des concentrateurs qui augmentent la profondeur de l'arborescence). Je ne connais pas suffisamment l'USB pour expliquer les détails des étapes USB.
  • Finalement , nous arrivons au contrôleur hôte USB: ATTRS{product}=="EHCI Host Controller". EHCI signifie un contrôleur USB 2.0.
  • Le contrôleur USB communique avec le CPU via un bus PCI . 0000:00:1d.7est l'adresse de bus à laquelle le contrôleur USB est connecté.
    Des cartes d'extension PCI sont connectées à ce niveau. La puce contenant le contrôleur USB n'est connectée à rien de si encombrant, ses connexions sont profondément à l'intérieur du silicium.
  • La dernière entrée est le bus PCI lui-même. Il s'agit de la dernière entrée car le point d'extrémité de ce bus est la CPU.
Gilles 'SO- arrête d'être méchant'
la source
2
@Tim Le boîtier se traduit physiquement, électriquement et entre le stockage IDE et USB au niveau inférieur de la pile de protocoles. Le stockage IDE et USB utilisent SCSI comme protocole d'échange de données (ou des variantes très proches). Votre première question est un peu délicate; le système voit différentes choses à différents niveaux (on pourrait dire qu'il voit le disque dur au niveau du périphérique de bloc, le disque dur au niveau SCSI et le boîtier au niveau USB). Le câble USB est invisible depuis le logiciel.
Gilles 'SO- arrête d'être méchant'
2
@Tim Ces niveaux sont toutes des abstractions créées par les concepteurs du système d'exploitation. La plupart de ces abstractions correspondent à une certaine vue d'un matériel (qui peut ne pas être tous des composants séparés, et il peut y avoir plus d'un composant à l'intérieur d'un matériel physiquement monobloc), la correspondance entre les abstractions et le matériel est proche mais pas toujours parfait.
Gilles 'SO- arrête d'être méchant'
1
@Tim Hmmm, je suppose que ce sont des choses que vous ne comprenez vraiment que lorsque vous avez écrit le code du pilote des deux côtés (ce que je n'ai jamais fait). Vous pouvez commencer à partir de Wikipedia, et il y a des livres sur le sujet (je ne sais pas quoi recommander), et vous pouvez lire les normes (certaines sont disponibles gratuitement, certaines doivent être payées, parfois des frais substantiels uniquement disponibles pour un moyen à -grande organisation).
Gilles 'SO- arrête d'être méchant'
1
@Tim C'est comme si vous pouviez avoir IP sur Ethernet, ou sur PPP, ou sur Bluetooth, etc. Et vous pouvez avoir des choses comme Ajax sur HTTP sur TCP sur IP. Vous pouvez avoir des commandes SCSI sur SCSI, sur IDE, sur USB, etc. Et le bus PCI relaie tout cela.
Gilles 'SO- arrête d'être méchant'
1
@Tim 1) Remplacez l'IDE par un stockage USB , le boîtier se traduit entre les deux. 2) Commandes SCSI vs SCSI
Gilles 'SO- arrête d'être méchant'