9. Extension de la capacité de stockage d'une image de machine virtuelle

L'énorme avantage de l'utilisation du gestionnaire de volume logique LVM avec les images disques de machine virtuelle, c'est que l'on peut manipuler la capacité de stockage après installation.

Dans le cas présent, les images disques ont été dimensionnées à minima pour faciliter le téléchargement à partir du serveur Web de l'infrastructure de travaux pratiques. Il est donc important de pouvoir étendre la capacité d'une instance système après copie sur le système hôte.

Du point de vue pédagogique, c'est aussi l'occasion de se familiariser avec les fonctionnalités offertes par les outils LVM. Ces outils sont devenus indispensables dans la gestion de la capacité de stockage d'un serveur aujourd'hui.

Voici un exemple d'extension de la capacité de stockage d'une image de machine virtuelle Debian/testing avec interface graphique. À partir d'un volume de stockage initial de 4Go on ajoute 8Go en répartissant cette extension entre les volumes logiques de l'arborescence système.

9.1. Extension de l'image disque

On commence par identifier les caractéristiques du fichier image du système avant extension.

$ ls -sh vm0-debian-testing-amd64-X11.qcow2
2,3G vm0-debian-testing-amd64-X11.qcow2

Une fois l'instance de système virtuel lancée, on obtient l'occupation disque suivante.

etu@vm:~$ df -h
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/mapper/vm--debian-root
                      473M  105M  344M  24% /
tmpfs                 503M     0  503M   0% /lib/init/rw
udev                   10M  148K  9,9M   2% /dev
tmpfs                 503M     0  503M   0% /dev/shm
/dev/hda1             228M   20M  197M   9% /boot
/dev/mapper/vm--debian-home
                      473M   14M  435M   3% /home
/dev/mapper/vm--debian-usr
                      1,9G  1,2G  586M  68% /usr
/dev/mapper/vm--debian-var
                      595M  235M  330M  42% /var

Toujours à partir de la même instance la table des partitions est la suivante.

# fdisk -l /dev/hda

Disk /dev/hda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000162

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          31      248976   83  Linux
/dev/hda2              32         522     3943957+  8e  Linux LVM

Avant de passer à l'opération d'extension, on effectue une conversion du fichier image au format «brut» non compressé ou format raw.

$ qemu-img convert -O raw vm0-debian-testing-amd64-X11.qcow2 \
  vm0-debian-testing-amd64-X11-extended.raw
$ ls -sh vm0-debian-testing-amd64-X11*
2,1G vm0-debian-testing-amd64-X11-extended.raw  2,3G vm0-debian-testing-amd64-X11.qcow2

On procède enfin à l'augmentation de capacité à l'aide de la commande dd. On passe d'un fichier image d'une capacité de 4Go à 12Go en ajoutant 8Go.

$ dd if=/dev/zero of=vm0-debian-testing-amd64-X11-extended.raw seek=12288 obs=1MB count=0
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 3,3943e-05 s, 0,0 kB/s

Pour terminer cette extension d'image disque, on reconvertit le fichier image au format compressé qcow2.

$ qemu-img convert -O qcow2 vm0-debian-testing-amd64-X11-extended.raw \
  vm0-debian-testing-amd64-X11-extended.qcow2
$ ls -lAh vm0-debian-testing-amd64-X11*
-rw-r--r-- 1 phil phil 2,1G mai 24 18:10 vm0-debian-testing-amd64-X11-extended.qcow2
-rw-r--r-- 1 phil phil  12G mai 24 16:23 vm0-debian-testing-amd64-X11-extended.raw
-rw-r--r-- 1 phil phil 2,3G mai 24 18:08 vm0-debian-testing-amd64-X11.qcow2

Le fichier image au format brut (raw) est maintenant inutile et peut être supprimé sans problème.

9.2. Extension des volumes logiques LVM

En utilisant l'image système étendue générée ci-avant, on fait apparaître l'espace disponible en affichant l'état des partitions.

# fdisk -l /dev/hda

Disk /dev/hda: 12.2 GB, 12288000000 bytes
255 heads, 63 sectors/track, 1493 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000162

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          31      248976   83  Linux
/dev/hda2              32         522     3943957+  8e  Linux LVM

On remarque que l'espace total a bien été augmenté et qu'aucune partition n'est disponible. Il faut donc créer une nouvelle partition correspondant à l'espace libre.

# fdisk /dev/hda

The number of cylinders for this disk is set to 1493.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/hda: 12.2 GB, 12288000000 bytes
255 heads, 63 sectors/track, 1493 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000162

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          31      248976   83  Linux
/dev/hda2              32         522     3943957+  8e  Linux LVM

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (523-1493, default 523):
Using default value 523
Last cylinder or +size or +sizeM or +sizeK (523-1493, default 1493):
Using default value 1493

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Périphérique ou ressource occupé.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

C'est la nouvelle partition /dev/hda3 que nous utilisons pour créer un nouveau volume physique LVM. On visualise ensuite les propriétés des deux volumes physiques du système virtuel.

# pvcreate /dev/hda3
  Physical volume "/dev/hda3" successfully created
vm:/home/etu# pvdisplay
  --- Physical volume ---
  PV Name               /dev/hda2
  VG Name               vm-debian
  PV Size               3,76 GB / not usable 3,52 MB
  Allocatable           yes (but full)
  PE Size (KByte)       4096
  Total PE              962
  Free PE               0
  Allocated PE          962
  PV UUID               ahs2DO-u8gV-VVnN-sUOT-dUwv-fjlz-VRQpUl

  "/dev/hda3" is a new physical volume of "7,44 GB"
  --- NEW Physical volume ---
  PV Name               /dev/hda3
  VG Name
  PV Size               7,44 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               IHbF6G-Tfye-uUXC-mcWf-KUNd-MrSD-y4Yy4y

On remarque facilement les différences entre les deux volumes physiques LVM. Le volume physique /dev/hda3 n'est associé à aucun groupe de volumes et ne dispose pas d'une taille de bloc ou Physical Extent (PE) définie.

L'étape suivante consiste à étendre le groupe de volumes logiques avec le nouveau volume physique disponible ; c'est le rôle de la commande vgextend. On visualise ensuite le résultat sur les propriétés du nouveau volume physique.

# vgextend vm-debian /dev/hda3
  Volume group "vm-debian" successfully extended

# pvdisplay /dev/hda3
  --- Physical volume ---
  PV Name               /dev/hda3
  VG Name               vm-debian
  PV Size               7,44 GB / not usable 773,50 KB
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              1904
  Free PE               1904
  Allocated PE          0
  PV UUID               IHbF6G-Tfye-uUXC-mcWf-KUNd-MrSD-y4Yy4y

Pour achever l'opération, il est nécessaire d'affecter l'espace offert par le nouveau volume physique aux différents volumes logiques du système. Pour étendre les volumes logiques voulus à l'aide de la commande lvextend, on utilise deux options différentes : -L pour ajouter une capacité fixe et -l pour attribuer un pourcentage de volume.

# lvextend -L +512M /dev/mapper/vm--debian-root
  Extending logical volume root to 1000,00 MB
  Logical volume root successfully resized

# lvextend -L +2560M /dev/mapper/vm--debian-usr
  Extending logical volume usr to 4,36 GB
  Logical volume usr successfully resized

# lvextend -L +2560M /dev/mapper/vm--debian-var
  Extending logical volume var to 3,09 GB
  Logical volume var successfully resized

# lvextend -l +100%FREE /dev/mapper/vm--debian-home
  Extending logical volume home to 2,48 GB
  Logical volume home successfully resized

Il ne reste plus qu'à répercuter l'extension des volumes logiques au niveau système de fichiers à l'aide de la commande resise2fs.

# resize2fs /dev/mapper/vm--debian-root
resize2fs 1.41.3 (12-Oct-2008)
Le système de fichiers de /dev/mapper/vm--debian-root est monté sur / ; le changement de taille doit être effectué en ligne
old desc_blocks = 2, new_desc_blocks = 4
En train d'effectuer un changement de taille en ligne de /dev/mapper/vm--debian-root vers 1024000 (1k) blocs.
Le système de fichiers /dev/mapper/vm--debian-root a maintenant une taille de 1024000 blocs.

# resize2fs /dev/mapper/vm--debian-usr
resize2fs 1.41.3 (12-Oct-2008)
Le système de fichiers de /dev/mapper/vm--debian-usr est monté sur /usr ; le changement de taille doit être effectué en ligne
old desc_blocks = 1, new_desc_blocks = 1
En train d'effectuer un changement de taille en ligne de /dev/mapper/vm--debian-usr vers 1142784 (4k) blocs.
Le système de fichiers /dev/mapper/vm--debian-usr a maintenant une taille de 1142784 blocs.

# resize2fs /dev/mapper/vm--debian-var
resize2fs 1.41.3 (12-Oct-2008)
Le système de fichiers de /dev/mapper/vm--debian-var est monté sur /var ; le changement de taille doit être effectué en ligne
old desc_blocks = 1, new_desc_blocks = 1
En train d'effectuer un changement de taille en ligne de /dev/mapper/vm--debian-var vers 793600 (4k) blocs.
Le système de fichiers /dev/mapper/vm--debian-var a maintenant une taille de 793600 blocs.

# resize2fs /dev/mapper/vm--debian-home
resize2fs 1.41.3 (12-Oct-2008)
Le système de fichiers de /dev/mapper/vm--debian-home est monté sur /home ; le changement de taille doit être effectué en ligne
old desc_blocks = 2, new_desc_blocks = 10
En train d'effectuer un changement de taille en ligne de /dev/mapper/vm--debian-home vers 2596864 (1k) blocs.
Le système de fichiers /dev/mapper/vm--debian-home a maintenant une taille de 2596864 blocs.

En conclusion, on visualise l'espace occupé et disponible sur l'ensemble des volumes logiques du système virtuel.

# df -h
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/mapper/vm--debian-root
                      969M  106M  814M  12% /
tmpfs                 503M     0  503M   0% /lib/init/rw
udev                   10M  152K  9,9M   2% /dev
tmpfs                 503M     0  503M   0% /dev/shm
/dev/hda1             228M   20M  197M   9% /boot
/dev/mapper/vm--debian-home
                      2,4G   14M  2,3G   1% /home
/dev/mapper/vm--debian-usr
                      4,3G  1,2G  3,0G  29% /usr
/dev/mapper/vm--debian-var
                      3,0G  236M  2,7G   9% /var

Du point de vue du système hôte, rien n'a changé dans la mesure ou l'extension réalisée n'est pas occupée et que le format compressé qcow2 joue son rôle.

$ ls -sh vm0-debian-testing-amd64-X11*
2,3G vm0-debian-testing-amd64-X11-extended.qcow2  2,3G vm0-debian-testing-amd64-X11.qcow2

Bien sûr, les valeurs numériques utilisées dans cette section ne sont que des exemples. Il est possible de faire beaucoup d'autres manipulations avec le gestionnaire de volume logique LVM. L'extension de capacité n'est qu'une facette des fonctionnalités offertes.