パーティション全体またはハードドライブをスパースファイルに複製する


35

パーティション全体またはハードドライブ全体をより大きな外部ディスクに複製したいのですが、スパースファイルを作成したいです。ddクローン作成によく使用しますが、スパースファイルはサポートしていません。回避策として、次のようなものを使用しました。

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

しかし、これは私の趣味にはややトリッキーすぎて、中止された場合にプロセスを再開することはできません。このためのNTFSツールがあることは面白いですが(ntfsclone)、Linuxのネイティブファイルシステム(EXT2-4)にはそのようなツールは存在しません。

ddスパースをサポートするバリアントなど、これに適したツールはありますか?ディスクバックアップ用の独自のソフトウェアは探していませんが、必要に応じてループデバイスとしてマウントできるスパースクローンコピーを作成したいだけです。


7
の創造的な使用のために+1がcp、ディスクイメージをまばらにコピーできるとは決して思いませんでした。スペースを節約する必要がある場合は、常に圧縮するだけです。なぜ質問ではそれが答えではないのですか?
カレブ

回答:


21

あなたが欲しいdd_rescue

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
すばらしいです!マニュアルには、「コピー処理がユーザーによって中断された場合、後で任意の位置で続行することが可能です」と書かれています。および「-a spArseファイルの書き込み(デフォルト= no)」。まさに私が欲しいもの!ありがとう!
マーティンシャーラー

3
dd_rescueオンラインを探して、ddrescue独立して開発された(アンダースコアなしの)別のツールもあることがわかりましたが、dd_rescue基本的には同じように見えます。ここで一般的な参考資料として言及します。
マーティン

うん、dd_rescueddrescue同じものではありません。理論的には彼らは同じ仕事をしますが、一般的に私はより古い/オリジナルで幸運がありましたdd_rescue
スティーブンプリチャード

1
誰かが疑問に思っている場合は、Ctrl-Cでいつでもコピーを停止できます。現在の位置が表示さ-sれ、元のコマンドに位置を追加することにより、その値を使用して再起動できます。(だからそれのようになりますdd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw。)
スティーブンプリチャード

1
@Steven Pritchard:位置を覚える必要はありません。3番目のファイル名を指定します。これはログファイルになり、再起動時にそれを読み取り、中断した場所から再開します。
タニスローゼンバウム14年

20

完全を期すために、ddrescueの呼び出し。--sparseまたは-Sフラグ宛先がまばらに書き込まれることを可能にします。

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

または、長いオプション:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

または、MiBを好む場合

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

レスキューを中断して再開できるようにするには、ログファイルを使用することもできます。

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

GNU ddrescuedd_rescueは異なるプログラムであることに注意してください。しかし、GNU ddrescueはより普及しているようです。たとえば、すでにGRMLでパッケージ化されています。


復元時にイメージの特別な処理が必要ですか?ddrescueの復元に使用するコマンドを提供できますか?
user12439

理論的には、レスキューに使用している記憶媒体はより信頼性が高いと想定されているため、通常はddを使用して交換ディスクに書き込むことができますdd if=sda1.raw of=/dev/sdb1。ただし、復元にddrescueを使用するには、レスキューに使用したソース/宛先を、できれば新しいログファイルを使用して、新しいソース/宛先に変更するだけです。可能であれば(そうでない場合が多い)、もちろんddrescueを使用して、不良ソースディスクから交換ディスクにデータを直接コピーできます。
zaTricky

3

GNU ddでスパースファイルサポートを提供するために2007年に提供れたパッチがありましたが、coreutilsには組み込まれていなかったようです(少なくとも8.4では)。それ以降、ddがあまりにも大きく変更されたとは思わないので、パッチは多くの作業なしで現在のバージョンに適用される可能性があります。

私はcpあなたの質問での創造的な使用にも本当に感銘を受けており、それを使用して再開を達成する軌道に乗れました(ここでは〜80Mからソースに再開します):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

編集:スクラッチ。ddもちろん、2番目は出力と同じ長さではないため、出力ファイル内の間違った位置をシークします。


1
bhinesleyの答えの場合と同様に、正確な再開のためにddの進行状況をログに記録することをお勧めします。最初の実行と再開の両方にこのアプローチを使用し、両方のパラレルddを独立してログに記録する場合、シークする出力までの距離を知ることができます。時間があれば、これを解決しようとします。
エリヘディ

2
パッチへのリンクをありがとう。私は自分でそのようなものをプログラミングすることを考え始めていました:-)スパースファイルはpipできないため、コードは機能しません。
マーティンシャーラー

うん、私は自分自身を発見しました。まあ、それはクレイジーな新しい用途を見つけるのは楽しかったですcp-ありがとう!
エリヘディ

1
2012年のddコミット:git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd:conv = sparseオプションのサポートを追加"( "(iwrite):NULブロックの書き込みをシークに変換要求された場合。 ")
osgx

1

私の2セントを追加するだけです。rawディスクからスパースファイルを作成する別の方法は、次のようなものを使用してqemu-imgを使用することです。

qemu-img convert -f raw /dev/sda /tmp/sda.raw

これは単一のパーティションでも使用できます。また、rawディスク/パーティションをqemu-imgがサポートする他の形式(QCOW2、VHD [x]、vmdkなど)に変換するオプションがあります


1

別のオプションはrsyncです。例えば:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

説明:

  • -S/ --sparse書き込み時にスパースブロックをスキップする
  • -P/ --partial --progress進行状況を表示し、部分的に転送されたファイルを保持する
  • --copy-devices デバイスの内容をコピーするには

--append中断されたコピーを再開するために追加することができます(または--append-verify、新しいデータと古いデータの両方の一致についてチェックサムを確認するため)。

編集copy-devices.diffは検討中であり、多くのシステムには存在しない可能性があることに気付きました(ただし、FedoraUbuntuDebianなどに含まれています)


0

注:これはコメントに記載されている理由により機能しません。参照用にここに残しておきます。

kill -USR1を使用して、ddの統計を監視します。

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

skip / seekを使用して再開します。

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

$ i_bytesがなければ、再開するのがより困難になります。マシンがクラッシュした場合など、dd統計をファイルに記録するのがおそらく最も簡単です。


2番目cpは既存のファイルを上書きするだけです。skipとのその他のオプションを知っていますdd。問題はそのcp一部です。
マーティンシャーラー

うん、そうだね。
-bhinesley


0

なぜ単純ではない:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.