2009-05-25 14 views
32

SSD(ソリッドステートドライブ)ではなく、通常のハードドライブでのみ有効なツールをリリースしようとしています。実際には、SSDには使用すべきではありません。なぜなら、本当の有効性を持たない多くの読み書きが行われるからです。ドライブがSSDであるかどうかを検出する方法はありますか?

誰かが、特定のドライブがソリッドステートであるかどうかを検出する方法を知っていますか?

+0

この質問がある([UNIX&Linux上で解答] http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is- an-ssd-or-an-hdd/65602#65602)。 – Totor

+0

[私のUbuntuがSSDに置かれているかどうかを確認する方法](http://askubuntu.com/q/792814/253474) –

答えて

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

+0

シリアルキーが唯一の方法だとは言えません。ドライブによっては、RPMを1または0として有用に報告するものもあります(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) –

+1

あなたは正しいかもしれませんが、わかりません。 "いくつかのドライブ" - そこに問題がある、それはすべてのドライブ、投機でなければならない。 – Mihaela

8

あなたは実際に回転待ち時間をかなり簡単に判断することができます。これは大学のプロジェクトの一環としてこれを一度だけ行いました。それはthis reportに記載されています。レイテンシの良いグラフが表示されている7ページに進んでください。それは約9.3msから1.1msに短縮され、8.2msの低下となる。これは直接60 s/8.2 ms = 7317 RPMに対応しています。

これは完了しましたwith simple C code - ここでは、位置abの間をスクラッチファイルで測定する部分です。

 
/* 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

+0

Hehe :-)私はちょうど "デルファイ"タグを見ました...それについて残念:-)私はパススルにそれを変換する人を信じて、私は何年もDelphiを使用していません。 –

3

あなたは幸運を得ることができSmartmontoolsから

smartctl -i sda 

を実行して:我々はすべての方法シリンダーの周りにさまよってきたまで、私たちはますます大きくb値でこれをやりました。ほとんどすべてのSSDには、ModelフィールドにSSDがあります。しかし保証はありません。

+0

'smartctl -i/dev/sda'を意味します。 – EarthMind

29

最後に信頼性の高いソリューション! 2人、実際には!

/sys/block/sdX/queue/rotationを確認してください。ここで、sdXはドライブ名です。 0の場合はSSD、1の場合は古いHDDを意味します。

私が指摘したLinuxバージョンには手を加えることができませんが、UbuntuのLinux 3.2とvanilla Linux 3.6には存在し、vanilla 2.6.38には存在しません。 Oracle backportedも、2.6.32に基づいてUnbreakable Enterpriseカーネル5.5に転送されます。

Linux 3.3以降でドライブが回転しているかどうかを確認するためのioctlもあります(this commitによって導入されました)。しかし、通常はsysfsを使うほうが便利です。

+0

RHEL 6.4にもあります。 – Raedwald

+6

私はこれを試して、「回転」しています。 – Flimm

+3

@Flimmこれについては、[カーネルのバグ報告をしてください](https://bugzilla.kernel.org/)をご覧ください。 – Totor

0

この古いしかし非常に重要な質問に答える2つのセント... SCSIにアクセスすると、SCSI INQUIRYコマンドを使用して回転速度を要求することができます。そのためのVPD(Vital Product Data)ページはBlock Device Characteristicsと呼ばれ、番号は0xB1です。バイト4と、このページの5意味を持つ数含む:

  • 0002H

    • 0000H「ミディアム回転速度が報告されていない」
    • 0001H「非回転媒体(例えば、固体状態)」 - 0400H "予約"
    • 0401h - FFFEH "毎分回転公称媒体の回転速度(すなわち、 RPM)(例えば、7を200rpm = 1C20h、10000 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

    3

    あなたのドライブを一覧表示し、それがSSDだ場合、回転ディスクと0の場合ROTAで1を持っているlsblk -d -o name,rotaこのコマンド。 出力例:

     
    NAME ROTA 
    sda  1 
    sdb  0 
    
    関連する問題