在我的Linux C ++应用程序中,我想获得所有SCSI磁盘的名称 系统。例如/ dev / sda,/ dev / sdb,...等等。
目前我使用以下代码从文件/ proc / scsi / sg / devices输出中获取它:
host chan SCSI id lun type opens qdepth busy online 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磁盘名称?喜欢系统调用吗?
谢谢
答案 0 :(得分:0)
您只需阅读所有文件的列表,例如/dev/sd*
(在C中,您需要使用opendir
/ readdir
/ closedir
)并按{{过滤} 1}}(其中X是一个或两个字母)。
此外,您可以通过阅读单个文件sdX
获取所有分区的列表,然后按/proc/partitions
过滤第4个字段:
sdX
它将为您提供所有物理磁盘的列表及其容量(第3个字段)。
答案 1 :(得分:0)
从/ proc / scsi / sg / devices获取磁盘名称列表后,您可以通过代码验证是否存在。例如,安装sg3-utils,并使用sg_inq查询磁盘是否处于活动状态。