Virtualisation · 8 min read · Dec 08, 2025

Virtualisation avec Xen sur CentOS 6.3 (x86_64) (Paravirtualisation & Virtualisation matérielle)

Virtualisation avec Xen sur CentOS 6.3 (x86_64) (Paravirtualisation & Virtualisation matérielle)

Version 1.0
Auteur : Falko Timme
Suivez-moi sur Twitter

Ce tutoriel fournit des instructions étape par étape sur la façon d’installer Xen (version 4.1.x) sur un système CentOS 6.3 (x86_64).

Xen vous permet de créer des systèmes d’exploitation invités (systèmes d’exploitation nix comme Linux et FreeBSD*), appelés “machines virtuelles” ou domU, sous un système d’exploitation hôte (dom0). En utilisant Xen, vous pouvez séparer vos applications en différentes machines virtuelles qui sont totalement indépendantes les unes des autres (par exemple, une machine virtuelle pour un serveur de messagerie, une machine virtuelle pour un site web à fort trafic, une autre machine virtuelle qui sert les sites web de vos clients, une machine virtuelle pour DNS, etc.), mais utiliser le même matériel. Cela permet d’économiser de l’argent, et ce qui est encore plus important, c’est plus sécurisé. Si la machine virtuelle de votre serveur DNS est piratée, cela n’a aucun effet sur vos autres machines virtuelles. De plus, vous pouvez déplacer des machines virtuelles d’un serveur Xen à un autre.

Je vais utiliser CentOS 6.3 (x86_64) à la fois pour le système d’exploitation hôte (dom0) et le système d’exploitation invité (domU).

Ce guide est destiné à être un guide pratique ; il ne couvre pas les bases théoriques. Elles sont traitées dans de nombreux autres documents sur le web.

Ce document est fourni sans aucune garantie ! Je tiens à dire que ce n’est pas la seule façon de configurer un tel système. Il existe de nombreuses façons d’atteindre cet objectif, mais c’est la méthode que je choisis. Je ne donne aucune garantie que cela fonctionnera pour vous !

1 Remarque préliminaire

Ce guide expliquera comment configurer des machines virtuelles basées sur des images et également des machines virtuelles basées sur LVM.

Assurez-vous que SELinux est désactivé ou permissif :

vi /etc/sysconfig/selinux

| # Ce fichier contrôle l'état de SELinux sur le système. # SELINUX= peut prendre l'une de ces trois valeurs : # enforcing - La politique de sécurité SELinux est appliquée. # permissive - SELinux imprime des avertissements au lieu d'appliquer. # disabled - SELinux est complètement désactivé. SELINUX=disabled # SELINUXTYPE= type de politique en cours d'utilisation. Les valeurs possibles sont : # targeted - Seuls les démons réseau ciblés sont protégés. # strict - Protection complète de SELinux. SELINUXTYPE=targeted |

Si vous avez dû modifier /etc/sysconfig/selinux, veuillez redémarrer le système :

reboot

2 Création d’un pont réseau

Nous devons configurer un pont réseau sur notre serveur afin que nos machines virtuelles puissent être accessibles depuis d’autres hôtes comme si elles étaient des systèmes physiques dans le réseau.

Pour ce faire, nous installons le paquet bridge-utils…

yum install bridge-utils

… et configurons un pont. Créez le fichier /etc/sysconfig/network-scripts/ifcfg-br0 (veuillez utiliser les valeurs IPADDR, PREFIX, GATEWAY, DNS1 et DNS2 du fichier /etc/sysconfig/network-scripts/ifcfg-eth0) ; assurez-vous d’utiliser TYPE=Bridge, pas TYPE=Ethernet :

vi /etc/sysconfig/network-scripts/ifcfg-br0

| DEVICE="br0" NM_CONTROLLED="yes" ONBOOT=yes TYPE=Bridge BOOTPROTO=none IPADDR=192.168.0.100 PREFIX=24 GATEWAY=192.168.0.1 DNS1=8.8.8.8 DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System br0" |

Modifiez /etc/sysconfig/network-scripts/ifcfg-eth0 comme suit (commentez BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1 et DNS2 et ajoutez BRIDGE=br0) :

vi /etc/sysconfig/network-scripts/ifcfg-eth0

| DEVICE="eth0" #BOOTPROTO=none NM_CONTROLLED="yes" ONBOOT=yes TYPE="Ethernet" UUID="73cb0b12-1f42-49b0-ad69-731e888276ff" HWADDR=00:1E:90:F3:F0:02 #IPADDR=192.168.0.100 #PREFIX=24 #GATEWAY=192.168.0.1 #DNS1=8.8.8.8 #DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0" BRIDGE=br0 |

Redémarrez le réseau…

/etc/init.d/network restart

… et exécutez

ifconfig

Il devrait maintenant afficher le pont réseau (br0) :

[root@server1 ~]# ifconfig  
br0       Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:460 (460.0 b)  TX bytes:2298 (2.2 KiB)  
  
eth0      Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:18455 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:11861 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:26163057 (24.9 MiB)  TX bytes:1100370 (1.0 MiB)  
          Interrupt:25 Base address:0xe000  
  
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:2456 (2.3 KiB)  TX bytes:2456 (2.3 KiB)  
  
[root@server1 ~]#

3 Installation de Xen

Tout d’abord, vérifiez si votre CPU prend en charge la virtualisation matérielle - si c’est le cas, la commande

egrep '(vmx|svm)' --color=always /proc/cpuinfo

devrait afficher quelque chose, par exemple comme ceci :

[root@server1 ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
[root@server1 ~]#

Si rien n’est affiché, alors votre processeur ne prend pas en charge la virtualisation matérielle. Cela signifie que vous ne pouvez utiliser que la paravirtualisation avec Xen, mais pas la virtualisation matérielle.

Comme CentOS 6 est basé sur RedHat 6, et que RedHat a abandonné le support de Xen dans la version 6, nous devons obtenir Xen à partir d’un dépôt tiers. Nous pouvons activer le dépôt comme suit :

yum install http://au1.mirror.crc.id.au/repo/kernel-xen-release-6-3.noarch.rpm

Pour installer Xen, nous exécutons maintenant simplement

yum install kernel-xen xen

Cela installe Xen et un noyau Xen sur notre système CentOS.

Avant de pouvoir démarrer le système avec le noyau Xen, veuillez vérifier votre configuration de chargeur de démarrage GRUB. Nous ouvrons /boot/grub/menu.lst :

vi /boot/grub/menu.lst

Le premier noyau répertorié doit être le noyau Xen que vous venez d’installer :

| [...] title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32.57-2.el6xen.x86_64.img [...] |

Nous devons modifier cette section afin que l’hyperviseur Xen soit chargé en premier. Dans la ligne kernel /vmlinuz…, remplacez le premier mot kernel par module. Faites de même dans la ligne suivante - remplacez le premier mot initrd par module dans la ligne initrd /initramfs…. Ensuite, ajoutez la ligne kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin après la ligne root et avant la première ligne module (si vous avez plus d’un cœur CPU, vous pouvez spécifier un autre nombre que 1 pour dom0_max_vcpus). La section kernel finale devrait ressembler à ceci :

| [...] title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img [...] |

Changez la valeur de default à 0 (afin que le premier noyau (le noyau Xen) soit démarré par défaut) :

| [...] default=0 [...] |

Le fichier complet /boot/grub/menu.lst devrait ressembler à quelque chose comme ceci :

| # grub.conf généré par anaconda # # Notez que vous n'avez pas besoin de relancer grub après avoir apporté des modifications à ce fichier # AVIS : Vous avez une partition /boot. Cela signifie que # tous les chemins de noyau et initrd sont relatifs à /boot/, par exemple. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg_server1-LogVol00 # initrd /initrd-[generic-]version.img #boot=/dev/sde default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img title CentOS (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img |

Avant de redémarrer, nous installons les paquets libvirt et python-virtinst (qui contient l’outil virt-install que nous utiliserons plus tard pour installer des VM Xen) :

yum install libvirt python-virtinst

Parce que le paquet libvirt de CentOS 6/RedHat 6 n’a pas de support pour Xen, nous devons le reconstruire avec le support Xen. Pour ce faire, nous installons quelques prérequis maintenant :

yum groupinstall 'Development Tools'
yum install python-devel xen-devel libxml2-devel xhtml1-dtds readline-devel ncurses-devel libtasn1-devel gnutls-devel augeas libudev-devel libpciaccess-devel yajl-devel sanlock-devel libpcap-devel libnl-devel avahi-devel libselinux-devel cyrus-sasl-devel parted-devel device-mapper-devel numactl-devel libcap-ng-devel netcf-devel libcurl-devel audit-libs-devel systemtap-sdt-devel libblkid-devel scrub

Découvrons notre version de libvirt :

rpm -qa | grep libvirt
[root@server1 ~]# rpm -qa | grep libvirt  
libvirt-client-0.9.10-21.el6_3.3.x86_64  
libvirt-0.9.10-21.el6_3.3.x86_64  
libvirt-python-0.9.10-21.el6_3.3.x86_64  
[root@server1 ~]#

C’est 0.9.10, donc nous téléchargeons le paquet src.rpm approprié dans /root/src et l’installons :

mkdir /root/src  
cd /root/src  
wget http://vault.centos.org/6.3/os/Source/SPackages/libvirt-0.9.10-21.el6.src.rpm  
rpm -i libvirt-0.9.10-21.el6.src.rpm

La dernière commande affichera quelques avertissements que vous pouvez ignorer :

warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root

Ensuite, nous patchons le support Xen dans les sources de libvirt :

wget http://pasik.reaktio.net/xen/patches/libvirt-spec-rhel6-enable-xen.patch  
cd /root/rpmbuild/SPECS  
cp -a libvirt.spec libvirt.spec.orig  
patch -p0 < ~/src/libvirt-spec-rhel6-enable-xen.patch

Maintenant, nous construisons un nouveau paquet libvirt :

rpmbuild -bb libvirt.spec

À la fin du processus de construction, vous devriez voir quelque chose comme ceci :

Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-lock-sanlock-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.9.10-21.el6.x86_64.rpm

Allez dans le répertoire où les nouveaux paquets ont été créés (/root/rpmbuild/RPMS/x86_64/ dans ce cas)…

cd /root/rpmbuild/RPMS/x86_64/

… et installez les nouveaux paquets libvirt (avec support Xen) comme suit :

rpm -Uvh --force libvirt-0.9.10-21.el6.x86_64.rpm libvirt-client-0.9.10-21.el6.x86_64.rpm libvirt-python-0.9.10-21.el6.x86_64.rpm

Ensuite, nous redémarrons le système :

reboot

Le système devrait maintenant démarrer automatiquement avec le nouveau noyau Xen. Après le démarrage du système, nous pouvons vérifier cela en exécutant

uname -r
[root@server1 ~]# uname -r  
2.6.32.57-2.el6xen.x86_64  
[root@server1 ~]#

Donc, il utilise vraiment le nouveau noyau Xen !

Nous pouvons maintenant exécuter

xm list

pour vérifier si Xen a démarré. Il devrait lister Domain-0 (dom0) :

[root@server1 ~]# xm list  
Name                                     ID   Mem VCPUs      State   Time(s)  
Domain-0                                 0  1024     1      r-----     18.9  
[root@server1 ~]#

Au lieu d’utiliser la commande xm, je vais désormais utiliser la commande virsh pour gérer les VM Xen. C’est la méthode préférée car nous utilisons libvirt.

virsh list

devrait afficher ceci :

[root@server1 ~]# virsh list  
 Id    Name                         State  
----------------------------------------------------  
 0     Domain-0                     running  
  
[root@server1 ~]#
Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.