Qcow2 : étendre un système de fichier de machine virtuelle

Publié le mer. 15 janvier 2014 par Feth Arezki

Introduction

  • L'extension décrite ici se fait à froid.
  • Il est indispensable de faire une sauvegarde de l'image d'origine avant toute manipulation.
  • On ne parle que du redimensionnement à la hausse : la réduction n'est pas gérée.

Comment faire, dans l'ordre

Arrêter la machine virtuelle (a priori, je n'ai pas essayé autrement).

virsh shutdown nom_de_ma_machine_virtuelle

Redimensionner l'image qcow2

Pour passer de 8G à 1500G :

% qemu-img resize monfichier.qcow2 +1492G

Ne pas oublier de raffraichir le pool. Utiliser virsh pool-list pour lister les pools et virsh vol-list pour retrouver le pool dans lequel se trouve votre fichier qcow2.

% virsh pool-refresh <nom du pool>

Redimensionner la partition Linux dans l'image qcow2

Cette section a été mise à jour et préfère l'usage de virt-resize plutôt que de qemu-nbd.

On commence par récupérer les informations sur les points de montage :

% virt-filesystems --long -h --all -a monfichier.qcow2
Name       Type        VFS      Label  MBR  Size  Parent
/dev/sda1  filesystem  ext4     -      -    8G   -
/dev/sda2  filesystem  unknown  -      -    1,0K  -
/dev/sda5  filesystem  unknown  -      -    383M  -
/dev/sda1  partition   -        -      83   8G   /dev/sda
/dev/sda2  partition   -        -      0f   1,0K  /dev/sda
/dev/sda5  partition   -        -      82   383M  /dev/sda
/dev/sda   device      -        -      -    8G   -

Ici c'est la partition /dev/sda1 qui va nous intéresser. On crée une copie temporaire du fichier qcow2 puis on redimensionne la partition avec virt-resize.

% cp monfichier.qcow2 monfichier-orig.qcow2
% virt-resize --expand /dev/sda1 monfichier-orig.qcow2 monfichier.qcow2
...

Vous pouvez alors vérifier que les modifications ont bien été prises en compte:

% virt-filesystems --long -h --all -a monfichier.qcow2
Name       Type        VFS      Label  MBR  Size  Parent
/dev/sda1  filesystem  ext4     -      -    1500G   -
/dev/sda2  filesystem  unknown  -      -    1,0K  -
/dev/sda5  filesystem  unknown  -      -    383M  -
/dev/sda1  partition   -        -      83   1500G   /dev/sda
/dev/sda2  partition   -        -      0f   1,0K  /dev/sda
/dev/sda5  partition   -        -      82   383M  /dev/sda
/dev/sda   device      -        -      -    1500G   -

Redimensionner le système de fichiers ext3/4 dans la partition

Je redémarre ma machine virtuelle :

virsh start nom_de_ma_machine_virtuelle

Et enfin, après avoir booté, je localise le système de fichiers dans la partition depuis la VM :

% mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=126895,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=102708k,mode=755)
/dev/disk/by-uuid/27476a99-30d7-4174-82b3-942a085c2e7a on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=205400k)
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)

Puis je le redimensionne :

% resize2fs /dev/disk/by-uuid/27476a99-30d7-4174-82b3-942a085c2e7a

Ici, allez faire autre chose, car c'est potentiellement très long -jusqu'à quatre heures par téraoctet. Ça irait plus vite sur un système de fichiers non monté. Si vous n'avez pas redimensionné la partition avant, vous aurez eu le message suivant

the filesystem is already <value> blocks long

On vérifier que cela a fonctionné :

% df -h

Si c'est le cas, vous pouvez supprimer le fichier monfichier-orig.qcow2 utilisé plus haut.

Conseil de gestion des images pour une pré-production

Les disques virtuels sont quasiment gratuits. À moins que vos tests de préprod ne portent sur le partitionnement et les systèmes de fichier, je conseille de créer un disque qcow2 par partition disque de l'invité. Le swap, par exemple, ne vous embêtera pas lors des redimentionnements, juché sur sa partition en fin de disque, puisqu'il aura son disque à lui. Pour connaître l'UUID de votre nouveau système de fichiers :

% blkid