web-dev-qa-db-ja.com

ディスクのクローン作成にDDを使用する

ディスクのクローン作成ツールに関しては多くの質問があり、ddは少なくとも一度は提案されています。私はすでにddを自分で使用することを検討しました。これは、主に使いやすさ、そしてほとんどすべての起動可能なLinuxディストリビューションですぐに利用できることを理由としています。

ディスクのクローンにddを使用する最良の方法は何ですか?私は簡単なGoogle検索を行いましたが、最初の結果は明らかな 失敗した試み でした。 ddを使用した後に行う必要があることはありますか?つまり、ddを使用して読み取ることができないものはありますか?

187
falstro

ddは間違いなく最高のクローン作成ツールです。次のコマンドを使用するだけで100%のレプリカが作成されます。一度も問題が発生したことはありません。

dd if=/dev/sda of=/dev/sdb bs=32M

すべてのバイトを複製する間、使用されているドライブまたはパーティションでこれを使用しないでください。特にデータベースのようなアプリケーションはこれにうまく対応できず、データが破損する可能性があります。

165
Adam Gibbins

スペースを節約するために、ddによって生成されたデータをgzipで圧縮できます。例:

dd if=/dev/hdb | gzip -c  > /image.img

次の方法でディスクを復元できます。

gunzip -c /image.img.gz | dd of=/dev/hdb

さらに多くのスペースを節約するには、クローンを作成するドライブ/パーティションを事前にデフラグし(該当する場合)、残りの未使用スペースをすべてゼロにして、gzipによる圧縮を容易にします。

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

少し待ってから、ddは最終的に「ディスクがいっぱいです」というメッセージで失敗します。

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

また、killコマンドを使用してシグナルを送信することにより、バックグラウンドでddプロセスを実行してステータスを報告することもできます。例:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

システムを確認してください-上記のコマンドはLinux、OSXおよびBSDのddコマンド用ですが、受け入れる信号が異なります(OSXはSIGINFOを使用します-押すことができます Ctrl+T ステータスを報告します)。

119
David Hicks

[〜#〜]注意[〜#〜]:ライブファイルシステムを削除すると、ファイルが破損する可能性があります。その理由は単純で、進行中の可能性のあるファイルシステムのアクティビティを理解しておらず、緩和しようとはしていません。書き込みが部分的に進行中の場合、部分的な書き込みが行われます。これは通常、物事には良くなく、データベースにとっては致命的です。さらに、誤植しやすいifofのパラメータを台無しにすると、悲惨になります。ほとんどの場合、rsyncmultitasking の登場後に書かれた同等に効果的なツールであり、個々のファイルの一貫したビューを提供します。

ただし、DDは、マウントされていないドライブのビット状態を正確にキャプチャする必要があります。ブートローダー、llvmボリューム、パーティションUUIDとラベルなど。ターゲットドライブを少しずつミラーリングできるドライブがあることを確認してください。

39
jldugger

Ddを使用して不良セクターが含まれている可能性のあるディスクのクローンを作成する場合は、「conv = noerror、sync」を使用して、エラーが発生しても停止せず、不足しているセクターをnullバイトで埋めます。これは通常、障害が発生したディスクまたは障害が発生したディスクから回復しようとする場合の最初のステップです。回復を試みる前にコピーを取得し、正常な(クローン)ディスクで回復を実行します。コピーできなかった空白セクターに対処するために、それを回復ツールに任せます。

また、ddの速度がbs(ブロックサイズ)設定の影響を受ける可能性があることもわかります。私は通常bs = 32768を試しますが、自分のシステムでそれをテストして、何が最も速く機能するかを確認することもできます。 (これは、たとえばテープに書き込む場合など、別の理由で特定のブロックサイズを使用する必要がないことを前提としています。)

26
TimB

ディスクのクローンを作成するために必要なのは、ddへの入力と出力を指定することだけです。

dd if=/dev/hdb of=/image.img

もちろん、/ dev/hdb(ルートとして実行することをお勧めします)から直接読み取るための適切な権限があり、/ dev/hdbがマウントされていないことを確認してください(ディスクの変更中にコピーする必要はありません-読み取り専用としてマウントすることもできます)。完了すると、image.imgはディスク全体のバイト単位のクローンになります。

ディスクのクローンを作成するためにddを使用することにはいくつかの欠点があります。まず、ddはディスク全体をコピーします。空のスペースもコピーします。大きなディスクで実行すると、非常に大きなイメージファイルが生成される可能性があります。第2に、ddは進行状況をまったく示しません。これは、コピーに長時間かかるため、イライラする可能性があります。 3番目に、このイメージを他のドライブにコピーする場合(ここでもddを使用)、それらは元のディスクと同じかそれ以上である必要がありますが、ターゲットディスク上にある可能性のある追加のスペースは使用するまで使用できません。パーティションのサイズを変更します。

ディスクからディスクへの直接コピーを行うこともできます。

dd if=/dev/hdb of=/dev/hdc

ただし、空き容量に関しては上記の制限があります。

問題や落とし穴に関する限り、ddは大部分が優れた仕事をします。しかし、少し前に、死にかけようとしているハードドライブがあったため、完全に死ぬ前に、ddを使用して、オフにできる情報をコピーしてみました。その後、ddは読み取りエラーを適切に処理しないことがわかりました。ディスク上にddが読み取れなかったセクターがいくつかあったため、ddはあきらめてコピーを停止しました。当時、読み取りエラーが発生したにもかかわらずddに続行するように指示する方法が見つからなかったため( それが表示されている場合 設定があるかのように)、手動で指定するのにかなりの時間を費やしましたスキップして、読み取り不可能なセクションを飛び越えようとします。

この問題の解決策を調査す​​るのにしばらく時間を費やしました(タスクを完了した後) ddrescue と呼ばれるプログラムを見つけました。サイトによると、これはddのように動作しますが、エラー。私は実際にプログラムを使用したことはありませんが、特にコピー元のディスクが古く、システムが正常に見えても不良セクターがある可能性がある場合は、検討する価値があります。

17
Kyle Cronin

ソースドライブがまったく損傷している場合は、 dd_rhelpdd_rescue(私の好み)またはGNU ddrescue

この背後にある理由は、読み取りエラーが発生すると、ddが試行錯誤を繰り返し、タイムアウトが発生するまで長時間待機する可能性があるためです。 dd_rescueは、エラーまで読み取り、次にディスク上のスポットを選択し、最後のエラーまで逆方向に読み取るなどのスマートなことを行います。dd_rhelpは基本的にdd_rescueセッションマネージャーです-巧妙ですdd_rescueの実行を開始して再開すると、再び速くなります。

dd_rhelpの最終結果は、最小限の時間で最大のデータを回復することです。 dd_rhelpを実行したままにすると、最終的にはddとまったく同じジョブを同時に実行します。ただし、ddが100Gbディスクのバイト100で読み取りエラーを検出した場合、他の9,999,900バイト*を回復するために長時間待つ必要がありますが、dd_rhelp + dd_rescueはデータの大部分をはるかに速く回復します。

11
Ben Williams

ソースディスクにはマウントされたファイルシステムがあってはなりません。ブロックデバイスを読み取ることができるユーザー(rootが機能する)として、「dd if =/dev/sda ....」を実行します。

さて、ここで優れた点の1つは、バイトのストリームを作成していることです。それを使用して、圧縮、ネットワーク経由での送信、小さなBlobへのチャンクの分割など、さまざまなことができます。

例えば:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

しかし、より強力に:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

上記は、ソースハードドライブの圧縮イメージをリモートシステムにコピーし、ソースホストの名前を使用して番号付きの2Gチャンクに保存します。

ディスクのサイズ、ソースでのCPUの速度、宛先でのCPUの速度、ネットワークの速度などに応じて、圧縮をスキップするか、リモート側で圧縮を実行するか、sshの圧縮を有効にしてください。

7
retracile

ディスクのクローンを作成するために必要なのは、ddへの入力と出力を指定することだけです。

dd if=/dev/hdb of=hdb.img

もちろん、/dev/hdb(ルートとして実行することをお勧めします)から直接読み取るための適切な権限があり、/dev/hdbがマウントされていないことを確認してください(ディスクが変更されています)。完了すると、hdb.imgはディスク全体のバイト単位のクローンになります。

ddを使用してディスクのクローンを作成することには、いくつかの欠点があります。まず、ddはディスク全体をコピーします。空のスペースも含まれます。大きなディスクで実行すると、非常に大きなイメージファイルが作成される可能性があります。第2に、ddは進行状況をまったく示しません。これは、コピーに時間がかかるため、イライラする可能性があります。 3番目に、このイメージを他のドライブにコピーする場合(ここでもddを使用)、それらは元のディスクと同じかそれ以上である必要がありますが、ターゲットディスク上にある可能性のある追加のスペースは使用するまで使用できません。パーティションのサイズを変更します。

ディスクからディスクへの直接コピーを行うこともできます。

dd if=/dev/hdb of=/dev/hdc

ただし、空き容量に関しては上記の制限があります。

最初の欠点は、コピーを作成するときにデータをgzip圧縮することで解決できます。例えば:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

2番目の欠点は、pipeview(pv)ツールを使用して解決できます。例えば:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

3番目の欠点を克服する方法は知りません。

さらに、ddに大きなデータチャンクを処理するように指示することで、コピー時間を短縮できます。例えば:

dd if=/dev/hdb of=hdb.img bs=1024
6
James Sumners

Ddおよびレスキューディスクで実行できるもう1つの良い点は、ネットワーク経由でデータをコピーすることです。

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

ネットワークがローカルでない場合は、これらのパイプラインの両方でgzipを使用できます。進行状況については、pvを使用してください。コピーが完了した後でlocal_machineのnetcatを終了するには、-w 5または何かを追加します。

5
user5692

Ddはすべての空白スペースを含めて正確なコピーを作成することに注意してください。

つまり:

  1. 2番目のドライブは、少なくとも最初のドライブと同じ大きさでなければなりません
  2. 2番目のドライブが大きい場合、余分なスペースが無駄になります(ファイルシステムできますを拡張できます)
  3. ソースドライブがいっぱいでない場合、ddは多くの時間を無駄にコピーして空白スペースをコピーします。
  4. この方法で、ドライブ全体または単一のパーティションをコピーできます。
  5. これが起動可能なドライブである場合、ddを使用した後にブートローダーをインストールする必要があると確信しています

お役に立てば幸い

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

これはディスクをコピーし、エラーのあるブロックをスキップします。これは非常に重要です。

これらは、ddを使用してディスクをクローンまたはレスキューするための基本的かつ不可欠なオプションです。

私は別の回答を投稿したくありませんでしたが、すでに投稿された25の中には、本質的な「conv = sync、noerror」オプションで良い回答がありませんでした。

4
Sam Watkins

あなたは実際にこのようなものを試すことができます

 dd if =/dev/sda2 of =/dev/sdb2 bs = 4096 conv = sync、noerror 

すべてのエラーをスキップして、パーティションまたはハードドライブの正確なクローンを作成する

3
hirol

もう1つの重要な機能は、MBR、パーティションテーブル、およびブートレコードのコピーです。

ただ

dd if=/dev/sda of=parttable bs=512 count=1

そして、あなたがそれを書いているときの周りの他の方向。後はfdiskでポーランド語にします。

パーティションテーブルをバックアップすると、はるかに安全になります。

また、別のハードドライブへの移行(パーティションの構造を変更している間)を楽しいものにします。

3
alamar

将来の参考のために、 ddrescue を確認することは興味深いでしょう。それは私の日を数回救いました。

3
Anders Hansson

これは安価なハックのようなものですが、DDプロセスを監視するための迅速で汚れた方法です。

Ddコマンドを実行します。新しいシェルを開き、ps awxを実行してddプロセスのPIDを見つけます。新しいシェルタイプのwatch -n 10 kill -USR1 {DDプロセスのpid}

これは監視出力ウィンドウでは何もしませんが、元のDDシェルに戻ると、DDは10秒ごとにステータスレポートの出力を開始します。もちろん、watchコマンドの-n 10を他の任意の時間枠に変更できます。

タキオン

3
Tachyon

ほとんどの情報は以前に挿入されたレシピで説明されていましたが、すべてが説明されていたわけではありません。

Linuxでは、ddコマンドでハードドライブまたはパーティションをクローンできます。注意、間違いをすると、すべてのデータが失われます。

最初は、宛先を使用しないでください。次に、ソースを使用しないでください。または、読み取り専用モードに再マウントしてください。そうしないと、コピーが破損します。再マウントできない場合は、ブート可能なドライブ(hdd/ssd/pendrive)をLinuxライブディストリビューションにしてください。私はknoppixをpreverしますが、これはあなたの選択です。可能であれば、システムレベルを1にブートまたは変更してシングルユーザーモードにするか、システムを直接リブートしてシングルユーザーモードにすることができます。これはディストリビューションによって異なります。パーティションを1つだけ複製する場合は、このパーティションをアンマウントするか、ROに再マウントする必要があります。

umount /mountpoint_or_device

または

remount -o,ro /mountpoint_or_device

ハードドライブ全体のクローンを作成する場合は、すべてのパーティションをアンマウントまたは再マウントする必要があります。

ソースおよび宛先デバイスを識別する必要があります。 dmesgを参照してください。ここには、デバイスに関するすべての必要な情報が格納されています。ベンダーなども使用できます。別の方法として、デバイスサイズに基づいて識別することもできます。次に、宛先はソースと同じか、それより大きくなければなりません。ソースを計算する必要があります。例:fdisk -l/dev/sdaパーティションジオメトリを除く(GPTが存在する場合があります)、フェッチするのは次のとおりです。1. GBとバイトの合計ディスクサイズ2.履歴ジオメトリと合計セクター数、非常に重要な情報3.バイト単位のブロックサイズ。通常は512です。

例えば:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

次に、512分周器より大きなものを試してみましょう。41943040の物理セクターがあります。

41943040/256 = 163840、非常に良いです。256セクターの一括コピーを実行できます。もっとできる?試してみましょう:41943040/1024 = 40960、これで十分だと思います。これを選択します。セクターグループのサイズを数えてみましょう:512(セクターサイズ)* 1024 = 524288バイトeq 512K。次に、パラメーターbs = 512K以下を使用できますが、これを2 ^ xで割ります。大きな内部キャッシュを備えた最新のハードドライブの場合、これは十分実用的です。キャッシュがはるかに小さい古いドライブの場合、32K以下の値で十分です。

次に、準備ができたら、コピーを実行できます。ddif =/dev/source_devide of =/dev/destination_device bs = 32Kで、コピーが行われます。注意してください、どんな間違いでもあなたのインポートとデータを上書きします。宛先では、すべてが上書きされます。

破損したソースディスクのデータをレスキューする場合は、ネイティブセクターサイズを使用することをお勧めします。通常、これは512バイトです。オプションconv = notruncを追加します。そうでない場合、不良セクターによってドロップされたソースの穴は、宛先でシフトするセクターによって結合されます。これはコピーを損傷し、修復の機会がほとんどありません。コマンドは次のようになります:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

、そしてドライブとシステムがあきらめ、最後までセクターごとに歩くときは長い時間待ちます。

ddはパーティションを新しい場所に移動するための便利なツールです。単にパーティションを作成し、新しいパーティションにddを作成します(これはさらに大きくなる可能性があります)。可能な場合は、コピーされたファイルシステムを拡張して、すべての新しいパーティションを満たすために、ext3/ext4/xfs/zfs/btrfsにこの機能があります。最後に/ etc/fstabを変更し、可能であればumount/mountを変更するか、システムを再起動する必要があります。

もちろん、あらゆるタイプのパーティションのクローンを作成できます。 ddコマンドは、ファイルシステムタイプを調べません。構造は何もしません。このコマンドは、NTFSまたはその他のパーティションタイプのクローン作成に使用できます。

トリックがあります。パラメータを設定しなかった場合、ddは出力をstdoutに入れます。次に、ディスクまたはパーティションの圧縮されたrawコピーを作成できます。次に例を示します。

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

もちろん、これはオフラインで行う必要があります。これは次の方法で復元できます。

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

、すべてのsdaハードドライブがこのバックアップによって上書きされ、現在のデータはすべて失われます。これは、NTFS Windowsパーティションと、これで使用されるハードドライブでも実行できます。もちろん、選択に応じて、他の圧縮コマンドを使用できます。

2
Znik

進行状況を示すddを使用してコピーする方法(この場合はリモートマシンにコピーしますが、ローカルコピーにも同じ原理が適用されます)。

これは、ファイル記述子3を介して/ tmp/pidにpidを格納することで機能します。これは、信号USR1を使用した後続のkillに使用されます。しわは、サブシェルでstderrをフィルタリングすることにより、stderrの進行状況の出力を1行だけにフィルタリングすることでした。

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
2

ddは進捗情報を提供します-まあLinuxのほとんどのバージョン。 unixフレーバーを思い出さないが、覚えていないものを見たことがあります。

マニュアルページには、実行中の「dd」プロセスにUSR1シグナルを送信すると、I/O統計が標準エラーに出力され、コピーが再開されます。

私はこの機能を定期的に使用しています。

2
Steven

誰かがこれを言わなければならなかった:Clonezillaを試してみる(http:// clonezilla.org/)

何を手に入れますか?ファイルシステムの使用された部分のみをコピーします。 Clonezillaはdd、grub、sfdisk、parted、partimage、ntfsclone、partcloneを使用します。選択したオプションに応じて。

まともなドキュメントは次の場所にあります:http:// clonezilla.org/clonezilla-live/doc/

2
Roflo

gzipの代わりにbzip2またはddを使用して、その場でパーティション(またはディスク)の圧縮イメージファイルを作成できます。これは、リムーバブルメディアに画像を保存するのに最適です。

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

以前にディスクが頻繁に使用されている場合は、イメージングの前にすべての未使用領域をゼロで埋めることで圧縮を強化できます。

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

イメージを別のディスクに復元するには、次の手順を実行するだけです。

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
1
JCCyC

ディスク全体をddする場合に注意しなければならないことの1つは、これを行うと、受信ディスクのマスターブートレコードが上書きされることです。これには、パーティションテーブルとその他の重要な情報が含まれます。新しいディスクが古いディスクと同じでない場合、これはあらゆる種類のテーブルを作成する可能性があります。パーティションをコピーする方が一般的に安全です(そしてスワップパーティションをコピーする必要はありません)

0
Paul de Vrieze

私はもう何年も管理者の役割をしていませんが、「dd」は仕事を任されていることを知っています。私はこの技術を80年代後半にSun Sparcおよび386iコンピュータで定期的に使用しました。複数のQICテープで配布されたCADソフトウェアを実行している30を超える386iシステムで1つのクライアント注文がありました。

最初のコンピューターにインストールし、アプリを構成して、SunOSのsys-unconfigを実行し、ドライブを別のSCSIアドレスの靴箱に入れてから、他の30台のドライブの「dd」に進みました。

0
pbrooks100

言う必要がある初心者への警告:少なくとも一部のバージョンでは、bs = Xは、Xのサイズのメモリが文字通り割り当てられることを意味します。 RAMの1GBのシステムでbs = 2GBを使用していて、スワップが不十分だと、問題が発生します。

0
rackandboneman

何らかの理由で、オーディオトラックのあるCDをイメージングするときにddが失敗します。画像+ TOCファイルを取得するには、cdrdaoなどを使用する必要があります。

0
Matt

NTFSボリュームの場合、私は ntfsclone を使用することを好みます。 ntfsprogs パッケージの一部です。

0
Ed Brannin

他の人が前述したように、マウントされたファイルシステムのクローンを作成する際の問題の1つは、潜在的なデータ破損です。これは明らかにフルドライブクローンには適用されませんが、LVMを使用している場合は、LogicalVolumeをスナップショットして、スナップショットからddを作成し、一貫したイメージを取得できます。

0
Ophidian