Понимать вывод `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означает следующее . Например,

Первый ли это мой внешний HDD? Какие остальные?

Почему все, кроме двух последних, имеют «usb» внутри «...»?

Один рядом с последними слотами PCI?

Что является последним, который настолько пуст, хотя и имеет pciв своем названии?

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

Спасибо!

Тим
источник

Ответы:

11

Пройдемся по различным программным компонентам (драйверам), которые обрабатывают устройство; это в целом соответствует аппаратным устройствам и шинам, которые участвуют в подключении к устройству. Это в основном не связано с физическим расположением устройств: большинство из них в любом случае находятся внутри одного чипа.

Взяв этот пример сверху:

  • Сначала у нас есть блочное устройство (дискообразное устройство).
    Это фактическое устройство, поэтому его ключи не имеют окончательного S( KERNEL, ATTRи т. Д.). Финал S( KERNELS, ATTRSи т. Д.) Добавляется к ключам предков в udevadmвыводе, чтобы соответствовать тому, что вы можете написать в правилах udev .
  • Первым родителем является диск SCSI , который обрабатывается sdдрайвером (диск SCSI). Это диск, связанный с протоколом 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 в качестве протокола обмена данными (или очень близкие варианты). Ваш первый вопрос немного сложен; система видит разные вещи на разных уровнях (можно сказать, что она видит жесткий диск на уровне блочных устройств, жесткий диск на уровне SCSI и корпус на уровне USB). USB-кабель невидим от программного обеспечения.
Жиль "ТАК - перестань быть злым"
2
@Tim Эти уровни - все абстракции, созданные дизайнерами ОС. Большинство из этих абстракций соответствуют некоторому представлению части аппаратного обеспечения (которая может не быть всеми отдельными компонентами, и может быть больше чем один компонент внутри физически единой части аппаратного обеспечения), соответствие между абстракциями и оборудованием близко, но не всегда идеально.
Жиль "ТАК - перестать быть злым"
1
@ Тим Хммм, я полагаю, это то, что вы действительно понимаете, когда пишете код драйвера с обеих сторон (чего я никогда не делал). Вы можете начать с Википедии, и есть книги по этой теме (я понятия не имею, что порекомендовать), и вы можете прочитать стандарты (некоторые находятся в свободном доступе, некоторые требуют оплаты, иногда существенная плата доступна только для среднего и среднего уровня). большая организация).
Жиль "ТАК - перестань быть злым"
1
@Tim Похоже, у вас может быть IP через Ethernet, или через PPP, или через Bluetooth, и т. Д. И вы можете иметь такие вещи, как Ajax через HTTP через TCP через IP. У вас могут быть команды SCSI через SCSI, через IDE, через USB и т. Д. И шина PCI передает все это.
Жиль "ТАК - перестань быть злым"
1
@Tim 1) Замените IDE на USB-накопитель , корпус переводится между ними. 2) Команды SCSI против SCSI
Жиль "ТАК - перестань быть злым"