C语言 如何识别硬盘使用的协议?



我有一个需要从硬盘读取信息的应用程序,如串行模型等。

现在,如果驱动器是SAS, SATA或FC驱动器当然很重要。

是否有一种可靠的方法可以识别连接驱动器使用的协议?通过操作系统命令或检查一些日志或查询设备?

我不想使用sysfs结构。我想知道操作系统是如何知道它是ATA, SCSI还是其他类型的磁盘

正如您在对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}

(零旁边的反斜杠用于转义特殊字符:)

此外,我想建议您访问这两个链接,以便获得更多信息或细节,如示例输出等:-

查找硬盘规格

查看Adaptec RAID控制器后盘

检查启动信息,似乎在kernel ahci调用中设置了磁盘类型。您可以使用dmesg | grep ahci(在sysvinit系统上)或journalctl -k -b -0 -l --no-pager | grep ahci(在systemd系统上)检查(作为根用户)。相关的查询/设置看起来是:

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或类似的位置。希望这些信息可以帮助您或其他人确定是否,如果是的话,在运行的系统中,这些信息是在哪里捕获和可用的。

根据说明改写: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

相关内容

  • 没有找到相关文章

最新更新