usb フラッシュドライブ – どのように Linux で USB スティックの物理的な健康状態を確認するには?

linux usb-flash-drive

USBメモリの健康状態を確認するには?

USBが修理不可能なほど壊れている、または修理可能な状態であることを知るにはどうすればいいのでしょうか?

  102  valpa  2012-01-08


ベストアンサー

USB メモリスティックに SMART のようなパラメータを問い合わせる方法はありません。できる最善の方法は、badblocksを使ってデバイス全体への読み書きが正常にできることを確認することです

badblocks - Wikipedia

スティック上のすべてのデータを消去する書き込みテストを指定したい場合は、最初にバックアップを作成してください

USBスティックを接続した後、dmesgを見てデバイスを見つけてください。デバイス名(sd_, sdc, sddなど)とメーカー情報が表示されます。適切なデバイスを使用していることを確認してください

スティックが有効なファイルシステムでフォーマットされている場合は、まずそれを unmount しなければならないかもしれません

例:/dev/sdz として列挙された USB スティックで、データ破壊的書き込みテストとエラーログを usbstick.log に書き込んだ状態で、進行状況を出力する構文

sudo badblocks -w -s -o usbstick.log /dev/sdz

このテストでは、スティック上のすべてのデータが消去されます。失敗した場合は、デバイスのメモリコントローラが故障したか、故障したブロックをリマップするための予備ブロックが不足していることを示しています。この場合、デバイスのどの領域も信用できません

80  Brett Dikeman  2012-01-09


[ubuntu] Error Check USB Flash Driveを経由して、私は最終的にこれを見つけました、これは参考になる可能性があります

私はフラッシュメモリをテストするためにソフトウェアH2testw(ここまたはここを参照してください)を推奨するブログファイトフラッシュ詐欺とSOSFakeFlashに到着しました。私はH2testwをダウンロードして、それに2つの問題が見つかりました。(1)それはWindowsのみのためであり、(2)それはオープンソースではありません。(1) Windows専用であること、(2) オープンソースではないことです。しかし、作者は親切にも何をするのかを説明するテキストファイルを含めてくれました。 このページでは、わたしのGPLv3のアルゴリズムの実装について説明します。わたしの実装はシンプルで信頼性が高く、H2testwを実行したことがないので、F3がH2testwとどのように比較しているのか正確にはわかりません。わたしはわたしの実装をF3と呼んでいます。これはFight Flash Fraud、あるいはFight Fake Flashの略です

追記 by @pbhj.F3はUbuntuのリポジトリにあります。それは2つの部分があり、f3writeはデバイスに1GBのファイルを書き込み、f3readはその後にそれらを読み取ろうとします。このようにして、容量や書き込み能力、効果的にデータを読み取る能力がテストされています

24  sdaau  2013-04-29


故障モードにもよると思いますが安いのには理由がある

USB デバイスとして、Windows のデバイスマネージャや Linux の dmesg の出力でバスを見ると、デバイスが接続されていると認識されているかどうかがわかります。認識されていない場合は、ボード上のコントローラか物理的な接続が壊れているかのどちらかです

デバイスが接続されていると認識されても、ディスクコントローラとして認識されない場合 (どうやって認識されるのかはわかりませんが…)、コントローラは撃たれてしまいます

ディスクドライブとして認識されていてもマウントできない場合は、fdiskで修復してパーティションテーブルを書き換えてから別のファイルシステムを作るという方法もあるかもしれません

S.M.A.R.T.に相当するものを探しているのであれば、見つからないでしょう。サムドライブコントローラは安いです。彼らはコモディティストレージであり、現代のドライブが持っている通常のフェイルセーフとインテリジェンスを持つことを意図していません

14  Matt Simmons  2012-01-08


今日に至るまでの道のりで、このスレッドはいくつかの疑問を投げかけた

-どのくらいの時間がかかるのか(一晩走らせるという議論が暗示されている)

現在、sudo badblocks -w -s -oを使ってUSB 3.0 128G Sandiskをテストしていますが、古いAthlon 64×2のUSB 3/USBC PCIeカードに接続しています。 そのため、PCIe上でのUSB3からUSB3への変換はかなり速いはずです

ここでは、33%完了時の私のコンソールコマンドラインを示しています

Testing with pattern 0xaa: 33.35% done, 49:47 elapsed. (0/0/0 errors)

と、後にもう一度

Testing with pattern 0xaa: 54.10% done, 1:17:04 elapsed. (0/0/0 errors)

次に来たのはこのセグメント

Reading and comparing: 43.42% done, 2:23:44 elapsed. (0/0/0 errors)

この処理は oxaa、次に 0x55、0xff、最後に 0x00 と繰り返されます

ArchLinux は文句なしの発言をしました

For some devices this will take a couple of days to complete.

注:テストは午後8時30分頃から始まり、翌日の午前8時45分前にはテストが終了しており、私の状況では約12時間で終了していました

-破壊検査だけが可能な方法ではありません

ウィキペディアはこのような記述を提供しました

badblocks -nvs /dev/sdb This would check the drive "sdb" in non-destructive read-write mode and display progress by writing out the block numbers as they are checked.

私の現在の distro man ページでは、-n が非破壊的であることを確認しています

-n Use non-destructive read-write mode. By default only a non- destructive read-only test is done.

そして最後に、それは価値がないということ

要約すると、フラッシュチップ内の何十億ものメモリサイトの状況に基づいて、失敗とは、すでに何万回も書き込まれて消去されたセルが、今、失敗している状態のことです。そして、1つのテストでセルが故障していることが示されたとき、あなたが追加したり消去したりした各ファイルは、それらのサイクルを実行していることを覚えておいてください

ここでの考え方は、1 つのセルが故障すると、さらに多くのセルが同じ故障ポイントに到達するということです。今日1つのセルが故障したが、しばらく普通に使っていたとすると、さらに3つのセルが故障し、さらに24個のセルが故障し、さらに183個のセルが故障し、いつの間にかメモリアレイは不良箇所だらけになっていたとする。使用可能な容量が減少し始め、最終的には急速に減少するまでに死ぬことができるセルの数は限られています。より多くのセルが故障していることを どうやって知ることができる?だから、ここの投稿は、一度不良セルを持っていると言うことによって、あなたのデータを守っている、あなたはかなり信頼できるストレージに関しては終了しています。あなたの使用法はまだあなたに数ヶ月を与えるかもしれません

それはあなたのデータです

HTH

6  Lee Dunbar  2018-06-07


多くの失敗は、完全なものか、1つの場所が複数の場所に対応できるようにしているかのどちらかです。私は、パターンとアドレスの両方のために、擬似乱数発生器に素数を使用する少しランダムな書き込み読み取りプログラムを書きました。私がシステム上のラムキャッシュをテストしていないことを確認するために、読み取りは書き込みよりも十分なページ数だけ遅れています。それはまだパラメータ化されていません、ちょうど私のシステム上の64Gのデバイスのために設定されています。批判したり、パラメータ化したり、よりスマートにしたりすることは自由に感じてください

強力なチェックで、全バイト下から上までやるよりも速いですが、スワップ発生にも優れています(他はほぼ全部転がしてしまいます)。一時的にスワップ性を1にしてみたところ、遅くなりましたが、他のアプリでは許容範囲内になりました。swapoutに対抗してチューニングする方法のヒントがあれば教えてください

$ sudo ksh -c ‘echo 1 > /proc/sys/vm/swappiness’

$ cat mysrc/test64g.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main( int argc, char **argv ){

long long int mask = 0xFFFFFFFF8L ;    // 64Gb word
long long int stag = 8413257 ;  // 8G / 1021
long long int inc = 1021L ;     // prime < 1024

long long int w_addr = 0L ;
long long int r_addr = 0L ;
long long int w_ct = 0L ;
long long int r_ct = 0L ;
long long int w_patt = 0xFEDCBA9876543210L ;
long long int r_patt = 0xFEDCBA9876543210L ;
long long int r_buf ;
int fd, ret ;

if ( argc < 2
|| argv[1] == NULL
|| 0 > ( fd = open( argv[1], O_RDWR ))){
printf( "Fatal: Cannot open file $1 for RW.\n" );
exit( 1 );
}

while ( 1 ){
if ( (off_t)-1 == lseek( fd, w_addr & mask, SEEK_SET )){
printf( "Seek to %llX\n", w_addr & mask );
perror( "Fatal: Seek failed" );
exit( 2 );
}

if ( 8 != ( ret = write( fd, (void*)&w_patt, 8 ))){
printf( "Seek to %llX\n", w_addr & mask );
perror( "Fatal: Write failed" );
exit( 3 );
}

w_ct++ ;
w_addr += inc ;
w_patt += inc ;

if ( ( w_ct - r_ct ) < stag ){
continue ;
}

if ( (off_t)-1 == lseek( fd, r_addr & mask, SEEK_SET )){
printf( "Seek to %llX\n", r_addr & mask );
perror( "Fatal: Seek failed" );
exit( 4 );
}

if ( 8 != ( ret = read( fd, (void*)&r_buf, 8 ))){
printf( "Seek to %llX\n", w_addr & mask );
perror( "Fatal: Read failed" );
exit( 5 );
}

if ( ( ++r_ct & 0XFFFFF ) == 0 ){
printf( "Completed %lld writes, %lld reads.\n", w_ct, r_ct );
}

if ( r_buf != r_patt ){
printf( "Data miscompare on read # %lld at address %llX:\nWas: %llX\nS/B: %llX\n\n", r_ct, r_addr & mask, r_buf, r_patt );
}

r_addr += inc ;
r_patt += inc ;
}
}

1  David Pickett  2015-08-14


誰も私が遭遇した障害のバリエーションについて言及していないようです – より一般的なコントローラ/インターフェースの障害です

USB デバイスを接続すると、dmesg にいくつかの行が生成されます

 [ 3209.991107] usb 2-1.1: New USB device found, idVendor=0951, idProduct=1666
[ 3209.991117] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3209.991123] usb 2-1.1: Product: DataTraveler 3.0
[ 3209.991129] usb 2-1.1: Manufacturer: Kingston

そして、次のように実行します: lsusb

詳細については、ベンダーID:プロダクトIDに焦点を当てることができます

lsusb -d -v 0951:1666

ドライブがカーネルによってプローブされ認識されると、ブロックストレージデバイスの新しい /dev/sd?ファイルシステムをオートマウントしていない場合は、ファイルシステムの構造 (コンテンツではなく) にアクセスしてみることができます

例えば、/dev/sdb1 /mnt をマウントします

私の場合は、古いUSBメモリにNANDセルを死滅させるよりも、新しいUSBメモリにフリッツのコントローラーを付けていたのですが

dmesgはしばらくしてから、他の多くのメッセージの中からこれを吐き出しました

[ 3356.078359] usb 2-1.1: new high-speed USB device number 36 using ehci-pci
[ 3361.098287] usb 2-1.1: device descriptor read/8, error -110
[ 3366.217872] usb 2-1.1: device descriptor read/8, error -110
[ 3366.321702] usb 2-1-port1: unable to enumerate USB device

私の場合は、USBファイルシステムをマウントした後、(もっとNANDセルを歩かせるために)途中で完全に傾いてしまい、二度と「オンライン」にならなかったのです

UTubeでKrzysztof Opasiak – Debugging Usually Slightly Broken (USB) Devices and Driversを見る

これが、瀕死のNANDセルのシナリオを超えて、もう少し有用な背景を追加してくれることを願っています

0  Alex M  2020-01-20


USBドライブはかなり初歩的なものです。一般的に, それはドライブとして表示され、あなたはそれをフォーマットすることができれば、それは動作します.CrystalDiskInfoの携帯版を見てみるのもいいでしょう。USBスティックでS.M.A.R.T.情報などをレポートしているものはほとんどありませんが

-2  SimonJGreen  2012-01-08


タイトルとURLをコピーしました