web-dev-qa-db-ja.com

ddが同じディスクからの読み取りと同じディスクへの書き込みを行うのはなぜですか?

Linuxでddを使用して、外付けUSBハードドライブを上書きしてきました。

次のコマンドで、デフォルトのブロックサイズである512バイトを使用する場合:

# dd if=/dev/zero of=/dev/sdb

操作全体を通して、ハードドライブ(/ dev/sdb)は、一度に約1GBずつ交互に読み書きされます。つまりread 1GB...write 1GB...read 1GB...write 1GBなど。ハードドライブに書き込まれるのと同じ量のデータがハードドライブから読み取られます。

カスタムのConkyパネルに表示されているため、これが発生していることはわかっています(diskio_readdiskio_write)、これはディスクI/Oアクティビティの100%信頼できる指標であることがわかっています。

別のコンピューターの別の外付けハードドライブを使用してこれを繰り返しました。 USB2.0とUSB3.0の両方を介して発生します。

対照的に、私が同じことをするが、代わりに1MBのブロックサイズを使用する場合、次のコマンドを使用します。

# dd if=/dev/zero of=/dev/sdb bs=1M

起動時の少量の読み取りを除いて、操作中にハードドライブはまったく読み取られません。

この現象が私の2つの異なるコンピューターと2つの異なるハードドライブで発生し、標準のLinuxディストリビューション(Xubuntu 14.04)を使用していることを考えると、おそらく自分のコンピューターでそれを複製できるはずです。

誰かがここで何が起こっているのか説明できますか?

5
EmmaV

ディスクのブロックサイズ(多くの場合4096バイトですが、最近はそれ以上)よりも小さいブロックサイズ(512バイト)を指定すると、ブロックは部分的に書き込まれるため、ブロックの残りの内容を保持する必要があります。書く前に。

これは、512バイトだけではディスクブロックに書き込むことができないためですが、一度に完全なブロック(4096以上)を書き込む必要があります。この(4096)以上の量を書き込む場合、部分的な書き込みがないため、読み取る必要はありません。

5
ctrl-d

これは基本的に、LinuxシステムでのバッファI/Oの症状です。 ddコマンドに関連するこれの概要は次の場所にあります ddに対するbsパラメーターの最適値を決定する方法はありますか? これはctrl-dの答えをサポートします。ただし、これは、ブロックサイズがさらに大きい(つまり、1Mを超える)とパフォーマンスがさらに向上する可能性があることも示唆しています。

0
Thomas N