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
がない場合に機能します。
まず、スパースファイルは、ゼロを書き込んだ場合ではなく、シークした場合にのみ透過的に処理されます。
より明確にするために、ウィキペディアからの例
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
おそらく、ファイルを所定の場所にスパース化する最も簡単な方法は、次のようにfallocate
ユーティリティを使用することです。
fallocate -v --Dig-holes {file_name}
fallocate(1) は Debian の til-linux パッケージによって提供されます。
完全を期すために私の答えを編集する:
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
'dd'には、ゼロのあるファイルをスパースファイルに変換するオプションがあります。
dd if=disk.img of=disk-sparse.img conv=sparse
あなたのddrescueで作成されたイメージは、たとえば50 GBであり、実際にはそれよりもはるかに少ないものが十分であることを意味しますか?
その場合は、最初にddを使用して新しいイメージを作成することはできません。
dd if=/dev/zero of=some_image.img bs=1M count=20000
次に、その中にファイルシステムを作成します。
mkfsofyourchoice some_image.img
次に、イメージをマウントして、古いイメージから新しいイメージにすべてをコピーしますか?それはあなたのために働きますか?
PartImage は、ファイルシステムの使用済みブロックのみを格納するディスクイメージを作成できるため、未使用のブロックを無視することで必要なスペースを大幅に削減できます。結果のイメージを直接マウントできるとは思いませんが、次のようにします。
image -> partimage -> image -> cp --sparse=alway
あなたが望むものを生み出すはずです(最後のステップを固執することさえ可能かもしれません、試していません)。
これを行う virt-sparsify というツールがあります。空のスペースをゼロで埋めてから、画像をスパースファイルにコピーします。ただし、多くの依存関係をインストールする必要があります。