Xen Sur Debian 6
Cet article a été écrit a partir de Debian 6.0 Squeeze, mais il peut être facilement adapté à Debian 5.0 Lenny
Sommaire
Installation de Xen
Installation des prérequis :
(x86_32)
aptitude install -y xen-utils-4.0 xen-tools xen-hypervisor-4.0-i386 xen-docs-4.0 libc6-xen linux-image-xen-686
(x86_64)
aptitude install -y xen-utils-4.0 xen-tools xen-hypervisor-4.0-amd64 xen-docs-4.0 linux-image-xen-amd64
Si vous êtes en grub2 (ce qui est le cas avec Squeeze), il est conseillé de réaliser les opérations suivantes, afin de modifier l'ordre de détection des noyaux pour que les noyaux XEN soient considérés en premier, et de désactiver l'OS_PROBER, pour éviter d'avoir autant d'entrées dans le fichier que de VM, dans le cas d'une install avec des volumes logiques (LVM)
mv -i /etc/grub.d/10_linux /etc/grub.d/50_linux echo "" >> /etc/default/grub echo "# Disable OS prober to prevent virtual machines on logical volumes from appearing in the boot menu." >> /etc/default/grub echo "GRUB_DISABLE_OS_PROBER=true" >> /etc/default/grub update-grub2
Il suffit ensuite de rebooter sur le kernel Xen, après avoir modifié le fichier de configuration pour activer le réseau Xen (voir plus bas)
Pour vérifier que l'hyperviseur est fonctionnel :
# xm list Name ID Mem VCPUs State Time(s) Domain-0 0 249 4 r----- 14.9
(si rien ne s'affiche, c'est que l'hyperviseur n'est pas démarré, kernel ou module Xen manquant ?)
Ou
# xm info host : xen1-test release : 2.6.32-5-xen-amd64 version : #1 SMP Thu Nov 3 05:42:31 UTC 2011 machine : x86_64 nr_cpus : 4 nr_nodes : 1 cores_per_socket : 1 threads_per_core : 2 cpu_mhz : 2992 hw_caps : bfebfbff:20000800:00000000:00000180:0000641d:00000000:00000000:00000000 virt_caps : total_memory : 8191 free_memory : 7846 node_to_cpu : node0:0-3 node_to_memory : node0:7846 node_to_dma32_mem : node0:3259 max_node_id : 0 xen_major : 4 xen_minor : 0 xen_extra : .1 xen_caps : xen-3.0-x86_64 xen-3.0-x86_32p xen_scheduler : credit xen_pagesize : 4096 platform_params : virt_start=0xffff800000000000 xen_changeset : unavailable xen_commandline : placeholder dom0_mem=256M cc_compiler : gcc version 4.4.5 (Debian 4.4.5-8) cc_compile_by : waldi cc_compile_domain : debian.org cc_compile_date : Sun Nov 6 09:42:15 CET 2011 xend_config_format : 4
Réseau
Pour du network-bridge
On active le script pour le mode bridge de Xen, le script pour les vifs est activé par défaut
sed -i 's/#\ (network-script network-bridge)/(network-script network-bridge)/g' /etc/xen/xend-config.sxp
Pour du network-nat
On désactive le vif-script pour activer les scripts relatifs au NAT
sed -i 's/^(vif-script vif-bridge)/#(vif-script vif-bridge)/g' /etc/xen/xend-config.sxp sed -i 's/^#(network-script network-nat)/(network-script network-nat)/g' /etc/xen/xend-config.sxp sed -i 's/^#(vif-script vif-nat)/(vif-script vif-nat)/g' /etc/xen/xend-config.sxp
Il est nécessaire de redémarrer au moins le démon xend pour prendre en compte les modifications
/etc/init.d/xend restart
creation de VMs
Créations automatiques, Debian Way
On va utiliser le script xen-create-image
, écrit en perl, et fourni par le paquet xen-tools
.
Il est conseillé de lire la documentation fournie, ou de faire un coup de --help
, il y a vraiment beaucoup d'options.
Note particulière : si vous n'utilisez pas --mirror=
le script utilisera le miroir présent dans votre /etc/apt/sources.list
Avec LVM
Cet exemple utilisera le noyau recompilé disponible sur le dom0, en IP statique, debootstrap une Debian Squeeze i386 via un apt-cacher [1]
xen-create-image --vcpus=1 --nohosts --install-method=debootstrap --dist=squeeze --genpass=0 --password=kikoolol \ --arch=i386 --initrd=/boot/initrd.img-2.6.32-i386-bigmem-xenu --kernel=/boot/vmlinuz-2.6.32-i386-bigmem-xenu \ --memory=700M --noswap --fs=ext3 --size=12G --lvm=MyVgName \ --mirror=http://172.16.200.2:3142/ftp2.fr.debian.org/debian/ --hostname=MyVmName \ --broadcast=172.16.255.255 --gateway=172.16.254.254 --netmask=255.255.0.0 --nameserver="172.16.254.254" --ip=172.16.200.51
PyGrub, LVM2, 64 bits
xen-create-image --vcpus=1 --nohosts --install-method=debootstrap --dist=squeeze --genpass=0 --password=tatayoyo \ --arch=amd64 --pygrub \ --memory=700M --noswap --fs=ext3 --size=12G --lvm=MyVgName \ --mirror=http://ftp2.fr.debian.org/debian/ --hostname=MyVmName \ --broadcast=172.16.255.255 --gateway=172.16.254.254 --netmask=255.255.0.0 --nameserver="172.16.254.254" --ip=172.16.200.51
Cet exemple va debootstraper une Ubuntu Lucid Lynx en AMD64 sans apt-cacher
xen-create-image --vcpus=1 --nohosts --install-method=debootstrap --dist=lucid --genpass=0 --password=kikoolol \ --arch=amd64 --pygrub \ --memory=700M --noswap --fs=ext3 --size=5G --lvm=MyVgName \ --hostname=lucid --mirror=http://archive.ubuntu.com/ubuntu/ \ --broadcast=10.0.0.254 --gateway=10.0.0.128 --netmask=255.255.255.0 --nameserver="10.0.0.128" --ip=10.0.0.3
n.b. : cet exemple a debootsrapé une version "serveur" de lucid
n.b. : avec la même methode et en souhaitant debootstraper maverick, impossible de booter sur xvda1, voir #Impossible_de_booter_sur_xvda1
Sans LVM (fichiers .img)
Debootstrap (via apt-cacher) d'une Lenny en amd64 en utilisant pygrub, avec 2Go de disque, 512Mo de swap (images stockée dans /home/xen-disks/domains/<hostname>/
), IP DHCP. Le kernel et l'initrd seront physiquement présent dans le /boot de la VM.
A noter que les xen-tools fournis avec Squeeze génèrent par défaut un password root qui vous sera fourni à la fin de l'install (ou dans le fichier de log de la création : /var/log/xen-tools/<hostname>.log
)
xen-create-image --vcpus=2 --nohosts --install-method=debootstrap --dist=lenny \ --arch=amd64 --pygrub \ --memory=700M --size=2G --swap=512M --fs=ext4 --dir=/home/xen-disks \ --hostname=MyVmLenny --mirror=http://172.16.200.2:3142/ftp2.fr.debian.org/debian/ \ --dhcp
Créations manuelles
Linux
Windows
Prérequis
Installer qemu :
aptitude install xen-qemu-dm
Puis, il vous faut disposer d'un CD/DVD ou d'une ISO de la version de Windows que vous souhaitez installer.
Vous pouvez installer directement depuis le CD/DVD, ou générer une ISO de celui ci de cette manière :
dd if=/dev/cdrom of=/path/to/ISO/windows_version.iso
Il vous faudra remplacer /dev/cdrom
par le vrai nom de votre lecteur CD/DVD, et le démonter (si automount est passé par là)
Création du disque
Là encore, 2 méthodes pour la création du disque, la plus intéressante en terme de performance reste tout de même via LVM :
lvcreate -L 20G -n win2008-disk MyVgName
pour créer un volume de 20G nommé win2008-disk dans le VG MyVgName.
via images disques en attribuant tout l'espace disque (moins de fragmentation possible) :
dd if=/dev/zero of=/path/to/IMG/win2008-disk.img bs=1M count=20480
Configuration de XEN pour VNC
Dans le fichier de config /etc/xen/xend-config.sxp
il faut activer :
(vnc-listen '0.0.0.0')
(ou l'interface sur laquelle l'hyperviseur devra écouter)
(keymap 'fr')
Pour activer un clavier Français.
Configuration du premier démarrage
On va créer le fichier /etc/xen/win2008.cfg
. Cet exemple est pour un mode BRIDGE :
import os, re arch = os.uname()[4] if re.search('64', arch): arch_libdir = 'lib64' else: arch_libdir = 'lib' kernel = '/usr/lib/xen-4.0/boot/hvmloader' builder = 'hvm' memory = 2050 # Shadow pagetable memory for the domain, in MB. # If not explicictly set, xend will pick an appropriate value. # Should be at least 2KB per MB of domain memory, plus a few MB per vcpu. shadow_memory = 8 # The number of cpus guest platform has, default=1 vcpus=2 # Enable/disable HVM guest PAE, default=1 (enabled) #pae=1 # Enable/disable HVM guest ACPI, default=1 (enabled) #acpi=1 # Enable/disable HVM APIC mode, default=1 (enabled) # Note that this option is ignored if vcpus > 1 #apic=1 name = "win2008" # Bridge name must be your bridge name (possibly eth0) vif = [ 'type=ioemu, bridge=xenbr0' ] disk = [ 'phy:/dev/MyVgName/win2008-disk,hda,w', 'file:/home/ISO/WIN2008R2_x86-64_FR_STD.ISO,hdc:cdrom,r' ] device_model = '/usr/' + arch_libdir + '/xen-4.0/bin/qemu-dm' #----------------------------------------------------------------------------- # boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) # default: hard disk, cd-rom, floppy boot = 'dc' sdl = 0 vnc = 1 vncconsole = 1 vncpasswd = 'MyVNCpasswd' serial = 'pty' usbdevice = 'tablet'
n.b. : on active dans un premier temps VNC, pour l'installation. On veillera bien à le désactiver après avoir activé le RDP (Prise en Main à Distance/Remote Desktop Protocol).
Pour un mode NAT il faut modifier la ligne vif =
par :
vif = [ 'type=ioemu, vifname=wif_win2008, bridge=10.0.1.254/24' ]
Toujours uniquement pour le NAT, il faut modifier le script hotplug fourni avec qemu /etc/xen/scripts/qemu-ifup
en
#!/bin/sh ##############ORIG SCRIPT############### #echo -c 'config qemu network with xen bridge for ' #echo $* # #ifconfig $1 0.0.0.0 up #brctl addif $2 $1 ######################################## # $1 - tapx.x name # $2 - bridge domain config vif option (vif = ['type=ioemu, bridge=$2']) echo 'config qemu network with xen interface ' $* # configure the tapx.x interface to have the ip provided in the bridge option ip link set "$1" up arp on ip addr add $2 dev "$1" # add a route for the Qemu private network to go to the tapx.x interface ip_only=echo $2 | awk -F/ '{print $1}' route add $2 dev $1 src $ip_only # make the tapx.x interface rewrite the MAC address for the forwarded virtual machines packages # this will make tapx.x interface act as a gateway echo 1 >/proc/sys/net/ipv4/conf/$1/proxy_arp # add the iptables rules, in case firewall is enabled, to allow all connection in/out of the tapx.x interface iptables -I FORWARD -m physdev --physdev-in "$1" -j ACCEPT 2>/dev/null iptables -I FORWARD -m state --state RELATED,ESTABLISHED -m physdev --physdev-out "$1" -j ACCEPT 2>/dev/null
Boot de la VM
xm create -c /etc/xen/vm.cfg
L'option -c
permet de se connecter à la console de la VM à la création de celle-ci (inutile sur une VM Windows).
http://img.sn4ky.net/wiki/xen_lenny.JPG
Si VNC est activé, vous devriez pouvoir vous connecter à l'interface de la VM en vous connectant sur l'IP de l'hyperviseur, le port par défaut étant 5900, avec UltraVNC par exemple.
http://img.sn4ky.net/wiki/xen_win2008.JPG
Recompiler un noyau pour les domU (Debian Way)
Kernel 2.6.26
Ici, on va recompiler depuis le domU, installé en utilisant pygrub
Installation des prérequis (on va se placer dans /usr/src
, les sources seront téléchargées dans le répertoire courant) :
aptitude install -y build-essential libncurses5 zlib1g-dev zlibc kernel-package libncurses-dev cd /usr/src/ apt-get source linux-image-2.6.26-2-xen-686
N.b. : apt-get source
n'est disponible que si le fichier /etc/apt/sources.list
contient les entrées deb-src
:
deb-src http://ftp2.fr.debian.org/debian/ lenny main deb-src http://security.debian.org/ lenny/updates main deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
Vous devriez vous retrouver avec des éléments :
linux-2.6-2.6.26/ linux-2.6_2.6.26-26lenny2.diff.gz linux-2.6_2.6.26-26lenny2.dsc linux-2.6_2.6.26.orig.tar.gz
On va appliquer les patchs contenu dans le .diff (ils contiennent entre autre les patch pour Xen)
gzip -d linux-2.6_2.6.26-26lenny2.diff.gz cd linux-2.6-2.6.26/ patch -p0 < ../linux-2.6_2.6.26-26lenny2.diff
On passe à la compilation (avec copie préalable du .config)
cp /boot/config-2.6.26-2-xen-686 ./.config make menuconfig
Il FAUT penser à activer les options suivantes :
Processor type and features ---> [*] Paravirtualized guest support ---> [*] Xen guest support
Une fois que vous avez sélectionné les options souhaitées, il ne reste plus qu'à faire un
time env CONCURRENCY_LEVEL=`grep -c '^processor' /proc/cpuinfo` make-kpkg --initrd --revision=2.6.26-26lenny2 --append-to-version=-i386-bigmem-xenu kernel_image modules
Prenez un café (ou prenez préalablement le temps d'arrêter la VM et de la rebooter avec plus de vCPUs)
Une fois la compilation terminée un ls ../
doit remonter en plus linux-image-2.6.26-i386-bigmem-xenu_2.6.26-26lenny2_i386.deb
qu'il ne reste plus qu'à dpkg -i
pour installer le kernel, les modules, l'initrd, et regénérer grub en conséquence.
cd /usr/src/ dpkg -i linux-image-2.6.26-i386-bigmem-xenu_2.6.26-26lenny2_i386.deb
Répondez Oui
à la première question, OK
à la seconde, et Non
à la 3eme.
Il faut ensuite modifier le fichier /boot/grub/menu.lst
pour y ajouter le kernel précédemment compilé :
title Debian GNU/Linux 5.0 root (hd0,0) kernel /boot/vmlinuz-2.6.26-i386-bigmem-xenu root=/dev/xvda2 ro initrd /boot/initrd.img-2.6.26-i386-bigmem-xenu
(Pensez à modifier la valeur du default
en fonction de où vous avez placé le bloc ci-dessus)
reboot
Si tout c'est bien passé, ça reboot sur le bon kernel, et vous devriez avoir les nouvelles options compilées correctement.
Kernel 2.6.32
Cet exemple est réalisé à partir du dom0 (puisqu'on utilise le même kernel)
Installation des prérequis :
aptitude install -y build-essential libncurses5 zlib1g-dev zlibc linux-source-2.6.32 kernel-package libncurses-dev
On va ensuite détarer les sources :
cd /usr/src/ tar jxvf linux-source-2.6.32.tar.bz2 cd linux-source-2.6.32
Une configuration fonctionnelle pour un domU est fournie avec le kernel du dom0 (il y aura juste des options en moins, mais ces options ne sont pas nécessaires aux domU). On récupère le fichier de configuration du kernel précedemment installé :
cp /boot/config-2.6.32-5-xen-686 ./.config
Et on lance la partie de configuration visuelle du kernel
make menuconfig
Sélectionnez dans ce menu les options et optimisation souhaités.
Ex. : la configuration du 1000hz se trouve dans Processor type and features --->
puis il s'agit du paramètre de Timer frequency
.
C'est également dans ce menu que l'on peut désactiver le Tickless, modifier le Processor family
, activer ou pas le SMT (Hyperthreading)
ou encore choisir le Preemption Model
time env CONCURRENCY_LEVEL=`grep -c '^processor' /proc/cpuinfo` make-kpkg --initrd --revision=1 --append-to-version=-i386-bigmem-xenu kernel_image modules cd .. dpkg -i ...deb
Tunning
Mémoire du dom0
Dans certains cas, il peut être intéressant de mettre des quantités fixes de ram au dom0, et faire en sorte que les domU ne puissent pas lui en prendre.
On va pour celà modifier le fichier /etc/xen/xend-config.sxp
et indiquer :
(dom0-min-mem 256) (enable-dom0-ballooning no)
Ce qui aura pour effet d'indiquer à Xen que le dom0 ne peut aller en dessous de 256Mo de ram, et qu'on interdit le balooning du dom0 (le balooning c'est la possibilité d'ajouter ou de diminuer la ram à chaud d'un système)
Puis, pour parfaire la chose, et afin de booter le dom0 avec pile poil 256Mb de ram (ajuster bien sur cette valeur à vous souhaits), on va faire quelques modifs dans les fichiers de config de GRUB2 :
echo "" >> /etc/default/grub echo "GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=256M"" >> /etc/default/grub
Suivi d'un petit update-grub2
pour que la modification soit prise en compte.
Boot au démarrage du serveur
Afin de faire booter une, ou plusieurs VM au démarrage de la machine physique, il suffit de créer un répertoire /etc/xen/auto
et d'y placer des liens symboliques :
mkdir /etc/xen/auto ln -s /etc/xen/mavm1.cfg /etc/xen/auto/mavm1.cfg ...
Toujours dans la section boot & reboot, si on veut que l'hyperviseur procède à un shutdown des VM avant extinction de la machine (au lieu d'un SAVE), il convient de modifier quelques options de /etc/default/xendomains
XENDOMAINS_SAVE= XENDOMAINS_RESTORE=false
Fixer le CPU du dom0
Pour diverses raisons, il est possible de n'attribuer qu'un seul CPU au dom0, dans le fichier /etc/xen/xend-config.sxp
# In SMP system, dom0 will use dom0-cpus # of CPUS # If dom0-cpus = 0, dom0 will take all cpus available (dom0-cpus 0)
Les CPU (en réalité les threads) sont comptés de 1 à N, 0 indique tous les CPU disponible.
Ressources IO du dom0
Il est possible donner plus de crédits pour l'allocation des IO du dom0, dans /etc/rc.local
:
/usr/sbin/xm sched-credit -d Domain-0 -w 512
Plusieurs bridges
Selon les cas, il peut être utile d'avoir à monter plusieurs bridges sur le dom0. Sans trop complexifier la chose, nous allons créer un script /etc/xen/scripts/network-multi-bridge
et y mettre dedans :
#!/bin/sh dir=$(dirname "$0") "$dir/network-bridge" "$@" vifnum=0 netdev=eth0 bridge=eth0 "$dir/network-bridge" "$@" vifnum=1 netdev=eth1 bridge=eth1
Ne pas oublier de rendre ce script exécutable chmod +x /xen/scripts/network-multi-bridge
et de demander au démon Xen de prendre ce script plutôt qu'un autre, dans /etc/xen/xend-config.sxp
rechercher la ligne
(network-script network-bridge)
pour la remplacer par
(network-script network-multi-bridge)
Un redémarrage pour être certain que toutes les modifications sont bien prises en compte et fonctionnelles, et c'est OK.
Bridge sans IP sur l'interface
Dans certains cas, il peut être intéressant de ne pas avoir d'IP sur une interface du dom0 (genre, pas d'IP publique).
Problème, si l'interface n'est pas configurée, elle ne monte pas au démarrage
Voici un petit trick applicable dans /etc/network/interfaces
allow-hotplug eth0 iface eth0 inet manual pre-up ifconfig $IFACE up post-down ifconfig $IFACE down
Paraviritualized drivers pour Windows
Troubleshooting
Impossible de booter sur xvda1
Dans certaines conditions, on peut se retrouver avec ce type d'erreurs au boot de la VM :
ALERT! /dev/xvda1 does not exist. Dropping to a shell!
Debug :
(initramfs) ls /dev/
Rechercher un xvda1 (a priori, il n'y en a pas), un sda1 ou un hda1.
Puis remplacer, dans le fichier de config de la VM, les occurences à xvda1 et les remplacer par le device trouvé plus haut.
Par exemple :
# Disk device(s). root = '/dev/xvda1 ro' disk = [ 'phy:/dev/MyVgName/maverick-disk,xvda1,w', ]
par
# Disk device(s). root = '/dev/sda1 ro' disk = [ 'phy:/dev/MyVgName/maverick-disk,sda1,w', ]
pyGrub et grub.cfg
pyGrub sait booter sur menu.lst et grub.cfg. Problème, lors de l'utilisation des xen-scripts l'installeur génère un fichier menu.lst ; or depuis Squeeze (6.0) grub-legacy a été remplacé par grub2, qui génère des fichiers grub.cfg. Il est impossible à pygrub de booter en l'état.
La modification des lignes
set root='(/dev/xvda2)'
en
set root='(hd0,1)'
corrige le problème et permet de booter.
Attention toutefois, lors de l'utilisation de update-grub2, la mauvaise configuration revient.