我准备发布一个只对常规硬盘有效的工具,而不是SSD(固态硬盘)。事实上,它不应该与SSD一起使用,因为它会导致大量的读/写操作而没有真正的效果。
任何人都知道检测给定驱动器是否为固态的方法吗?
答案 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 - 此处是测量临时文件中位置a
和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; }
答案 2 :(得分:3)
答案 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行包含一个含义为的数字:
因此,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