パーティション全体またはハードドライブ全体をより大きな外付けディスクに複製するのが好きですが、スパースファイルを作成するのが好きです。クローンにはdd
をよく使用しますが、スパースファイルはサポートしていません。回避策として、私は次のようなものを使用しました:
cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw
しかし、これは私の好みには少しトリッキーであり、中止された場合にプロセスを再開することはできません。これ(ntfsclone
)用のNTFSツールがあるのはおかしいですが、Linux(EXT2-4)のネイティブファイルシステムにはそのようなツールはありません。
これのためのより良いツールがありますか?スパースサポートのあるdd
バリアント?ディスクバックアップ用の独自のソフトウェアを探していませんが、必要に応じてループデバイスとしてマウントできるスパースクローンコピーを作成したいだけです。
あなたが欲しい dd_rescue
。
dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw
完全を期すために 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
または、必要に応じて MiBs :
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw
レスキューを中断して再開できるようにするには、ログファイルを使用することもできます。
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log
GNU ddrescue
およびdd_rescue
は異なるプログラムです。しかし、GNU ddrescue
はより広く普及しているようです。たとえば、すでに [〜#〜] grml [〜#〜])でパッケージ化されています 。
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
編集:それをスクラッチ。もちろん、2番目のdd
は、入力と同じ長さではないため、出力ファイル内の間違った位置にシークしています。
ちょうど私の2セントを追加します。 rawディスクからスパースファイルを作成する別の方法は、 qemu-img を使用することです。
qemu-img convert -f raw /dev/sda /tmp/sda.raw
これは単一のパーティションでも使用できます。また、生のディスク/パーティションをqemu-imgがサポートする他の形式(QCOW2、VHD [x]、vmdkなど)に変換するオプションもあります。
別のオプションは rsync です。例えば:
rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw
説明:
-S
/--sparse
書き込み時にスパースブロックをスキップする-P
/--partial --progress
進行状況を表示し、部分的に転送されたファイルを保持します--copy-devices
デバイスのコンテンツをコピーするあなたは付け加えられます --append
中断されたコピーを再開するには(または--append-verify
を使用して、新しいデータと古いデータの両方に対するチェックサムを確認します)。
Edit:私は気づきました copy-devices.diff は検討中であり、多くのシステムには存在しない可能性があります(ただし、 Fedora 、 bunt 、 Debian などに含まれています)
注:これはコメントに記載されている理由で機能しません。参照用にここに残します。
Kill -USR1を使用してddの統計を監視します。
$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
/mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`
スキップ/シークを使用して再開:
$ 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統計をファイルに記録するのがおそらく最も簡単です。
xfsdump と xfsrestore かなり長い間ネイティブLinuxファイルシステムであったXFSの場合。
なぜ単純ではないのですか?
cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw