web-dev-qa-db-ja.com

ハードディスクから使用中のスペースのみを複製

Linuxのハードディスクで使用中の領域のみを複製するために、dd、rsync、clonezilla、またはその他のツールを使用できますか? 1 TB HD(使用中の2 GBスペースのみ))から500 GB HDにバックアップする必要があります。

15
kroka

できますが、最初にディスクを準備する必要があります。コツは、スパースファイルまたは圧縮を使用することです。 この方法は時間がかかり、高いI/Oを生成します。あなたの場合(1 TB HDDで2GBを使用))ファイルのコピー(sawdustのコメントで提案されている)は、おそらくより良い解決策です。一方、たとえば、1 TBのうち850 GBが使用されていて、そこに多くの小さなファイルがあり、MBR、パーティションテーブル、メタデータを一度にすべてバックアップしたい場合、少なくとも私の方法は、画像ファイルに150 GB(データが十分に圧縮されていないと、500 GBのHDDに収まりません)。

ディスク使用量が多いユーザー向けにこれを書いています。また、ソースドライブは正常で、空のスペースを上書きできる必要があることに注意してください。私はソリューションを主にバックアップに提供しています。リカバリやフォレンジックではありません。時間とI/Oコストは、イメージの作成中だけでなく、イメージがディスクに書き戻された場合(ある場合)にも支払われます。 メソッドがあなたに適しているかどうか、もう一度考えてください。

/dev/sdbのクローンを作成する必要があり、いくつかのパーティションがあるとします:/dev/sdb1/dev/sdb2

準備

スパースファイルまたは圧縮を最大限に活用するには、空のスペースをゼロで上書きする必要があります。

## Most commands need Sudo.
mount -o rw /dev/sdb1 /mnt
dd if=/dev/zero of=/mnt/zero_file bs=32M
## Long wait here. Expect "no space left on device".
sync
rm /mnt/zero_file
umount /dev/sdb1
## Repeat this with /dev/sdb2, /dev/sdb3 etc.

Windowsパーティションの場合、Windowsの休止状態により問題が発生する可能性があります。 this をお読みください。

パーティションレイアウトに大きなギャップがある場合は、ゼロで埋める必要もあります。スワップパーティション(存在する場合)は、結果のイメージをできるだけ小さくするために特別な処理が必要です。 hiberfil.syspagefile.sysswapfile.sysなどのWindowsファイルは、zero_fileを作成する前に削除される場合があります。これらのケースについては、ここでは詳しく説明しません。

スパースファイル方式

この方法は、ターゲットファイルシステム(画像ファイルが保存される場所)がスパースファイルをサポートしている場合に使用できます。スパース画像ファイルを生成するには、以下を呼び出します。

## dd probably needs Sudo here.
dd if=/dev/sdb of=/foo/bar/my_image.dd bs=512 conv=sparse

(編集:元々はbs=32Mがありましたが、conv=sparseには適していません。比較してください この質問 。)

画像を書き戻すには:

## dd probably needs Sudo here.
dd if=/foo/bar/my_image.dd of=/dev/sdb bs=32M

利点:

  • イメージをマウントして(mount -o offset=…またはkpartxを使用)、その中のファイルにアクセスできます。

短所:

  • ターゲットファイルシステムはスパースファイルをサポートする必要があります。
  • cp --sparse=always)をコピーしている間は、まばらにしておく必要があります。

圧縮ファイル方式

画像を生成するには:

## dd probably needs Sudo here.
dd if=/dev/sdb bs=32M | gzip -c > /foo/bar/my_image.dd.gz

画像を書き戻すには:

## dd probably needs Sudo here.
gzip -cd < /foo/bar/my_image.dd.gz | dd of=/dev/sdb bs=32M

これらのコマンドは、ddなしで、gzipのみでビルドされる場合があります。 ddを使用して、32 MiBのバッファーを確保しました。

利点:

  • 結果のファイルは非スパースであり、特別な処理は必要ありません。
  • ソースディスク上のファイルが圧縮されやすい場合、イメージサイズはさらに縮小されます。

短所:

  • 完全に解凍しないと、圧縮されたイメージ内のファイルにアクセスするのは困難です(一部のFuseは役立つかもしれませんが、わかりませんが、試したことはありません。 squashfsアプローチ を検討してください)。

ヒント

  • この回答の最初のバージョンを書いてからずっと後に、私は virt-sparsify ツールがあることを知りました。便利そうです。

  • 進行状況を監視するには、status=progressオペランドを指定してddを呼び出します。 ddがそれなしですでに実行されている場合(たとえば、ddstatus=progressをサポートしていないか、使用するのを忘れた場合)、USR1信号をツールに送信します。

    kill -s USR1 $(pidof dd)
    

    必要に応じて繰り返します。

    別の方法として、pvを使用して読み取ることもできます。例:

    pv -B 32m /dev/sdb | dd of=/foo/bar/my_image.dd bs=512 conv=sparse
    pv -B 32m /dev/sdb | gzip -c > /foo/bar/my_image.dd.gz
    
  • 高速に圧縮するにはgzip --fastを使用し、最適に圧縮するにはgzip --bestを使用します。その他のオプションについては、man gzipを参照してください。

  • 可能であれば、pigzの代わりにgzipを使用してください。 pigzは複数のプロセッサコアを利用できるため、これにより処理速度が向上します。必要に応じて別のコンプレッサーを使用できます。

24

ターゲットディスクがすでにフォーマットされている場合、2番目のディスクは最初のディスクと同じマシンに接続され、マウントされます。LinuxまたはMacを実行している場合:

rsync -avP --ignore=/media/disk2 / /media/disk2

ターゲットディスクがすでにフォーマットされている場合、2番目のディスクはフォーマットされ、別のPCにマウントされます。LinuxまたはMacを実行している場合:

rsync -avP / user@ip_of_disk2_Host:/media/disk2

これは、基礎となるドライブに関係なく、ファイルのバックアップが必要なだけであると想定しています。これはPER FILEバックアップを実行し、わずか2 GBのデータでかなり高速に実行されます。

1
UtahJarhead