我准备发布一个只对普通硬盘有效的工具,而不是SSD(固态硬盘)。事实上,它不应该与SSD一起使用,因为它会导致大量的读取/写入,而没有真正的效果。有没有办法检测驱动器是否是SSD?
任何人都知道检测给定驱动器是否为固态的方法?
我准备发布一个只对普通硬盘有效的工具,而不是SSD(固态硬盘)。事实上,它不应该与SSD一起使用,因为它会导致大量的读取/写入,而没有真正的效果。有没有办法检测驱动器是否是SSD?
任何人都知道检测给定驱动器是否为固态的方法?
检测SSD并不像dseifert发现那样不可能。 Linux的libata已经有一些进步(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html),尽管它似乎还没有用户准备。
我绝对明白为什么需要这样做。这基本上是链接列表和数组之间的区别。碎片整理等在SSD上通常会适得其反。
SSD设备模拟硬盘设备接口,因此它们可以像硬盘一样使用。这也意味着没有通用的方法来检测它们是什么。
您可能会使用该驱动器的某些特性(延迟,速度,大小),尽管这对于所有驱动器都不准确。另一种可能性可能是查看S.M.A.R.T.数据,并查看是否可以通过此(通过型号名称,某些值)确定磁盘的类型,但是除非您保存所有驱动器的数据库,否则这不会是100%准确的。
我同意,我认为唯一的方法是弄清楚制造商如何为他们的SSD生成串行密钥设备而不是HDD。然后建立一个所有制造商和他们的SSD字符串模式的列表。我曾经不得不寻找一些设备序列号来确定它们是否适合我的需求(美国市场上的iPod,Linux fw上的Linksys路由器) – Mihaela 2009-05-25 22:22:46
说串行密钥是唯一可行的方式是不对的。一些驱动器可以有效地将其RPM报告为1或0(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) – 2009-05-25 22:28:00
也许你是对的,但我不确定。 “有些驱动器” - >有问题,它必须是所有驱动器,没有猜测。 – Mihaela 2009-05-25 22:40:02
实际上,您可以非常容易地确定旋转延迟 - 作为大学项目的一部分,我曾这么做过。它在this report中描述。你会想跳到第7页,在那里你可以看到一些很好的延迟图。它从约9.3毫秒变为1.1毫秒 - 下降8.2毫秒。这直接对应于60 s/8.2 ms = 7317 RPM
。
已完成with simple C code - 这是测量位置a
和b
之间的部分在临时文件中。我们与越来越大的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; }
不是C代码!杰夫永远无法处理! PS:把这个提到播客上,我们可以喝! – geoffc 2009-05-25 22:47:37
呵呵:-)我刚看到“delphi”标签......对不起: - )我相信你们家伙们把它转换成Pascal,我很多年都没有用过Delphi。 – 2009-05-26 08:06:35
最后一个可靠的解决方案!其中两个,其实!
检查/ 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通常更方便。
我的两分钱回答这个旧的,但非常重要的问题......如果通过SCSI访问磁盘,那么你将(可能)能够使用SCSI INQUIRY命令来请求其转速。VPD(重要产品数据)页面被称为Block Device Characteristics
,其编号为0xB1
。字节4和当前页的5包含多个具有含义:
所以SSD在这个领域必须有0001h
。关于此页面的T10.org
文档可以找到here。
但是,这个标准的实施状态我不清楚。
我写了下面的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();
这不是一个答案。 – TomSlick 2016-05-12 16:56:44
此命令lsblk -d -o name,rota
列出您的驱动器,并具有1在罗塔如果它是一个旋转磁盘和0,如果它是一个SSD。 输出示例:
NAME ROTA sda 1 sdb 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
[如何检查我的Ubuntu是否安装在SSD上?](http://askubuntu.com/q/792814/253474) – 2016-12-06 02:21:41