Способ получения имен дисков SCSI в приложении Linux C ++

В моем приложении Linux C ++ я хочу получить имена всех дисков SCSI, которые присутствуют на
система. например / dev / sda, / dev / sdb, … и так далее.

В настоящее время я получаю его из файла / proc / scsi / sg / devices, используя следующий код:


host chan SCSI id Тип LUN открывает 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? как системный вызов?

Спасибо

0

Решение

Вы можете просто прочитать список всех файлов, таких как /dev/sd* (в C, вам нужно будет использовать opendir/readdir/closedir) и отфильтровать sdX (где X — одна или две буквы).

Кроме того, вы можете получить список всех разделов, прочитав один файл /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

который даст вам список всех физических дисков вместе с их емкостью (3-е поле).

0

Другие решения

Получив список имен дисков из / proc / scsi / sg / devices, вы можете проверить существование с помощью кода. Например, установите sg3-utils и используйте sg_inq, чтобы узнать, активен ли диск.

0

По вопросам рекламы [email protected]