0

在我的 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 磁盘名称吗?像系统调用?

谢谢

4

2 回答 2

0

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

于 2013-08-23T07:05:16.147 回答
0

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

此外,您可以通过读取单个文件来获取所有分区的列表/proc/partitions,然后通过以下方式过滤第 4 个字段sdX

$ 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

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

于 2013-04-26T05:56:06.640 回答