J'ai une image DD d'une carte SD de 4 Go qui possède deux partitions. Ces deux partitions ne consomment qu'environ 800 Mo et, à ce titre, je souhaite réduire la taille de l'image.
Est-ce que quelqu'un connaît un moyen de supprimer "l'espace libre" du fichier img?
Tout d'abord, assurez-vous que l'espace disponible est réellement vide et qu'il ne contient pas de restes de fichiers supprimés. Pour ce faire, le moyen le plus simple consiste à créer un fichier de grande taille sur le disque, contenant uniquement des octets nuls, puis à 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
Puis compressez-le avec un outil comme gzip
ou xz
. Même aux plus bas niveaux de compression, une longue série de zéros compressera bien:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Notez que vous devez décompresser l'image lorsque vous la réécrivez sur le disque. Cela va décompresser le "live":
# cat foo.img.gz | gunzip | dd of=/dev/sda
Notez que le périphérique de sortie (sda) doit avoir une taille suffisante pour l’image originale , sinon les données seront perdues ou corrompues. .
Une autre méthode, si vous souhaitez continuer à utiliser l’image - par ex. avec une machine virtuelle - est de convertir l'image brute vers 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 toujours nécessite de préparer l'image en nettoyant l'espace libre à l'aide de 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 si le disque doit être réécrit, vous devez le reconvertir en image brute.
Utiliser resize2fs
est beaucoup plus facile
resize2fs -M xxx.img
e2fsck vous sera demandé d’abord - alors:
e2fsck -f -y xxx.img
(l'image ne doit PAS être montée!)
Remarque: cela ne fonctionnera que si l'image est d'une seule partition, s'il s'agit d'un périphérique de bloc entier avec plusieurs partitions, voir la réponse ci-dessus ...
Je l'ai également essayé avec qemu-img , et cela a fonctionné comme un charme:
qemu-img resize test.img 2G
Nous redimensionnons le test.img
pour le faire 2G (2 Go).
Travaillé sans faille pour moi.