![从pseudo-fs获取块设备型号名称和制造商](https://linux22.com/image/87956/%E4%BB%8Epseudo-fs%E8%8E%B7%E5%8F%96%E5%9D%97%E8%AE%BE%E5%A4%87%E5%9E%8B%E5%8F%B7%E5%90%8D%E7%A7%B0%E5%92%8C%E5%88%B6%E9%80%A0%E5%95%86.png)
[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
hdparm 从哪里读取该Model
字段?来自某处sysfs
?从哪里来?
答案1
# 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=…
所以hdparm
从HDIO_GET_IDENTITY
读写控制,不是来自 sysfs。当然,这并不意味着不能从 sysfs 访问信息。
HDIO_GET_IDENTITY
接下来我们可以在内核源码中查找。LXR对此很方便。相关点击显示拨电至ata_get_identity
。这个功能查找模型在设备描述中的偏移量处ATA_ID_PROD
。
看看其他地方的ATA_ID_PROD
使用情况,考虑到 sysfs,我们发现了一个热门的地方ide-sysfs.c
,在一个名为 的函数中model_show
。该函数由下面的宏调用引用DEVICE_ATTR_RO(model)
,因此如果 ata 驱动程序公开 IDE 接口,则model
设备的 sysfs 目录中会调用一个包含此信息的文件。
如果 ata 驱动程序公开 SCSI 接口,则跟踪内核源代码会复杂得多,因为代码使用不同的方式从硬件中提取信息。但事实证明还有一个model
领域在设备的 sysfs 目录中。
至于设备的sysfs目录在哪里,有几种方法可以访问。这sysfs.txt
内核文档中的文件记录这一点,不是很好。访问它的最简单方法是通过/sys/block
其中包含每个块设备的条目:
$ cat /sys/block/sda/device/model
中有很多符号链接/sys
。该目录的“物理”位置取决于磁盘与系统的连接方式;例如,它具有/sys/devices/pci…/…/ata…/host…/target…/…
连接到 PCI 总线的带有 SCSI 接口的 ATA 设备的形式。
答案2
经过一个小时的挖掘后发现:
gala@arch /sys/bus/scsi/devices/2:0:0:0 % pwd
/sys/bus/scsi/devices/2:0:0:0
gala@arch /sys/bus/scsi/devices/2:0:0:0 % cat model
KINGSTON SHFS37A
所以对于模型来说:
/sys/bus/scsi/devices/<device>/model
和供应商:
/sys/bus/scsi/devices/<device>/vendor