【问题标题】:Way to get SCSI disk names in Linux C++ application在 Linux C++ 应用程序中获取 SCSI 磁盘名称的方法
【发布时间】:2013-04-20 05:18:02
【问题描述】:

在我的 Linux C++ 应用程序中,我想获取所有 SCSI 磁盘的名称,这些磁盘存在于 系统。例如/dev/sda, /dev/sdb, ... 等等。

目前我正在使用以下代码从文件 /proc/scsi/sg/devices 输出中获取它:

host chan SCSI id lun type 打开 qdepth 在线忙 0 0 0 0 0 1 128 0 1 1 0 0 0 0 1 128 0 1 1 0 0 1 0 1 128 0 1 1 0 0 2 0 1 128 0 1
// If SCSI device Id is > 26 then the corresponding device name is like /dev/sdaa or /dev/sdab etc.
    if (MAX_ENG_ALPHABETS <= scsiId)
    {
        // Device name order is: aa, ab, ..., az, ba, bb, ..., bz, ..., zy, zz.
        deviceName.append(1, 'a'+ (char)(index / MAX_ENG_ALPHABETS) - 1);
        deviceName.append(1, 'a'+ (char)(index % MAX_ENG_ALPHABETS));
    }
    // If SCSI device Id is < 26 then the corresponding device name is liek /dev/sda or /dev/sdb etc.
    else
    {
        deviceName.append(1, 'a'+ index);
    }

但文件 /proc/scsi/sg/devices 还包含有关系统先前存在的磁盘的信息。例如,如果我从系统中分离磁盘 (LUN) /dev/sdc 文件 /proc/scsi/sg/devices 仍然包含无效的 /dev/sdc 信息。

告诉我有什么不同的方法来获取 SCSI 磁盘名称吗?像系统调用?

谢谢

【问题讨论】:

  • 您可能必须通过/proc/sys

标签: c++ linux disk scsi


【解决方案1】:

您可以简单地读取所有文件的列表,例如 /dev/sd*(在 C 中,您需要使用 opendir/readdir/closedir)并通过 sdX 过滤它(其中 X 是一或二字母)。

另外,你可以通过读取单个文件/proc/partitions获取所有分区的列表,然后通过sdX过滤第4个字段:

$ cat /proc/partitions
major minor  #blocks  name

8        0   52428799 sda
8        1     265041 sda1
8        2          1 sda2
8        5    2096451 sda5
8        6   50066541 sda6

这将为您提供所有物理磁盘及其容量的列表(第三个字段)。

【讨论】:

    【解决方案2】:

    从/proc/scsi/sg/devices获取磁盘名列表后,可以通过代码验证是否存在。比如安装sg3-utils,使用sg_inq查询磁盘是否处于活动状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2020-03-31
      • 2020-03-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多