Есть ли способ определить, является ли диск SSD?

Я собираюсь выпустить инструмент, который эффективен только с обычными жесткими дисками, а не с SSD (твердотельный диск). Фактически, он не должен использоваться с SSD, потому что это приведет к большому количеству операций чтения/записи без реальной эффективности.

Кто-нибудь знает о способе обнаружения, если данный диск является твердотельным?

Ответ 1

Обнаружение SSD не так просто невозможно, как делает dseifert. В linux libata уже есть некоторый прогресс (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html), хотя он пока еще не готов к использованию.

И я определенно понимаю, почему это нужно сделать. Это в основном разница между связанным списком и массивом. Дефрагментация и, как правило, контрпродуктивны на SSD.

Ответ 2

Наконец-то надежное решение! Два из них, действительно!

Проверить/sys/block/sdX/queue/rotational, где sdX - имя диска. Если это 0, вы имеете дело с SSD, а 1 означает обычный старый жесткий диск.

Я не могу погладить версию Linux, где она была представлена, но она присутствует в Ubuntu Linux 3.2 и в vanilla Linux 3.6 и не присутствует в vanilla 2.6.38. Oracle также обратил его в свое Unbreakable Enterprise kernel 5.5, основанное на 2.6.32.

Также существует ioctl, чтобы проверить, является ли привод вращательным с Linux 3.3, введенным this commit. Использование sysfs обычно более удобно.

Ответ 3

На самом деле вы можете довольно легко определить вращательную задержку - я сделал это один раз в рамках университетского проекта. Это описано в в этом отчете. Вам нужно перейти на страницу 7, где вы увидите несколько хороших графиков задержки. Он составляет от 9,3 мс до 1,1 мс - снижение на 8,2 мс. Это соответствует непосредственно 60 s / 8.2 ms = 7317 RPM.

Это было сделано с простым кодом C - здесь часть, которая измеряет между позициями a и b в файле с нуля, Мы делали это с большими и большими значениями b, пока мы не бродили по всему цилиндру:

/* Measure the difference in access time between a and b.  The result
 * is measured in nanoseconds. */
int measure_latency(off_t a, off_t b) {
  cycles_t ta, tb;

  overflow_disk_buffer();

  lseek(work_file, a, SEEK_SET);
  read(work_file, buf, KiB/2);

  ta = get_cycles();
  lseek(work_file, b, SEEK_SET);
  read(work_file, buf, KiB/2);
  tb = get_cycles();

  int diff = (tb - ta)/cycles_per_ns;
  fprintf(stderr, "%i KiB to %i KiB: %i nsec\n", a / KiB, b / KiB, diff);
  return diff;
}

Ответ 4

Вам может повезти, запустив

smartctl -i sda

из Smartmontools. Почти все SSD имеют SSD в поле Model. Однако никаких гарантий.

Ответ 5

Эта команда lsblk -d -o name,rota перечисляет ваши диски и имеет 1 в ROTA, если это вращательный диск и 0, если это SSD. Пример вывода:

NAME ROTA
sda     1
sdb     0

Ответ 6

SSD-устройства эмулируют интерфейс жесткого диска, поэтому их можно просто использовать как жесткие диски. Это также означает, что нет общего способа определить, что они собой представляют.

Вероятно, вы можете использовать некоторые характеристики накопителя (латентность, скорость, размер), хотя это не будет точно для всех дисков. Другая возможность может заключаться в том, чтобы взглянуть на S.M.A.R.T. данные и посмотреть, можете ли вы определить тип диска через это (по имени модели, определенным значениям), однако, если вы не сохраните базу данных всех дисков там, это также не будет на 100% точным.

Ответ 7

Мои два цента, чтобы ответить на этот старый, но очень важный вопрос... Если доступ к диску через SCSI, то вы (потенциально) сможете использовать команду SCSI INQUIRY для запроса ее скорости вращения. Страница VPD (Vital Product Data), которая называется Block Device Characteristics и имеет номер 0xB1. Байты 4 и 5 этой страницы содержат число со значением:

  • 0000h "Средняя скорость вращения не сообщается"
  • 0001h "Невращающаяся среда (например, твердое состояние)"
  • 0002h - 0400h "Зарезервировано"
  • 0401h - FFFEh "Номинальная скорость вращения среды при вращении в минуту (т. об/мин) (например, 7 200 об/мин = 1C20h, 10 000 об/мин = 2710 ч и 15 000 об/мин = 3A98h) "
  • FFFFh "Зарезервировано"

Итак, SSD должен иметь 0001h в этом поле. T10.org документ об этой странице можно найти здесь.

Однако статус реализации этого стандарта мне не понятен.

Ответ 8

Я написал следующий код javascript. Мне нужно было определить, была ли машина SSD-накопителем, и если это был загрузочный диск. Решение использует интерфейс MSFT_PhysicalDisk WMI.

function main()
{
    var retval= false;
    // MediaType - 0 Unknown, 3 HDD, 4 SSD
    // SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD)
    // DeviceID - 0 boot device
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage");
    var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk");  
    var enumItems = new Enumerator(colItems);
    for (; !enumItems.atEnd(); enumItems.moveNext()) 
    {
        var objItem = enumItems.item();
        if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0)
        {
            if (objItem.DeviceID ==0)
            {
                retval=true;
            }
        }
    }
    if (retval)
    {
        WScript.Echo("You have SSD Drive and it is your boot drive.");
    }
    else
    {
        WScript.Echo("You do not have SSD Drive");
    }
    return retval;
}
main();