web-dev-qa-db-ja.com

生のdd画像から空のスペースを切り捨てます

Ubuntuインスタンスのddを使用して取得した生のディスクイメージがあります。合計ディスクサイズは0 GBですが、5.5 GBのみが使用されます。

生のddイメージのサイズを20 GBに変更し、5.5 GBのデータをすべて保持し、空のブロックを切り捨てる方法はありますか?

4
Justin

セクターサイズを確認します。

Sudo fdisk -l '/home/user/images/test.img'

Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00070424

Device                      Boot Start     End Sectors  Size Id Type
/home/user/images/test.img1 *     2048   26623   24576   12M  e W95 FAT16
/home/user/images/test.img2      26624 7200767 7174144  3,4G 83 Linux

参照として終了番号(7200767)を使用し、以下のように1と* 512を追加します。

Sudo truncate --size=$[(7200767+1)*512] '/home/user/images/test.img'

ファイルは切り捨てられる必要があります

2
Wessel van Waas

生の画像であるため、常に元のインスタンスとまったく同じサイズになります。ただし、同じことを実現するために使用できるトリックがいくつかあります。

ゼロ化

未使用のスペースがある領域にゼロを書き込むと、圧縮の準備が整い、サイズが使用済みのスペースよりも効果的に小さくなります。

Sudo mount -o loop instance.img /testmount
Sudo dd if=/dev/zero of=/testmount/zero
Sudo rm -f /testmount/zero
Sudo umount /testmount

圧縮

最初にゼロに設定したかどうかに関係なく、画像を圧縮するだけで画像は小さくなります。

gzip instance.img

または、より現代的なアプローチの場合:

zstd -T0 instance.img

ファイルシステム対応のイメージング

画像が生である必要がない場合(つまり、コンテンツではなくブロックデバイスの表現)、ファイルシステム対応ツールを使用して画像を作成するオプションもあります。この場合、ゼロ調整は必要ありません。たとえば、ZFSには、これに対する組み込みのサポートが付属しています。例:comression:

Sudo zfs snapshot myvms/myinstance@myimage
Sudo zfs send myvms/myinstance@myimage | zstd -T0 > instance.zfs.zst
0
Johan Ehnberg