我有一个应用程序,需要从硬盘读取信息,如串行模型等。
当然,如果驱动器是SAS,SATA或FC驱动器,这很重要。
是否有一种可靠的方法可以识别连接驱动器使用的协议?是通过OS命令还是检查某些日志或查询设备?
我不想使用sysfs结构。我想知道操作系统是如何知道它是ATA,SCSI还是任何类型的磁盘。
答案 0 :(得分:5)
正如您在对user3588161's answer
的评论中所提到的,您将SATA和SAS磁盘连接到同一SAS控制器,因此我建议使用smartctl
命令!
smartctl命令充当Linux和Unix操作系统下SMART磁盘的控制和监视工具。键入以下命令以获取有关/ dev / sda(SATA磁盘)的信息:
# smartctl -d ata -a -i /dev/sda
对于SAS磁盘,请使用以下语法之一:
# smartctl -d scsi --all /dev/sgX
# smartctl -d scsi --all /dev/sg1
# smartctl -d scsi --all /dev/sg1 -H
我猜所有信息都与这个位置有关: -
/sys/class/scsi_device/?:?:?:?/device/model
我建议您尝试这样做以检查它渲染的输出。
cat /sys/class/scsi_device/0\:0\:0\:0/device/{model,vendor}
(零旁边的反斜杠用于转义特殊字符:
。)
此外,我建议您访问这两个链接,以获取更多信息或详细信息,如样本输出等: -
答案 1 :(得分:3)
根据澄清重写的答案: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
如果您的实际问题是只有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。
答案 2 :(得分:3)
检查启动信息,似乎在kernel ahci
个调用中设置了磁盘类型。您可以使用dmesg | grep ahci
(在sysvinit系统上)或journalctl -k -b -0 -l --no-pager | grep ahci
(使用systemd)检查(以root用户身份)。相关查询/设置看起来是:
kernel: ahci 0000:00:12.0: version 3.0
kernel: ahci 0000:00:12.0: controller can't do 64bit DMA, forcing 32bit
kernel: ahci 0000:00:12.0: AHCI 0001.0100 32 slots 4 ports 3 Gbps 0xf impl SATA mode
kernel: ahci 0000:00:12.0: flags: ncq sntf ilck pm led clo pmp pio slum part ccc
第三行包含您要查找的控制器/类型信息。这似乎是信息来源的地方,但从你的问题的角度来看,它不是一个可行的解决方案。
问题变成了在/ dev / proc或/ sys中记录或存储此信息的位置。我看起来并且找不到启动时磁盘类型的初始确定与存储的任何标志之间的一对一关联。该信息可能是编码数据的一部分,例如/sys/class/scsi_disk/0:0:0:0/device
或类似位置。希望这些信息可以让您或其他人帮助确定是否以及如果是这样,在正在运行的系统上捕获和获取此信息的位置。