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

时间:2009-05-25 21:59:07

标签: disk hard-drive ssd

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

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

9 个答案:

答案 0 :(得分:37)

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

检查/ sys / block / sdX / queue / rotation,其中 sdX 是驱动器名称。如果它是0,那么你正在处理一个SSD,而1意味着普通的旧硬盘。

我不能把它放在引入它的Linux版本上,但是它存在于Ubuntu的Linux 3.2和vanilla Linux 3.6中,并且不存在于vanilla 2.6.38中。 Oracle还backported到它的Unbreakable Enterprise内核5.5,它基于2.6.32。

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

答案 1 :(得分:8)

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

已完成with simple C code - 此处是测量临时文件中位置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;
}

答案 2 :(得分:3)

你可以通过运行

来幸运
smartctl -i sda
来自Smartmontools

。几乎所有SSD都在Model字段中都有SSD。不过不保证。

答案 3 :(得分:3)

检测SSD并不像dseifert那样难以实现。 linux的libata(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html)已经取得了一些进展,但它似乎还没有用户准备好。

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

答案 4 :(得分:3)

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

NAME ROTA
sda     1
sdb     0

答案 5 :(得分:0)

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

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

答案 6 :(得分: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

但是,我对此标准的实施情况并不清楚。

答案 7 :(得分: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();

答案 8 :(得分:-1)

写入文本文件
读取文本文件

重复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