DDコマンドで物理ディスクをバックアップする

どうも、どうも。久しぶりの更新です。
ゴタゴタが続いてたり、続いていなかったりでして。
更新するような感じのことができていません(勉強しろ)
まぁそんなどうでもいいことは置いておきまして、本題に入ります。

発端


最近、とある目的のためにWindowsPCを買いました。
中古で安く買ったのはいいのですが、ライセンス的なもので復旧用のディスクを頂けませんでした。
頂けない上にちょっとアレな感じなところもありまして・・・

とりあえず、以下でゴニョゴニョやってみました。

  1. Windows7に標準で搭載されているバックアップツール
  2. 出処不明のリカバリーディスク

結果として、どちらも失敗でした。
1はリカバーしたら古い情報も残ります。
残るだけならまだしも、色々ファイルも消えます。
2なんかは、インストールでドライバー用意しろと言われました。
なんか、ディスク起動もやたら遅いので怪しい感じ。。。

仕方ないので、ディスク換装した上に
元のドライブのデータを全て換装後のディスクにコピーして保存するようにしました。

バックアップ方法


ディスクのバックアップ方法ですが、「dd」コマンドを使用します。
このコマンドですが、「ハードディスク・パーティションを0/1の信号のママ丸ごとコピー」するものです。
注意点とすれば、以下のことでしょうか。

  • ハードディスクの容量がコピー元以上であること
  • コマンドで指定するディスクを間違えて指定した場合、データが消滅すること

バックアップ例


以下のような条件とします。

  • ディスクサイズは、「コピー先HDD ≧コピー元HDD」の大きさとすること
  • パーティションは、mountしないこと
  • コピー元HDDのパス、「/dev/sdb」
  • コピー先HDDのパス、/dev/sdc」

以下のコマンドで、上記のデータをコピーすることができます。

1
$dd if=/dev/sdb of=/dev/sdc bs=512 conv=noerror,sync

これで、コピーができます。 但し、完了までに数時間かかります。

さて、これでディスクからディスクにコピーすることができました。 それだけでなくバックアップ用のディスクイメージをつくることが出来ます

1
$dd if=/dev/sdb of=./backup-disk-image.img bs=512 conv=noerror,sync

故障ディスクのコピー


上記のコマンドを使えば、故障している(ある程度読める必要がありますが)ものまでコピーできます。
まぁ強引に読んでる(読めないところは、スキップしています)だけです。

上記のコマンドに設定しているオプションは、以下の表の意味です。

オプション 内容
noerror エラー読み飛ばし
sync エラー箇所をNUL(ゼロ)で埋める
bs byte size 読込書き出すバイトサイズ

因みに、byte size値が大きいとコピー速度が速くなります。
但し、壊れている部分があると道連れになる部分が大きくなります。
なので、byte size値を小さくするとエラー範囲は最小になります(コピー速度が遅くなります)

転送状況の表示


ddコマンドには、転送状況を表示してくれるようなオプションはありません。
以下のように、killallコマンドのUSRオプションで途中経過を表示できます。

1
$killall -USR1 dd 

これで、どれくらいかかるか時間計算ができますね。

ディスクイメージからの復元方法


ディスクイメージのバックアップは取れましたが、ディスクイメージからの復元が必要ですね。
といっても、ここまでで大まかに理解できそうな感じがしますが・・・

1
$dd if=./backup-disk-image.img of=/dev/sdb bs=512 conv=noerror,sync

コピー元とコピー先を入れ替えるだけですね。

ディスクの消去


復元と同じ要領で、zero埋めすれば完全フォーマットができます。

1
$dd if=/dev/zero of=/dev/sdc

このコマンド本当に便利。
LinuxとかMacのディスクだけでなくって、Windowsなディスクまで丸ごとコピーできるところが素敵。
ファイル指定はできないけどw