web-dev-qa-db-ja.com

ドライブがSSDかどうかを検出する方法はありますか?

SSD(ソリッドステートドライブ)ではなく、通常のハードドライブでのみ有効なツールをリリースする準備をしています。実際、SSDと一緒に使用するべきではありません。実際の効果がなく、多くの読み取り/書き込みが発生するためです。

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

35
smartins

SSDの検出は、dseifertの場合ほど不可能ではありません。 linuxのlibata( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html )にはすでにある程度の進歩がありますが、ユーザー向けではないようです。まだ。

そして、これを行う必要がある理由を私は間違いなく理解しています。基本的には、リンクリストと配列の違いです。通常、デフラグなどはSSDでは非生産的です。

3

最後に信頼できるソリューション!2つ、実際に!

/ sys/block/sdX/queue/rotationalを確認します。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 kernel 5.5に対応しています。

this commit によって導入されたLinux 3.3以降、ドライブが回転しているかどうかをチェックするioctlもあります。ただし、通常はsysfsを使用する方が便利です。

37
Shnatsel

実際、回転待ち時間はかなり簡単に決定できます。これは、大学のプロジェクトの一環として1回行いました。 このレポート で説明されています。 7ページにスキップすると、レイテンシのナイスグラフがいくつか表示されます。約9.3ミリ秒から1.1ミリ秒になり、8.2ミリ秒減少します。これは60 s / 8.2 ms = 7317 RPMに直接対応します。

単純なCコードを使用 -スクラッチファイルのabの間の位置を測定する部分は次のとおりです。シリンダーの周りをずっとさまよっているまで、次第にbの値を大きくしていきました。

/* aとbの間のアクセス時間の差を測定します。結果
 *はナノ秒単位で測定されます。 */
 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; 
} 
8
Martin Geisler

このコマンドlsblk -d -o name,rotaはドライブを一覧表示し、回転ディスクの場合はROTAに1があり、SSDの場合は0です。出力例:

 NAME ROTA 
 sda 1 
 sdb 0 
4
user3700673

あなたは実行することで幸運になることができます

smartctl -i sda

Smartmontools から。ほとんどすべてのSSDのモデルフィールドにSSDがあります。保証はありません。

3
Jonas Elfström

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

  • 0000h「中程度の回転数は報告されません」
  • 0001h "非回転媒体(例:固体)"
  • 0002h-0400h「予約済み」
  • 0401h-FFFEh「1分あたりの公称中速回転数(つまり、rpm)(たとえば、7 200 rpm = 1C20h、10000 rpm = 2710h、15000 rpm = 3A98h)」
  • FFFFh「予約済み」

そのため、SSDではこのフィールドに0001hが必要です。このページに関するT10.orgドキュメントは here で見つけることができます。

ただし、この標準の実装状況はわかりません。

1
HEKTO

以下の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();
1
IrocD

SSDデバイスはハードディスクデバイスインターフェイスをエミュレートするため、ハードディスクのように使用できます。これは、それらが何であるかを検出する一般的な方法がないことも意味します。

おそらくドライブのいくつかの特性(待ち時間、速度、サイズ)を使用できますが、これはすべてのドライブに対して正確ではありません。別の可能性としては、S.M.A.R.T.データを見て、これを使用してディスクのタイプを(モデル名、特定の値によって)判別できるかどうかを確認できます。ただし、すべてのドライブのデータベースを除外しない限り、そこでも、これは100%正確ではありません。

0
dseifert