从pseudo-fs获取块设备型号名称和制造商

Gal*_*ala 4 hard-disk sysfs hdparm

[gala@arch ~]$ sudo !!
sudo hdparm -i /dev/sda

/dev/sda:

 Model=KINGSTON SHFS37A120G, FwRev=603ABBF0, SerialNo=50026B725B0A1515
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=unknown, MaxMultSect=1, MultSect=1
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234441648
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: unknown setting WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode
Run Code Online (Sandbox Code Playgroud)

hdparmModel从哪里读取字段?从哪里来sysfs?从哪里来?

Gil*_*il' 8

# strace hdparm -i /dev/sda
…
ioctl(3, HDIO_GET_IDENTITY, 0x7fffa930c320) = 0
brk(0)                                  = 0x1c42000
brk(0x1c63000)                          = 0x1c63000
write(1, "\n", 1
)                       = 1
write(1, " Model=…
Run Code Online (Sandbox Code Playgroud)

所以hdparmHDIO_GET_IDENTITY ioctl获取它的信息,而不是从 sysfs。当然,这并不意味着不能从 sysfs 访问这些信息。

接下来我们可以HDIO_GET_IDENTITY在内核源代码中查找。LXR很方便。相关命中显示对 的调用ata_get_identity。此函数在设备描述中的偏移量处查找设备描述中的模型ATA_ID_PROD

查看ATA_ID_PROD使用else 的地方,并考虑到 sysfs,我们ide-sysfs.c在名为 的函数中找到了一个命中model_show。此函数由下面的宏调用引用DEVICE_ATTR_RO(model),因此如果 ata 驱动程序公开 IDE 接口,则会model在设备的 sysfs 目录中调用一个包含此信息的文件。

如果 ata 驱动程序暴露 SCSI 接口,则跟踪内核源代码要复杂得多,因为代码使用不同的方式从硬件中提取信息。但事实证明,设备的 sysfs 目录中也有一个model字段

至于设备的sysfs目录在哪里,可以通过多种方式访问​​。该sysfs.txt内核文档文件文档此,不是很好。访问它的最简单方法是通过/sys/block它包含每个块设备的条目:

$ cat /sys/block/sda/device/model
Run Code Online (Sandbox Code Playgroud)

中有很多符号链接/sys。该目录的“物理”位置取决于磁盘与系统的连接方式;例如,它具有/sys/devices/pci…/…/ata…/host…/target…/…连接到 PCI 总线的带有 SCSI 接口的 ATA 设备的形式。