Comprendi l'output di `udevadm info -a -n / dev / sdb`


11

Collego un HDD esterno al mio laptop. Provo a scoprire le informazioni da

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

Mi chiedo che cos'è la "catena di dispositivi genitore", implicita dall'output? Non capisco bene cosa looking at (parent) devicesignifichi seguire ciascuno . Per esempio,

Il primo è il mio HDD esterno? Quali sono gli altri?

Perché tutti tranne gli ultimi due hanno "usb" in '...'?

Quello è vicino agli ultimi slot PCI?

Qual è l'ultimo che è così vuoto, pur avendo pcinel suo nome?

"Walk up" significa dall'HDD esterno alla CPU?

Grazie!

Risposte:


11

La passeggiata è sui diversi componenti software (driver) che gestiscono il dispositivo; questo corrisponde in linea di massima ai dispositivi hardware e ai bus coinvolti nella connessione al dispositivo. Ciò è in gran parte estraneo alla disposizione fisica dei dispositivi: la maggior parte di essi si trova comunque nello stesso chip.

Prendendo questo esempio dall'alto:

  • Innanzitutto abbiamo un dispositivo a blocchi (un dispositivo simile a un disco).
    Questo è il dispositivo effettivo, per cui i suoi tasti non hanno finale S( KERNEL, ATTRecc). Un finale S( KERNELS, ATTRS, ecc) viene aggiunto alle chiavi antenati in udevadmuscita, per corrispondere a ciò che si può scrivere in udev regole.
  • Il primo genitore è un disco SCSI , gestito dal sddriver (disco SCSI). Questo è un disco collegato con il protocollo SCSI, non necessariamente tramite una connessione SCSI fisica; i più moderni collegamenti di archiviazione (ATA, SCSI, USB, iSCSI) utilizzano il protocollo SCSI su diversi protocolli di comunicazione fisica.
  • L'indirizzamento SCSI è stratificato: il dispositivo SCSI è collegato a una destinazione collegata a un host .
  • L'host SCSI è un controller di archiviazione USB , gestito dal usb-storagedriver.
  • Il controller di archiviazione USB è collegato a un controller USB . I dispositivi USB sono collegati in modo ad albero (come SCSI, ma SCSI ha un numero fisso di punti di diramazione, mentre USB può concatenare hub che aumentano la profondità dell'albero). Non so abbastanza su USB per spiegare i dettagli dei passaggi USB.
  • Alla fine si arriva al controller host USB: ATTRS{product}=="EHCI Host Controller". EHCI significa un controller USB 2.0.
  • Il controller USB comunica con la CPU tramite un bus PCI . 0000:00:1d.7è l'indirizzo del bus a cui è collegato il controller USB.
    Le schede di estensione PCI sono collegate a questo livello. Il chip contenente il controller USB non è collegato a nulla di così ingombrante, le sue connessioni sono profonde all'interno del silicio.
  • L'ultima voce è il bus PCI stesso. Questa è l'ultima voce perché l'endpoint di quel bus è la CPU.

2
@Tim Il contenitore si traduce tra IDE e memoria USB fisicamente, elettricamente e al livello inferiore dello stack di protocollo. Sia l'IDE che l'archivio USB utilizzano SCSI come protocollo di scambio dati (o varianti molto simili). La tua prima domanda è un po 'complicata; il sistema vede cose diverse a livelli diversi (si potrebbe dire che vede il disco rigido a livello di dispositivo a blocchi, l'hdd a livello SCSI e il contenitore a livello USB). Il cavo USB è invisibile dal software.
Gilles 'SO- smetti di essere malvagio' il

2
@Tim Questi livelli sono tutte astrazioni create dai progettisti del sistema operativo. La maggior parte di queste astrazioni corrispondono a una vista di un pezzo di hardware (che potrebbe non essere tutti componenti separati e può esserci più di un componente all'interno di un pezzo di hardware fisicamente singolo), la corrispondenza tra le astrazioni e l'hardware è vicino ma non sempre perfetto.
Gilles 'SO- smetti di essere malvagio' il

1
@ Tim Hmmm, suppongo che queste siano cose che capisci davvero solo quando hai scritto il codice del driver su entrambi i lati (cosa che non ho mai fatto). Puoi iniziare da Wikipedia e ci sono libri sull'argomento (non ho idea di cosa raccomandare), e puoi leggere gli standard (alcuni sono disponibili gratuitamente, alcuni richiedono il pagamento, a volte una tariffa sostanziale disponibile solo per un medio-a -grande organizzazione).
Gilles 'SO- smetti di essere malvagio' il

1
@Tim È come se tu potessi avere IP su Ethernet, PPP o Bluetooth, ecc. E puoi avere Ajax su HTTP su TCP su TCP su IP. Puoi avere comandi SCSI su SCSI, su IDE, su USB, ecc. E il bus PCI inoltra tutti questi.
Gilles 'SO- smetti di essere malvagio' il

1
@Tim 1) Sostituire IDE con memoria USB , il contenitore si traduce tra i due. 2) Comandi SCSI vs SCSI
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.