LinuxでUSBスティックの物理的な状態を確認する方法は?


85

USBスティックの正常性状態を確認する方法は?

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


12
それを捨てる。投資した時間は、新しいものを購入するよりも高くなります。
-mailq

1
@mailqに同意する必要があります。最近はまともな4 GBサムドライブを2.00ドルで購入できます。
iglvzx

17
@iglvzxまあ、質問はそれが安いものなのか、それとも+
32Gb

回答:


69

SMARTに似たパラメータをUSBメモリスティックに照会する方法はありません。公に入手可能なプロプライエタリなソフトウェアを介してでもそうすることをサポートするメモリスティックを私は知りません。最善の方法は、を使用してデバイス全体の読み取りと書き込みが正常に行えることを確認することです badblocks

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

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

dmesgUSBスティックを差し込んだ後を見て、デバイスを見つけます。デバイス名(sd_、つまりsdc、sddなど)と製造元情報が表示されます。適切なデバイスを使用していることを確認してください!

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

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

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

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


21
おそらくbadblocksが最適なオプションです。「それだけの価値はない」と言うコメントは、これが非常に必要になるいくつかのケースを完全に見逃します(たとえば、企業が商品のフラッシュドライブを購入し、どれほどひどく詐欺に遭ったかを
知りたい

2
リンクされたウィキペディアの記事で指摘されているように、それらの不良ブロックe2fsck -cを使用badblocksしてファイルシステムから効果的に隠し、破損した書き込みを回避するものもあります。ただし、ディスクが新しい不良ブロックを取得した場合、おそらく破損し、新しい不良ブロックが後で発生する可能性があることに注意してください。つまり、寿命が短くなり、交換を検討する必要があります。
igorsantos07 14

1
-vフラグを追加することをお勧めします。ターミナルウィンドウでエラーが表示されることもあります。(あなたはそれが例えば一晩実行してみましょう場合、ログファイルはそれがどのように悪いクイックビューのためにその有用ではありません。。
は、Tilo

@BeeDee、デバイス全体を使用するか、一部のパーティションのみを使用するか、それは重要ではありませんか?つまり、/ dev / sdzまたは/ dev / sdz1ですか?
ミスターP

1
@Pisekは、パーティション全体ではなくデバイス全体が故障しているため、デバイス全体を使用する必要があります。
ハイ天使

21

[ubuntu] Error Check USB Flash Drive経由で、最終的にこれが見つかりました。

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

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


4
F3に勝る利点はありますbadblocksか?
ザズ14


14

故障モードに依存すると思われます。理由は安いです。

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

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

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

SMARTに相当するものを探している場合、それは見つかりません。サムドライブコントローラーは安価です。それらはコモディティストレージであり、現代のドライブが持つ通常のフェイルセーフとインテリジェンスを備えているわけではありません。


2

今日に至るまで、このスレッドはいくつかの質問を提起しました。

-これにはどれくらい時間がかかりますか(一晩実行するかどうかの議論からわかるように)

現在、を使用してUSB 3.0 128G Sandiskをテストしていますsudo badblocks -w -s -oが、古いAthlon 64x2の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.

私の現在のディストリビューションのマンページでは、-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

多くの障害は完全であるか、1つの場所で複数の場所をサポートできるようになっています。私は、パターンとアドレスの両方に対して、疑似乱数ジェネレーターに素数を使用する、少しランダムな書き込み読み取りプログラムを作成しました。読み取りは、システム上でRAMキャッシュをテストしていないことを確認するのに十分なページだけ、書き込みの後ろにずれています。これはまだパラメーター化されていません。8GRAMを搭載したシステムで64Gデバイス用にセットアップされているだけです。気軽に批判、パラメータ化、スマート化してください。

これは強力なチェックであり、すべてのバイトを下から上に行うよりも高速ですが、優れたスワップジェネレーターでもあります(他のほとんどすべてをロールアウトします)。私は一時的にスワップを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 ;
        }
}

1024のような2の累乗のincを使用すると、ホップあたり8バイトしかチェックしませんが、より良いチェックまたはデッドハイアドレスビットが可能になります。
デビッドピケット

ええ、これはデッドハイビットの場合を見逃します。また、同じパスで読み取りと書き込みを行うと、それを見逃す可能性があります
-user313114

0

USBドライブは非常に初歩的なものであり、故障することはあまりありません!一般に、ドライブとして表示され、フォーマットできる場合は動作します。CrystalDiskInfoポータブルバージョンを見てみてください。これは簡単な軽量の分析ツールです。ただし、SMART情報などを報告するUSB​​スティックはほとんどありません。


1
参考のために、英語のCrystal Disk Infoマニュアルを参照してください。crystalmark.info
Matt Simmons
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.