ローカルハードドライブ、USBドライブなどのデータの整合性を確認するためのツールが必要です。
私は有名人のような解決策を探しています。www.heise.de/download/h2testwそれとも、少なくともリポジトリでよく見られるものです。 (h2testwは、特定のデータ文字列をメディアに繰り返し記録し、再度読み取って正しく記録されていることを確認し、書き込み/読み取り時間/速度を表示します。)
私は探していません
dd if=/dev/random of=/dev/sdx bs=1k && dd if=/dev/sdx of=/dev/null bs=1k
すべてが正しく書かれていることを確認していないからです。これは、デバイスが正常に読み書きできるかどうかをテストするためのものです。
これまではあまり満足できません。
badblocks -w -v /dev/sdx1
これは、遅いようで正確に何を書くのか、フラッシュメディアの摩耗レベリングを検討しているのか分からないからです。
F3というプログラムがあります。http://oss.digirati.com.br/f3/コンパイルが必要です。 h2testwの後に設計された概念は興味深いようです。私は事前にパッケージ化されたバイナリである方が良いと思います。
答え1
以下のスクリプトは、共有メモリにランダムファイル(〜100 M)を作成し、そのファイルのチェックサムを計算し、それを指定されたブロックデバイスに複数回コピーし、それを読み取り、再計算しながらデバイス全体をランダムデータのコピーで埋めます。元の値と一致することを確認してください。
次の出力が生成されます。
We will create a test data file /dev/shm/testsource with size 100000000.
We will fill the device /dev/sdb (of size 16001036288) with this data (in 160 blocks) and then will check if the data is not corrupted.
This will erase all data in /dev/sdb.
Do you want to continue?
1) yes
2) no
#? 1
Creating test source file... (100000000)
Calculating source checksum...
9f4c31858b3bb1122974a5c9d8ec28c6f71b3367
Writing block 0 ...
Checking block 0 ... ok
Writing block 1 ...
Checking block 1 ... ok
Writing block 2 ...
Checking block 2 ... ok
dd、blockdev、cut、sha1sum、/dev/urandom、および/dev/shmが必要です。デバイス(通常はルート)へのアクセスが必要です。これはLinux 2.6.3xでテストされました。非常に遅いです。複数のパスを実行するか、すべての書き込みを実行し、すべての確認を実行または確認する前にしばらく待つように変更できます(「フェード」テスト)。
#!/bin/bash
TARGETDEVICE=$1
TESTFILE="/dev/shm/testsource"
BLOCKSIZE="100000000"
if [ -b "$1" ]; then
TARGETSIZE=$(blockdev --getsize64 $TARGETDEVICE)
if [ "$TARGETSIZE" -gt 0 ] ; then
let "BLOCKS=$TARGETSIZE / $BLOCKSIZE"
if [ "$BLOCKS" -lt 2 ] ; then
BLOCKSIZE=$TARGETSIZE
BLOCKS=1
fi
fi
echo "We will create a test data file $TESTFILE with size $BLOCKSIZE."
echo "We will fill the device $TARGETDEVICE (of size $TARGETSIZE) with this data (in $BLOCKS blocks) and then will check if the data is not corrupted."
echo "This will erase all data in $TARGETDEVICE."
echo "Do you want to continue?"
select choice in yes no ; do
if [ "$choice" == "yes" ] ; then
echo "Creating test source file... ($BLOCKSIZE)"
dd if=/dev/urandom of=$TESTFILE bs=$BLOCKSIZE count=1 status=noxfer 2> /dev/null
echo "Calculating source checksum..."
CHECKSUM=$(sha1sum $TESTFILE | cut -d " " -f 1)
echo $CHECKSUM
for ((y=0 ; y<$BLOCKS ; y++)) ; do
echo "Writing block $y ..."
dd if=$TESTFILE of=$TARGETDEVICE bs=$BLOCKSIZE count=1 seek=$y status=noxfer 2> /dev/null
echo -n "Checking block $y ... "
TESTCHECKSUM=$(dd if=$TARGETDEVICE bs=$BLOCKSIZE count=1 skip=$y status=noxfer 2> /dev/null | sha1sum | cut -d " " -f 1)
if [ "$CHECKSUM" == "$TESTCHECKSUM" ] ; then
echo "ok"
else
echo "MISMATCH"
echo "(found $TESTCHECKSUM)"
fi
done
rm -f $TESTFILE
break
fi
if [ "$choice" == "no" ] ; then
echo
echo "Operation cancelled"
echo
break
fi
done
else
echo
echo "Missing or wrong target device"
echo "Usage: $0 /dev/device"
echo
fi