Ubuntuインスタンスのdd
を使用して取得した生のディスクイメージがあります。合計ディスクサイズは0 GBですが、5.5 GBのみが使用されます。
生のddイメージのサイズを20 GBに変更し、5.5 GBのデータをすべて保持し、空のブロックを切り捨てる方法はありますか?
セクターサイズを確認します。
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'
ファイルは切り捨てられる必要があります
生の画像であるため、常に元のインスタンスとまったく同じサイズになります。ただし、同じことを実現するために使用できるトリックがいくつかあります。
未使用のスペースがある領域にゼロを書き込むと、圧縮の準備が整い、サイズが使用済みのスペースよりも効果的に小さくなります。
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