【问题标题】:How can I identify the protocol used in hard disk?如何识别硬盘使用的协议?
【发布时间】:2014-09-30 20:46:39
【问题描述】:

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

现在当然重要的是驱动器是 SAS、SATA 还是 FC 驱动器。

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

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

【问题讨论】:

  • 它可能被埋在 /proc 的某个地方。
  • sysfs 不是文件结构,它是内核用来导出信息的伪文件系统。当您尝试读取伪文件时,内核会生成内容,类似于/proc 中的条目。您明确声明您不想使用/sys,但答案——可能还有一些特定于总线和/或控制器的ioctl——就是答案。你把自己画在角落里;祝你好运。
  • @RG337:不,我告诉你内核通过/sys/ 伪文件系统导出你想要的大部分信息。 (事实上​​,你只需要那个,在某些情况下,一些驱动程序/总线/设备特定的 ioctl 来获取所有信息;少数命令行工具可以为你做到这一点。)拒绝/sys/,你就是把自己的手绑在背后。
  • @RG337:你很失望,因为你选择的方法不起作用,你拒绝考虑其他任何方法,只是惊呼“这对我来说不可能”。问题是你的方法,而不是你的目标。我和其他人很乐意使用特定于操作系统的接口(如 Linux 中的 /sys/block/DEVICE pseudosymlink 和 /sys/block/DEVICE/device/vendor/block/DEVICE/device/model 伪文件,以及所有架构上的 sdparmhdparmsmartctl 跨平台实用程序)来以最小的麻烦和高可靠性找到此信息。 为什么这对你不起作用?

标签: c linux hard-drive sata


【解决方案1】:

正如您在 cmets 中提到的 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}

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

另外,我建议您访问这两个链接,以获取更多信息或详细信息,例如示例输出等:-

Find Out Hard Disk Specs

To Check Disk behind Adaptec RAID Controllers

【讨论】:

    【解决方案2】:

    检查启动信息,似乎磁盘类型是在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 或类似位置。希望这些信息可以让您或其他人帮助查明是否,如果是,这些信息在哪里被捕获并在运行的系统上可用。

    【讨论】:

    • 感谢您的帮助。很明显,这些信息可以通过某种方式获得。内核开发人员代码执行了让内核知道的魔法,不幸的是我已经搜索了几个月但没有运气。
    • 这是一个巨大的挑战。显然,内核人员有办法做到这一点。我想他们的代码读取了一些扇区并提取了一些保存这些信息的比特。祝你好运。这些信息很可能记录在一些 25 年前的 IBM 手册中,该手册解释了哪些中断调用是必要的,此后又补充了 BIOS/内核更新以支持出现的新驱动器类型。
    【解决方案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

    【讨论】:

    • 就像问题中所说的那样,我不想使用外部工具来做到这一点。我想直接查询磁盘和/或控制器。例如通过 sg 驱动程序或其他方式发送特定命令。
    • 我误解了您所说的“操作系统命令”的含义。您应该将其重写为“系统调用”。
    • 好吧,我仍然会使用系统调用,因为ioctl() 是一个系统调用。 lshw 和其他工具是通常包含在 linux 系统中的应用程序,但我几乎不会称它们为系统调用
    • libata 不能在基于 scsi 协议的磁盘上工作。如果您手边有 SCSI、SAS 或 FC 磁盘,您可以自己测试。尝试在其上使用 hdparm。
    • 作为旁注,目前我使用 hack 尝试发送 HDIO_GET_IDENTITY ioctl(),如果失败,我将假定它是基于 SCSI 的磁盘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多