Extension d’une image disque RAW

Après quelques manipulations et divers essais sur votre image réalisé avec dd, ou téléchargée depuis un site de raspbian, vous vous rendez compte que l’image est trop petite pour ce que vous deviez en faire. Pas de stress, il suffit de l’étendre. Le problème est résolu en quelques minutes.

Pour cela, nous allons utiliser la commande qemu-img. Les trois commandes suivantes sont équivalentes :

# qemu-img resize test.img +2G (ajout de 2Gio au fichier)
# qemu-img resize test.img 4294967296 (nouvelle taille du fichier en octets)
# qemu-img resize test.img 4G (nouvelle taille du fichier en Gio)

Créons un périphérique de type bloc avec notre image nouvellement agrandie dans notre système hôte.

# kpartx -a -v image.img
add map loop1p1 (254:7): 0 114688 linear /dev/loop1 8192
add map loop1p2 (254:8): 0 3840000 linear /dev/loop1 122880

Simple extension de la dernière partition

Nous allons étendre la dernière partition pour qu’elle prenne l’ensemble de l’espace disque restant.

# fdisk /dev/loop1
: p

Disque /dev/loop1 : 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres, total 8388608 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x00047c7a

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/loop1p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop1p2          122880     3962879     1920000   83  Linux

Notez bien le début de la seconde partition. Ça va nous être très utile immédiatement. Supprimons la seconde partition.

: d
: 2

Créons la nouvelle seconde partition

: n
: p
: 2

Le premier secteur doit être le même qu’avant, et non celui proposé.

: 122880

Pour le dernier secteur, l’option par défaut fait très bien l’affaire.

: (par défaut)

Vérifions les modifications.

: p

Disque /dev/loop1 : 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres, total 8388608 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x00047c7a

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/loop1p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop1p2          122880     8388607     4132864   83  Linux

Confirmons l’écriture.

: w

Il faut maintenant recharger le système de fichier, puis le faire vérifier.

# kpartx -d -v image.img
# kpartx -a -v image.img
# e2fsck -f  /dev/mapper/loop1p2

Enfin, étendons le système de fichier pour lui faire épouser tout l’espace de la partition redimentionnée.

# resize2fs /dev/mapper/loop1p2

Voilà simple non ?

Déplacement et redimensionnement des partitions sans perdre les données

Oui ! Mais moi je voulais ajouter une nouvelle partition, ou déplacer la première avec gparted et j’ai une erreur bizarre…

Can't open /dev/loop1p1: No such file or directory
Cannot initialize 'H':
mlabel: Cannot initialize drive
[…]
Impossible de lire le contenu du système de fichiers.
[…]

Pas de panique, il suffit, après avoir créé le périphérique via kpartx (notez bien les périphériques retournés par la commande), d’exécuter les commandes suivantes :

# cd /dev
# ln -s mapper/loop1p1
# ln -s mapper/loop1p2
# gparted loop1 (éditez vos partitions)
# rm loop1p1 loop1p2

Par défaut, gparted cherche le périphérique de partition dans /dev, alors que kpartx les crée dans /dev/mapper.