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

Publié le mer. 15 janvier 2014 par Feth Arezki

Introduction

Voici un pas-à-pas sans aucune garantie, faites vos sauvegardes ! Notamment, ici, 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).

Redimensionner l'image qcow2

Pour passer de 8G à 1500G :

% qemu-img resize monfichier.qcow2 +1492G

Ne pas oublier de raffraichir le pool :

% virsh pool-refresh <nom du pool>

Redimensionner la partition Linux dans l'image qcow2

J'ai besoin d'accéder à l'image qcow2 depuis l'hôte :

% # éventuellement 'modprobe ndb'
% qemu-nbd -c /dev/nbd0 monfichier.qcow2

Repartitionnement depuis l'hôte :

% fdisk /dev/ndb0

...

p

     Device Boot      Start         End      Blocks   Id  System
/dev/nbd0p1   *        2048    15988735     7993344   83  Linux
/dev/nbd0p2        15990782    16775167      392193    5  Extended
/dev/nbd0p5        15990784    16775167      392192   82  Linux swap / Solaris

C'est bien fait, ma partition unique est au début. Je supprime tout le reste (d), et même cette partition, après avoir noté qu'elle débutait en 2048. Je recrée une partition primaire Linux au même point (2048) et lui affecte tout l'espace disponible.

Je déconnecte l'image qcow2 de son nœud :

% qemu-nbd -d /dev/nbd0

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

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

Pour finir, rebooter ne fera pas forcément de mal.

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