Ours & Hippy — le blogOurs & Hippyourshippy@huoc.orgtag:blog.huoc.org,2009:atom2009-12-20T15:50:01+01:00tag:blog.huoc.org,2009:posts/35
Premiers pas vers un environnement de test NetBSD/Xen
2009-12-20T15:50:01+01:002009-12-20T15:50:01+01:00Nhat Minh Lê (rz0)
<p>Loin des préoccupations über-théoriques de bluestorm, ces temps-ci,
moi, j’ai essayé de bosser un peu, pour <a class="extern" href="http://www.nsigma.fr">la Junior Entreprise
locale</a>. Autant dire que ça ne se passe pas
tellement bien : on manque de main d’œuvre compétente et sérieuse, et
honnêtement, ça m’irrite au plus haut point que le client soit
perpétuellement déçu de notre travail ; c’est comme si je faisais du
mauvais travail, mais franchement, si je savais que je me taperais
autant de glands à gérer et autant de boulot pour lequel je n’ai pas
signé, je n’aurais jamais accepté ce job. Bref, paraît qu’il y a des
années avec et des années sans, bah là c’est clairement une année
sans.
</p><p>Tout ceci me mène à une petite anecdote : au cours de mon travail, je
suis amené à tester le produit que je développe (la nature duquel est
un secret…) dans une perspective de déploiement sur
serveur. Récemment, je me suis heurté à des bugs que je n’arrive pas
à reproduire sur ma machine de développement, pour une raison ou pour
une autre (je n’ai pas encore réglé le souci), qui semble être liée au
déploiement lui-même, du moins la configuration employée. Du coup,
pour bien faire, je me suis dit que j’allais monter un petit serveur
de test… un petit serveur virtuel !
</p><p>Et ça tombe bien, j’ai toujours trouvé que <a class="extern" href="http://www.xen.org">Xen</a>,
ça avait l’air sympa ! Et en plus, chez NetBSD, on semble accorder une
certaine importance au support Xen, ce qui est plutôt cool. Je me suis
donc mis en tête de configurer un joli petit environnement NetBSD+Xen,
le but étant d’avoir un serveur virtuel tournant sur une NetBSD
<i>vanilla</i>, avec le minimum de paquetages nécessaires au déploiement de
mon application. Bref, un truc propre.<sup>α</sup>
</p><div class="Notes"><p>α : Le véritable serveur tourne sous Linux, mais pour du test
rapide, il est beaucoup plus simple pour moi de virtualiser du
NetBSD ; j’écrirai peut-être un autre billet, si je me fais un test
Linux+Xen.
</p></div><h3>Xen pour les innocents
</h3><p>Pour me la jouer à la blueblue, je vais dire deux mots pour ceux qui
ne connaîtraient pas le principe. Ahem, donc pour ceux qui ne
connaîtraient pas, Xen est une solution de
<a class="extern" href="http://fr.wikipedia.org/wiki/Virtualisation">virtualisation</a>,<sup>β</sup> comme
<a class="extern" href="http://fr.wikipedia.org/wiki/VirtualBox">VirtualBox</a>… mais pas tellement en fait.
</p><div class="Notes"><p>β : … principalement destinée aux serveurs, mais hey !
</p></div><p>Avec VirtualBox, vous avez votre système normal et par-dessus, un
petit logiciel qui fait tourner en son sein un autre système
d’exploitation.
</p><p>Xen est un peu différent. Vous ne pouvez pas simplement lancer Xen
depuis votre système préféré, comme vous lanceriez un programme
quelconque… c’est en fait plutôt l’inverse : Xen est une espèce de
méta-système (un <a class="extern" href="http://fr.wikipedia.org/wiki/Hyperviseur">hyperviseur</a>) qui va se charger de
lancer vos systèmes d’exploitation un à un ! Si donc avant vous aviez,
disons une Ubuntu avec une NetBSD dans votre VirtualBox, vous auriez
maintenant l’hyperviseur Xen, et deux domaines (c’est comme ça que ça
s’appelle dans Xen) : votre Ubuntu, et votre NetBSD.<sup>γ</sup>
</p><div class="Notes"><p>γ : Pour tout vous dire, ce n’est probablement pas le meilleur
choix… Ubuntu ne semble pas intégrer, dans sa ligne de
développement centrale le support de Xen. Voyez la <a class="extern" href="https://help.ubuntu.com/community/Xen">documentation
communautaire d'Ubuntu sur
Xen</a> pour plus de détails.
</p></div><p>Tous les domaines ne sont pas égaux pour autant : il y a toujours un
système principal, appelé dom0 (domaine 0) ; les autres sont les
domaines U (domU). Le dom0, c’est un peu le root de tous vos
domaines : il a tous les pouvoirs, tandis que les autres ont des
droits restreints, notamment concernant l’accès au réseau et au
matériel. Au démarrage, Xen lance le dom0, qui a à sa charge de créer
les domU qu’il désire (ou plutôt d’ordonner à Xen de les créer). Dans
notre exemple, Ubuntu est le dom0, et NetBSD, le seul domU.
</p><p>La dernière chose à savoir est que pour pouvoir être géré par Xen, il
faut que le noyau soit conçu pour dialoguer avec l’hyperviseur, qui
fait office d’abstraction entre la machine et le système. Il y a des
noyaux dom0 et des noyaux domU. NetBSD propose dans sa distribution
officielle des noyaux dom0 et domU ; sous Gentoo, compiler un noyau
Xen est juste une histoire de changer de paquetage sources ; je ne
sais pas trop ce qu’il en est des autres distributions Linux…
</p><p>Bref, si vous ne connaissiez pas Xen, voilà qui est réglé. Il est
temps de passer aux choses sérieuses…
</p><h3>Notes d’installation
</h3><p>Peut-être parce que c’est destiné à des mecs un peu <i>underground</i>, des
<i>sysadmins</i> et tout, il n’y a pas beaucoup de tutos sur Xen… du
moins, il y en a, mais beaucoup ne sont plus à jour et offrent des
informations périmées. Notamment, le <i>howto</i> officiel de NetBSD/xen
est, en l’état, incorrect.<sup>δ</sup> C’est fort dommage car mettre en place un
environnement Xen avec NetBSD est en réalité très simple… pour peu
que l’on sache comment s’y prendre.
</p><p>J’offre ici mes humbles notes d’installation. Sait-on jamais,
peut-être mon expérience servira-t-elle à quelqu’un.
</p><div class="Notes"><p>δ : Si je mets la main sur ces permissions de <i>commit</i> un jour, je
devrais ptet y faire quelque chose… Normalement, je fais signer ma
clef GPG ce lundi !
</p></div><ol><li><p>Si NetBSD est livré avec tout ce qu’il faut pour le faire tourner
comme domaine Xen, Xen lui-même (l’hyperviseur et les outils pour le
contrôler depuis le dom0) est à installer <i>via</i> pkgsrc. Il y a un
jeu de paquetages par version majeure de Xen. Dans mon cas, j’ai
pris la 3 :
</p><pre><code># cd /usr/pkgsrc/xenkernel3 && make install
# cd /usr/pkgsrc/xentools3 && make install
</code></pre><p>Le noyau Xen s’installe très logiquement dans la hiérarchie
<code>/usr/pkg</code>. À l’heure où j’écris ces lignes, le fichier en question
est <code>/usr/pkg/xen3-kernel/xen.gz</code>.
</p><p>On aura aussi besoin de scripts de démarrage pour les démons Xen
<code>xend</code> et <code>xenbackendd</code>. J’ai simplement recopié ceux fournis
à l’endroit habituel :
</p><pre><code># ln -s /usr/pkg/share/examples/rc.d/xend /etc/rc.d/
# ln -s /usr/pkg/share/examples/rc.d/xenbackendd /etc/rc.d/
</code></pre><p>Pour l’instant, ces démons ne font rien ; ils ne peuvent même être
lancés (mais on peut déjà les ajouter dans le <code>rc.conf</code>, histoire de
ne pas oublier). Il nous manque un dom0…
</p></li><li><p>Concernant le dom0, la bonne nouvelle, c’est que seul le noyau
a besoin d’être modifié : juste en changeant de noyau au démarrage,
on peut décider d’utiliser Xen ou pas, tout ça avec le même jeu de
programmes, les mêmes disques et systèmes de fichiers, etc.
</p><p>Pour se faire un noyau dom0, rien de plus simple : un noyau dom0 est
fourni avec NetBSD (<code>XEN3_DOM0</code>) ; en partant de sa configuration,
j’ai simplement modifié le fichier à ma convenance (comme j’ai fait
pour le noyau <code>GENERIC</code>, pour obtenir ma configuration non Xen),
puis <code>config</code> et <code>make</code> ont fait le reste, comme d’habitude :
</p><pre><code># cd /usr/src/sys/arch/conf/
# cp XEN3_DOM0 ELHAYM_DOM0
# emacs ELHAYM_DOM0
# config ELHAYM_DOM0
# cd ../compile/ELHAYM_DOM0
# make depend && make
# cp netbsd /netbsd-dom0
</code></pre><div class="Avertissement"><p>Pour avoir testé, il est sensiblement plus difficile de partir de
la configuraiton personnalisée (dérivée de <code>GENERIC</code>) pour la
rendre compatible avec Xen, que de partir de la configuration Xen
pour l’adapter à la machine…
</p></div><div class="Remarque">Quelques défauts remarquables du noyau compatible Xen par rapport
à un noyau NetBSD normal :
<ul><li>pas de <a class="extern" href="http://fr.wikipedia.org/wiki/Symmetric_multiprocessing">SMP</a> ;
</li><li>pas de changement de fréquence SpeedStep du processeur (corrigé
dans NetBSD-current, il me semble) ;
</li><li>l’ACPI a quelques soucis chez moi (le <i>poweroff</i> ne fonctionne
pas et la machine s’arrête simplement, sans s’éteindre)…
</li></ul></div></li><li><p>Une fois le nouveau noyau fraîchement compilé, il suffit d’ajouter
la ligne correspondante dans le <code>boot.cfg</code>. Autrefois, il fallait
passer par Grub, à la place du <i>bootloader</i> NetBSD ; ce n’est plus
le cas aujourd’hui, et tant mieux ! Les manips sont d’autant plus
simple.
</p><p>À noter que la ligne à ajouter ne lance pas le nouveau noyau
directement ; elle doit lancer l’hyperviseur, en lui indiquant le
chemin du dom0. Quelque chose comme ceci (dans <code>boot.cfg</code>, il faut
placer les instructions sur une seule ligne en les séparant par des
points-virgules, bien sûr) :
</p><pre><code>load /netbsd-dom0 console=pc
multiboot /usr/pkg/xen3-kernel/xen.gz dom0_mem=max:1536M
</code></pre><p>Limiter la mémoire pouvant être allouée au dom0 permet d’être sûr de
pouvoir créer les domU quand on en a besoin. Je n’ai pas trouvé
d’autre moyen de réduire la mémoire consommée par un domaine.
</p></li><li><p>Vient ensuite le domU, la configuration duquel est contrôlée par un
fichier, que j’ai, pour ma part, simplement emprunté aux exemples
fournis avec le paquetage :
</p><pre><code># cp /usr/pkg/share/examples/xen/netbsd1 /usr/pkg/etc/xen/test
</code></pre><p>Le fichier est commenté, et c’est plutôt explicite. Cependant, quand
on débute dans ce vaste monde, comme moi, ce n’est pas forcément
évident pour autant…
</p><ol><li><p>Tout d’abord, ça paraît stupide, mais domU, au départ, correspond
à une machine vierge, sans système d’exploitation. Cela ne sert
donc pas à grand chose de charger un noyau domU (par exemple le
noyau <code>XEN3_DOMU</code> standard de NetBSD) vu qu’il ne trouvera rien
sur le disque… Il faut en fait charger un noyau d’installation
(<code>INSTALL_XEN3_DOMU</code>), qui contient un <i>ramdisk</i> avec
sysinst.
</p><pre><code>#kernel = '/netbsd-domu'
kernel = '/netbsd-install-domu'
</code></pre></li><li><p>La seconde variable d’intérêt s’appelle <code>disk</code>. Elle décrit les
disques virtuels disponibles à l’intérieur du domU. Créer un
disque virtuel vivant dans un fichier est le plus simple :
</p><pre><code>vif = ['file:/var/xen/images/test.img,0x01,w']
</code></pre><p>Pour l’installation du domU (avec le noyau d’installation), il ne
faut pas non plus oublier de configurer le disque virtuel
correspondant au CD-ROM contenant les <i>sets</i> d’installation NetBSD
(les gros fichiers <code>.tgz</code> contenant l’<i>userland</i> précompilé) :
</p><pre><code>vif = ['file:/var/xen/images/test.img,0x01,w',
'file:/var/xen/images/install.iso,0x02,r']
</code></pre><p>L’ISO se télécharge simplement sur un miroir NetBSD, dans le
dossier <code>iso/</code> (séparé des autres dossiers de fichiers
d’installation).
</p><p>Ces disques apparaîtront dans le domU NetBSD sous la forme de
périphériques <code>xbd</code> (le premier étant <code>xbd0</code>, le second
<code>xbd1</code>, etc.). D’autres systèmes interprètent cela différemment.<sup>ε</sup>
</p><div class="Notes"><p>ε : Sous Linux, le second paramètre de la description du disque
virtuel spécifie le périphérique à créer dans le domU.
</p></div><div class="Avertissement"><p>Le seul point délicat sur lequel je suis tombé est que pour
utiliser un fichier en guise de disque virtuel (<code>file:</code>), il
faut absolument que ce fichier <em>ne soit pas creux</em> <i>(sparse)</i>,
sans quoi <i>vnd(4)</i>, le périphérique virtuel permettant de monter
un fichier comme un disque, est incapable de fonctionner
correctement.
</p><p>En pratique, cela signifie utiliser <code>dd count=N</code> plutôt que <code>dd
seek=N</code> pour créer le fichier.
</p></div></li><li><p>Enfin, la configuration du réseau mérite un point à elle toute
seule. Le principe est que Xen expose deux interfaces réseau (type
Ethernet) connectées : une du côté domU (qui s’appelle <code>xennet</code>
sous NetBSD) et une du côté dom0 (<code>xvif</code> sous NetBSD).
</p><p>Ce qui est fait de ces interfaces est laissé libre
à l’administrateur, et est typiquement contrôlé par des
scripts. Il y a deux scripts fournis avec le paquetage,
<code>vif-bridge</code> et <code>vif-ip</code>, permettant respectivement d’obtenir un
pont <i>(bridge(4))</i> ou une simple IP statique privée associée au
domU.<sup>ζ</sup>
</p><p>Pour ma part, j’ai choisi la seconde solution, car elle me
convient mieux. Je n’ai pas besoin d’accéder à Internet depuis mon
domU, et si cela devait se présenter, je pense que j’essaierai de
mettre en place de la redirection, et du <a class="extern" href="http://fr.wikipedia.org/wiki/NAT">NAT</a>. Pour
utiliser par défaut <code>vif-ip</code>, il suffit de modifier le fichier de
configuration de <code>xend</code> (<code>/usr/pkg/etc/xen/xend-config.sxp</code>,
syntaxe <a class="extern" href="http://fr.wikipedia.org/wiki/S-expression">s-exp</a>, d’où le nom) :
</p><pre><code>(vif-script vif-ip)
</code></pre><p>Avec une telle configuration, la ligne de configuration du <i>vif</i>
ressemble à :
</p><pre><code>vif = ['ip=192.168.127.2 netmask 255.255.255.0']
</code></pre><p>La valeur du sous-paramètre <code>ip</code> est simplement passée
à <i>ifconfig(8)</i> pour configurer l’interface <code>xvif</code> (côté dom0). Le
script ajoute automatiquement le sous-réseau mentionné (ici
192.168.127/24) dans la table de routage afin de diriger le trafic
en direction de celui-ci à travers la bonne interface <code>xvif</code>. Cela
signifie, en bref, qu’il suffit de donner une adresse IP
appartenant au même sous-réseau à l’interface <code>xennet</code>, du côté du
domU, et tout marche comme si les deux domaines étaient sur un
même réseau !
</p><div class="Notes"><p>ζ : Le script proposé dans le <i>howto</i> NetBSD/xen est
périmé. Celui fourni avec le paquetage semble très bien marcher.
</p></div></li></ol><p>Une fois le fichier de configuration écrit, il suffit de faire appel
à <code>xm create</code>, et tak.
</p></li><li><p>L’installation se passe comme une installation classique, par
CD-ROM (à part que le périphérique CD est ici <code>xbd1</code>). Une fois
terminée, il suffit de changer de noyau (dans le fichier de
configuration du domU), et hop ! Une fois les briques de base en
place, on peut passer à l’installation des paquetages que l’on veut.
</p><p>Pour ça, j’ai utilisé la solution <i>cheap</i> : un <i>chroot(8)</i> dans le
<i>vnd(4)</i>, en réutilisant les paquetages précompilés par pkgsrc pour
ma NetBSD principale (avec un petit <i>mount_union(8)</i>).
</p><pre><code># vnconfig vnd0 /var/xen/images/test.img
# mount /dev/vnd0a /mnt/
# mkdir /mnt/usr/pkgsrc/
# mount -t union -o -b /usr/pkgsrc/ /mnt/usr/pkgsrc/
# chroot /mnt/ /bin/sh
# export PKG_PATH=/usr/pkgsrc/packages/All/
# pkg_add ...
</code></pre><p>Et voilà ! Un joli environnement de test. :)
</p></li></ol><h3>Impressions
</h3><p>Avec tout ça, j’ai un truc qui tourne. Je peux même tout simplement
copier le disque en l’état, pour produire des environnements de test
en masse.
</p><p>Ceci dit, même si je considère Xen comme une technologie « cool »,
tout n’est pas rose. Au-delà des défauts que possède la version dom0
de NetBSD (principalement l’absence de SMP), j’ai eu du mal à trouver
de la doc pertinente, et c’est un gros problème pour l’adoption de
Xen par un public moins gurutique, à mon avis.
</p><p>Cela mis à part, comme dit plus haut, je trouve, à titre personnel,
que Xen avec NetBSD, c’est plutôt facile à mettre en place une fois
que l’on a compris le truc ; et même si la doc comporte quelques
erreurs, à l’heure actuelle, cela donne une bonne base sur laquelle
partir.
</p><p>Je ne sais pas ce qu’il en est des distributions Linux. J’entends
souvent les gens opposer <a class="extern" href="http://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine">KVM</a>
à Xen. Je ne connais pas KVM donc je ne saurais pas trop dire ce qu’il
en est. Mais du coup, il semblerait que l’adoption de Xen dans le
monde Linux soit moindre… dommage ? Je ne saurais pas dire.
</p>