私は2つのハードドライブにいくつかのGBファイルを保存します。数年間オフラインで保存した後(残念ながら理想的な条件からは離れています)、ビットが破損したファイル(2つのコピーが異なる)を頻繁に受け取ってファイルを復元したいと思います。問題は、ファイルが大きすぎて同じファイル内の一部のストレージデバイスで特定のビットが破損し、他のストレージデバイスで他のビットが破損しているため、両方のディスクに破損していない文書が含まれないことです。
したがって、ファイル全体のMD5チェックサムを計算する代わりに、各1KBブロックのチェックサムを計算したいと思います。これらの小さなブロックを使用すると、2台のハードドライブで同じ1KBブロックが破損する可能性が大幅に削減されます。
これはどのように達成できますか?難しくないと確信していますが、別の方法を試すのに1時間以上かかり、失敗し続けました。
答え1
光学メディア(現在はBD-Rですが、CD-RとDVD-Rでも同じ方法を使用しています)のビットロットと同様の問題があります。
というプログラムがあります。par2
回復データ(Reed-Solomonコードを使用)を生成して、特定の数のエラーを検出できるだけでなく、修正することもできます。ブロックサイズと冗長性の割合(必要な追加のディスク容量の量でもあります)を設定できます。たとえば、1,000個のブロックと10%の冗長性を使用する場合、100個の冗長ブロックを格納するためにディスク容量の10%を追加して合計1100個になります。しかし、その代わりにファイルを完全に回復することができます。どの無傷のブロック1000個。したがって、100個以下のブロックにビットロートが含まれていると、ファイルを回復できます。
par2の欠点は、回復データの計算に時間がかかり、生成されるデータが多いほど時間がかかることです(10%生成より20%生成が長くなります)。
他の同様のツールはジピーク、個人的には使用しなかったが。
答え2
ここでは完全なソリューションを提供しませんが、独自のソリューションを構築するのに役立つことを願っています。個人的に私はより良いツールがあると思いますrsync
が、これはあなたの質問基準を満たしていないようです。
split
元のデータだけでなく分割データも保存できる必要があるため、実際には使用しません。代わりにdd
。このようなものが役に立ちます。
file=/path/to/file
blocksize=1024 # Bytes per block
numbytes=$(stat -c '%s' "$file")
numblocks=$((numbytes / blocksize))
[[ $((numblocks * blocksize)) -lt $numbytes ]] && : $((numblocks++))
blockno=0
while [[ $blockno -lt $numblocks ]]
do
md5sum=$(dd bs=$blocksize count=1 skip=$blockno if="$file" 2>/dev/null | md5sum)
# Do something with the $md5sum for block $blockno
# Here we write to stdout
echo "$blockno $md5sum"
: $((blockno++))
done