我準備發佈一個只對普通硬盤有效的工具,而不是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