入出力エラーが発生した場合、ddは何を書きますか?

入出力エラーが発生した場合、ddは何を書きますか?

ドライブがすぐに失敗する予定であるため(C5とC6がトリガーされます)、まだ実行できるときに別のバックアップを実行することにしました。これを行うには、同じモデルの他のドライブにddを使用します。期待どおりに入力/出力エラーが発生し、エラーが発生した場合はddが何をするのか知りたいです。何も書かずにそのセクタをスキップしますか?それとも、ターゲットドライブの古いデータをゼロに置き換えますか?

また、64Kブロックを使用しているので、コピーがより多くのデータを取得できない場合は、より小さいブロックサイズでddを実行できますか?

答え1

コメントで述べたように、牛に似た一種の栄養ddrescueこれはユースケースのためのより良いツールです。とにかく、あなたの明白な質問に答えますdd

ddエラーが発生した場合はどうすればよいかを知りたいです。

与えられないと終了し、conv=noerrorツールは無視されます。入力する間違い。仮定noerrorが与えられ、印刷上のエラーが発生しました。それから

何も書かずにそのセクタをスキップしますか?それとも、ターゲットドライブの古いデータをゼロに置き換えますか?

それはあなたがそれを使用したかどうかによって異なりますconv=sync。これにより、dd各入力ブロックが埋められ、ibs=nullバイトが追加されます。私推測するソースブロックデバイスのセクタサイズとibs等しい場合、読み取りエラーが発生した場合、出力ストリームは入力と同期したままになります。ただし、誤った場合、ibs読み取りエラーが原因でストリームが非同期化される可能性が高くなります。この素晴らしい答え。参考になりそうですiflag=fullblock

また、読み出しエラーがなくても出力が入力より大きくなることがあります。これは、バッファがいっぱいになる前にsync最後のブロックがEOFに達した場合にibs発生する可能性があります。

参考にしてnoerrorsyncますPOSIXの要件fullblockいいえ。

ddコピーからより多くのデータをインポートできなかった場合は、より小さいブロックサイズで実行できますか?

理論的にはそうです。ただし、これを行うには、上記の問題を引き続き処理しながらskip=手動で使用する必要があります。新しいブロックサイズを再計算し、それに合わせる必要があるseek=ことを忘れないでください。可能ですが、すぐにプロセスを自動化したいと思います。skipseek


さて、ddrescueこれらすべての問題をGNUの基本的な動作と比較してみましょう。

  • 読み取りエラーはスキップされ、後で「疑わしい」セグメントに戻り、ますます小さいチャンクで読み取ろうとします。
  • 何があっても適切なオフセットを維持します。

関連情報