Primero asegúrese de que el espacio libre esté realmente vacío y que no contenga restos de archivos eliminados. La forma más fácil de lograr esto es crear un archivo enorme en el disco, que contenga solo bytes nulos, y luego eliminarlo.
# losetup --find --partscan foo.img
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 4096M 0 loop
├─loop0p1 259:0 0 2048M 0 loop
└─loop0p2 259:1 0 2048M 0 loop
# for part in /dev/loop0p*; do
mount $part /mnt
dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
rm /mnt/filler
umount /mnt
done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0
Luego comprímalo con una herramienta como gzip
o xz
. Incluso en los niveles de compresión más bajos, una larga serie de ceros se comprime bien:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Tenga en cuenta que debe descomprimir la imagen al volver a escribirla en el disco. Esto lo descomprimirá 'en vivo':
# cat foo.img.gz | gunzip | dd of=/dev/sda
Tenga en cuenta que el dispositivo de salida (sda) debe tener el tamaño suficiente para adaptarse a la imagen original ; de lo contrario, los datos se perderán o se dañarán.
Un método alternativo, si desea seguir usando la imagen, por ejemplo, con una máquina virtual, es convertir la imagen en bruto en uno de los formatos de imagen utilizados por el software de virtualización; por ejemplo, qcow2 para Qemu, VDI para VirtualBox o VMDK para VMware.
Tenga en cuenta que esto aún requiere que prepare la imagen limpiando el espacio libre utilizando el método anterior.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Pero si va a volver a escribirse en un disco real, debe volver a convertirlo en una imagen sin formato.