LinuxでSDカードの全容量をテストするにはどうすればよいですか?


17

eBayから64 GB SDカードを購入しました。Arch Linux ARMイメージを書き込み、それを使用してRaspberry Piを起動すると正常に動作します。

ただし、単一のext4パーティションを作成してカードのすべての容量を使用しようとすると、エラーが発生します。mkfs.ext4常に楽しく終了します。ただし、パーティションをmount編集することはできず、常にエラーがスローされ、dmesgカーネルメッセージincludeが表示されCannot find journalます。これは、少なくとも2つのプラットフォーム(Arch Linux ARMおよびUbuntu 13.04)で当てはまることが判明しています。

一方、エラーなしでFAT32パーティションを作成およびマウントできます(全容量のチェックは行われていません)。

カードをより良い価格で販売するために、一部の悪者がSDカードインターフェイスを変更してOSに誤った容量を報告する(つまり、カードは実際には2 GBだけですが、64 GBとして報告する)ことがあると聞きました。

badblocksSDカードの不良ブロックをチェックするためのツールが存在することは知っています。badblocksこのような問題を検出できますか?そうでない場合、カードをテストするための他の解決策はありますか?

理想的には、私がだまされたかどうかを知りたいです。結果が悪いアイテムを受け取ったばかりの場合、売り手だけに戻ることができ、誰かが私をだまそうとしたことをeBayに報告できます。

更新

操作とメッセージ:

~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, 16383996 blocks
819199 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
500 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

~$ dmesg | tail
...
[4199.749118]...
~$ sudo mount /dev/sde1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sde1,
   missing codepage or helper program, or other error
   In some cases useful info is found in syslog - try
   dmesg | tail  or so

~$ dmesg | tail
...
[ 4199.749118]...
[ 4460.857603] JBD2: no valid journal superblock found
[ 4460.857618] EXT4-fs (sde1): error loading journal

更新

実行しましたbadblocks /dev/sdeが、エラーは報告されません。つまり、残りの原因は次のとおりです。

  • SDカーは良好ですが、何らかの理由でmke2fsmountまたはカーネルに問題の原因となるバグがあります。

  • 私はbadblocksそれが敗北を検出できない方法でだまされました。これはもっともらしいです。なぜならbadblocks、インプレースの読み書きテストを行っているだけだからです。ただし、詐欺師は、アウトバウンドエリアへのアクセスをインバウンドブロックに戻すことができます。この場合、インプレース書き込み/読み取りチェックでは問題を検出できません。

適切なテストを実行できるアプリケーションがなければ、簡単なCプログラムを作成してテストできると思います。


SDXC USBカードリーダーで試しましたか?
イグナシオバスケス-エイブラムス

また、エラーと同時にシステムログにメッセージが表示されますか?
イグナシオバスケス-エイブラムス

ネイティブのRaspberry PiカードリーダーとUbuntuデスクトップ用の外部カードリーダーの両方で試しました。私はそれdmesgがカーネルメッセージを表示すると言ってきましたが、エラーの前後にそれを行って比較したため、エラーと同時に表示されると確信しています。メッセージを表示するsyslogと信じているため、チェックしていませんdmesg
地球エンジン

他のメッセージは表示されますか?
イグナシオバスケス-エイブラムス

私が使用した外部カードリーダーは、他のカードで動作しており、SDXCカードが含まれています。ただし、問題のあるものには1つの違いがあります。SDアダプタを備えたマイクロSDカードです。
地球エンジン

回答:



6

不正行為は次の手順で確認されました。

  • ランダムデータファイルを生成します。(4194304 = 4×1024×1024 = 4 MiB、合計サイズ= 40×4 MiB = 160 MiB)

    コマンド:

    dd if=/dev/urandom of=test.orig bs=4194304 count=40
    40+0 records in
    40+0 records out
    167772160 bytes (168 MB) copied, 11.0518 s, 15.2 MB/s
    
  • データをSDカードにコピーします。(2038340×4096 = 8153600 KiB = 7962.5 MiB)

    コマンド:

    sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096
    40960+0 records in
    40960+0 records out
    167772160 bytes (168 MB) copied, 41.6087 s, 4.0 MB/s
    
  • SDカードからデータを読み戻します。

    コマンド:

    sudo dd if=/dev/sde of=test.result skip=2038399 bs=4096 count=40960
    40960+0 records in
    40960+0 records out
    167772160 bytes (168 MB) copied, 14.5498 s, 11.5 MB/s
    
  • 結果を表示する

    コマンド:

    hexdump test.result | less
    ...
    0000ff0 b006 fe69 0823 a635 084a f30a c2db 3f19
    0001000 0000 0000 0000 0000 0000 0000 0000 0000
    *
    1a81000 a8a5 9f9d 6722 7f45 fbde 514c fecd 5145
    
    ...
    

どうした?ゼロのギャップが観察されました。これは、ランダムデータが実際にカードに書き込まれていないことを示すインジケータです。しかし、なぜデータが戻ってくるの1a81000ですか?明らかに、カードには内部キャッシュがあります。

キャッシュの動作を調査することもできます。

hexdump test.orig | grep ' 0000 0000 '

結果を提供しません。つまり、生成されたごみにはそのようなパターンはありません。しかしながら、

hexdump test.result | grep ' 0000 0000 '
0001000 0000 0000 0000 0000 0000 0000 0000 0000
213b000 0000 0000 0000 0000 0000 0000 0000 0000
407b000 0000 0000 0000 0000 0000 0000 0000 0000
601b000 0000 0000 0000 0000 0000 0000 0000 0000

4つの一致があります。

これがbadblocksチェックに合格する理由です。さらにテストすると、実際の容量が7962.5 MB、つまり8 GBをわずかに下回ることがわかります。

これは、単なるランダムなハードウェア障害ではありませんが、一種の不正行為(つまり、詐欺)である可能性が高いと結論付けています。他の被害者を支援するために私ができる行動を知りたい。

アップデート11/05/2019

  • 人々は、正しいseekパラメーターがどのようにわかるかについて尋ねました2038399。上記で示したよりも多くの経験をしました。基本的には、最初に推測する必要があります。適切なサイズのデータ​​を推測する必要があり、データの破損がどこにあったかを推測する必要があります。ただし、いつでも二分法を使用して支援できます。

  • 以下のコメントでは、上記の2番目のステップ(SDカードへのデータのコピー)は1セクターのみをコピーすると想定されたと思いました。しかし、私は実験でこの間違いを犯したわけではありません。代わりseekに、「結果の表示」ステップ1000で、データの2番目のセクターでオフセットが発生することを示すことでした。場合はseek2038399の分野で、破損が第二百三万八千四百部門です。


(1)2038340と2038399の数字はどこから来ますか?(2)なぜあなたは使用しない  bs=4194304 count=40 から読み込むとき/dev/urandom が、   bs=4096 count=40960  への書き込みやSDカードから読み込むとき?(これらは数学的に等価です。それぞれ167772160バイトです。)
スコット

1)bisec tecniqueを使用して、オフセットを計算しました。bisecの手順は回答に対して冗長すぎるため、これ以上説明することなく、単にそれらを明白なものとしています。2)はい、計算は同等です。しかし、私は、私は信じているカードのセクタサイズと一致する必要がありますかどうかわからない4096です
地球エンジン

ああ、ポイント2)では、を使用seekしているので、カードに1セクターしか書き込んでいないため、データ転送量を節約できます。原因として、実験する際により大きなデータブロックを使用したため、生成されたデータファイルが160MiBになっています。
地球エンジン

2番目のコメントは意味がありません。答えの2番目のコマンド(カードに書き込むコマンド)はsudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096です。そして明らかにあなたは正しい。を使用しseekます。そして、ええ、技術的にはを使用しませんcount。…(続き)
スコット

(続き)…しかし、「カードに1セクターしか書き込んでいないので、データ転送量を節約できます」と言います。それは明らかに間違っています。なしcount仕様、dd全体の入力(すなわち、それはEOFまたはエラーに転送)転送します。そのため、このコマンドはのコンテンツ全体を転送しますtest.orig。これは、それぞれ4096バイトの40960レコードで、合計167772160バイトです(前述)。
スコット

3

まず、@ RadtooによるF3の回答を読んでください。それは正しい方法です。

私は何とかそれを逃し、自分のやり方を試しました:

  1. 1GBのテストファイルを作成します: dd if=/dev/urandom bs=1024k count=1024 of=testfile1gb

  2. そのファイルのコピーをSDカードに書き込みます(64はGB単位のSDカードサイズです): for i in $(seq 1 64); do dd if=testfile1gb bs=1024k of=/media/sdb1/test.$i; done

  3. ファイルのmd5を確認します(最後を除くすべて、不完全、一致する必要があります): md5sum testfile1gb /media/sdb1/test.*


これは簡単で迅速なアプローチです。
地球エンジン


2

SDカードの全容量をテストする最も簡単な方法は、SDカードにファイルを入れてから、ファイルが正しいことを確認することです。 diff -qr /directory/on/computer /directory/on/SD

または、プログラムを使用して、パターンまたはハッシュのチェーンをファイルに書き込み、それらが正しいことを確認できます。

以下のよう@Earthyエンジンは指摘し、それを読んで、その後、単にデータの小さなブロックを書く伝統的なアプローチとして、そして、SDカードを埋めるデータを読むことが重要だ、偽のSSDカードにだまされています。


2

次のことを行う小さなスクリプトを作成しました。

-ターゲットUSBまたはSCカードへの一時ディレクトリを作成します

-ランダムに生成された5MBの参照ファイルをmd5sumチェックサムで作成します

-参照ファイルをターゲットにコピーし、ターゲットからmd5sumチェックを生成して、読み取り/書き込みの成功を確認します

-ターゲットを容量(100%)まで埋めるか、チェックサムエラーが発生したときに停止します

-スクリプトが自然に停止すると、レポートされたターゲットサイズ、使用量、空き量が表示されます。

このスクリプトを使用して、64GBの8GB microSDを渡したeBayの売り手にぼられたと結論付けました。

#!/bin/bash
#Save file as 'filltext' and remember to set the executable flag to run it
if [ -d "$1" ]; then
 if [ -d "$1/tmp" ]; then
  echo "."
 else
  mkdir $1/tmp
 fi

#Make a tmp file and fill it with 3MB of junk
 TMPTSTR=$(mktemp)      
 base64 </dev/urandom  | head -c 5000000 > $TMPTSTR

 TESTVAL=$(md5sum $TMPTSTR | awk '{ print $1 }')

 while $CHECKEDOK; do

  FL=$( tr -dc A-Za-z0-9 </dev/urandom  | head -c 5).TEST

  cp $TMPTSTR $1/tmp/$FL
  TESTTMP=$(md5sum $1/tmp/$FL | awk '{ print $1 }')
  if [ "$TESTVAL" != "$TESTTMP" ]; then   
   echo "Checksum ERROR"
   echo "Original: $TESTVAL Temp File:$TESTTMP"
   CHECKEDOK=false
   df $1 -Ph
   echo 
   echo 
   echo "Removing test files"
   rm $1/tmp -r
   rm $TMPTSTR
   df $1 -Ph
  else
   #echo -n "$FL..."
   clear
   df $1 -Ph
  fi
 done

else
 echo "Error: Directory $1 does not exists."
 echo "Usage: filltest [PATH]"
 echo
 echo "Try the PATH of a mounted USB dongle or SD card to confirm it's capacity"

fi

1
これにより、誤解を招く結果が生じる可能性があります。OSはファイルシステムの書き込みをバッファリングするため、SDカードではなく、システムのメモリをほとんどテストしています。
セリン

「hdparm -W 0 / dev / disk」を実行すると、バッファリングされた書き込みの問題が解決するはずです。
マイケル

1

一連の数字を書き(各行は16バイト)、内容を検証できます。

dd if=<(seq -w 0 123456789012345) of=/dev/yourSdHere

次に、スキップ==出力を確認します(書き込まれたレコードの数が少ないスキップ値の小さなサンプルを使用)。例:skip = 9876

dd if=/dev/yourSdHere bs=16 count=1 skip=9876
000000000009876
1+0 records in
1+0 records out
16 bytes copied, ...

または、1つのライナーで20箇所のサンプルを作成します。

seq -w 000000000000000 NumberOfWrittenRecords | shuf | head -20 | while read i; do [[ $(dd if=/dev/yourSdHere bs=16 count=1 skip=$i) == $i ]] && echo ok || echo bad; done
  • SDカードに書き込みを行っていることを確認してください
  • of=tempFileOnSDカードに保存されたデータの破壊を回避したい場合は、ファイルに書き込みます(偽物でない場合のみ)
  • 64GBとラベル付けされた8GBカードの場合、20個すべてのテストに合格する可能性は(8GB / 64GB)** 20 <1e-18

1
あなたが言っていることを理解する前に、私はあなたの答えを3回読まなければなりませんでした:「スキップ==出力の確認」は明確ではありません。そして、私が何かを逃していない限り、あなたのアプローチでは、ユーザーが123456789012345コマンドを実行し、出力を手動で検査する必要があります  !明らかにそれは不合理です。理由だけでないseq -w 0 123456789012345 > /dev/yourSdHereseq -w 0 123456789012345 | cmp - /dev/yourSdHere
スコット

コメントをありがとう:)私は私の答えを編集しました、それが今より良いことを願っています!
カルパダ

また、123456789012345は、各数字が16バイトを使用するようにする15桁の数字です。SDの16バイトブロックの数を使用できます
karpada
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.