Un tutoriel très technique (uniquement des commandes à taper et un bref commentaire) pour expliquer comment redimensionner une image disque d’un guest xen. De plus prenons le cas le plus compliqué, ce fichier image contient une partition LVM avec plusieurs volumes logiques.
La technique consiste à "mounter" toutes les partitions contenues dans le fichier image et la partition LVM de cette image disque puis de copier les données dans une nouvelle image disque de dimension différente.

Prérequis :
fdisk, dd, losetup (package util-linux), kpartx (package kpartx), outils LVM (package lvm2)

Topologie du fichier image actuel :

# si necessaire, stopper le guest xen
xm shutdown guest
 
losetup /dev/loop0 /var/xendisks/guestimage.disk
fdisk /dev/loop0 -l

Par exemple :

Disk /dev/loop0: 26.2 GB, 26214400000 bytes
255 heads, 63 sectors/track, 3187 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *           1          13      104391   83  Linux
/dev/loop0p2              14        2933    23454900   8e  Linux LVM
/dev/loop0p3            2934        3187     2040255   82  Linux swap / Solaris

Forcer la lecture de la table de partition :

kpartx -av /dev/loop0
ls /dev/mapper/loop0*
/dev/mapper/loop0p1  /dev/mapper/loop0p2  /dev/mapper/loop0p3
# exemple de resultat

Détection du Volume Group LVM :

vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group 'VolGroup1' using metadata type lvm2

Détection des Volumes Logiques LVM :

vgchange -ay VolGroup1
  3 logical volume(s) in volume group 'VolGroup1' now active
 
ls /dev/VolGroup1/*
/dev/VolGroup1/tmp  /dev/VolGroup1/var  /dev/VolGroup1/volroot
# exemple de resultat

Montage (à adapter suivant la topologie du disque image) :

mount /dev/VolGroup1/volroot /mnt/old/
mount /dev/VolGroup1/var /mnt/old/var/
mount /dev/VolGroup1/tmp /mnt/old/tmp/
mount /dev/mapper/loop0p1 /mnt/old/boot/

Création du nouveau disque image :
Faire un df pour juger de la taille du disque image et des partitions nécessaires.

# exemple
/dev/mapper/VolGroup1-volroot
                      7.6G  1.4G  5.9G  19% /mnt/old
/dev/mapper/VolGroup1-var
                       13G  911M   11G   8% /mnt/old/var
/dev/mapper/VolGroup1-tmp
                      2.0G   36M  1.8G   2% /mnt/old/tmp
/dev/mapper/loop0p1    99M   26M   68M  28% /mnt/old/boot

Création d’un disque (15Go ici) :

dd if=/dev/zero of=/var/xendisks/guestimage-smaller.disk oflag=direct bs=1M count=15360
losetup /dev/loop1 /var/xendisks/guestimage-smaller.disk
fdisk /dev/loop1
# creation de partitions suivantes
# (a adapter)
# 100 Mo /boot
# 12.9 Go LVM
# 2 Go swap

Re lecture de la table de partition :

kpartx -av /dev/loop1
 
# verification
ls /dev/mapper/loop1p*
/dev/mapper/loop1p1  /dev/mapper/loop1p2  /dev/mapper/loop1p3

Création des partitions, récupérer les éventuels noms de partition dans /mnt/old/etc/fstab :

mkswap -L 'SWAP-xvda3' /dev/mapper/loop1p3
mkfs.ext3 -L '/boot' /dev/mapper/loop1p1
pvcreate /dev/mapper/loop1p2
vgcreate VolGroup2 /dev/mapper/loop1p2
lvcreate -L 4g -nvolroot VolGroup2
lvcreate -L 2g -ntmp VolGroup2
lvcreate -l 100%FREE -nvar VolGroup2
 
# verification
lvdisplay VolGroup2

Formatage des volumes logiques :

mkfs.ext3 /dev/VolGroup2/tmp
mkfs.ext3 /dev/VolGroup2/var
mkfs.ext3 /dev/VolGroup2/volroot

Montage des partitions du futur disque image :

mount /dev/VolGroup2/volroot /mnt/new/
cd /mnt/new/
mkdir boot var tmp
mount /dev/VolGroup2/var /mnt/new/var/
mount /dev/VolGroup2/tmp /mnt/new/tmp/
mount /dev/mapper/loop1p1 /mnt/new/boot/

Copie des anciennes données :

cp -rpv /mnt/old/* .

Démonter l’ancien système :

umount /mnt/old/boot/
umount /mnt/old/var/
umount /mnt/old/tmp/
umount /mnt/old
vgchange -an VolGroup1
kpartx -d /dev/loop0
losetup -d /dev/loop0

Renommer le groupe de volume (VG) :

cd /mnt
umount /mnt/new/boot/
umount /mnt/new/var/
umount /mnt/new/tmp/
umount /mnt/new
vgchange -an VolGroup2
vgrename VolGroup2 VolGroup1

Désactiver le loopback du nouveau disque image :

kpartx -d /dev/loop1
losetup -d /dev/loop1

Démarrer le Guest Xen sur le nouveau disque :

mv guestimage.disk guestimage-old.disk
mv guestimage-smaller.disk guestimage.disk
xm create -c guest

Et voilà !