Зрозумійте вихід `udevadm info -a -n / dev / sdb`


11

Я підключаю зовнішній жорсткий диск до свого ноутбука. Я намагаюся з’ясувати інформацію за

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

Цікаво, що таке "ланцюжок батьківських пристроїв", що має на увазі вихід? Я не зовсім розумію, що слідкувати за кожним looking at (parent) deviceзасобом. Наприклад,

Перший мій зовнішній жорсткий диск? Які інші?

Чому всі, крім двох останніх, мають "usb" в межах "..."?

Чи знаходиться поруч з останніми слотами PCI?

Який останній такий порожній, хоч і має pciсвоє ім’я?

Чи означає "прогулянка вгору" від зовнішнього жорсткого диска до процесора?

Спасибі!

Відповіді:


11

Прогулянка ведеться за різними програмними компонентами (драйверами), які керують пристроєм; це за великим рахунком відповідає апаратним пристроям та шинам, які беруть участь у підключенні до пристрою. Це здебільшого не пов'язане з фізичним розташуванням пристроїв: більшість із них все одно знаходяться всередині однієї мікросхеми.

Візьмемо цей приклад зверху:

  • Спочатку у нас є блок-пристрій (дископодібний пристрій).
    Це фактичне пристрій, так що його клавіші не мають ніякого остаточного S( KERNEL, ATTRі т.д.). Фінал S( KERNELS, ATTRSі т.д.) додається до ключів предків у udevadmвисновку, щоб відповідати тому, що ви можете записати в правилах udev .
  • Перший батьківський - це диск SCSI , яким керує sdдрайвер (SCSI disk). Це диск, підключений до протоколу SCSI, не обов'язково через фізичне з'єднання SCSI; більшість сучасних посилань на зберігання даних (ATA, SCSI, USB, iSCSI) використовують протокол SCSI для різних фізичних протоколів зв'язку.
  • Адресація SCSI шарується: пристрій SCSI приєднано до цілі, яка приєднана до хоста .
  • Хост SCSI - це контролер USB-накопичувача , яким керує usb-storageдрайвер.
  • Контролер USB-накопичувача приєднаний до USB- контролера. USB-пристрої прикріплюються деревом (як SCSI, але SCSI має фіксовану кількість точок розгалуження, тоді як USB можуть ланцюжковувати концентратори, що збільшують глибину дерева). Я не знаю достатньо USB, щоб пояснити деталі кроків USB.
  • В кінці кінців ми приходимо до хост - контролер USB: ATTRS{product}=="EHCI Host Controller". EHCI означає контролер USB 2.0.
  • Контролер USB розмовляє з процесором через шину PCI . 0000:00:1d.7- адреса шини, за якою приєднано USB-контролер.
    Карти розширень PCI додаються на цьому рівні. Мікросхема, що містить USB-контролер, не пов'язана ні з чим настільки об'ємною, її з'єднання знаходяться глибоко всередині кремнію.
  • Останній запис - сама шина PCI. Це останній запис, оскільки кінцевою точкою цієї шини є процесор.

2
@Tim Пристрій перекладає між IDE і USB-накопичувачем фізично, електрично та на нижньому рівні стеку протоколів. І IDE, і USB-накопичувач використовують SCSI як протокол обміну даними (або дуже близькі варіанти). Ваше перше запитання трохи складне; система бачить різні речі на різних рівнях (можна сказати, він бачить жорсткий диск на рівні блочного пристрою, hdd на рівні SCSI та корпус на рівні USB). USB-кабель невидимий у програмному забезпеченні.
Жиль "ТАК - перестань бути злим"

2
@Tim Ці рівні - це всі абстракції, створені дизайнерами ОС. Більшість цих абстракцій відповідають деякому виду обладнання (яке може бути не всіма окремими компонентами, а всередині фізично нероз'ємного апарату може бути більше одного компонента), відповідність між абстракціями та обладнанням є близький, але не завжди ідеальний.
Жил "ТАК - перестань бути злим"

1
@Tim Hmmm, я вважаю, що це речі, які ви дійсно розумієте, коли ви написали код драйвера з обох сторін (чого я ніколи не робив). Ви можете почати з Вікіпедії, і є книги на цю тему (я поняття не маю, що рекомендувати), і ви можете прочитати стандарти (деякі доступні у вільному доступі, деякі вимагають оплати, іноді значна плата доступна лише середньому та середньому -велика організація).
Жил 'SO- перестань бути злим'

1
@Tim Це так, як у вас може бути IP через Ethernet, або через PPP, або через Bluetooth, і т.д. І у вас можуть бути такі речі, як Ajax через HTTP через TCP через IP. Ви можете мати команди SCSI через SCSI, через IDE, через USB тощо. І шина PCI реле всього цього.
Жил 'SO- перестань бути злим'

1
@Tim 1) Замініть IDE на USB-накопичувач , корпус перекладається між двома. 2) Команди SCSI проти SCSI
Gilles 'SO- перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.