QEMU/KVM : Utilisation du mode Copy-On-Write

Le mode « Copy-On-Write », souvent désigné par l’acronyme COW, est accessible sur certains formats de disques de machines virtuelles tel que QCOW2.

Concrètement, lors de l’utilisation du mode COW, aucune modification n’est appliquée à l’image disque. Toutes les modifications sont consignées dans un fichier séparé préservant l’image originale. Plusieurs fichiers COW peuvent pointer vers la même image permettant de tester plusieurs configurations simultanément sans mettre en péril le système de base.

QEMU/KVM permet d’intégrer ensuite les modifications d’un fichier COW à l’image d’origine.



Fonctionnement Copy-On-Write

À la différence du snapshot, le copy-on-write utilise plusieurs fichiers et permet d’exploiter simultanément plusieurs occurrences de la machine de base (voir « KVM : Snapshots de machines virtuelles » pour plus d’informations sur les snapshots).

Mise en place de COW

Nous partons du principe que vous disposez d’un disque de machine virtuelle. Voir « Première approche de KVM (“Kernel-based Virtual Machine”) » pour une initiation à QEMU/KVM.

Passage de l’image disque au format QCOW2

Commencer par convertir le disque de la machine virtuelle sur laquelle nous travaillerons au format QCOW2 qui supporte le mode COW.

fhh@aaricia ~/vbox/kvm $ file ../vm/vm.vmdk 
../vm/vm.vmdk: VMware4 disk image
fhh@aaricia ~/vbox/kvm $ ls -alh ~/vbox/vm/vm.vmdk
-rw------- 1 fhh users 1.1G May 28 10:58 /users/fhh/vbox/vm/vm.vmdk
fhh@aaricia ~/vbox/kvm $ qemu-img convert -c -O qcow2 ~/vbox/vm/vm.vmdk vm01.qcow2
fhh@aaricia ~/vbox/kvm $ ls -Alh
total 486M
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2
fhh@aaricia ~/vbox/kvm $ file vm01.qcow2 
vm01.qcow2: QEMU QCOW Image (v2), 8589934592 bytes

Voir « KVM : Conversions d’images disques » pour plus d’informations sur la conversion d’images disques.

Note : Notez l’activation de la compression lors du passage du format vmdk au format qcow2 via l’option « -c » de « qemu-img » qui, dans ce cas, réduit de plus de 50% la taille de la machine virtuelle. Cela n’a rien à voir avec COW.

Génération des images COW

Les générations d’images COW sont de simples créations d’images. Elles passent donc par l’utilitaire « qemu-img » en mode « create » à qui est passé le format du disque (option « -f format ») et l’image de référence (option « -b image de référence ») :

fhh@aaricia ~/vbox/kvm $ qemu-img create -f qcow2 -b vm01.qcow2 img01.qcow2
Formatting 'img01.qcow2', fmt=qcow2 size=8589934592 backing_file='vm01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
fhh@aaricia ~/vbox/kvm $ ls -Alh
total 486M
-rw------- 1 fhh users 193K Jun  9 14:59 img01.qcow2
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2

L’image créée est beaucoup plus petite que l’image de référence (193K pour une référence de 486M) car lors de la création il n’y a pas de différences entre l’originale et le COW.

Autant d’image COW que nécessaire peuvent être générées avec la même référence.

fhh@aaricia ~/vbox/kvm $ qemu-img create -f qcow2 -b vm01.qcow2 img02.qcow2
Formatting 'img02.qcow2', fmt=qcow2 size=8589934592 backing_file='vm01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
fhh@aaricia ~/vbox/kvm $ qemu-img create -f qcow2 -b vm01.qcow2 img03.qcow2
Formatting 'img03.qcow2', fmt=qcow2 size=8589934592 backing_file='vm01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
fhh@aaricia ~/vbox/kvm $ ls -Alh
total 486M
-rw------- 1 fhh users 193K Jun  9 14:59 img01.qcow2
-rw------- 1 fhh users 193K Jun  9 15:08 img02.qcow2
-rw------- 1 fhh users 193K Jun  9 15:08 img03.qcow2
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2

Note : Pour s’assurer de la sauvegarde de l’image d’origine, cette dernière peut être protégée en écriture par un « chmod a-w vm01.qcow2 ».

Utilisation des images disques

Les images « différentielles » peuvent être utilisées simultanément :

fhh@aaricia ~/vbox/kvm $ qemu-system-x86_64 img01.qcow2 &
[1] 3279
fhh@aaricia ~/vbox/kvm $ qemu-system-x86_64 img02.qcow2 &
[2] 3283
fhh@aaricia ~/vbox/kvm $ qemu-system-x86_64 img03.qcow2 &
[3] 3287

mais leurs volumes ne représente QUE la différence entre le disque original et l’état actuel :

fhh@aaricia ~/vbox/kvm $ ls -Alh
total 883M
-rw------- 1 fhh users  75M Jun  9 15:21 img01.qcow2
-rw------- 1 fhh users 7.4M Jun  9 15:30 img02.qcow2
-rw------- 1 fhh users 236M Jun  9 15:30 img03.qcow2
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2

Informations sur les images COW

Les informations sur une image COW et sur sa référence sont obtenues par « info » de l’utilitaire d’image « qemu-img » à qui est passé l’option « backing-chain » :

fhh@aaricia ~/vbox/kvm $ qemu-img info --backing-chain img01.qcow2 
image: img01.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 75M
cluster_size: 65536
backing file: vm01.qcow2
 
image: vm01.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 485M
cluster_size: 65536

Dans cet exemple, l’image « img01.qcow2 », au format « qcow2 », d’une taille virtuelle de 8G, occupant réellement 75M sur le disque dur, est liée à « vm01.qcow2 », également au format « qcow2 », occupant 485M sur le disque dur.

Changer d’image de référence

Le mode « rebase » du gestionnaire d’image disque permet de changer l’image de référence. La nouvelle référence doit être identique à l’ancienne (copie).

fhh@aaricia ~/vbox/kvm $ cp vm01.qcow2 vm02.qcow2
fhh@aaricia ~/vbox/kvm $ chmod a-w vm02.qcow2 
fhh@aaricia ~/vbox/kvm $ qemu-img info img02.qcow2 
image: img02.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 8.6M
cluster_size: 65536
backing file: vm01.qcow2
fhh@aaricia ~/vbox/kvm $ qemu-img rebase -b vm02.qcow2 img02.qcow2
fhh@aaricia ~/vbox/kvm $ qemu-img info img02.qcow2
image: img02.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 8.6M
cluster_size: 65536
backing file: vm02.qcow2

Note : Les machines virtuelles peuvent être en marche lors de la copie du disque de référence. J’ai testé des changements de disques de références machine arrêtée et en marche sans rencontrer le moindre problème, mais il semble logique/préférable que la VM soit à l’arrêt pour le changement de référence.

Fusionner le fichier COW et la référence

La commande « commit » de « qemu-img » applique les différences à l’image d’origine.

fhh@aaricia ~/vbox/kvm $ ls -Alh
total 1.7G
-rw------- 1 fhh users  76M Jun  9 16:37 img01.qcow2
-rw------- 1 fhh users 9.4M Jun  9 16:36 img02.qcow2
-rw------- 1 fhh users 621M Jun  9 16:35 img03.qcow2
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2
-rw------- 1 fhh users 486M Jun  9 16:38 vm02.qcow2
fhh@aaricia ~/vbox/kvm $ qemu-img rebase -b vm02.qcow2 img01.qcow2
fhh@aaricia ~/vbox/kvm $ qemu-img commit img01.qcow2
Image committed.
fhh@aaricia ~/vbox/kvm $ ls -Alh
total 1.8G
-rw------- 1 fhh users  76M Jun  9 16:37 img01.qcow2
-rw------- 1 fhh users 9.4M Jun  9 16:36 img02.qcow2
-rw------- 1 fhh users 621M Jun  9 16:35 img03.qcow2
-rw------- 1 fhh users 486M Jun  9 14:29 vm01.qcow2
-rw------- 1 fhh users 559M Jun  9 16:41 vm02.qcow2

Dans cet exemple, nous changeons la référence d' »img01.qcow2″ puis appliquons son contenu au disque référent (« commit »). Le résultat est « vm02.qcow2 » qui s’étend approximativement de la taille du fichier COW.

Références

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *