Попробуйте использовать клавиши date__gte
и date__lte
. Вы можете передать два объекта даты и времени, обозначающих границы того, что вы хотите сопоставить.
Обнаружение твердотельных накопителей не так невозможно, как утверждает dseifert. Уже есть некоторый прогресс в libata Linux ( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html ), хотя он еще не кажется готовым к использованию.
И я определенно понимаю, зачем это нужно делать. Это в основном разница между связанным списком и массивом. Дефрагментация и тому подобное на SSD обычно неэффективны.
Вы можете получить удачу, запустив
smartctl -i sda
из Smartmontools . Почти у всех SSD есть SSD в поле Model.
SSD-устройства имитируют интерфейс жесткого диска, поэтому их можно использовать как жесткие диски. Это также означает, что не существует общего способа определить, что это такое.
Вы, вероятно, могли бы использовать некоторые характеристики диска (задержка, скорость, размер), хотя это не будет точным для всех дисков. Другая возможность может заключаться в том, чтобы посмотреть на данные SMART и посмотреть, можете ли вы определить тип диска с помощью этого (по названию модели, определенным значениям), однако, если вы не ведете базу данных всех дисков, это не будет 100% тоже точный.
На самом деле вы можете довольно легко определить задержку вращения - я однажды сделал это в рамках университетского проекта. Это описано в этом отчете . Вы захотите перейти на страницу 7, где вы увидите несколько хороших графиков задержки. Оно изменяется с 9,3 мс до 1,1 мс - падение на 8,2 мс. Это напрямую соответствует 60 с / 8,2 мс = 7317 об / мин
.
Это было сделано с помощью простого кода 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; }