Première approche de KVM (« Kernel-based Virtual Machine »)

KVM, pour « Kernel-based Virtual Machine« , est une solution de virtualisation libre et intégrée aux noyaux Linux supérieures ou égales au version 2.6.20. Elle nécessite le support matériel de la virtualisation par les technologies VT (d’Intel) ou SVM (d’AMD).

KVM permet de faire fonctionner facilement des machines virtuelles aux OS variés, Windows, Linux, BSD, etc, à faibles coûts dans des environnements de production.

Vérification des pré requis

Afin d’utiliser KVM sur votre système, vous devez vous assurer que votre processeur supporte la virtualisation. Pour cela, recherchez « vmx » ou « svm » dans la liste des flags de votre CPU (fichier « /proc/cpuinfo »).

15:08:14 fhh@mafalda ~ $ egrep -c '(vmx|svm)' /proc/cpuinfo
2

Dans cet exemple, nous comptons le nombre de lignes contenant « vmx » ou « svm » si le résultat est supérieure ou égale à 1, la virtualisation est supportée.

Depuis les noyaux 2.6.20, KVM est intégré aux kernel Linux. Vérifiez que les modules sont bien disponibles sur votre distribution :

15:39:23 fhh@mafalda ~ $ find /lib/modules/`uname -r` -iname "*kvm*"
/lib/modules/2.6.38-2-amd64/kernel/arch/x86/kvm
/lib/modules/2.6.38-2-amd64/kernel/arch/x86/kvm/kvm.ko
/lib/modules/2.6.38-2-amd64/kernel/arch/x86/kvm/kvm-intel.ko
/lib/modules/2.6.38-2-amd64/kernel/arch/x86/kvm/kvm-amd.ko

ou depuis la configuration de votre noyau (exemple sur Debian Wheezy) :

15:39:39 fhh@mafalda ~ $ grep KVM /boot/config-2.6.38-2-amd64 
CONFIG_KVM_CLOCK=y
CONFIG_KVM_GUEST=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
# CONFIG_KVM_MMU_AUDIT is not set

et qu’ils sont chargés :

16:12:21 fhh@mafalda ~ $ lsmod | grep kvm
kvm_intel              49947  0 
kvm                   263288  1 kvm_intel

Dernier point, et non des moindres, vérifiez que le support de la virtualisation est activé dans le BIOS de votre machine.

Installation

Une fois assuré que la machine supporte la virtualisation, installez les outils permettant de gérer les machines virtuelles, leurs disques, etc. L’ensemble ce cache derrière QEMU et est « empaqueté » sous la quasi totalité des distributions (exemple sous Debian wheezy) :

19:38:37 mafalda ~ # aptitude install qemu-kvm
The following NEW packages will be installed:
  bridge-utils{a} etherboot-qemu{a} libaio1{a} libbrlapi0.5{a} libvdeplug2{a} qemu-keymaps{a} qemu-kvm qemu-utils{a} seabios{a}
0 packages upgraded, 9 newly installed, 0 to remove and 13 not upgraded.
Need to get 2,208 kB of archives. After unpacking 6,812 kB will be used.
Do you want to continue? [Y/n/?]
...

ou sous Gentoo Linux :

srv ~ # emerge -av qemu-kvm
...

Dernière phase concernant l’installation, ajoutez les utilisateurs autorisés à utiliser la virtualisation dans le groupe « kvm ». Exemple d’ajout de « fhh » dans le groupe « kvm » :

19:42:58 mafalda ~ # gpasswd -a fhh kvm
Adding user fhh to group kvm

Première machine virtuelle

Création d’un disque virtuel (fichier)

La création d’une machine virtuelle consiste à créer pour elle un disque dur à l’aide de l’outil « qemu-img » que l’on invoquera en mode « création » (create) et à qui seront précisés, au moins :

  • le nom du fichier servant de disque dur à la machine virtuelle ;
  • la taille du disque de la machine.

Ce qui donne à l’exécution :

19:48:20 fhh@mafalda ~ $ mkdir kvm
19:48:20 fhh@mafalda ~ $ qemu-img create kvm/hda.deb.raw 20G
Formatting 'kvm/hda.deb.raw', fmt=raw size=21474836480 
19:49:58 fhh@mafalda ~ $ ls -lh kvm/
total 0
-rw-r--r-- 1 fhh users 20G May 20 18:25 hda.deb.raw

Par défaut, le disque est créé au format « RAW ». L’option « -f » permet cependant de préciser un autre format tel que « qcow2 », « vmdk », etc. La page de man de « qemu-img » vous renseignera sur les différences entre ces formats.

Voir aussi « KVM : Conversions d’images disques » sur Admin Linux.

Démarrage de la machine virtuelle

Les différents paramètres de la machine virtuelle sont précisés au lancement de celle-ci. Lancer la machine se fait par « l’invocation » de la commande « kvm » à qui l’on précisera le « fichier disque dur ».

19:19:42 fhh@mafalda ~ $ kvm kvm/hda.deb.raw

La machine démarre alors avec ses paramètres par défaut : 128Mo de RAM, un coeur de processeur, etc.

Pour réaliser une installation, vous ajouterez à la machine virtuelle un lecteur CD-ROM via l’option « -cdrom fichier » et préciserez au système de « booter » dessus (option « -boot »).

19:58:49 fhh@mafalda ~ $ kvm kvm/hda.deb.raw -m 512 -cdrom ~/Downloads/debian-6.0.1a-amd64-businesscard.iso -boot d

Notez au passage la possibilité de préciser la quantité de RAM allouée à la machine via l’option « -m taille_en_méga ».

Pour démarrer depuis le lecteur CD de la machine physique, précisez son device à l’option « -cdrom » (ie : -cdrom /dev/cdrom ).

Parmi les options les plus intéressantes pour une première approche, nous trouvons :

  • « -daemonize » qui lance la machine virtuelle en tant que démon ;
  •  » -vnc :a » qui permet d’accéder à la machine sur l’ip de la machine hôte via VNC (port 5900+a) ;
  • « -snapshot » qui écrit les modifications dans un fichier plutôt que sur le disque de la machine virtuelle ;
  • « -smp x » qui permet de préciser le nombre de processeur alloué à la machine virtuelle ;
  • « -net » permettant de paramétrer toutes les options réseau de la machine virtuelle.

Au final l’installation d’une machine virtuelle peut donc être intégralement effectuée à distance en VNC sur une machine sans interface graphique (un serveur par exemple). Nous commencerons par lancer la machine virtuelle :

20:34:26 fhh@srv ~ $ kvm -hda kvm/hda.deb.raw -m 512 -k fr -vnc :1 -cdrom ~/Downloads/debian-6.0.1a-amd64-businesscard.iso -boot d -daemonize
20:34:33 fhh@srv ~ $ ps aux
...
fhh      23349  0.7  0.5 742772 20096 ?        Sl   20:34   0:23 kvm -hda kvm/hda.deb.raw -m 512 -k fr -vnc :1 -cdrom /users/fhh/Downloads/debian-6.0.1a-amd64-businesscard.iso -boot d -daemonize
...

Puis depuis une machines de bureau (disposant d’une interface graphique) nous nous y connecterons via VNC :

20:37:55 fhh@mafalda ~ $ xtightvncviewer srv.rez0.lan:5901
...

Cette méthode est aussi applicable à des machines virtuelle sous MS Windows par exemple (un Windows tournant dans un Linux sans interface graphique…).

Références

Man kvm / qemu-kvm : http://linux.die.net/man/1/qemu-kvm
Man qemu-img : http://linux.die.net/man/1/qemu-img
Le site du projet KVM : http://www.linux-kvm.org/page/Main_Page
Le site du projet QEMU : http://wiki.qemu.org/Main_Page

10 réflexions au sujet de « Première approche de KVM (« Kernel-based Virtual Machine ») »

  1. Bonjour, en premier lieu merci beaucoup pour cette procédure technique !
    Néanmoins, je rencontre un petit problème lorsqu’il s’agit d’envoyer la commande kvm kvm/hda.deb.raw l’ordinateur me répond Could not initialize SDL(No available video device) - exiting

    Je réalise l’installation de KVM/QEMU sur une machine … virtuelle VMWare à l’aide d’une installation toute « neuve » de Debian – Testing – Wheezy.

    Je n’ai pour le moment trouvé rien de probant – et encore moins en français – concernant ce message d’erreur à ce niveau de procédure …

    Auriez-vous éventuellement déjà entendu parler de ce petit souci ?

    1. Lors de l’invocation de « kvm kvm/hda.deb.raw » ou de « qemu-system-x86_64 kvm/hda.deb.raw« , le système affiche une jolie fenêtre graphique de la VM qui démarre .
      Dans votre cas, il semble que l’affichage de cette fenêtre échoue soit parceque vous lancez cette commande depuis un terminal, soit parceque l’utilisateur qui execute la commande n’a pas d’accès direct à X .


      aaricia ~ # qemu-system-x86_64 hda.deb.raw
      Could not initialize SDL(No available video device) - exiting

      Comment résoudre ça ? utilisez le mode démon lors du lancement de votre VM, mais pensez à activer un accès (VNC par exemple) pour pouvoir accéder à la VM :

      aaricia ~ # qemu-system-x86_64 hda.deb.raw -vnc :1 -daemonize

      Ensuite vous pourrez accéder à la VM via une machine disposant d’une interface graphique en VNC (dans le cas de l’exemple ci dessus) :

      fhh@aaricia ~ $ vncviewer 127.0.0.1:5901

      Tenez nous au courant !!!

  2. KVM s’appuie sur les extensions matériels des processeurs, il fait donc de la virtualisation complète et non de la para-virtualisation (comme Xen par exemple).

    1. Vaste sujet… Complètement d’accord avec l’argument, mais VirtIO remet tout en question… On ne s’en rend pas vraiment compte puisque tout est nativement intégré aux noyaux des différentes distribs, mais ils y a bien la de la virtualisation d’interface et « des » hyperviseurs… non ? (http://www.linux-kvm.org/page/Virtio). La frontière devenant difficile à distinguer, je retire ma remarque de l’article …
      Merci.

      1. Oui c’est juste. La frontière est effectivement assez vague dans certains cas.

        Par ma remarque, je voulais juste relever le fait qu’un hyperviseur s’appuyant sur de la para-virtualisation ne nécessite pas d’extensions matériels sur le processeur, contrairement à la virtualisation complète comme KVM.

        Enfin bon, cette remarque n’est pas plus très pertinente en 2012 vu les processeurs que l’on trouve sur le marché….

  3. salut, et merci pour le tuto, je cherchais comment faire de la virtu simplement sans avoir à rebooter sur un kernel à part (xen) 🙂
    Sinon, pour le réseau de la machine virtuelle, il est par défaut en nat.
    pour le mettre en bridge et faire en sorte que tout le monde puisse la voir:
    http://wiki.debian.org/QEMU

    1. Heureux que ça ait pu servir 🙂
      Pour la partie réseau je comptais faire un petit rappel… dans un prochain post…
      Merci pour le retour

    1. Je n’ai pour le moment entendu que du bien de PROXMOX (http://pve.proxmox.com/wiki/Main_Page). Vous vous ajoutez donc à la longue liste des personnes satisfaites par l’outil…

      PROXMOX fera probablement l’objet d’un post rien qu’à lui, mais si quelqu’un à déjà une base, ou souhaite soumettre son propre article, se sera avec plaisir…

      Merci pour ce retour d’expérience…

Laisser un commentaire

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