web-dev-qa-db-ja.com

LinuxでUSBメモリの健康状態を確認するにはどうすればいいですか?

USBメモリの正常性状態を確認する方法

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

78
valpa

USBメモリースティックにSMARTのようなパラメータを問い合わせる方法はありません。私は公に利用可能なプロプライエタリなソフトウェアを通してさえそれをサポートするどんなメモリースティックも知らない。あなたができる最善のことは、badblocksを使ってデバイス全体に読み書きできることを確認することです。

https://en.wikipedia.org/wiki/Badblocks

書き込みテストの1つを指定すると、スティック上のすべてのデータが消去されます。最初にバックアップを作成してください。

USBスティックを差し込んだ後にdmesgを見てデバイスを見つけます。デバイス名(おそらくsd_、すなわちsdc、sddなど)と製造元情報が表示されます。正しい機器を使用していることを確認してください。

スティックが有効なファイルシステムでフォーマットされている場合は、まずそれをunmountにする必要があります。

/ dev/sdzとして列挙されたUSBスティックの構文例。進行状況情報を出力し、データ破壊書き込みテストとエラーログをusbstick.logに書き込みます。

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

通過したと仮定して、後でスティックを再分割して再フォーマットする必要があります。このテストは棒の上のすべてを拭きます。障害が発生した場合は、デバイスのメモリコントローラに障害があるか、または障害ブロックを再マップするためにスペアブロックが不足しています。その場合、デバイスのどの領域も信頼できません。

66
Brett Dikeman

経由 [ubuntu]エラーチェックUSBフラッシュドライブ 、私は結局これを見つけました。

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

補遺@pbhjさん:F3はUbuntuリポジトリにいます。 f3writeは1GBのファイルをデバイスに書き込み、f3readは後でそれらを読み込もうとします。このようにして、データを書き込んで効果的に読み取る能力と能力がテストされます。

19
sdaau

それは故障モードに依存します、と私は思います。彼らは理由で安いです。

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

デバイスが接続されていると認識されても、ディスクコントローラとして識別されない場合(そして、それがどのように発生する可能性があるのか​​わかりませんが...)、コントローラは撃たれます。

それがディスクドライブとして認識されているのにマウントできない場合は、fdiskで修復してパーティションテーブルを書き換えてから別のファイルシステムを作成することができます。

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

14
Matt Simmons

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

- これにはどれぐらいの時間がかかりますか(夜間に実行させるという議論によって暗示されています)。

私は現在Sudo badblocks -w -s -oを使ってUSB 3.0 128G Sandiskをテストしています、それは私のUSB 3/USBC PCIeカードに古いAthlon 64x2で接続されています。それで、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.

N.B .:テストは午後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つのセルが故障しましたが、もう少し長く使用すると、さらに3つのセルが故障し、さらに24の故障が発生し、さらに183の故障が発生します。あなたの使用可能な容量が低下し始め、最終的に急速に低下する前に死ぬことができるのは非常に多くのセルだけです。どのようにしてより多くのセルが故障しているのかを知ることができますか?それで、あなたが悪いセルを持ったら、あなたのデータを守っています。あなたの使用法はまだあなたに数ヶ月を与えるかもしれません。

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

HTH

1
Lee Dunbar

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

これは強力なチェックであり、すべてのバイトを下から上にするよりも速くなりますが、優れたスワップジェネレータでもあります(他のほとんどすべてをロールアウトします)。私は一時的にswapinessを1にしました、そしてそれはより遅くなりました、しかし、他のアプリケーションにもっと容認できます。スワップアウトに対して調整する方法についてのあらゆるヒントもまた評価されるでしょう。

$ 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

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

0
SimonJGreen