2009-05-25 105 views
32

我準備發佈一個只對普通硬盤有效的工具,而不是SSD(固態硬盤)。事實上,它不應該與SSD一起使用,因爲它會導致大量的讀取/寫入,而沒有真正的效果。有沒有辦法檢測驅動器是否是SSD?

任何人都知道檢測給定驅動器是否爲固態的方法?

+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

+0

[如何檢查我的Ubuntu是否安裝在SSD上?](http://askubuntu.com/q/792814/253474) – 2016-12-06 02:21:41

回答

3

檢測SSD並不像dseifert發現那樣不可能。 Linux的libata已經有一些進步(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html),儘管它似乎還沒有用戶準備。

我絕對明白爲什麼需要這樣做。這基本上是鏈接列表和數組之間的區別。碎片整理等在SSD上通常會適得其反。

0

SSD設備模擬硬盤設備接口,因此它們可以像硬盤一樣使用。這也意味着沒有通用的方法來檢測它們是什麼。

您可能會使用該驅動器的某些特性(延遲,速度,大小),儘管這對於所有驅動器都不準確。另一種可能性可能是查看S.M.A.R.T.數據,並查看是否可以通過此(通過型號名稱,某些值)確定磁盤的類型,但是除非您保存所有驅動器的數據庫,否則這不會是100%準確的。

+0

我同意,我認爲唯一的方法是弄清楚製造商如何爲他們的SSD生成串行密鑰設備而不是HDD。然後建立一個所有制造商和他們的SSD字符串模式的列表。我曾經不得不尋找一些設備序列號來確定它們是否適合我的需求(美國市場上的iPod,Linux fw上的Linksys路由器) – Mihaela 2009-05-25 22:22:46

+0

說串行密鑰是唯一可行的方式是不對的。一些驅動器可以有效地將其RPM報告爲1或0(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) – 2009-05-25 22:28:00

+1

也許你是對的,但我不確定。 「有些驅動器」 - >有問題,它必須是所有驅動器,沒有猜測。 – Mihaela 2009-05-25 22:40:02

8

實際上,您可以非常容易地確定旋轉延遲 - 作爲大學項目的一部分,我曾這麼做過。它在this report中描述。你會想跳到第7頁,在那裏你可以看到一些很好的延遲圖。它從約9.3毫秒變爲1.1毫秒 - 下降8.2毫秒。這直接對應於60 s/8.2 ms = 7317 RPM

已完成with simple C code - 這是測量位置ab之間的部分在臨時文件中。我們與越來越大的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; 
} 
+0

不是C代碼!傑夫永遠無法處理! PS:把這個提到播客上,我們可以喝! – geoffc 2009-05-25 22:47:37

+0

呵呵:-)我剛看到「delphi」標籤......對不起: - )我相信你們傢伙們把它轉換成Pascal,我很多年都沒有用過Delphi。 – 2009-05-26 08:06:35

3

你可以得到幸運。幾乎所有的固態硬盤在型號領域都有固態硬盤。沒有保證,但。

+0

您的意思是'smartctl -i/dev/sda' – EarthMind 2018-01-21 21:11:13

29

最後一個可靠的解決方案!其中兩個,其實!

檢查/ 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通常更方便。

+0

也出現在RHEL 6.4中。 – Raedwald 2013-03-04 14:28:23

+6

我試過這個,'旋轉'在於。 – Flimm 2013-07-09 14:32:34

+3

@Flimm請[提交內核錯誤報告](https://bugzilla.kernel.org/)。 – Totor 2014-09-04 14:18:49

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

這不是一個答案。 – TomSlick 2016-05-12 16:56:44

3

此命令lsblk -d -o name,rota列出您的驅動器,並具有1在羅塔如果它是一個旋轉磁盤和0,如果它是一個SSD。 輸出示例:

 
NAME ROTA 
sda  1 
sdb  0 
相關問題