Astuces et optimisations

De Sn4kY
Aller à : navigation, rechercher

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 /etc/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

Bridge sans interface physique

Dans certains cas, il est intéressant d'avoir un bridge sans interface physique reliée (communication interVM uniquement sur le même Dom0, ou simplement pour natter). Dans ce cas, il faut créer un bridge vide, puis y allouer les VMs : auto xenbr1

iface xenbr1 inet static
       address 10.10.0.1
       netmask 255.255.255.0
       bridge_stp off
       bridge_waitport 0
       bridge_fd 0


Paraviritualized drivers pour Windows

Xen GPLPV Drivers

[1]

Sources