Assurez-vous d'abord que l'espace libre est réellement vide et ne contient pas de restes de fichiers supprimés. La façon la plus simple d'y parvenir est de créer un énorme fichier sur le disque, ne contenant que des octets nuls, puis de le supprimer.
# 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
Ensuite, compressez-le avec un outil comme gzip
ou xz
. Même aux niveaux de compression les plus bas, une longue série de zéros se comprime bien:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Notez que vous devez décompresser l'image lors de la réécriture sur le disque. Cela le décompressera «en direct»:
# cat foo.img.gz | gunzip | dd of=/dev/sda
Notez que le périphérique de sortie (sda) doit être de taille suffisante pour s'adapter à l' image d' origine , sinon les données seront perdues ou corrompues.
Une autre méthode, si vous souhaitez continuer à utiliser l'image - par exemple avec une machine virtuelle - consiste à convertir l'image brute en l'un des formats d'image utilisés par le logiciel de virtualisation; par exemple qcow2 pour Qemu, VDI pour VirtualBox ou VMDK pour VMware.
Notez que cela vous oblige toujours à préparer l'image en nettoyant l'espace libre en utilisant la méthode ci-dessus.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Mais s'il doit être réécrit sur un vrai disque, vous devez le reconvertir en image brute.