LTO6テープにちゃんと書き込めたかどうかmd5sum -cでチェックする場合、何も考えずにテープからディスク上にいったん全部書き出してmd5sum -cでチェックしてもよいのだけど、場所と時間がかかるのでオンザフライでチェックだけ行って、ディスク上には何も書き出さないプログラムを作成してみた。
また、我々の目的としてはアーカイブ内の本当に大事なファイルだけチェックできればいいので、それだけチェックして、他のファイルは読み飛ばす仕組みにしたかった。
最初はApache Commons のCompressも試してみたんだけど、ブロックサイズの問題なのか、読み飛ばしできないのか、DigestInputStreamを併用できないのか、ファイルでは動くけどテープでは失敗しちゃうのか、詳しい理由は忘れてしまったけど、Apache Commonsの中の実装がよく分からなくてどうもうまく行かないので、自分で生のテープ内のデータ構造にアクセスして直接読み出すようにしてしまった。
作成したプログラムは、このURLのTarChecker2.java
プログラム内のBLOCK_SIZE は今回は512バイト、blocking factorは128(BUFSIZEの64KB=512バイト*128個)にしてあるけど、LTO6以外のテープやドライブによっては設定を変えなきゃいけないかもしれない。
読み出したデータはストリームでMD5の計算をしていくので、大きなファイルでもメモリは食わない。ただし、チェック対象のファイルのリスト、つまりMD5値のリストのファイルはメモリ上に持ってしまうので、チェックするファイル数が膨大な場合はメモリを食うかもしれない(我々の用途では数百個程度なので問題にはならない)。