SSD(ソリッドステートドライブ)ではなく、通常のハードドライブでのみ有効なツールをリリースする準備をしています。実際、SSDと一緒に使用するべきではありません。実際の効果がなく、多くの読み取り/書き込みが発生するためです。
特定のドライブがソリッドステートかどうかを検出する方法を知っている人はいますか?
SSDの検出は、dseifertの場合ほど不可能ではありません。 linuxのlibata( http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html )にはすでにある程度の進歩がありますが、ユーザー向けではないようです。まだ。
そして、これを行う必要がある理由を私は間違いなく理解しています。基本的には、リンクリストと配列の違いです。通常、デフラグなどはSSDでは非生産的です。
最後に信頼できるソリューション!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を使用する方が便利です。
実際、回転待ち時間はかなり簡単に決定できます。これは、大学のプロジェクトの一環として1回行いました。 このレポート で説明されています。 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; 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; }
このコマンドlsblk -d -o name,rota
はドライブを一覧表示し、回転ディスクの場合はROTAに1があり、SSDの場合は0です。出力例:
NAME ROTA sda 1 sdb 0
この古いが非常に重要な質問に答えるための私の2セント...ディスクがSCSI経由でアクセスされる場合、(潜在的に)SCSI INQUIRYコマンドを使用して回転速度を要求することができます。そのためのVPD(Vital Product Data)ページは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();
SSDデバイスはハードディスクデバイスインターフェイスをエミュレートするため、ハードディスクのように使用できます。これは、それらが何であるかを検出する一般的な方法がないことも意味します。
おそらくドライブのいくつかの特性(待ち時間、速度、サイズ)を使用できますが、これはすべてのドライブに対して正確ではありません。別の可能性としては、S.M.A.R.T.データを見て、これを使用してディスクのタイプを(モデル名、特定の値によって)判別できるかどうかを確認できます。ただし、すべてのドライブのデータベースを除外しない限り、そこでも、これは100%正確ではありません。