ทำความเข้าใจเอาต์พุตของ `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 ตัวแรกของฉันหรือไม่ ที่เหลือคืออะไร?

ทำไมทุกอย่างยกเว้นสองอันสุดท้ายมี "usb" อยู่ใน "... "

อยู่ถัดจากสล็อต PCI ล่าสุดหรือไม่

สุดท้ายคืออะไรที่ว่างเปล่าแม้ว่าจะมีpciชื่ออยู่ในนั้น?

"walk up" หมายถึงจาก HDD ภายนอกไปยัง CPU หรือไม่

ขอบคุณ!

คำตอบ:


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
  • ในที่สุดเรามาถึงที่โฮสต์คอนโทรลเลอร์ ATTRS{product}=="EHCI Host Controller"USB: EHCIหมายถึงคอนโทรลเลอร์ USB 2.0
  • คอนโทรลเลอร์ USB พูดกับ CPU ผ่านบัสPCI 0000:00:1d.7คือที่อยู่บัสซึ่งต่อคอนโทรลเลอร์ USB ไว้
    การ์ดส่วนต่อขยาย PCI ติดอยู่ที่ระดับนี้ ชิปที่มีคอนโทรลเลอร์ USB ไม่ได้เชื่อมต่อกับสิ่งใดดังนั้นขนาดใหญ่การเชื่อมต่อของมันอยู่ลึกเข้าไปในซิลิคอน
  • รายการสุดท้ายคือบัส PCI เอง นี่เป็นรายการสุดท้ายเนื่องจากจุดสิ้นสุดของบัสนั้นคือ CPU

2
@Tim กล่องหุ้มแปลระหว่างที่เก็บข้อมูล IDE และ USB ทางร่างกายไฟฟ้าและที่ระดับล่างของโปรโตคอลสแต็ก ทั้งที่เก็บข้อมูล IDE และ USB ใช้ SCSI เป็นโปรโตคอลการแลกเปลี่ยนข้อมูล (หรือตัวแปรใกล้เคียง) คำถามแรกของคุณค่อนข้างยุ่งยาก ระบบเห็นสิ่งต่าง ๆ ในระดับต่าง ๆ (คุณสามารถพูดได้ว่าเห็นฮาร์ดดิสก์ในระดับอุปกรณ์บล็อก, hdd ที่ระดับ SCSI และกล่องหุ้มที่ระดับ USB) สาย USB ไม่สามารถมองเห็นได้จากซอฟต์แวร์
Gilles 'หยุดความชั่วร้าย'

2
@Tim ระดับเหล่านี้ล้วนเป็นนามธรรมที่สร้างขึ้นโดยนักออกแบบระบบปฏิบัติการ abstractions เหล่านี้ส่วนใหญ่สอดคล้องกับมุมมองบางส่วนของฮาร์ดแวร์ (ซึ่งอาจไม่ใช่ส่วนประกอบที่แยกจากกันทั้งหมดและอาจมีมากกว่าหนึ่งองค์ประกอบในฮาร์ดแวร์ชิ้นเดียวทางร่างกาย) การโต้ตอบระหว่าง abstractions และฮาร์ดแวร์คือ ปิด แต่ไม่สมบูรณ์แบบเสมอไป
Gilles 'หยุดความชั่วร้าย'

1
@ Tim Hmmm ฉันคิดว่าสิ่งเหล่านี้เป็นสิ่งที่คุณเข้าใจจริงๆเท่านั้นเมื่อคุณเขียนรหัสไดรเวอร์ทั้งสองด้าน (ซึ่งฉันไม่เคยทำ) คุณสามารถเริ่มต้นจาก Wikipedia และมีหนังสือในหัวข้อ (ฉันไม่รู้ว่าจะแนะนำอะไร) และคุณสามารถอ่านมาตรฐาน (บางอย่างสามารถใช้ได้อย่างอิสระบางคนต้องจ่ายเงินบางครั้งมีค่าธรรมเนียมมากสำหรับคนกลางถึง - องค์กรขนาดใหญ่)
Gilles 'หยุดความชั่วร้าย'

1
@Tim มันเหมือนกับว่าคุณสามารถมี IP ผ่านอีเธอร์เน็ตหรือมากกว่า PPP หรือผ่านบลูทู ธ ฯลฯ และคุณสามารถมีสิ่งต่าง ๆ เช่น Ajax ผ่าน HTTP ผ่าน TCP ผ่าน IP ได้ คุณสามารถมีคำสั่ง SCSI ผ่าน SCSI, มากกว่า IDE, ผ่าน USB ฯลฯ และบัส PCI รีเลย์เหล่านี้ทั้งหมด
Gilles 'หยุดความชั่วร้าย' ใน

1
@Tim 1) แทนที่ IDE ด้วยที่เก็บข้อมูล USBกล่องหุ้มจะแปลระหว่างทั้งสอง 2) คำสั่ง SCSIกับSCSI
Gilles 'SO- หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.