Kvm

Introduction

KVM consiste en un module noyau kvm.ko qui implémente le coeur de l’infrastructure virtuelle et les modules kvm-intel.ko ou kvm-amd.ko suivant votre architecture. Cette technologie nécéssite des processeurs dont l’architetcture supporte les extensions de virtualisation Intel VT ou AMD-V.

Afin de vérifier que votre processeur possède bien les options de virtualisation :

Pour Intel :

grep vmx /proc/cpuinfo

Pour AMD :

grep svm /proc/cpuinfo

Les gros avantages de KVM sont : son intégration native au noyau, le support virtio à partir de la version 2.6.20, des performances proches de la machine physique et enfin une certaine facilité de mise en oeuvre.

Dans la suite de ce document nous allons mettre en place un hyperviseur sous gentoo et une machine virtuelle elle aussi sous gentoo ;-) , nous terminerons en mettant en place la paravirtualisation sous virtio.

Hyperviseur

Installation

Demasquez le paquet app-emulation/qemu-kvm :

echo "app-emulation/qemu-kvm" >> /etc/portage/package.accept_keywords/world

Choisissez le type de processeur que vous voudrez émuler avec qemu-kvm et mettez les dans le fichier make.conf, dans notre exemple i386 et x86_64 :

vi /etc/portage/make.conf

QEMU_SOFTMMU_TARGETS="i386 x86_64"
QEMU_USER_TARGETS="i386 x86_64"

Activez l’option des Entrées/Sorties asynchrones :

echo "app-emulation/qemu-kvm aio" >> /etc/portage/package.use/world.use

Installez le paquet app-emulation/qemu-kvm :

emerge -av app-emulation/qemu-kvm

Forcez l’installation du dernier paquet sys-kernel/gentoo-sources afin d’installer la dernière version des modules kvm du noyau.

echo "sys-kernel/gentoo-sources" >> /etc/portage/package.keywords/system.keywords"

Et installez :

emerge -av sys-kernel/gentoo-sources

Configuration noyau

Passons à la configuration du noyau :

cd /usr/src/linux
make menuconfig
Bus options (PCI etc.)  --->
  [*] PCI IOV support

[*] Networking support  --->
  Networking options  --->
    <*> 802.1d Ethernet Bridging

Device Drivers  --->
  [*] Network device support  --->
    <M>   Universal TUN/TAP device driver support

[*] Virtualization  --->
  <M>   Kernel-based Virtual Machine (KVM) support
  <M>     KVM for Intel processors support
  <M>   Host kernel accelerator for virtio net
  <M>   PCI driver for virtio devices (EXPERIMENTAL)
  <M>   Virtio balloon driver (EXPERIMENTAL)

Compilez et installez votre nouveau noyau :

make -j5 && make modules_install

Modifiez votre fichier /etc/conf.d/modules afin que le chargement des modules se fasse automatiquement à chaque redémarrage.

modules_2_6="${modules_2_6} kvm_intel"
module_kvm_intel_args_2_6=""

modules_2_6="${modules_2_6} tun"
module_tun_args_2_6=""

modules_2_6="${modules_2_6} virtio_balloon"
module_virtio_balloon_args_2_6=""

modules_2_6="${modules_2_6} virtio_ring"
module_virtio_ring_args_2_6=""

modules_2_6="${modules_2_6} virtio_pci"
module_virtio_pci_args_2_6=""

modules_2_6="${modules_2_6} virtio_rng"
module_virtio_rng_args_2_6=""

modules_2_6="${modules_2_6} vhost_net"
module_vhost_net_args_2_6=""
update-modules

Installez votre nouveau noyau et rebootez.

Installation et paramétrage

Configuration réseau de l’hyperviseur

Installez les paquets bridge-utils, usermode-utilities et iproute2 pour le paramétrage réseau :

emerge -av bridge-utils usermode-utilities iproute2

Créons le bridge et les interfaces tap qui serviront à la connectivité réseau de nos machines virtuelles :

cd /etc/init.d
ln -s net.lo net.br0
ln -s net.lo net.tap0
ln -s net.lo net.tap1

Modifier votre fichier /etc/conf.d/net :

modules="iproute2"

rc_need_br0="net.tap0 net.tap1 net.eth0"

bridge_add_eth0="br0"
bridge_add_tap0="br0"
bridge_add_tap1="br0"

brctl_br0="setfd 0
stp off"

config_br0="192.168.0.1/24"
routes_br0="default via 192.168.0.254"

config_eth0="null"
txqueuelen_eth0="2000"

config_tap0="null"
tuntap_tap0="tap"

config_tap1="null"
tuntap_tap1="tap"

(Attention! si vous faites les manipulations sur des machines via SSH, vous perdrez la main…)

Modifions l’adresse IP de notre carte réseau :

ifconfig eth0 down
ifconfig eth0 0.0.0.0 promisc up

Créons le bridge et associons notre carte réseau :

brctl addbr br0
brctl addif br0 eth0
ifconfig br0 192.168.0.1 netmask 255.255.255.0 up
route add -net 0/0 gw 192.168.0.254

Créons notre interface tap0 qui servira à notre première machine virtuelle :

tunctl -b -t tap0
ifconfig tap0 0.0.0.0 promisc up
brctl addif br0 tap0

A ce niveau, votre hyperviseur est prêt à recevoir sa première machine virtuelle.

Machine Virtuelle

La première chose à faire, consiste à créer le fichier qui servira de disque dur à notre machine virtuelle :

qemu-img create -f qcow2 gentoo-x86_64.img 20G

Une fois là, il ne reste plus qu’à lancer la machine virtuelle en la démarrant sur un liveCD afin de procéder comme d’habitude à l’installation de votre OS préféré :

qemu-system-x86_64 -name gentoo-x86_64 -curses -monitor pty \
-cpu core2duo -smp 2 -m 1024 -vga std \
-net nic,model=e1000,macaddr=52:54:00:12:34:60 \
-net tap,ifname=tap0,script=no,downscript=no \
-hda gentoo-x86_64.img \
-cdrom iso/systemrescuecd-x86-2.0.0.iso \
-boot d

Je vous invite à lancer la commande ci-dessous afin de comprendre les différentes options utilisées :

qemu-system-x86_64 --help

A noter que le choix de l’adresse MAC est important car sinon qemu-system-x86_64 choisira l’adresse 52:54:00:12:34:60, ce qui ne pose aucun soucis si vous n’avez qu’une machine virtuelle, à partir de deux, vous risquez d’avoir du mal à les faire communiquer par le réseau …

Noyau de la machine virtuelle

La configuration de votre noyau de votre machine se fait là encore de la manière la plus normale …

La machine virtuelle

Une fois votre installation terminée, eh bien il ne reste plus qu’à stopper la machine virtuelle et la demarrer en mode normale :

qemu-system-x86_64 -enable-kvm -name gentoo-x86_64 -curses -monitor pty \
-cpu core2duo -smp 2 -m 1024 -vga std \
-net nic,model=e1000,macaddr=52:54:00:12:34:60 \
-net tap,ifname=tap0,script=no,downscript=no \
-hda gentoo-x86_64.img \
-boot c

Ou en mode paravirtualisé :

qemu-system-x86_64 -enable-kvm -name gentoo-x86_64 -curses -monitor pty \
-cpu core2duo -smp 2 -m 1024 -vga std \
-net nic,model=virtio,macaddr=52:54:00:12:34:60 \
-net tap,ifname=tap0,script=no,downscript=no \
-drive if=virtio,boot=on,aio=native,file=gentoo-x86_64.img \
-boot c

Liens