Xen dedibox2
Un article de TcWeb.
Dedibox viennent tout juste de sortir la version 2 des dedibox ... je m'empresse donc de faire la suite de Xen dedibox avec une petite touche d'ipv6
L'objectif de ce document c'est de décrire l'installation de xen sur une dedibox V2 à 30€ HT par mois. Le dom0 sera sur une petite partition de 2G en début de disque et tout le reste y compris le swap du dom0 sera en lvm avec reiserfs.
Les domU seront joignables soit par leur IPv4 privé à travers du port forwarding soit à travers leur IPv6.
Sommaire |
Dom0
Dedian Etch
Installer une debian etch 64 (debian 4.0) avec juste un / de 2G un /boot et un petit swap, l'espace restant sera utilisé par le LVM. Ne pas oublier de changer les mots de passes.
Attention, si vous souhaitez reprendre des domU depuis une dedibox v1, il est plus simple d'installer une debian etch 32bits
Installer les paquets Xen :
apt-get install xen-linux-system-2.6.18-6-xen-amd64 xen-tools xen-hypervisor bridge-utils
Un petit fdisk pour créer un sda2 sur tout le disque restant et voilà, il est temps de rebooter. Une fois le reboot effectif, vous pouvez vérifier que vous utilisez bien le noyau xen :
uname -a Linux dedi02 2.6.18-6-xen-amd64 #1 SMP Fri May 4 02:40:51 UTC 2007 x86_64 GNU/Linux
Pour jouer avec les lvm et reiserfs, il faut les installer :
apt-get install lvm2 reiserfsprogs
Il est possible de créer un VG (vg00 par exemple) avec tout le disque restant.
pvcreate /dev/sda4 vgcreate vg00 /dev/sda4
Un routeur NAT pour l'IPv4
Une des fonctionnalités de xen c'est d'utiliser un pont réseau pour regrouper toutes les interfaces virtuelles. Comme les routeurs dedibox font du RA et du filtrage sur adresse mac il est vivement déconseiller de monter un pont réseau avec l'interface réseau physique. J'ai donc opté pour la configuration suivante : chaque domU a une IPv4 privés et une ipv6 publiques en 6to4. L'interface réseau de chaque domU va donc être intégré dans un pont privé et le dom0 va être un routeur ipv6 et faire du NAT pour le trafic ipv4
Configurons donc ce ponts réseau, on ajoute xendmz :
vi /etc/network/interfaces
auto xendmz
iface xendmz inet static
bridge_ports dummy0
bridge_stp off
bridge_fd 0
address 192.168.1.1
netmask 255.255.255.0
/etc/init.d/network restart
Avec Xen 3.0 il faut configurer xen pour utiliser le pont réseau, avec Xen 3.2 ce n'est pas utile :
vi /etc/xen/xend-config.sxp (network-script 'network-bridge bridge=xendmz netdev=dummy0') #(network-script network-dummy) /etc/init.d/xend restart
pour vérifier que tout marche bien, on affiche l'état des ponts :
brctl show bridge name bridge id STP enabled interfaces xendmz 8000.feffffffffff no dummy0
on ajoute un peut de nat :
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
on active le routage :
vi /etc/sysctl.conf net.ipv4.conf.default.forwarding=1
Un routeur IPv6
Installer les bon paquets
apt-get install iproute radvd
Trouver son préfix 6to4, la commande suivante devrait fonctionner :
printf "2002:%x%02x:%x%02x::\n" $(ifconfig eth0 | grep "inet adr"| sed -e 's/.*adr://' -e 's/B.*//g' -e 's/\./ /g') 2002:58bf:503b::
Pour l'instant ça ne fonctionne pas.
DomU
Reste à configurer une petite machine virtuelle :
vi /etc/xen-tools/xen-tools.conf xen-create-image --hostname=test2 --ip=192.168.1.2 --gateway=192.168.1.1 --netmask=255.255.255.0 --lvm=vg00 --debootstrap --passwd
Un petit lvscan permet de voir les 2 nouveaux FS :
dedi02:/etc/xen# lvscan ACTIVE '/dev/vg00/test2-disk' [4,00 GB] inherit ACTIVE '/dev/vg00/test2-swap' [256,00 MB] inherit
changer le fichier de conf :
vi /etc/xen/test2.cfg vif = [ 'ip=192.168.1.2' ]
et on peut booter la nouvelle machine, et se connecter dessus :
xm create /etc/xen/test2.cfg xm console test2
pour la lancer automatiquement :
cd /etc/xen/auto ln -s ../test2.cfg .
Récupération de DomU
Tous les domU étaient à reprendre de l'ancienne dedibox ... j'ai donc changé les machine virtuelle de machine physique, en un mot migré d'une machine à l'autre.
On copie les lv de la machine1 vers la machine2 grace au snapshot lvm. Sur machine1 on crée le snapshot
DOMU=domu
lvcreate -s -n ${DOMU}-disk-snapshot -L 150M /dev/vg00/${DOMU}-disk
mount /dev/vg00/${DOMU}-disk-snapshot /mnt/
Sur machine2 on crée un lv de la même taille
DOMU=domu
lvcreate -n ${DOMU}-disk -L 15G vg00
mkreiserfs /dev/vg00/${DOMU}-disk
mount /dev/vg00/${DOMU}-disk /mnt/
Et on copie les données :
rsync -a --progress machine1:/mnt /
Sur machine1 on stop le domU et on synchronise le lv
xm shutdown ${DOMU}
umount /mnt
mount /dev/vg00/{$DOMU}-disk /mnt/
Sur machine2 on crée le lv de swap et on synchronise les dernières données
lvcreate -n ${DOMU}-swap -L 256M vg00
rsync -a --progress machine1:/mnt /
umount /mnt
scp machine1:/etc/xen/${DOMU}.cfg /etc/xen/
Et voilà, on peut maintenant lancer ${DOMU} sur la nouvelle machine
Autre
Contournement d'un bug dans l'allocation mémoire du pilote réseau
Régulièrement, certains domU se retrouvais injoignable par le réseau, des ping dom0 vers domU et domU vers dom0 donnaient 100% des paquets perdu pourtant toutes les interfaces étaient là, bien présentent, et bien configuré. Seul indice, cette ligne dans /var/log/message
xen_net: Memory squeeze in netback driver.
La solution, fixer la mémoire utilisé par dom0, dans /etc/xen/xend-config.sxp
(dom0-min-mem 96)
et dans /boot/grub/menu.lst
# xenhopt=dom0_mem=96M
Mon utilisation
Depuis la mise en ligne de ces quelques notes vous êtes nombreux à me demander comment j'utilise mes xen, alors voilà , j'ai 7 domU sur ma dedibox réparties comme ceci :
- divers, 64Mo de ram pour le ldap
- greg, 128Mo de ram serveur web d'un amis
- jabber, 128Mo de ram serveur jabber (ejabberd) avec les passerelles
- lmbc, 128Mo de ram le site web de lille métropole basket club (LAMP)
- mail, 96Mo de ram, serveur de mail exim + spamassassin + imap
- walcky, 128Mo de ram, lamp + smtp + spamassassin + imap
- web, 192Mo de ram front web apache + divers sites php + mysql.
Vous pouvez consulter les Statistiques de toutes ces machines.
Conclusion
1G de ram en plus c'est vraiment bien pour ne plus avoir des VM étriqués et l'architecture x86 à base de CPU intel apporte une réel stabilité avec un noyau par défaut.





