Verstehe die Ausgabe von `udevadm info -a -n / dev / sdb`

11

Ich schließe eine externe Festplatte an meinen Laptop an. Ich versuche die Informationen durch herauszufinden

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

Ich frage mich, was "die Kette der übergeordneten Geräte" ist, impliziert durch die Ausgabe? Ich verstehe nicht ganz, was es looking at (parent) devicebedeutet, jedem zu folgen . Beispielsweise,

Ist die erste meine externe Festplatte? Was ist der Rest?

Warum haben alle außer den letzten beiden "usb" in "..."?

Ist der neben den letzten PCI-Steckplätzen?

Was ist das letzte, das so leer ist, obwohl es pciin seinem Namen steht?

Bedeutet "Aufsteigen" von der externen Festplatte zur CPU?

Vielen Dank!

Tim
quelle

Antworten:

11

Der Spaziergang führt über die verschiedenen Softwarekomponenten (Treiber), die das Gerät handhaben. Dies entspricht im Großen und Ganzen den Hardwaregeräten und Bussen, die an der Verbindung mit dem Gerät beteiligt sind. Dies hängt größtenteils nicht mit der physischen Anordnung der Geräte zusammen: Die meisten von ihnen befinden sich sowieso im selben Chip.

Nehmen Sie dieses Beispiel von oben:

  • Zuerst haben wir ein Blockgerät (ein festplattenähnliches Gerät).
    Dies ist das eigentliche Gerät, so dass ihr Schlüssel keine endgültigen hat S( KERNEL, ATTRusw.). Ein abschließendes S( KERNELS, ATTRSusw.) wird zu Vorfahren Schlüssel im udevadmAusgang, dem , was Sie in schreiben können udev - Regeln.
  • Das erste übergeordnete Element ist eine SCSI- Festplatte, die vom sdTreiber (SCSI-Festplatte) verwaltet wird. Dies ist eine Festplatte, die mit dem SCSI-Protokoll verbunden ist, nicht unbedingt über eine physische SCSI-Verbindung. Die meisten modernen Speicherverbindungen (ATA, SCSI, USB, iSCSI) verwenden das SCSI-Protokoll über verschiedene physische Kommunikationsprotokolle.
  • Die SCSI-Adressierung ist geschichtet: Das SCSI-Gerät ist an ein Ziel angeschlossen, das an einen Host angeschlossen ist .
  • Der SCSI-Host ist ein USB-Speichercontroller , der vom usb-storageTreiber verwaltet wird.
  • Der USB-Speichercontroller ist an einen USB- Controller angeschlossen. USB-Geräte werden baumartig angeschlossen (wie SCSI, aber SCSI hat eine feste Anzahl von Verzweigungspunkten, während USB Hubs verketten kann, die die Tiefe des Baums erhöhen). Ich weiß nicht genug über USB, um die Details der USB-Schritte zu erklären.
  • Schließlich kommen wir zum USB-Host-Controller : ATTRS{product}=="EHCI Host Controller". EHCI bedeutet einen USB 2.0-Controller.
  • Der USB-Controller kommuniziert über einen PCI- Bus mit der CPU . 0000:00:1d.7ist die Busadresse, an die der USB-Controller angeschlossen ist.
    Auf dieser Ebene werden PCI-Erweiterungskarten angeschlossen. Der Chip mit dem USB-Controller ist nicht mit etwas so Sperrigem verbunden, dass seine Verbindungen tief im Silizium liegen.
  • Der letzte Eintrag ist der PCI-Bus selbst. Dies ist der letzte Eintrag, da der Endpunkt dieses Busses die CPU ist.
Gilles 'SO - hör auf böse zu sein'
quelle
2
@Tim Das Gehäuse übersetzt physisch, elektrisch und auf der unteren Ebene des Protokollstapels zwischen IDE und USB-Speicher. Sowohl IDE als auch USB-Speicher verwenden SCSI als Datenaustauschprotokoll (oder sehr nahe Varianten). Ihre erste Frage ist etwas knifflig; Das System sieht verschiedene Dinge auf verschiedenen Ebenen (man könnte sagen, es sieht die Festplatte auf Blockgeräteebene, die Festplatte auf SCSI-Ebene und das Gehäuse auf USB-Ebene). Das USB-Kabel ist für die Software nicht sichtbar.
Gilles 'SO - hör auf böse zu sein'
2
@Tim Diese Ebenen sind alle Abstraktionen, die von den Betriebssystemdesignern erstellt wurden. Die meisten dieser Abstraktionen entsprechen einer Ansicht einer Hardware (die möglicherweise nicht alle separate Komponenten sind und in einer physisch einteiligen Hardware mehr als eine Komponente enthalten kann). Die Entsprechung zwischen den Abstraktionen und der Hardware ist nah aber nicht immer perfekt.
Gilles 'SO - hör auf böse zu sein'
1
@ Tim Hmmm, ich nehme an, das sind Dinge, die Sie nur wirklich verstehen, wenn Sie den Treibercode auf beiden Seiten geschrieben haben (was ich noch nie getan habe). Sie können von Wikipedia aus starten, und es gibt Bücher zu diesem Thema (ich habe keine Ahnung, was ich empfehlen soll), und Sie können die Standards lesen (einige sind frei verfügbar, andere müssen bezahlt werden, manchmal ist eine erhebliche Gebühr nur für mittelständische Personen verfügbar -große Organisation).
Gilles 'SO - hör auf böse zu sein'
1
@Tim Es ist, als ob Sie IP über Ethernet oder über PPP oder über Bluetooth usw. haben könnten. Und Sie können Dinge wie Ajax über HTTP über TCP über IP haben. Sie können SCSI-Befehle über SCSI, über IDE, über USB usw. haben. Und der PCI-Bus leitet all diese weiter.
Gilles 'SO - hör auf böse zu sein'
1
@Tim 1) Ersetzen Sie die IDE durch einen USB-Speicher , das Gehäuse wird zwischen den beiden übersetzt. 2) SCSI-Befehle gegen SCSI
Gilles 'SO - hör auf böse zu sein'