36

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

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

4

9 に答える 9

40

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

/ sys / block / sdX / queue/rotationalを確認します。sdXはドライブ名です。0の場合はSSDを扱っており、1は普通の古いHDDを意味します。

導入されたLinuxバージョンに指を置くことはできませんが、UbuntuのLinux3.2とvanillaLinux 3.6には存在し、vanilla2.6.38には存在しません。オラクルはまた、2.6.32に基づくUnbreakableEnterpriseカーネル5.5にバックポートしました。

このコミットによって導入された、Linux3.3以降のドライブが回転しているかどうかを確認するioctlもあります。ただし、通常はsysfsを使用する方が便利です。

于 2012-10-19T18:04:58.093 に答える
9

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

これは単純なCコードaで行われました。これが位置間とbスクラッチファイルを測定する部分です。b円柱の周りをずっとさまよっているまで、これをどんどん大きな値で行いました。

/*aとbのアクセス時間の差を測定します。結果
 *はナノ秒単位で測定されます。* /
int measure_latency(off_t a、off_t b){
  Cycles_t ta、tb;

  オーバーフローディスクバッファ();

  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から%i KiB:%i nsec \ n"、a / KiB、b / KiB、diff);
  差分を返す;
}
于 2009-05-25T22:22:06.773 に答える
6

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

NAME ROTA
sda 1
sdb 0
于 2016-09-07T11:51:15.250 に答える
4

SSDの検出は、dseifertが理解しているほど不可能ではありません。Linuxのlibata(http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html)にはすでにある程度の進歩がありますが、まだユーザーの準備ができているようには見えません。

そして、私はこれがなぜ行われる必要があるのか​​をはっきりと理解しています。これは基本的に、リンクリストと配列の違いです。最適化などは通常、SSDでは逆効果です。

于 2009-05-25T22:23:17.190 に答える
3

あなたは走ることによって幸運を得ることができます

smartctl -i sda

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

于 2009-05-25T22:22:14.947 に答える
2

この古いが非常に重要な質問に答えるのに2セント...ディスクがSCSI経由でアクセスされる場合、(潜在的に)SCSIINQUIRYコマンドを使用してその回転速度を要求できるようになります。そのための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ページに関するドキュメントはここにあります。

しかし、この規格の実装状況は私にはわかりません。

于 2014-07-24T15:56:24.140 に答える
1

私は次のjavascriptコードを書きました。マシンがSSDドライブを使用しているかどうか、およびそれがブートドライブであるかどうかを判断する必要がありました。このソリューションは、MSFT_PhysicalDiskWMIインターフェイスを使用します。

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();
于 2016-05-12T16:26:20.107 に答える
0

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

ドライブのいくつかの特性(遅延、速度、サイズ)を使用できる可能性がありますが、これはすべてのドライブで正確であるとは限りません。もう1つの可能性は、SMARTデータを調べて、これを介してディスクのタイプを判別できるかどうかを確認することです(モデル名、特定の値によって)。ただし、すべてのドライブのデータベースを保持しない限り、これは100%にはなりません。どちらか正確です。

于 2009-05-25T22:13:05.387 に答える
-2

テキストファイルを書くテキストファイル
を読む

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
于 2019-03-09T17:40:15.943 に答える