web-dev-qa-db-ja.com

ddは何らかの検証を行いますか?

古いハードドライブから新しいハードドライブにデータをコピーするためにddを使用しています。データの整合性が保護されていることを確認したいと思います。

これについて answer 、Gillesは言います

[dd]が正常に終了した場合、ハードウェア障害がなければ、バックアップは正しいです…

それはどういう意味ですか? ddには、何らかの組み込み検証がありますか?

代わりにrsyncを使用する場合は、--checksumを使用して2番目のパスも実行し、確認します。そのようなパラノイアは正当化されますか?

16
Sparhawk

ddまたはその他のアプリケーションには、おそらく考えている意味での「組み込みの検証機能」がありません。ストレージメディアからデータを読み戻して、書き込まれた内容と比較することはありません。それがオペレーティングシステムの仕事です。

アプリケーションからハードウェアまで読み取り検証を行うことは実際には不可能です。一部のシナリオでは機能しますが、ほとんどの場合、何も実行されません。アプリケーションは、書き込んだばかりの内容を読み戻すことができますストレージメディアに直接書き込む場合ですが、通常はメモリ内のキャッシュから読み戻すため、有用な保証はありません。 引用する例 の場合、ddはパイプに書き込んでおり、その場合、データの行末で何が発生するかを制御できません。 rsyncの例では、rsync --checksumの2番目のパスは無意味です。理論的にはエラーをキャッチできますが、実際には、エラーが発生しても、2番目のパスはおそらく何も問題を報告しないため、実際に有用な保証を与えない何かに労力を費やすこと。

ただし、アプリケーションdoは、オペレーティングシステムがデータの責任を受け入れたことを確認するという意味で、データに何が起こるかを確認します。すべてのシステムコールはエラーステータスを返します。システムコールがエラーステータスを返す場合、アプリケーションは通常、エラーメッセージを表示してゼロ以外の終了ステータスを返すことにより、そのエラーをユーザーに伝達する必要があります。

ddは例外であることに注意してください。コマンドラインパラメータによっては、ddは一部のエラーを無視する場合があります。これは非常に珍しいです。ddは、このプロパティを持つ唯一の一般的なコマンドです。 catの代わりにddを使用します。これにより、破損のリスクを回避し、 それはより高速になる可能性があります になります。

データコピーのチェーンでは、2種類のエラーが発生する可能性があります。

  • 破損:転送中にビットが反転します。アプリケーションレベルでこれを確認する方法はありません。それが発生した場合、それは、プログラミングのバグまたはハードウェアエラーが原因であり、読み戻し時に同じ破損を引き起こす可能性が高いためです。このような破損が発生していないことを確認する唯一の有効な方法は、メディアを物理的に切断して再試行することです。RAMに問題があった場合は、別のコンピューターで実行することをお勧めします。
  • 切り捨て:コピーされたすべてのデータは正しくコピーされましたが、一部のデータはまったくコピーされませんでした。これはisコマンドの複雑さによっては、チェックする価値があります。そのためにデータを読み取る必要はありません。サイズを確認するだけです。

いいえ、ddは明示的な検証を行いません。法的に検証されたディスクまたはその一部のコピーが必要な場合は、dcflddを使用してください。これは、米国国防総省のコンピュータフォレンジックラボによって開発されたddの拡張バージョンです。

4
fpmurphy

「確実」にする唯一の方法は、追加の読み取りと比較のパスを実行することです(キャッシュを削除した後)。

それ以外は、ddは他のすべてのプログラムと同じように読み取りエラーと書き込みエラーを検出します...ドライブ(および関連する他のコンポーネント)がエラーを報告すると機能します。実際にデータを書き込まずにサイレントでデータを受け入れるドライブの場合、あなたは運が悪い。

そのようなパラノイアは正当化されますか?

ハードウェアの信頼性が信頼できない場合、状況は複雑になります...

4
frostschutz

はい、障害のあるハードウェアは、ランダムなエラービットをメガバイト数あたり1ビットとしてデータに挿入する可能性があります。これは可能であり、実際に行われることもあります。

通常、md5またはsha1ハッシュを使用して、ソースと宛先の両方を再度読み取ることにより、データが完全であることを確認します。例:

dd if=/dev/sdb of=~/hd_backup
dd if=/dev/sdb | md5sum
dd if=~/hd_backup | md5sum

これは、データがファイルシステムのキャッシュよりもはるかに大きいと想定しています。そうでない場合は、システムを再起動して、キャッシュの内容ではなくメディア上の実際のデータを確認するか、別のシステムを使用する必要があります。

2

man ddから:

終了すると、ddは、完全および部分的な入力および出力ブロック、切り捨てられた入力レコード、奇数長のバイトスワップブロックの数を標準エラー出力に表示します。

部分的な入力ブロックは、入力ブロックサイズよりも小さい値が読み込まれたブロックです。部分的な出力ブロックは、出力ブロックサイズ未満が書き込まれたブロックです。テープデバイスへの部分的な出力ブロックは、致命的なエラーと見なされます。それ以外の場合は、ブロックの残りの部分が書き込まれます。キャラクターデバイスへの部分的な出力ブロックは警告メッセージを生成します。

ddは、ブロックをコピーするたびに入力/出力ブロックサイズが一致することを確認します。そうでない場合は、警告または致命的なエラー(noerrorで上書き)でエラーを処理します。そのため、ddは事実上常に機能します。

それでも、ディスクの整合性を手動で検証する代わりにはなりません。情報があなたにとって価値のあるものであれば、はい、あなたの妄想は正当化されますddが完了したら、手動検証を実行します。

1
iangolden