Joh*_*ith 7 c linux sata hard-drive
我有一个应用程序需要从硬盘读取信息,如串行模型等.
当然,如果驱动器是SAS,SATA或FC驱动器,那么这很重要.
有没有可靠的方法可以确定连接驱动器使用哪种协议?通过OS命令或检查某些日志或查询设备?
我不想使用sysfs结构.我想知道操作系统是如何知道它是ATA,SCSI还是任何类型的磁盘.
正如您在评论中提到的那样user3588161's answer,您将SATA和SAS磁盘连接到同一SAS控制器,因此我建议使用该smartctl命令!
smartctl命令充当Linux和Unix操作系统下的SMART磁盘的控制和监视实用程序.键入以下命令以获取有关/ dev/sda(SATA磁盘)的信息:
# smartctl -d ata -a -i /dev/sda
Run Code Online (Sandbox Code Playgroud)
对于SAS磁盘,请使用以下语法之一:
# smartctl -d scsi --all /dev/sgX
# smartctl -d scsi --all /dev/sg1
# smartctl -d scsi --all /dev/sg1 -H
Run Code Online (Sandbox Code Playgroud)
我想所有的信息都与这个位置有关: -
/sys/class/scsi_device/?:?:?:?/device/model
Run Code Online (Sandbox Code Playgroud)
我建议你也尝试这样做以检查它渲染的输出.
cat /sys/class/scsi_device/0\:0\:0\:0/device/{model,vendor}
Run Code Online (Sandbox Code Playgroud)
(零旁边的反斜杠用于转义特殊字符:.)
此外,我建议您访问这两个链接,以获取更多信息或详细信息,如样本输出等: -
鉴于澄清而重写的答案:libATA是你想要的。这就是hdparm调用,它也报告传输。但很难找到有关它的最新文档。例如,请参阅http://docs.huihoo.com/linux/kernel/2.6.26/libata/index.html 。
我自己没有(直接)使用过 libATA,所以我无法更具体地说明所需的 API 调用。由于没有多少人需要自己编写 hdparm 之类的东西,因此最好的选择是查阅其来源以了解其确切名称。
hdparm 可以报告以下内容:
[root@alarmpi ~]# hdparm -I /dev/sdb
/dev/sdb:
ATA device, with non-removable media
Model Number: TOSHIBA DT01ACA200
Serial Number: Z36GKMKGS
Firmware Revision: MX4OABB0
Transport: Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0; Revision: ATA8-AST T13 Project D1697 Revision 0b
Run Code Online (Sandbox Code Playgroud)
如果您的实际问题是只有 sdparm 在您的 SCSI 驱动器系统上工作(可能会发生),那么问题似乎就简化为确定要调用 hdparm 或 sdparm 中的哪一个,不是吗?你可以用udevinfo它。例如,请参阅https://chromium.googlesource.com/chromiumos/third_party/laptop-mode-tools/+/775acea9e819bdee90cca8d2363827c13967a14b/laptop-mode-tools_1.52/usr/share/laptop-mode-tools/modules/hdparm 。