USBって便利ですよね。以前はハードディスクというとSCSIなりATAとして接続するのが当たり前でしたが、最近はUSBに変換してPCに接続するといろいろ便利に使えます。特にあらかじめUSBで外付けHDDを接続してHDDイメージをコピー、最後にPCを分解して物理的に交換 というのが最近の私のHDDリプレース手順。だから裸のドライブを接続してUSBに変換するアダプタは手放せません。
が、なんか動作が妙に感じることが稀にあるんですよね。以前ZFSプールを作成してミラーした時も妙なエラーがカウントされました。昨日は所用にてUSBアダプタのHDDにFreeBSDを入れたところ、 make world できない(コンパイルエラーが出る)現象が発生。
何かがおかしいことは間違いなさそうなので、簡単なスクリプトで実験してみました。
#!/bin/sh
base=testdata
dd if=/dev/random bs=200k count=10 | hd >$base
# ファイル作成
count=1
until [ $count -eq 1000 ];
do
cp $base ${base}$count
count=`expr $count + 1`
done
# ファイル比較
count=1
until [ $count -eq 1000 ];
do
diff $base ${base}$count
rm ${base}$count
count=`expr $count + 1`
done
rm $base
動作としては、10MBぐらいの大きいテキストファイルを作成した後 ファイル名を変えて1000個コピー、コピーが終わった後で diff にて元のファイルと同じかどうか調べています。正しく動作していれば dd が出力するメッセージ以外は画面に表示されないはずです。が、
1回目 | 2回目 |
なんと、違いが検出されてしまいます(T^T)
ちなみにおうちには2種類のUSB-HDDアダプタがあるのですが、片方は上記のように複数回実験しても違いが検出されるのですが、もう片方は試した限りでは同じHDDを使用しているにも関わらずdiffによる違いは見つかりませんでした。make world もちゃんと通ります。今まではっきりとは分からなかったのですが、USBアダプタのうち一つはダメダメだったのですねー。もしかしたらWindowsとかで使う限りは問題が起きないのかもしれませんが、FreeBSDで問題があるなら私にとってはゴミです。ゴミはゴミ箱へ(^_^)。
しかし、ハードディスクの読み書きがおかしい時はもっと盛大に(少なくともセクタ単位で)異常が見られるものだと思っていたのですが、こんな風に合計10GB弱読み書きして数バイトだけ違うなんてこともあり得るのですな。そりゃ今まで問題が発覚しなかったわけです。