我有一个应用程序需要从硬盘读取信息,比如串行模型等。
现在当然重要的是驱动器是 SAS、SATA 还是 FC 驱动器。
有没有一种可靠的方法可以识别连接的驱动器使用的协议?通过操作系统命令或检查一些日志或查询设备?
我不想使用 sysfs 结构。我想知道操作系统如何知道它是 ATA、SCSI 还是任何类型的磁盘。
我有一个应用程序需要从硬盘读取信息,比如串行模型等。
现在当然重要的是驱动器是 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}
(零旁边的反斜杠用于转义特殊 char :
。)
另外,我建议您访问这两个链接,以获取更多信息或详细信息,例如示例输出等:-
鉴于澄清重写答案: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。
检查启动信息,似乎在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
或类似的位置。希望这些信息可以让您或其他人帮助查明是否以及如果是,这些信息在哪里被捕获并在正在运行的系统上可用。