Есть ли способ определить, является ли накопитель SSD? - PullRequest
35 голосов
/ 26 мая 2009

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

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

Ответы [ 9 ]

37 голосов
/ 19 октября 2012

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

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

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

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

8 голосов
/ 26 мая 2009

На самом деле вы можете довольно легко определить задержку вращения - я делал это однажды как часть университетского проекта. Это описано в этом отчете . Вы захотите перейти к странице 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;
}
3 голосов
/ 07 сентября 2016

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

NAME ROTA
sda     1
sdb     0
3 голосов
/ 26 мая 2009

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

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

3 голосов
/ 26 мая 2009

Вы можете стать счастливчиком, запустив

smartctl -i sda

из Smartmontools . Почти все SSD имеют SSD в поле Model. Хотя нет гарантии.

0 голосов
/ 09 марта 2019

написать текстовый файл
читать текстовый файл

повторить 10000 раз ...

10000/elapsed

для ssd будет намного выше, python3:

def ssd_test():

    doc = 'ssd_test.txt'
    start = time.time()
    for i in range(10000):
        with open(doc, 'w+') as f:
            f.write('ssd test')
            f.close()
        with open(doc, 'r') as f:
            ret = f.read()
            f.close()
    stop = time.time()
    elapsed = stop - start
    ios = int(10000/elapsed)
    hd = 'HDD'
    if ios > 6000: # ssd>8000; hdd <4000
        hd = 'SSD'
    print('detecting hard drive type by read/write speed')
    print('ios', ios, 'hard drive type', hd)
    return hd
0 голосов
/ 12 мая 2016

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

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();
0 голосов
/ 24 июля 2014

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

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

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

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

0 голосов
/ 26 мая 2009

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

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

...