web-dev-qa-db-ja.com

dd入出力エラーの解釈

/dev/Storage/Storageパイプラインを使用して、dd | pv | dd(LVMのLV)をイメージファイルにコピーしようとしました。 ddがエラーを報告しました。ddがディスクのコピーを終了したのか、エラーが原因で停止したのかを知りたいです。上部にエラーがあるものとないものの2つの異なる出力が得られたので、私にはわかりません。推測すると、2つの間に0.1秒しか追加されず、余分なデータがないため、そうではなかったと思いますが、そうであったかどうかはわかりません。 /dev/Storage/Storageは1 TBディスクです(テラバイト= 1012 = 10004)または931.51 GiB(gibibyte = 230 = 1024)または1953513472セクター。ディスク上のファイルシステムがめちゃくちゃになっていて、正しく機能していません。

$ Sudo dd if=/dev/Storage/Storage | pv | dd of=Storage.img
dd: error reading ‘/dev/Storage/Storage’: Input/output error                   ]
1627672400+0 records ins] [   <=>                                              ]
1627672400+0 records out
833368268800 bytes (833 GB) copied, 75181 s, 11.1 MB/s
776GB 20:53:01 [10.6MB/s] [  <=>                                              ]
1627672400+0 records in
1627672400+0 records out
833368268800 bytes (833 GB) copied, 75181.1 s, 11.1 MB/s
6
Scoopta
  • デフォルトの512バイトのddブロックサイズを使用しています。 128k1mなどの大きなブロックサイズを使用すると、パフォーマンスが大幅に向上します。

  • 2つのddコマンドを実行しているため、2つの出力があります。最初の出力はデバイスリーダーで、I/Oエラーが表示されます。

  • 使用するデバイス名が/dev/Storage/Storageの場合、LVMを使用している可能性があります。これはディスク全体であり、サブセットではありませんか? lvdisplayを使用して、このデバイス名の背後にあるものを特定します。

4
jlliagre

カーネルログメッセージ(dmesg、または/var/log/kern.log)で、ハードウェアエラーの場合は、SATAドライバーからのより詳細なメッセージを確認してください。また有用:smartctl -x /dev/sda。パーティションの終わりを過ぎて読み取ろうとしただけの場合は、カーネルログにも表示されることがあります。

I/Oエラーの後もddを続行し、エラーに続く読み取り可能な部分を読み取るには、次のコマンドを使用します。

dd if=... of=... conv=noerror bs=128k   # it doesn't get any faster beyond about 128k, because of L2 cache size

(OPのコメントで述べたように、ddrescueにはこれ以上があります。ddrescueが存在した後、GNU ddにconv=noerrorが追加されました。IIRC)。

中断したところから再開したい場合は、seekおよびskipオプションをconv=notruncとともに使用できます。


Ddがどれだけ離れているかを本当に知りたい場合は、そのstdinのファイル位置を見てください。

cat /proc/$(pidof dd)/fdinfo/0  # dd opens its infile as fd #0

(またはls -lh出力ファイルのサイズ)。ハードドライブ全体のデータをパイプで2回余分にコピーすると、コピーにかかる時間に必要な時間よりもコンピューターの速度が少し遅くなるだけなので、私にはばかげているように見えます。

または、少なくとも次のようにします。

dd if=... conv=noerror bs=128k | pv > Storage.img
3
Peter Cordes

私は同じ問題を抱えていて、チュートリアルまたはddに関するSOの投稿は特にこの問題の特定の形式を助けていませんでした。いくつかの調査の結果、 この質問この解決策 は本当に私にとってうまくいきました。

これがユースケースの例です:

$ Sudo apt-get install gddrescue

$ Sudo ddrescue /dev/Storage/Storage Storage.img | pv

一般的な形式は次のとおりです。

$ Sudo ddrescue <in_file> <out_file>

そしてもちろん| pvstdoutを進行状況監視ツールにパイプしたい場合。

1
Blairg23