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 :
reboot2 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
ifconfigIl 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/cpuinfodevrait 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.rpmPour installer Xen, nous exécutons maintenant simplement
yum install kernel-xen xenCela 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.lstLe 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-virtinstParce 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 scrubDé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.rpmLa 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 rootEnsuite, 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.patchMaintenant, 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.rpmAllez 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.rpmEnsuite, nous redémarrons le système :
rebootLe 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 listpour 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 listdevrait afficher ceci :
[root@server1 ~]# virsh list
Id Name State
----------------------------------------------------
0 Domain-0 running
[root@server1 ~]#Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.