Le Xen sous Mandriva 2007 pour les nuls (ou presque)
par Yves-Gaël Chény aka nantes_geek
site perso : www.antredugeek.fr
irc : zelazny.freenode.net
channel : ##xen
INTRODUCTION :
Mais pourquoi le Xen ? C'est vrai, il faut vraiment une bonne raison pour perdre son temps pendant environ une heure sur cette page ....
En fait le Xen (site officiel : http://www.xensource.com/ ) vous permet de faire toutes sortes de choses sans la perte de performance habituellement liée à une virtualisation et avec quelques avantages en plus .
Avec Xen, vous pouvez : faire fonctionner plusieurs système/noyau Linux en même temps sur le même ordinateur physique, attribuer des ressources physiques à ces machines ( mémoire vive, disque dur, cpu, carte pci ), si vous avez la chance d'avoir un processeur qui supporte les instructions Virtual Machine Extensions (VMX) pour intel (http://www.intel.com/cd/ids/developer/asmo-na/eng/197668.htm) ou l'équivalent AMD, vous pouvez même prétendre faire fonctionner un Windows ® ( chacun est libre de faire ce qui lui plaît après tout) sans en modifier le noyau ( ce qui est bien sûr interdit de toute façon ).
Bref un monde nouveau s'ouvre à vous et je vais essayer de vous donner les bases pour vous en sortir.
Explications de base sur le Xen :
Pour que vous soyez capable de comprendre ce qui va suivre, je vais commencer par vous expliquer les termes les plus souvent employés avec XEN.
Les Domaines :
Les domaines sont en fait tout simplement les « environnements » virtuels dans lesquels vont fonctionner les systèmes d'exploitations virtualisés, il y a deux types de domaines : le domaine 0 et les domaines U (que j'appellerai respectivement dom0 et domU). Le dom0 est la couche la plus basse. Son kernel est compilé de façon spécifique avec une priorité d'accès sur la partie physique de la machine. C'est de son système que l'on contrôle les domU, qui eux sont les différentes machines virtuelles.
Dans un système de virtualisation « normal », le dom0 serait votre installation de base mais dans le cas du xen, le dom0 auquel vous avez accès est déjà une couche de virtualisation mais qui a les accès prioritaires et complet (sauf cas que nous verrons plus tard) à la machine physique.
Le réel noyau non virtuel est un micro-kernel, en général nommé xen-laversion.gz
Vous le verrez lors de la configuration du GRUB.
Les interfaces réseaux virtuelles ou VIF :
Le xen étant en général tout particulièrement destiné à des serveurs, les interfaces réseaux virtuelles ou vif sont nécessaires. Les vifs sont auto générés sauf instruction contraire de votre part lors du démarrage du démon xen ( /etc/init.d/xend ) puis lors du démarrage de chaque machine virtuelle (domU si vous avez suivis).
Pour faire simple :
Vous avez par défaut eth0 de votre machine physique qui est eth0 de votre dom0.
Cet eth0 dupliqué virtuellement en peth0 et en vif0.0 .
ils sont bridgés en xenbr0.
Puis chaque domU reçoit un vif numéroté en fonction de son id (1,2,3 ...) qui représente leur eth0/eth1 ... virtuels et qui sont bridgé par défaut sur xenbr0.
Voilà le résultat sur un serveur xen d'un brctl show

et celui d'un xm list

Vous voyez bien : vif1.0 pour le Xen1 ayant l'ID 1 , vif2.0 pour le Xen2 ayant l'ID 2 etc ...
(Petit jeu : cherchez le domaine intru ^^)
Xend :
J'ai parlé plus haut de /etc/init.d/xend .
En effet xen est à la fois dans le kernel et un daemon qui se lance au démarrage du dom0.
ce xend sert à générer les différentes interfaces, à gérer les domaines et leurs attributions. Pour cela il se sert d'un ensemble de scripts situés dans le /etc/xen/scripts (c'était logique ;) )
il permet l'utilisation de l'instruction xm
sur laquelle nous reviendrons à la fin.
Partie 1 – Installation des bases .
Mon serveur est un bi-xeon avec 4 Go de RAM et un raid 5 de 3 disques de 250 Go + un spare de 250Go
Il est partitionné comme ça :

L'explication que je vais donner va utiliser des partitions et pas des fichiers donc ça a son importance.
Nous allons partir du principe que vous savez installer une mandriva2007 et installer les mirroirs ( urpmi.addmedia avec easy urpmi par exemple )
Pour faire simple, je suis parti pour faire ce tutoriel d'une Mandriva 2007 free. J'ai tout décoché, je ne suis pas allé faire une configuration manuelle des packetages et je n'ai pas coché la case qui vire l'urpmi. Puis j'ai fait un urpmi openssh-server parce que mon serveur fait du bruit.
mon rpm -qa est là : RPM -QA
Il y a plus court, je sais , mais je n'ai pas envie de m'embêter trop non plus.
A- Installation des sources / Installations des paquetages Mandriva .
Nous allons installer xen et générer ses noyaux à partir des sources xen officielles.
Toute cette partie peut être remplacée par :
urpmi xen
urpmi kernel-xen0-2.6.17.5mdv
urpmi kernel-xenU-2.6.17.5mdv
Malheureusement si comme moi certaines de vos cartes (ici ma 3ware39550 pour mon RAID) ne sont pas supportées il vous faudra re-compiler vos kernels.
A partir d'ici je fais tout en ssh sauf indication contraire :
B- Téléchargement des sources officielles Xen :
Tout d'abord nous avons besoin de wget :
urpmi wget
puis :
wget http://bits.xensource.com/oss-xen/release/3.0.3-0/src.tgz/xen-3.0.3_0-src.tgz
si le lien n'est plus valide : http://www.xensource.com/download pour trouver le bon chemin
ensuite :
[root@localhost ~]# mv xen-3.0.3_0-src.tgz /usr/src/
[root@localhost ~]# cd /usr/src
[root@localhost src]# tar -xzf xen-3.0.3_0-src.tgz
pour travailler proprement ;)
[root@localhost src]# ln -s xen-3.0.3_0-src xen
[root@localhost src]# cd xen
C- Compilation des différentes ressources Xen, kernels et autres outils :
Il faut maintenant préparer nos outils :
[root@localhost xen]# urpmi make
[root@localhost xen]# urpmi gcc
[root@localhost xen]# urpmi patch
[root@localhost xen]# urpmi zlib-devel
[root@localhost xen]# urpmi libncurses-devel
[root@localhost xen]# urpmi libstdc++6-devel-4.1.1-3mdk.i586
[root@localhost xen]# urpmi libcryptopp5-devel-5.3-0.20050714.1mdk.i586
[root@localhost xen]# urpmi libopenssl0.9.8-devel
[root@localhost xen]# urpmi x11-proto-devel
[root@localhost xen]# urpmi bridge-utils
[root@localhost xen]# urpmi python-devel
Je crois qu'on a fait le tour...
On va commencer par créer l'environnement par défaut du xen
Pour cela une instruction très simple :
[root@localhost xen]# make world
puis une fois que tout est fini :
[root@localhost xen]# sh install.sh
Si vous allez dans votre /boot :
[root@localhost xen]# cd /boot
[root@localhost boot]# ll

Vous pouvez voir :
Le kernel xen-3.0.3-0.gz , c'est le kernel de démarrage Xen sur lequel on va passer en module notre kernel dom0.
Potentiellement le kernel : vmlinuz-2.6.16.29-xen peut servir de kernel pour le dom0 et pour les domU mais je vous conseille pour des raisons de customisation ( modules/drivers spécifiques suivant les serveurs virtuels que l'on veut obtenir ) de re-compiler le xen en séparant les deux kernels domO et domU
Pour cela on revient dans notre /usr/src/xen/
[root@localhost boot]# cd /usr/src/xen
[root@localhost xen]# make world KERNELS="linux-2.6-xen0 linux-2.6-xenU"
C'est reparti pour une compilation. On pouvait faire directement le make world comme ça mais je pense qu'il est intéressant de vous montrer les deux possibilités.
au final on obtient ça :
[root@localhost xen]# cd /boot/
[root@localhost boot]# ll

on voit bien nos deux kernels supplémentaires ( en
fait des
modules du kernel xen-3.0.3-0.gz mais le plus simple est de les
considérer comme des kernels à part
entière ) .
D – Personnalisation des kernels dom0 ou domU :
Pour personnaliser des kernels dom0 ou domU, ça se passe comme pour un kernel standard :
par exemple là je vais mettre dans le noyau ( pas en module mais bien dans le noyau ) la prise en charge de la 3ware9550 :
on retourne dans ses sources xen :
[root@localhost boot]# cd /usr/src/xen
puis on va dans le kernel que l'on veut modifier, ici le linux-2.6.16.29-xen0
[root@localhost xen]# cd linux-2.6.16.29-xen0/
[root@localhost linux-2.6.16.29-xen0]# make menuconfig
on obtient ça :

Vous remarquerez que les seules différences sont en haut, la version du kernel, et la présence , vers le bas, d'un nouvel onglet XEN dans vos choix de configuration.
Rien ne vous empêche de vous prendre la tête avec un make config si vous êtes puriste ou d'installer 15 kg de gtk dans votre dom0 pour faire un make xconfig ( c'est ça qui est bien avec gnu/linux , c'est qu'on est libre ;) )
La particularité du dom0 par rapport au domU réside dans une option de cet onglet XEN, on va aller y faire un tour en passant :

Vous avez une belle option claire :
[*] Privileged Guest (domain 0)
Donc vous l'avez sans doute deviné : c'est ça qui définit le type de domaine ;)
Je fais un petit aparté sur une autre option qui peut éventuellement vous intéresser plus tard :
<*> PCI-device backend driver │ │
│ │ PCI Backend Mode (Passthrough) --->
C'est ce qui vous permettra d'attribuer à vos domU des périphériques PCI...
Vous pouvez maintenant revenir à votre menu principal.
Il peut être intéressant, même pour les moins courageux, d'aller faire un tour dans :
Processor type and features --->
Afin d'y préciser deux trois trucs comme :

Le type de processeur ( pour moi un Xeon )
le « Symmetric multi-processing support » si vous en avez plusieurs
et la mémoire vive dont vous avez besoin « High Memory Support » ici je vais changer pour mettre 4GB (j'ai encore un problème non identifié avec 64GB )
Si vous avez un Athlon, les options x86 sont pour vous et peuvent vous éviter quelques désagréments.
Pendant que vous lisiez ces lignes, j'ai eu le temps d'aller faire un tour dans
Device Drivers ---> │ │
SCSI device support ---> │ │
│ │ SCSI low-level drivers --->
│ │ <*> 3ware 5/6/7/8xxx ATA-RAID support │ │
│ │ <*> 3ware 9xxx SATA-RAID support
Pour ne pas avoir un petit problème au boot de mon dom0 ( genre je trouve pas le disque sur lequel booter ^^ )
Méfiez-vous, l'initrd pour xen dom0 n'a rien de trivial donc ce que vous pouvez mettre dans le kernel et non en module, faites le .
Après ça, on quitte tout et on revient pour lancer un merveilleux (et ceux qui comme moi aime faire ça me comprendront ):
[root@localhost linux-2.6.16.29-xen0]# make && make modules && make modules_install && make install
MIAM ;)
on attend les quelques minutes nécessaires ..... ( sleep 1800 )
et quand enfin le moment est arrivé, on passe à la partie suivante !
Partie 2 – Configuration du GRUB.
Maintenant que l'on est rendu là, nous avons : le kernel, le xend, les outils divers et variés nécessaires à la suite.
Il ne nous reste plus qu'à booter sur notre dom0 pour avoir enfin la paix et s'occuper des domU ;)
Pour cela il nous faut un grub.
[root@localhost boot]# urpmi grub
puis il faut l'installer sur le disque de démarrage, ici /dev/sda (peut être /dev/hda chez vous )

voilà, vous voyez votre device de démarrage est hd0 pour grub ....
Maintenant, il faut éditer le fichier dans /boot/grub/menu.lst
mais comme il y en a pas on le crée à partir de l'exemple :
[root@localhost boot]# cp /boot/grub/menu.lst.example /boot/grub/menu.lst
puis utilisez votre éditeur de texte préféré ( vi ::> non non ceci n'est pas un troll )
[root@localhost boot]# vi /boot/grub/menu.lst

Vous devriez avoir quelque chose comme ça que l'on va transformer en ça :

Pour faire simple :
le kernel du xen est toujours xen.gz
dom0_mem est la mémoire vive que vous attribuez à votre dom0 en Ko (pas en Mo :) ça m'est arrivé ça fait un choc ^^ )
le module est le « kernel » du dom0
gardez toujours une possibilité de boot « normal » , une erreur est si vite arrivée
Maintenant courage, on reboot et si tout se passe bien on se retrouve au chapitre suivant .... ;)
Partie 3 – Un peu de ménage ça fait pas de mal.
Je me reconnecte en ssh à mon serveur (si tout se passe bien sshd s'est relancé avec la machine ;)
déjà après connexion, un :
[root@localhost ~]# uname -r
doit vous donner un kernel xen
ici : 2.6.16.29-xen0
Théoriquement, si vous avez compris l'intérêt du xen, vous ne voudrez pas faire tourner 40 tonnes de trucs sur votre dom0, donc vous pouvez enlever les divers démons qui ne vous servent pas et qui sont là à l'heure actuelle ...
[root@localhost ~]# chkconfig –list

Oulah, il y a du monde bon, dans l'orde :
[root@localhost ~]# chkconfig --del alsa
[root@localhost ~]# chkconfig --del keytable
[root@localhost ~]# chkconfig --del numlock
[root@localhost ~]# chkconfig --del sound
[root@localhost ~]# chkconfig --del wltool
[root@localhost ~]# chkconfig --level 345 xend on
bon là on est mieux déjà.
vous remarquerez que le xend n'est pas au démarrage par défaut... ça peut être utile de le mettre :)
Pour voir si votre xen fonctionne faites :
[root@localhost ~]# xm list
Et non ça ne marche pas ... c'est normal !
[root@localhost ~]# /etc/init.d/xend start
(au prochain démarrage , ça marchera vous l'avez mis dans le chkconfig )

Voilà votre beau dom0 fonctionne. On peut voir qu'il a l'ID 0 et 124 Mb de mémoire vive.
Partie 4 – Votre premier DomU
Bon voilà, on est heureux, on a un dom0 maintenant il ne nous reste plus qu'à faire un domU (voir plusieurs suivant ce que l'on veut en faire)
Pour cela, il faut préparer un arbre linux, le plus simple étant de recopier celui du dom0 dans une partition.
Ca tombe bien j'ai un /xen1 prévu à cet effet...

Par exemple ici j'ai prévu les emplacements pour 4 xen chacun ayant une tâche bien spécifique dans mon réseau.
J'ai également prévu une swap pour chacun :

Je vais faire avec vous le domU Xen1 qui aura pour racine : /dev/sda6 et pour swap /dev/sda7
Il faut penser à enlever les lignes correspondantes dans la /etc/fstab pour ne pas y avoir de conflit empêchant le démarrage du domaine U .
A- Création de la racine du domaine U xen1 :
Tout d'abord pour travailler sans soucis il faut stopper les services réputés pour être bavards :
[root@localhost ~]# /etc/init.d/crond stop; /etc/init.d/atd stop; /etc/init.d/syslog stop;
puis on recopie les parties de l'arbre du dom0 qui sont nécessaires :
[root@localhost ~]# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /xen1
Dans le cp le -a vous permet un mode « archive » pour conserver les liens symboliques et les uids, le x vous épargne la copie des systèmes de fichiers autres (ça ne sert pas trop ici mais c'est une bonne habitude pour plus tard ;) )
Une fois que cela est fini, il nous reste plus qu'à créer le fichier de configuration du domU.
B- Le Fichier de configuration domU :
Pour qu'un domU démarre, il lui faut un fichier de configuration.
Des fichiers d'exemples sont disponibles à l'installation dans le /etc/xen/
Il y en a plusieurs, on va partir du xmexample1 qui est le plus simple pour commencer.
D'abord on va en faire une copie pour travailler dessus tranquillement .
[root@localhost ~]# cp /etc/xen/xmexample1 /etc/xen/auto/xen1
Je le mets dans /etc/xen/auto pour pouvoir démarrer ensuite avec le service xendomains.
Je détaillerai son utilisation en fin de ce tuto.
Nous allons maintenant l'éditer :
[root@localhost ~]# vi /etc/xen/auto/xen1

d'abord on lui indique le kernel sur lequel booter.

Ici vous pouvez préciser un initrd personnalisé ( mkinitrd )

là vous précisez la mémoire vive que vous lui attribuez en MB (attention si il n'y en plus assez votre machine ne démarre pas).

Ici vous mettez le nom de votre domaine, vous le verrez s'afficher lors d'un « xm list »

Ici vous indiquez le nombre de cpu à utiliser, par défaut 1 si vous laissez commenté. La valeur maximum ne dépend pas de votre machine physique mais du nombre maximum de cpu indiqué lors de la compilation de votre kernel. N'oubliez pas c'est virtuel ;)

Ici vous configurez votre ou vos interfaces réseaux virtuelles, mac et bridge de rattachement. Rien ne vous empêche si vous avez plusieurs interfaces réseau de créer d'autres bridges xen. Par défaut xenbr0 correspond au bridge sur eth0. Mais l'ip de la machine virtuelle domU sera indépendante de celle de votre machine virtuelle dom0.

Ici vous avez définie deux disques virtuels . La règle est la suivante :
phy si c'est un disque physique
sda6 : votre disque sur le dom0
sda1 : l'équivalent sur votre domU xen1
w : inscriptible.
Attention pensez à les démonter dans le dom0 avant de booter le domU Xen1.

Un dernier petit paramètre pour la root qui va définir le root device pour votre kernel domU lors du boot.
Le reste peut rester tel quel .
C- derniers petits réglages avant de démarrer le domU :
Pour que le domU fonctionne bien, il ne faut surtout pas oublier deux trois choses :
modifier sa fstab :
[root@localhost boot]# vi /xen1/etc/fstab

pour mettre les bon dev tel que définis dans le fichier de configuration du domaine.
créer les répertoires non recopiés dans l'arbre.
[root@localhost boot]# mkdir /xen1/{proc,sys,home,tmp,opt}
démonter le xen1 et l'enlever de la fstab du dom0 (ne pas oublier sa swap aussi ;) )
[root@localhost boot]# umount /xen1
[root@localhost boot]# vi /etc/fstab

[root@localhost boot]# swapoff /dev/sda7
Bon là ça devrait marcher si vous allez dans /etc/xen/auto
[root@localhost auto]# xm create xen1

Vous pouvez maintenant voir votre domU Xen1 démarré !
Partie 5 – L'utilisation de base pour xm :
Pour utiliser vos domaines, il y a xm :
xm list permet de lister vos domaines actifs
xm create nom_du_script_de_démarrage_de_votre_domaine permet de lancer votre domaine
xm destroy nom_du_domaine (ici Xen1) permet de stopper votre domaine (équivalent d'un halt dans le domaine)
xm console nom_du_domaine vous ouvre une console dans votre domaine ( elle se quitte avec un ctrl+] comme pour un telnet mais ça ne marche pas parfois , et je n'ai pas trouvé pourquoi, le alt Gr ne doit pas être toujours bien supporté)
si vous voulez que vos domaines se lancent au démarrage de votre serveur vos scripts doivent se trouver dans /etc/xen/auto/ et :
chkconfig –level 345 xendomains
Théoriquement vous avez maintenant les bases pour vous amuser un peu.
Partie 6 – Quelques conseils pour la route :
allez faire un tour dans le inittab de vos domU (/etc/inittab) et commentez les lignes 2,3,4,5,6 après « # Run gettys in standard runlevels », ça vous évitera des erreurs de respawn
D'autres conseils viendront au fur et à mesure de vos questions, n'hésitez pas à m'envoyer un mail sur xen@antredugeek.fr ;)
Fait par Yves-Gaël Chény aka nantes_geek 11/2006
Merci de conserver ces références en cas de reproduction partielle ou complète de cette page