www.starend.org

TechNIX

Tags

virtualisation xen 3.0.3 debian

Xen 3.0.3 sous Debian

16/02/2008

22/03/2008 Terminé

19/05/2008 contournement de bugg réseau

1/Introduction

Il est maintenant beaucoup plus simple d'installer un hôte Xen sous Debian pour héberger plusieurs machines. Bien plus simple que sur Debian 'Sarge'...

Montage fait sur une machine Intel Pentium III (Coppermine) stepping 06 à 800MHz, 256Mo de RAM, 80Go de disque dur, 1 carte réseau 10/100.

Installer une Debian 4.0r1 de base. Le réseau doit être opérationnel, notament vers internet. J'utilise les dépôts de paquets officiels sur internet.

Partitionnement :
- 2Go de /
- 256Mo de swap
- Le reste en /xen

2/Installation de Xen

Installer les paquets :
- xen-hypervisor-3.0.3-1-i386-pae
- xen-utils-3.0.3-1
- xen-tools
- xen-linux-system-2.6.18-6-xen-686
- bridge-utils
- libc6-xen
- debootstrap

Je mets la version étiqueté PAE alors que ma machine n'en n'a normalement pas besoin pisqu'elle dispose de moins de 4Go de mémoire. Il se trouve que cette version marche sur ma machine et pas la version non PAE...

Vous pouvez aussi avoir desoin de ces paquets pour votre serveur :
- openssh-server
- opennntpd
- ntpdate
- tcpdump
- iptraf
- xenman
- resolvconf

Ajouter ou modifier dans le fichier '/etc/modules' la ligne :

...
loop max_loop 255

Ceci est très important si l'on veut pouvoir lancer plusieurs domaines (machines virtuelles) en même temps. Chaque domaine consomme au minimum 2 interfaces loop. Et il y en a 8 seulement par défaut.

Modifier les lignes suivantes dans /boot/grub/menu.lst :

...
# xenhopt=dom0_mem=48M
...
kernel          /boot/xen-3.0.3-1-i386-pae.gz dom0_mem=48M
...

L'hyperviseur consomme entre 10 et 12Mo de mémoire. Cette mémoire consommée est déduite de l'hôte, en fait le domaine 0. Et pour éviter de faire jouer les mécanismes de transvasement de mémoire depuis le domaine 0 vers un nouveau domaine, je limite la mémoire du domaine 0. 48Mo plus la douzaine de Mo de l'hyperviseur, on approche un chiffre un peu plus rond en informatique : 64Mo.

Redémarrer sur le nouveau noyau xen.

Créer les répertoires :
- /xen/domains
- /xen/etc
- /xen/etc/auto

Perso, je préfère déplacer tout ce qui concerne Xen dans /xen . Déplacer le contenu de /etc/xen dans /xen/etc . Remplacer le répertoire /etc/xen par un lien vers /xen/etc .

Le répertoire /xen/domains est destiné à contenir les machines virtuelles. Par exemple :
- /xen/domains/dns.starend.org/
- /xen/domains/www.starend.org/

Xen cherche sa configuration dans /etc/xen. Avec le lien fait dans /etc, il la retrouve sans problème à son nouvel emplacement. Le répertoire /xen/etc va contenir, en plus de la configuration de xen, un fichier de configuration pour démarrer chaque machine virtuelle. Par exemple :
- /xen/etc/dns.starend.org
- /xen/etc/www.starend.org
Dans mon cas, chaque machine virtuelle a sa configuration dans un fichier vm.conf dans le répertoire de la machine concernée. Et je fais un liens dans /xen/etc. Par exemple :
- /xen/etc/dns.starend.org -> /xen/domains/dns.starend.org/vm.conf
- /xen/etc/www.starend.org -> /xen/domains/www.starend.org/vm.conf

Dans mon cas, j'utilise des réseaux virtuels sur ma machine Xen. N'ayant pas trouvé de script pour prendre en charge automatiquement les ponts (bridges) au démarrage, j'en fais un moi même. Dans le fichier /xen/etc/bridges.sh, par exemple :

#!/bin/bash
brctl addbr dns
brctl addbr www

Le rendre exécutable et faire un lien pour le démarrage en /etc/rcS.d/S39bridges.sh . Penser à autoriser le routage dans ce cas. Ajouter dans /etc/sysctl.conf :

net.ipv4.ip_forward=1

De même, on peut utiliser le fichier habituel pour configurer les interfaces réseaux, /etc/network/interfaces. J'ai préféré sortir la configuration des réseaux liés aux ponts pour mes machines virtuelles. Créer le fichier /xen/etc/bridgenetwork.sh, par exemple :

#!/bin/bash
ifconfig eth0:0 10.254.22.254 netmask 255.255.255.0
ifconfig dns 10.254.80.254 netmask 255.255.255.0
ifconfig www 10.254.53.254 netmask 255.255.255.0

Le rendre exécutable et faire un lien pour le démarrage en /etc/rcS.d/S41bridgenetwork.sh

Pourquoi S39 et S41? Parce que en S40 il y a la configuration du réseau par rapport au fichier de configuration /etc/network/interfaces...

3/Créer une machine virtuelle Debian

Créer le répertoire qui va contenir tous les fichiers de la nouvelle machine. Par exemple : /xen/domains/model.starend.org .

Créer le fichier de configuration de la machine virtuelle /xen/domains/model.starend.org/vm.conf :

kernel  = '/boot/vmlinuz-2.6.18-6-xen-686'
ramdisk = '/boot/initrd.img-2.6.18-6-xen-686'
memory  = '32'
root    = '/dev/hda1 ro quiet'
disk    = [ 'file:/xen/domains/model.starend.org/root.dsk,hda1,w', 'file:/xen/domains/model.starend.org/swap.dsk,hda2,w' ]
name    = 'model.starend.org'
vif     = [ 'mac=00:16:3E:2E:D2:D9, bridge=model' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

Petites précisions.
Les lignes kernel et ramdisk font référence au noyaux de l'hôte, c'est le même noyau qui sera utilsé dans les machines virtuelles. Il faut penser à tous les mettres à jour en même temps, sinon voir /boot et /lib/modules...
Pour la mémoire, 32Mo est le strict minimum nécéssaire au fonctionement de Debian dans une installation de base (normale).
Pour le paramètre vif, je précise une adresse MAC. Ca n'est pas obligatoire, mais quand on migre la machine elle change parfois d'adresse MAC et donc l'interface réseau passe en eth1 ou plus. Dommage pour la config réseau, blanchir au besoin le fichier /etc/udev/rules.d/z25_persistent-net.rules .

Créer le disque racine de 1Go :

dd if=/dev/zero of=/xen/domains/model.starend.org/root.dsk bs=1M count=1000
mkfs.ext3 /xen/domains/model.starend.org/root.dsk

Créer le disque swap de 64Mo :

dd if=/dev/zero of=/xen/domains/model.starend.org/swap.dsk bs=1M count=64
mkswap /xen/domains/model.starend.org/swap.dsk

Installer Debian sur la partition racine. Utilisez debootstrap, je n'ai plus les commandes sous la main, voir le man...

Faire le lien de la config dans /xen/etc pour plus de façilité :

ln -s /xen/domains/model.starend.org/vm.conf /xen/etc/model.starend.org

Démarrer la nouvelle machine virtuelle, on appelle ça un domaine :

xm create -c model.starend.org

Avec create, le nom 'model.starend.org' fait référence au lien dans /etc/xen, et non au nom (name=) dans le fichier de config du domain. Par contre avec shutdown ou destroy, c'est le nom du domaine, donc celui définit dans la conf, qui est pris en compte. Le -c c'est pour avoir directement la console du nouveau domaine.

4/Quelques commandes utiles pour Xen

xm list : affiche la liste des domaines en cours de fonctionnement.
xentop : affiche en temps réel les domaines et leurs caractéristiques.
xm create vm.conf : Démarre un domaine en utilisant le fichier de configuration vm.conf, sans la console.
xm create -c vm.conf : Démarre un domaine en utilisant le fichier de configuration vm.conf, et nous affiche la console du domaine.
xm shutdown nom : Demande gentiment l'arret du domaine nommé.
xm destroy nom : Arrête instantanément le domaine nommé. Avec pertes et fracas...
xm dmesg : Affiche les logs de l'hyperviseur Xen.
brctl show : Liste les ponts. Ctrl-AltGr-] Pour quitter la console d'un domaine.

5/Contournement de bug réseau

Il arrive que, subitement, plus aucune machine virtuelle ne réponde sur le réseau, alors que le réseau semble bien configuré et que les machines en question fonctionnent parfaitement (via la console). Signe caractéristique dans les logs, de façon répété :

xen_net: Memory squeeze in netback driver.

La solution, forcer la mémoire utilisé par dom0, modifier dans /etc/xen/xend-config.sxp :

(dom0-min-mem 48)

et dans /boot/grub/menu.lst les paramètres 'dom0_mem' :

...
# xenhopt=dom0_mem=96M
...
title           Xen 3.0.3-1-i386-pae / Debian GNU/Linux, kernel 2.6.18-6-xen-686
root            (hd0,0)
kernel          /boot/xen-3.0.3-1-i386-pae.gz dom0_mem=48M
...

(Voir http://tcweb.org/mediawiki/index.php/Xen_dedibox)

Licence Creative Common 2007 :: BY-NC-SA :: Webdesign DENDIEVEL Stéphane