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

问题描述 投票:35回答:9

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

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

disk hard-drive ssd
9个回答
3
投票

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

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


37
投票

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

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

我不能把它放在引入它的Linux版本上,但是它存在于Ubuntu的Linux 3.2和vanilla Linux 3.6中,并且不存在于vanilla 2.6.38中。甲骨文还将backported改为他们的Unbreakable Enterprise内核5.5,它基于2.6.32。

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


8
投票

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

这是完成with simple C code - 这是衡量位置aand 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;
}

4
投票

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

NAME ROTA
sda     1
sdb     0

3
投票

你可以通过跑步获得幸运

smartctl -i sda

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


0
投票

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

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


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();

-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
© www.soinside.com 2019 - 2024. All rights reserved.