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


16

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

この答えについて、ジルは言う

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

それはどういう意味ですか?いdd検証に建てられたのいくつかの種類がありますか?

代わりにrsyncを使用する場合は--checksum、確認のために2回目のパスも実行します。そのような妄想は正当化されますか?


「整合性は安全です」を定義します。
するThorbjörnRavnアンデルセン

@ThorbjørnRavnAndersen私はコピーがオリジナルと同一であることを意味します。
-Sparhawk

フラットファイルしかない場合、ファイルをコピーする従来の方法はtarまたはcpioを使用することです。GNU tarには、検証フラグ gnu.org/software/tar/manual/html_section/tar_81.htmlがあります。最近rsyncはおそらく最も簡単でしょう。
するThorbjörnRavnアンデルセン

1
「ハードウェア障害の禁止」は、検証を行わないことを示します。その場合、ハードウェア障害を検出できます。
バーマー

回答:


20

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

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

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

ddただし、例外であることに注意してください。コマンドラインパラメーターによっては、dd一部のエラーを無視する場合があります。これは非常に珍しいことですdd。このプロパティを持つ唯一の共通コマンドです。cat代わりにを使用してくださいdd。そうすれば、破損の危険がなくなり、高速になります。

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

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

ほとんどのストレージメディアは、シングルビットフリップを検出および修正するのに十分なFECを使用していると思います。
ガーデンヘッド

2
もちろん、ddを使用してハードディスク全体をコピーし、すぐにハードディスクを比較した場合、キャッシュが十分に大きくないため、動作していることがわかります。
ジョシュア

1
答えてくれてありがとう(+1)。おそらく私はかなり基本的なものを使用していることに言及する必要がありますdd if=/dev/sdc of=/dev/sdb bs=4Mので、私の理解では、エラーと速度を無視する問題(多かれ少なかれ、と比較してcat)は無意味です。マウントしてサイズを確認するだけdfですか?
-Sparhawk

4

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


4

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

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

そのような妄想は正当化されますか?

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


読み取りと比較とddエラーの検出の両方について、これよりも複雑です
ジル 'SO-悪であるのをやめる'

さて、あなたは遠く、というつもりならdd持っている深刻なデータ破損の問題をしかし、このような特殊なケースが問題の一部ではありませんでした。
frostschutz

これらの破損の問題は、を使用して生成されたデータの検証を正当化できddます。真の解決策はdd、サイレントデータの破損がの専門分野である以外は何でも使用することですdd
ジル 'SO-悪であるのをやめる'

2
@Gilles、またはddエラーを無視するように指示しないでください。あなたが要求したことを正確に行うために、プログラムを正確に責めることはできません。
マーク

@Markそして、ddエラーを無視しないようにするにはどうすればいいですか?いいえ、conv=noerror正解ではありません。例については、frostschutzの回答を参照してください。私がやるのデザインを非難dd無視して、エラーを既定のモードを作るために、そして非常に正確にその内部の仕組みを知らずにオフにすることはできません1。
ジル 'SO-悪であるのをやめる'

2

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

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

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

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


OSにファイルシステムキャッシュをデバイスに強制的に書き込むには、ファイルシステムをアンマウント/マウントするだけで十分です。
miracle173

miracle173ですが、同期した後でも、OSは書き込み内容をキャッシュに保持しませんか?したがって、アンマウントするとRAMからすべてのキャッシュがクリアされるかどうかわかりません。
マット

1

からman dd

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

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.