web-dev-qa-db-fra.com

Comment redimensionner le fichier img créé avec dd?

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?

17
A_Porcupine

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.

6
grawity

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 ...

18
Serge Wagner

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.

2
Phil Roggenbuck