Blog

Xen 4.1 sur Debian wheezy

Écrit le 24 05 2013 par Kévin MET _

Voici un article sur Xen 4.1. Je vais détailler son installation sous Debian Wheezy et son utilisation avec LVM, sans LVM, en NAT et en bridge. En fait je vais détaillé l'utilisation que j'en fait. A vous de voir si cela vous convient...

Installation de Xen

Pour commencer, on va installer Xen. C'est facile :


# aptitude install libxen-4.1 libxenstore3.0 xen-hypervisor-4.1-amd64 xen-linux-system-3.2.0-4-amd64 \
  xen-linux-system-amd64 xen-system-amd64 xen-tools xen-utils-4.1 xen-utils-common xenstore-utils bridge-utils

Ensuite, il faut modifier l'ordre de boot de grub pour booter sur le kernel avec les options Xen. Et là, vous vous dites surement "Quoi, mais c'est un scandale! Je croyais qu'on avait enfin intégré Xen au kernel depuis la branche 3.x! Pourquoi je dois encore rebooter ?!" Et bien j'en sais foutre rien même après avoir chercher sur google pendant un bon moment. La nouveauté dans le grub.cfg c'est qu'une ligne multiboot est apparue et qu'elle pointe sur une image Xen dans /boot et ensuite on passe le vrai kernel en argument de module. Bref, je n'ai pas la moindre idée de comment tout cela fonctionne donc si vous avez un lien ou si vous savez, faite le savoir dans les commentaires, cela m’intéresse vivement. Voici un extrait de grub.cfg pour illustrer mes propos :


echo	'Loading Xen 4.1-amd64 ...'
multiboot	/boot/xen-4.1-amd64.gz placeholder dom0_mem=2048M dom0_mem=2048M
echo	'Loading Linux 3.2.0-4-amd64 ...'
module	/boot/vmlinuz-3.2.0-4-amd64 placeholder root=/dev/md1 ro  quiet
echo	'Loading initial ramdisk ...'
module	/boot/initrd.img-3.2.0-4-amd64

Bref, il faut faire en sorte de booter sur le bon kernel, pour cela, il existe 2 solutions ;

  • On peut changer le menu par défaut qui est sélectionné par grub au démarrage.
  • On peut changer l'ordre du menu grub.

Il n'y a pas une méthode meilleure qu'une autre. Pour changer l’ordre du menu grub on peut utiliser dpkg-divert comme ceci :


# dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen

Cela aura pour effet de renommer le dossier 20_linux_xen en 08_linux_xen qui sera donc le premier listé dans le menu grub. Ce changement peut être remis à zéro en utilisant cette commande :


# dpkg-divert --rename --remove /etc/grub.d/20_linux_xen

L'autre méthode est un peu plus simple, il faut éditer le fichier /etc/default/grub pour changer la valeur de GRUB_DEFAULT pour la mettre à 2 au lieu de 0.

Avant de rebooter pour prendre en compte ces changements, nous allons procéder à quelques petits réglages de grub. Pour commencer on ajoute la ligne suivante à la fin du fichier /etc/default/grub :


# Xen
GRUB_DISABLE_OS_PROBER=true
GRUB_CMDLINE_XEN="dom0_mem=2048M"

La première ligne indique a grub qu'il ne faut pas qu'il s'amuse à chercher toutes les entrées qu'il peut ajouter dans le menu grub. Si vous n'utilisez pas cette option il va ajouter les OS que vous virtualisez et qui utilisent LVM dans grub.cfg. La seconde ligne fixe l'utilisation de la mémoire à 2Go. Cela evite que la mémoire soit "baloonée", c'est à dire que Xen alloue toute la mémoire au Dom0 lors du boot et pioche dans la mémoire lors de la création d'une nouvelle VM. Cette ligne est donc à adaptée selon vos besoins. Dans mon cas j'ai laissé 2Go car je fais tourner un squid en reverse proxy sur mon Dom0 qui consomme un peu de RAM. Si votre Dom0 ne sert qu'a héberger des VM vous pouvez mettre un minimum de 512Mo (faite quelques benchs pour voir quels sont vont réels besoins).

In ne reste plus qu'a régénérer le grub.cfg :


# update-grub

Toujours avant de rebooter nous allons faire les réglages de Xen dans le fichier /etc/xen/xend-config.sxp. Voici les valeurs importantes à changer. Prenez le temps de lire ce fichier qui est très bien commenté.


# On passe les logs en debug
(logfile /var/log/xen/xend.log)
(loglevel DEBUG)
# on indique de nouveau que notre dom0 utilise 2Go de RAM
(dom0-min-mem 2048)
# on vire le balooning
(enable-dom0-ballooning no)
# si on veut faire du NAT
(network-script network-nat)
(vif-script     vif-nat)
# si on veut faire du bridge
(vif-script vif-bridge)
(network-script 'network-bridge bridge=br0')

Si vous voulez utiliser le mode bridge il faut ajouter une interface bridge sur votre machine. Pour une machine OVH qui utilise généralement un subnet en /24 vous pouvez utiliser les paramètres suivants :


auto br0
iface br0 inet static
        address aaa.bbb.ccc.ddd
        netmask 255.255.255.0
        network aaa.bbb.ccc.0
        broadcast aaa.bbb.ccc.255
        gateway aaa.bbb.ccc.254
        bridge_ports eth0

Votre bridge sera monté au prochain reboot et justement il est temps de rebooter !

LVM

Une fois votre machine remontée il faut configurer LVM si l'on veut fonctionner avec. Le gros avantage de LVM comparé à l'utilisation d'image iso est la performance. En effet, LVM permet d'obtenir des débits en lecture et en écriture bien plus rapide. On peut ajouter le fait que LVM gère les snapshots et que le resize se passe beaucoup mieux. On peut même ajouter une nouvelle partition dans notre volume physique.

On va donc créer notre volume physique. Dans l'exemple on va utiliser /dev/md2 :


# pvcreate /dev/md2
	Writing physical volume data to disk "/dev/md2"
	Physical volume "/dev/md2" successfully created

On enchaine avec le volume groupe que l'on nommera vgxen. Ce nom est important car il sera réutilisé dans la config de xen-tools.


# vgcreate vgxen /dev/md2
	Volume group "vgxen" successfully created

Dans le cas d'utilisation basique de LVM nous aurions utilisé la commande lvcreate pour créer nos volumes logiques mais dans le cadre de l'utilisation de Xen, c'est xen-tools qui se charge de tout lors de la création de la VM.

Utilisation de Xen-tools

Xen-tools permet de simplifier la création de domu. La configuration se fait via /etc/xen-tools/xen-tools.conf. On va donc changer quelques paramètres pour simplifier la création des VM au maximum. Voici une liste de paramètres que j'ai pour habitude changer lors de la configuration de xen-tools :


# si on préfère utiliser des images plutôt que LVM (sinon il faut le laisser commenter)
# ce dossier stockera les images des VM (il faut donc prévoir de la place)
dir = /home/xen

# le nom du vg avec de l'espace libre
lvm = vgxen

# la méthode d'installation (lorsqu'on installe des distribution de la même famille il vaut mieux choisir debootstrap
# autrement on peut utiliser rinse
install-method = debootstrap
debootstrap-cmd = /usr/sbin/debootstrap

# Les caractéristiques des images générées
size   = 10Gb      # taille de l'image principale
memory = 512Mb    # RAM
swap   = 256Mb    # Swap
# noswap = 1      # si on ne souhaite pas utiliser de swap
fs     = ext4    # le type de système de fichier
dist   = `xt-guess-suite-and-mirror --suite` # essaye de trouver automatiquement le meilleur sources.list
image  = full   # fulle ou sparse (on a de meilleures perfs en full)

# en cas de réglage en NAT on utilise ce type de réglage (pour un subnet du type 192.168.1.0/24)
gateway    = 192.168.1.254
netmask    = 255.255.255.0
broadcast  = 192.168.1.255

# en cas d'utilisation du mode bridge avec OVH (adresse ip du dom0 en aaa.bbb.ccc.xxx)
gateway    = aaa.bbb.ccc.254
netmask    = 255.255.255.0
broadcast  = aaa.bbb.ccc.255
bridge = br0

# le kernel et l'initrd par défaut (à utiliser pour des debian like)
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`

# on cherche automatiquement le miroir ou l'on va chercher le debootstrap
mirror = `xt-guess-suite-and-mirror --mirror`

# les options à passer lors du montage du filesystem
ext4_options     = noatime,nodiratime,errors=remount-ro

Toutes ces options vont permettre de créer une VM très simplement mais elle sont toutes spécifiables à la main directement lors de l'appel à xen-create-image. Pour l'exemple nous allons créer une VM avec l'ip 192.168.1.30 et test.mnt-tech.fr comme hostname. L'option --passwd permet de spécifier le password root à la fin de l'installation.


# xen-create-image --hostname test.mnt-tech.fr --ip 192.168.1.30 --passwd
General Information
--------------------
Hostname       :  test.mnt-tech.fr
Distribution   :  wheezy
Mirror         :  http://debian.mirrors.ovh.net/debian/
Partitions     :  swap            128Mb (swap)
                  /               10Gb   (ext4)
Image type     :  full
Memory size    :  512Mb
Kernel path    :  /boot/vmlinuz-3.2.0-4-amd64
Initrd path    :  /boot/initrd.img-3.2.0-4-amd64

Networking Information
----------------------
IP Address 1   : 192.168.1.30 [MAC: 00:16:3E:47:3A:FE]
Netmask        : 255.255.255.0
Broadcast      : 192.168.1.255
Gateway        : 192.168.1.1


Creating swap on /dev/vgxen/test.mnt-tech.fr-swap
Done

Creating ext3 filesystem on /dev/vgxen/test.mnt-tech.fr-disk
Done
Installation method: debootstrap
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done

No role scripts were specified.  Skipping
Setting up root password
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
All done


Logfile produced at:
	 /var/log/xen-tools/test.mnt-tech.fr.log

Installation Summary
---------------------
Hostname        :  test.mnt-tech.fr
Distribution    :  wheezy
IP-Address(es)  :  192.168.1.30 
RSA Fingerprint :  ed:3a:54:be:bd:c1:da:e0:b5:ba:ee:6b:84:c9:30:e0
Root Password   :  N/A

Xen-tools permet également de configurer des squelettes pour vos VM. Cela se fait via le dossier /etc/xen-tools/skel/. Il suffit d'y copier les fichiers que l'on veut voir copier dans sa vm. Cela peut servir si l'on souhaite importer des fichiers de configurations dans sa VM.

Un autre moyen très puissant pour personnaliser l'installation de vos VM et automatiser au maximum le travail d'administration est de créer des rôles. Les rôles sont écrits en bash et se situent dans le dossier /etc/xen-tools/role.d/. Par défaut, sous débian vous disposez de quelques roles qui peuvent vous aider à comprendre la syntaxe de ceux-ci. Pour appliquer un role à une VM, il faut, lors de sa création via xen-create-image, passer le paramètre --role nom_du_role. Je vous invite à jeter un coup d'oeil au fichier /usr/lib/xen-tools/common.sh que vous devez sourcer dans tous scripts de role et qui permet d'utiliser des fonctions très pratiques comme l'installation de paquet ou le log de message. Vous pouvez également vous inspirez de tous les scripts qui sont situés dans /etc/xen-tools/ (il sont nombreux).

Bind sur dom0

Si vous souhaitez que votre dom0 soit le serveur DNS qui accepte les requêtes récursives de vos VM, il faut configurer bind pour qu'il écoute sur les bonnes interfaces et il faut le configurer pour qu'il autorise les requêtes récursives depuis les adresses de vos VM. Tout ceci se configure via le fichier /etc/bind/named.conf.options. Il faut ajouter ou modifier les options suivantes :


# On indique à bind d’écouter sur toutes les interfaces disponibles
listen-on { any; };

# On indique à bind d'autorise les requêtes récursives en provenances de localhost et du subnet 192.168.1.0/24
allow-recursion { 127.0.0.1; 192.168.1.0/24; };

# Si vous utilisez des ip failovers il faudra donc indiquer ces ip dans la liste

Astuces

Si votre VM ne veut pas démarrer et que vous obtenez ce message d'erreur indiquant que la vm ne trouve pas son disque primaire :


Begin: Waiting for root file system ... 
Gave up waiting for root device.  Common problems:
 - Boot args (cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
   - Check root= (did the system wait for the right device?)
 - Missing modules (cat /proc/modules; ls /dev)
ALERT!  /dev/xvda2 does not exist.  Dropping to a shell!
modprobe: module ehci-hcd not found in modules.dep
modprobe: module uhci-hcd not found in modules.dep
modprobe: module ohci-hcd not found in modules.dep
modprobe: module usbhid not found in modules.dep

Vous devez ajouter cette ligne dans la config de votre VM :


bootloader = '/usr/lib/xen-4.1/bin/pygrub'
♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.