В моем приложении 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? как системный вызов?
Спасибо
Вы можете просто прочитать список всех файлов, таких как /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-е поле).
Получив список имен дисков из / proc / scsi / sg / devices, вы можете проверить существование с помощью кода. Например, установите sg3-utils и используйте sg_inq, чтобы узнать, активен ли диск.