web-dev-qa-db-ja.com

Linuxディスクイメージをスパースファイルに変換するにはどうすればよいですか?

Ddrescueで作成された多数のディスクイメージがEXTパーティションにあり、マウント可能な状態のまま、データを失うことなくサイズを小さくしたいと考えています。

イメージのファイルシステムの空のスペースをゼロで埋めてから、ファイルを スパースファイル に変換して、この空のスペースが実際にディスクに保存されないようにするにはどうすればよいですか?

例えば:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

ただし、これには実際には50Gの実際のデータしかないため、2番目の測定値ははるかに小さいはずです。

これはおそらく空のスペースをゼロで埋めます:

cat /dev/zero > zero.file
rm zero.file

しかし スパースファイルが透過的に処理される の場合、仮想ディスクに何も書き込まずに実際にスパースファイルが作成される可能性があるため、皮肉なことに、仮想ディスクイメージをスパースファイル自体に変換できません。 :)それはありますか?

注:何らかの理由で、Sudo dd if=/dev/zero of=./zero.fileは、マウントされたディスクイメージ上にcatがない場合に機能します。

12
endolith

まず、スパースファイルは、ゼロを書き込んだ場合ではなく、シークした場合にのみ透過的に処理されます。

より明確にするために、ウィキペディアからの例

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

notはゼロを書き込みません。出力ファイルを開き、5MBをシーク(ジャンプオーバー)してからゼロを書き込みます。 ゼロ(つまり、何もありません)。このコマンドは(ではありませんウィキペディアから)

dd if=/dev/zero of=sparse-file bs=1k count=5120

5MBのゼロを書き込み、スパースファイルを作成しません!

結果として、すでに非スパースであるファイルは、後で魔法のようにスパースになることはありません。

第二に、ゼロの多いスパースなファイルを作成するには、 cp itにする必要があります

cp --sparse=always original sparsefile

または、 tar または rsync の--sparseオプションを使用することもできます。

19
mihi

おそらく、ファイルを所定の場所にスパース化する最も簡単な方法は、次のようにfallocateユーティリティを使用することです。

fallocate -v --Dig-holes {file_name}

fallocate(1)Debiantil-linux パッケージによって提供されます。

12
Onlyjob

完全を期すために私の答えを編集する:

  1. バルーンが空ですFSゼロのあるスペース(警告:これによりディスクイメージが変更されます):

losetup --partscan --find --show disk.img

/ dev/loop1をディスクとして提供し、パーティションが1つしかない場合、マウント可能なFSが含まれるすべてのパーティションに対してこれを繰り返す必要があります(スワップパーティションなどは無視してください)。

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

ENOSPCで失敗するまで待ちます。

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. スパースイメージにコピーします。

'dd'には、ゼロのあるファイルをスパースファイルに変換するオプションがあります。

dd if=disk.img of=disk-sparse.img conv=sparse

3
Lam Das

あなたのddrescueで作成されたイメージは、たとえば50 GBであり、実際にはそれよりもはるかに少ないものが十分であることを意味しますか?

その場合は、最初にddを使用して新しいイメージを作成することはできません。

dd if=/dev/zero of=some_image.img bs=1M count=20000

次に、その中にファイルシステムを作成します。

mkfsofyourchoice some_image.img

次に、イメージをマウントして、古いイメージから新しいイメージにすべてをコピーしますか?それはあなたのために働きますか?

2

PartImage は、ファイルシステムの使用済みブロックのみを格納するディスクイメージを作成できるため、未使用のブロックを無視することで必要なスペースを大幅に削減できます。結果のイメージを直接マウントできるとは思いませんが、次のようにします。

image -> partimage -> image -> cp --sparse=alway

あなたが望むものを生み出すはずです(最後のステップを固執することさえ可能かもしれません、試していません)。

2
Grumbel

これを行う virt-sparsify というツールがあります。空のスペースをゼロで埋めてから、画像をスパースファイルにコピーします。ただし、多くの依存関係をインストールする必要があります。

0
endolith