Xen Sur Debian 6

De Sn4kY
Aller à : navigation, rechercher

Cet article a été écrit a partir de Debian 6.0 Squeeze, mais il peut être facilement adapté à Debian 5.0 Lenny

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

Xen GPLPV Drivers

[2]

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.

Sources