2009-05-25 68 views
32

我准备发布一个只对普通硬盘有效的工具,而不是SSD(固态硬盘)。事实上,它不应该与SSD一起使用,因为它会导致大量的读取/写入,而没有真正的效果。有没有办法检测驱动器是否是SSD?

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

+0

这个问题有([在Unix和Linux的答案] http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is-一个-SSD-或-AN-HDD/65602#65602)。 – Totor 2014-10-02 08:34:27

+0

[如何检查我的Ubuntu是否安装在SSD上?](http://askubuntu.com/q/792814/253474) – 2016-12-06 02:21:41

回答

3

检测SSD并不像dseifert发现那样不可能。 Linux的libata已经有一些进步(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html),尽管它似乎还没有用户准备。

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

0

SSD设备模拟硬盘设备接口,因此它们可以像硬盘一样使用。这也意味着没有通用的方法来检测它们是什么。

您可能会使用该驱动器的某些特性(延迟,速度,大小),尽管这对于所有驱动器都不准确。另一种可能性可能是查看S.M.A.R.T.数据,并查看是否可以通过此(通过型号名称,某些值)确定磁盘的类型,但是除非您保存所有驱动器的数据库,否则这不会是100%准确的。

+0

我同意,我认为唯一的方法是弄清楚制造商如何为他们的SSD生成串行密钥设备而不是HDD。然后建立一个所有制造商和他们的SSD字符串模式的列表。我曾经不得不寻找一些设备序列号来确定它们是否适合我的需求(美国市场上的iPod,Linux fw上的Linksys路由器) – Mihaela 2009-05-25 22:22:46

+0

说串行密钥是唯一可行的方式是不对的。一些驱动器可以有效地将其RPM报告为1或0(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) – 2009-05-25 22:28:00

+1

也许你是对的,但我不确定。 “有些驱动器” - >有问题,它必须是所有驱动器,没有猜测。 – Mihaela 2009-05-25 22:40:02

8

实际上,您可以非常容易地确定旋转延迟 - 作为大学项目的一部分,我曾这么做过。它在this report中描述。你会想跳到第7页,在那里你可以看到一些很好的延迟图。它从约9.3毫秒变为1.1毫秒 - 下降8.2毫秒。这直接对应于60 s/8.2 ms = 7317 RPM

已完成with simple C code - 这是测量位置ab之间的部分在临时文件中。我们与越来越大的b值,这样做,直到我们一直游荡缸一路:由Smartmontools运行

smartctl -i sda 

 
/* 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; 
} 
+0

不是C代码!杰夫永远无法处理! PS:把这个提到播客上,我们可以喝! – geoffc 2009-05-25 22:47:37

+0

呵呵:-)我刚看到“delphi”标签......对不起: - )我相信你们家伙们把它转换成Pascal,我很多年都没有用过Delphi。 – 2009-05-26 08:06:35

3

你可以得到幸运。几乎所有的固态硬盘在型号领域都有固态硬盘。没有保证,但。

+0

您的意思是'smartctl -i/dev/sda' – EarthMind 2018-01-21 21:11:13

29

最后一个可靠的解决方案!其中两个,其实!

检查/ sys/block/sdX/queue/rotation,其中sdX是驱动器名称。如果它是0,则表示处理SSD,1表示普通旧硬盘。

我不能把它放在引入它的Linux版本上,但它存在于Ubuntu的Linux 3.2和vanilla Linux 3.6中,并不存在于香草2.6.38中。甲骨文也将backported它纳入其基于2.6.32的Unbreakable Enterprise内核5.5。

还有一个ioctl来检查驱动器是否自从Linux 3.3引入,是由this commit引入的。不过,使用sysfs通常更方便。

+0

也出现在RHEL 6.4中。 – Raedwald 2013-03-04 14:28:23

+6

我试过这个,'旋转'在于。 – Flimm 2013-07-09 14:32:34

+3

@Flimm请[提交内核错误报告](https://bugzilla.kernel.org/)。 – Totor 2014-09-04 14:18:49

0

我的两分钱回答这个旧的,但非常重要的问题......如果通过SCSI访问磁盘,那么你将(可能)能够使用SCSI INQUIRY命令来请求其转速。VPD(重要产品数据)页面被称为Block Device Characteristics,其编号为0xB1。字节4和当前页的5包含多个具有含义:

  • 0000H“中旋转速率不报告”
  • 0001H“非旋转介质(例如,固态)”
  • 0002H - 0400H “保留”
  • 0401H - FFFEH “公称介质旋转在每分钟旋转速度(即, RPM)(例如,7 200 RPM = 1C20h,10 000 RPM = 2710h,和15 000 RPM = 3A98h)”
  • FFFFh“保留”

所以SSD在这个领域必须有0001h。关于此页面的T10.org文档可以找到here

但是,这个标准的实施状态我不清楚。

0

我写了下面的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(); 
+2

这不是一个答案。 – TomSlick 2016-05-12 16:56:44

3

此命令lsblk -d -o name,rota列出您的驱动器,并具有1在罗塔如果它是一个旋转磁盘和0,如果它是一个SSD。 输出示例:

 
NAME ROTA 
sda  1 
sdb  0 
相关问题