理解 `udevadm info -a -n /dev/sdb` 的输出

Tim*_*Tim 11 storage pci usb udev devices

我将外置硬盘插入我的笔记本电脑。我尝试通过以下方式找出信息

$ 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==""
Run Code Online (Sandbox Code Playgroud)

我想知道输出暗示的“父设备链”是什么?我不太明白下面每个looking at (parent) device是什么意思。例如,

第一个是我的外置硬盘吗?剩下的是什么?

为什么除了最后两个之外的所有“...”中都有“usb”?

是在最后一个 PCI 插槽旁边的那个吗?

最后一个如此空洞的东西是什么,尽管pci它的名字有?

“walk up”是指从外置硬盘到CPU吗?

谢谢!

Gil*_*il' 11

遍历处理设备的不同软件组件(驱动程序);这基本上对应于连接到设备所涉及的硬件设备和总线。这主要与设备的物理排列无关:无论如何,它们中的大多数都在同一芯片内。

从顶部看这个例子:

  • 首先我们有一个块设备(一个类似磁盘的设备)。
    这是实际的设备,因此它的键有没有最终SKERNELATTR等)。最终SKERNELSATTRS等)被添加到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总线与 CPU 通信。0000:00:1d.7是连接 USB 控制器的总线地址。
    PCI 扩展卡连接在这一层。包含 USB 控制器的芯片没有连接任何如此庞大的东西,它的连接在硅的深处。
  • 最后一个条目是 PCI 总线本身。这是最后一个条目,因为该总线的端点是 CPU。

  • @Tim 外壳在 IDE 和 USB 存储之间进行物理、电气和协议堆栈较低级别的转换。IDE 和 USB 存储都使用 SCSI 作为数据交换协议(或非常接近的变体)。你的第一个问题有点棘手;系统在不同级别看到不同的东西(你可以说它在块设备级别看到硬盘,在 SCSI 级别看到硬盘,在 USB 级别看到机箱)。USB 电缆在软件中是不可见的。 (2认同)
  • @Tim 这些级别都是操作系统设计者创建的抽象。这些抽象中的大部分都对应着一个硬件的一些视图(它可能不是所有独立的组件,一个物理单件硬件内部可以有多个组件),抽象和硬件之间的对应关系是接近但并不总是完美的。 (2认同)