有没有办法检测驱动器是否是SSD?

sma*_*ins 35 solid-state-drive disk hard-drive

我准备发布一个只对常规硬盘有效的工具,而不是SSD(固态硬盘).实际上,它不应该与SSD一起使用,因为它会导致大量读/写而没有实际效果.

任何人都知道检测给定驱动器是否为固态的方法?

Shn*_*sel 37

终于可靠的解决方案!其中两个,其实!

检查/ sys/block/sdX/queue/rotation,其中sdX是驱动器名称.如果它是0,那么你正在处理SSD,1表示普通的硬盘.

我不能把它放在引入它的Linux版本上,但是它存在于Ubuntu的Linux 3.2和vanilla Linux 3.6中,并且不存在于vanilla 2.6.38中.Oracle还将其向后移植到了Unbreakable Enterprise内核5.5,该内核基于2.6.32.

还有一个ioctl来检查驱动器是否自Linux 3.3以来是旋转的,由此提交引入.但是,使用sysfs通常更方便.

  • @Flimm请[提交内核错误报告](https://bugzilla.kernel.org/). (4认同)
  • 这不考虑混合驱动器。如果我要通过这种方法对混合驱动器进行碎片整理,会潜在地缩短其使用寿命吗? (2认同)

Mar*_*ler 8

你实际上可以很容易地确定旋转延迟 - 我曾经做过一次大学项目的一部分.本报告对此进行了描述.您将要跳到第7页,在那里您可以看到一些很好的延迟图表.它从大约9.3毫秒到1.1毫秒 - 下降8.2毫秒.这直接对应于60 s / 8.2 ms = 7317 RPM.

它是用简单的C代码完成的 - 这是测量位置之间ab临时文件的部分.我们用更大和更大的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;
}


小智 5

此命令会lsblk -d -o name,rota列出您的驱动器,如果是旋转磁盘,则 ROTA 为 1,如果是 SSD,则为 0。示例输出:

名称 ROTA
标准差 1
数据表 0


Mat*_*hen 4

检测 SSD 并不像 dseifert 所说的那么不可能。Linux 的 libata ( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html )已经取得了一些进展,尽管它似乎还没有为用户做好准备。

我绝对理解为什么需要这样做。这基本上是链表和数组之间的区别。对 SSD 进行碎片整理等通常会适得其反。