`udevadm info -a -n / dev / sdb`の出力を理解する


11

ラップトップに外付けHDDを差し込みます。私は情報を見つけようとします

$ 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ですか?残りは何ですか?

なぜ最後の2つを除いてすべて「...」内に「usb」があるのですか?

最後のPCIスロットの隣にありますか?

pci名前にあるけれども、とても空っぽの最後のものは何ですか?

「ウォークアップ」とは、外付けHDDからCPUへの意味ですか?

ありがとう!

回答:


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.7USBコントローラが接続されているバスアドレスです。
    PCI拡張カードはこのレベルで接続されます。USBコントローラーを搭載したチップはそれほど大きなものと接続されておらず、その接続はシリコンの奥深くにあります。
  • 最後のエントリはPCIバス自体です。そのバスのエンドポイントはCPUであるため、これは最後のエントリです。

2
@Timエンクロージャーは、IDEとUSBストレージ間を物理的、電気的に、プロトコルスタックの下位レベルで変換します。IDEとUSBストレージはどちらも、データ交換プロトコルとしてSCSIを使用しています(または非常に類似したバリアント)。最初の質問は少しトリッキーです。システムは異なるレベルで異なるものを認識します(ブロックデバイスレベルでハードディスクを認識し、SCSIレベルでHDDを認識し、USBレベルでエンクロージャーを認識すると言えます)。USBケーブルはソフトウェアからは見えません。
Gilles「SO-邪悪なことをやめ

2
@Timこれらのレベルはすべて、OS設計者が作成した抽象概念です。これらの抽象化のほとんどは、ハードウェアの一部のビューに対応します(すべてが個別のコンポーネントではない場合があり、物理的に単一の部品のハードウェア内に複数のコンポーネントが存在する場合があります)。抽象化とハードウェアの対応は近いですが、必ずしも完璧ではありません。
Gilles「SO-邪悪なことをやめなさい」

1
@Timうーん、これらはあなたが両側でドライバーコードを書いたときだけ私が本当に理解するものだと思います(私はこれをやったことはありません)。ウィキペディアから始めることができ、トピックに関する本があり(何をお勧めするのかわかりません)、標準を読むことができます(一部は無料で入手でき、一部は有料で必要な場合があります。 -大規模な組織)。
Gilles「SO-邪悪なことをやめなさい」

1
@Timそれは、IP over Ethernet、PPP、またはBluetoothなどを使用できるようなものです。また、Ajax over HTTP over TCP over IPなどを使用できます。SCSI、IDE、USBなどを介してSCSIコマンドを実行できます。PCIバスはこれらすべてを中継します。
Gilles「SO-邪悪なことをやめなさい」

1
@Tim 1)IDEをUSBストレージに置き換えます。エンクロージャは2つの間で変換されます。2)SCSIコマンド vs SCSI
Gilles「SO- stop be evil」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.