必要があります。を検出する場合はドライブSSD?
-
05-09-2019 - |
質問
私がリリースツールのみ有効通常のhdd、SSD(solid state drive).こんなに使用するとSSDのでよく読み取り/書き込みのない実効果がある。
誰でも知っていようとする試みであったとも言えを検出する場合は、指定されたドライブが固するのでしょうか。
解決
SSDを検出dseifertが出ますように不可能ではありません。 linuxのlibATAの中にいくつかの進展が既にあります(ます。http:// linuxの.derkeiler.com /メーリングリスト/カーネル/ 2009-04 / msg03625.html に)、それはまだユーザー準備思えませんが。
そして、私は間違いなくこれを行う必要がある理由を理解します。それは基本的にリンクリストと配列の違いです。デフラグなどが通常SSD上の逆効果である。
他のヒント
を最後に信頼性の高いソリューション!のうちの2つ、実際に!
、/ SYS /ブロック/ sdXに/キュー/回転を確認してください。ここで、のsdXにのドライブ名です。それが0だ場合は、SSDを扱っている、と1は、昔ながらのHDDを意味します。
私は、それが導入されたLinuxのバージョン私の指を置くことはできませんが、それはUbuntuのLinuxの3.2とバニラのLinux 3.6に存在するとバニラ2.6.38に存在しません。オラクルもそのアンブレイカブルエンタープライズカーネル5.5にをバックポート、これは2.6.32に基づいています。
<のhref = "https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6により導入されたドライブは、Linux 3.3以降の回転であるかどうかを確認するioctlは、もあります。 gitの; = commitdiff; H = ef00f59c95fe6e002e7c6e3663cdea65e253f4cc」REL = "noreferrerは">これはをコミット。 sysfsのを使用すると、しかし、通常はより便利である。
あなたは実際にはかなり簡単に回転待ち時間を決定することができます - 私は大学のプロジェクトの一環として、一度これをしませんでした。それは、このレポートにに記載されています。あなたは、待ち時間の利いたグラフを参照してください7ページをスキップすることをお勧めします。 8.2ミリ秒のドロップ - それは1.1ミリ約9.3ミリから行きます。それは60 s / 8.2 ms = 7317 RPM
に直接対応します。
これは簡単なCコードので行われていた - ここではその対策部分ですスクラッチファイルの位置a
and b
間。私たちは、シリンダ周りのすべての道をさまよってきたまで、私たちは、ますます大きなb
値でこれをやった。
/* 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; }
このコマンドは、lsblk -d -o name,rota
は、あなたのドライブを示していますし、それがSSDだ場合、回転ディスクと0の場合ROTAで1を持っています。
出力例:
NAME ROTA sda 1 sdb 0
あなたが実行することで幸運を得ることができます。
smartctl -i sda
のsmartmontoolsするから。ほとんどすべてのSSDモデルフィールドにSSDを持っています。しかし保証はありません。
SSDデバイスは、ハードディスク装置のインタフェースをエミュレートするので、彼らはただのハードディスクのように使用することができます。また、これは彼らが何であるかを検出するという一般的な方法がないことを意味します。
これは、すべてのドライブのために正確ではないでしょうが、あなたはおそらく、ドライブ(レイテンシ、速度、大きさ)のいくつかの特徴を使用することができます。別の可能性はS.M.A.R.T.を見てすることであってもよいですあなたはそこにすべてのドライブのデータベースを保持しない限り、データと(、モデル名によって特定の値を)あなたはこの介してディスクの種類を判別できるかどうかを確認には、しかし、これはどちらかが100%正確であるつもりではありません。
私の二つのセントに応答すが非常に重要な問題であり、い...場合ディスクにアクセスによSCSIします(可能性)をご利用できSCSI問い合わせコマンドを求められた場合の回転す。VPD(重要な製品データ)のページと呼ばれる Block Device Characteristics
しており、 0xB1
.バイト4と5のこのページに含まれる番号の意味:
- 0000h"中の回転率が報告されていない"
- 0001h"非回転中(例えば、固体状態)"
- 0002h-0400h"貸切"
- 0401h-FFFEh"名目中の回転率回転/分( rpm)(7 200回転=1C20h,10 000rpm=2710h、15 000rpm=3A98h)"
- FFFFh"貸切"
なので、SSDが必要 0001h
います。の T10.org
文書このページをめくることができた こちらの.
しかし、その実施状況にこの基準は明らかでない。
私は、次の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();
テキストファイルを作成し
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