web-dev-qa-db-ja.com

`dd if = / dev / zero of = / dev / sda`は何をしますか

編集済み:データを破棄したくない場合を除き、これを実行してテストしないでください。

誰かが私が得たものを理解するのを手伝ってくれませんか?

  1. _dd if=/dev/zero of=/dev/sda bs=4096 count=4096_

    Q:countが具体的に4096なのはなぜですか?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    Q:これは正確に何をしますか?

19
J H

dd if =/dev/zero of =/dev/sda bs = 4096 count = 4096 Q:なぜ4096が特にカウンタに使用されているのですか?

これにより、ドライブの最初の16 MiBがゼロになります。 16 MiBは、「ディスクの始まり」の構造を核にするのにおそらく十分以上の大きさであり、それほど長くはかからないほど小さいです。

dd if =/dev/zero of =/dev/sda bs = 512 count = 4096 seek = $(expr blockdev --getsz/dev/sda-​​4096)

Q:これは正確には何ですか?

blockdev --getszブロックデバイスのサイズを「512バイトセクター」で取得します。したがって、このコマンドは、ドライブの最後の2 MiBをゼロにすることを目的としたもののようです。

残念ながら、このコマンドは構文的には壊れています。コマンドはもともと意図されていたと思います

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

そして、バックティックは、さまざまな環境間でコピー/貼り付けを行う人々の行に沿ってどこかで失われました。

古いパーティションテーブル、LVMメタデータ、raidメタデータなどは、ドライブの再利用時に問題を引き起こす可能性があります。ドライブの最初と最後のセクションをゼロにすることで、ドライブ全体をゼロにするよりもはるかに速く、一般にこれらの問題を回避できます。

45
plugwash

これにより、ハードドライブの最初の4096*4096=16MBと最後の512*4096=2MBが消去されます。これらには、リカバリに役立つ重要な構造が含まれています。このコードは悪意を持って投稿されたと思います。

1以外のcountを明示的に指定した方が便利な状況に遭遇したことはありません。 I have MBRの痕跡を残さないようにしたい場合は、最初のブロックを消去しました...

17
o11c

これらのコマンドは、sdaデバイスをゼロで上書きします。最初のコマンドは最初の16MB(ブロックサイズ4096、カウント4096ブロック)を実行し、2番目のコマンドは最後の2MB(512ブロックサイズ、4096ブロック)をゼロで上書きします。 (それは技術的に消去することではなく、それは以下の私の最初のポイントに関連しています。)

(これは、他の回答ですでに言及されている部分であり、完全を期すためにここにも含まれています)

言及する価値のあるもう1つのことは、ブロックサイズには影響があることですが、それらは通常、大量の操作でのみ見られます。コマンドを実行する最も効率的な(最も速い)方法は、コマンドのブロックサイズがデバイスのアクセスサイズと一致する場合です。そうでない場合、時間が無駄になります。

興味がある場合は、100万個の1ブロックチャンクを含むファイルと100万個のブロックチャンクを含むファイルを作成して、違いを確認してください。

[user@Host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@Host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@Host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

ご覧のとおり、ブロックサイズは効率に大きな影響を与えます。それはおそらくOPのサイドバーですが、私はそれがまだ関連していると感じています。

TL; DR:ネット上で見つけた任意のコードを実行しないでください。または、信頼できない誰かがあなたに与えるものは実行しないでください。1日が台無しになります。

4
Tim S.

警告:dd if=/dev/zero of=/dev/は、データを法医学的にコピーする前にドライブまたはデバイスをクリーニングするために使用されます。相互汚染を軽減するために、法医学調査中のシステムから情報をコピーする前に、ドライブまたはデバイスを常に消毒する必要があります。したがって、それは悪いコマンドではありません。エンドユーザーはそれが何のために使用されるかを理解する必要があります。そうしないと、データが破壊されます。これがあなたが望むものであれば、ゼロ書き込み操作を確認するにはdd if=/dev/sda | hexdump -C | head

出典:Darren Hayes博士によるコンピュータフォレンジック調査の実用的なガイド

2
SierraJuliet

他の人は彼らが何をするかを説明したので、私はそれをスキップします。

ddbscountの引数を別々に持つ点は、bsが書き込む量を制御することです一度にbsに非常に大きな値を指定すると、プログラムに非常に大きなバッファーが必要になり、カーネルがデバイス全体に書き込むためにブロック全体を構築する必要があるため、デバイスのブロックサイズより小さい値を指定すると遅くなります(このような場合、おそらく完全なブロックができるまで書き込みをバッファリングできます。それ以外の場合は、すでにディスクにあるものを読み取る必要があるかもしれません)。 2つのコマンドはbsに異なる値を使用するため、2つの異なるサイトでそれらを見つけた可能性があると思います。ハードディスクのブロックサイズは512バイトで、後者のコマンドの_bs=512_に対応していましたが、数年前(6-8年だと思います)に、ブロックサイズが4096バイトのディスクを作成し、_bs=4096_最近のディスクにはより良い選択です。

私が使う dd if=/dev/zero of=/dev/sdX oflag=sync実際にディスクイメージでgparted、fdisk、またはddを使用する前に、挿入されたUSBドライブまたはMicroSDカードの品質をテストします。これは、特に品質の歴史が乏しいMicroSDメディアでは、賢明なアイデアだと思います。

もちろん、偶発的なディスクの消去は許されないため、of = sdXには注意してください。 X =目的のターゲットのドライブ文字であることを確認します。

1
Richard