Publié le vendredi 26 décembre 2008, mis a jour le dimanche 28 décembre 2008, par Stephane Malinet
OpenVZ permet de faire tourner jusqu’à 100 machines virtuelles par machine physique.
Là où les autres solutions de virtualisation affichent une perte de performance d’environ 15 à 20% pour les machines virtuelles, OpenVZ n’en compte que 3 à 5%.
Un des inconvénients majeur par rapport à certains de ses concurrents, est, vu que la solution est basée sur une modification du système d’exploitation, de ne pouvoir faire tourner qu’un linux dans un linux et pas un windows dans un linux...
En revanche, elle permet la migration des machines virtuelles (appelées VE, Virtual Entity, ou CT, container) à chaud ou à froid d’un noeud physique (appelé HN, Hardware Node) à l’autre.
Après avoir testé les versions stables sur des architectures x86 et x86_64 du noyau openvz-sources, il s’est avéré qu’avec gcc-4.1.2 seule la version openvz-sources-2.6.24.006.5 fonctionne correctement.
Commençons donc par démasquer ce paquet :
echo "sys-kernel/openvz-sources ~x86" >> /etc/portage/package.keywords
echo "sys-kernel/openvz-sources" >> /etc/portage/package.unmask
Ensuite installez-le :
emerge -av openvz-sources
vzctl est l’utilitaire qui vous permet d’administrer les CTs.
Si vous utilisez >=baselayout-2 installez la version la plus récente de la l’arbre de portage :
echo "sys-cluster/vzctl ~x86" >> /etc/portage/package.keywords
echo "sys-cluster/vzctl" >> /etc/portage/package.unmask
emerge -av vzctl
Nous verrons par la suite sa configuration.
Une fois le paquet openvz-sources installé, passez à sa configuration
cd /usr/src/linux
make menuconfig
-*- Enable the block layer --->
IO Schedulers --->
<*> CFQ I/O scheduler
Default I/O scheduler (CFQ) --->
OpenVZ --->
[*] Virtual Environment support
<M> VE calls interface
-M- VE network device
-M- Virtual ethernet device
-M- VE device
[*] VE netfiltering
<M> VE watchdog module
<M> Checkpointing & restoring Virtual Environments
File systems --->
[*] Quota support
[*] Report quota messages through netlink interface
<M> Quota format v2 support
<M> VPS filesystem
<M> Virtuozzo Disk Quota support
[ ] Unloadable Virtuozzo Disk Quota module
[*] Per-user and per-group quota in Virtuozzo quota partitions
Compilez et installez votre noyau après l’avoir configuré pour votre matériel et rebootez.
Donc vzctl est l’utilitaire qui permet l’administration des CTs : création, démarrage, arrêt, configuration et la migration.
Modifiez la ligne suivante dans le fichier /etc/vz/vz.conf :
DEF_OSTEMPLATE="gentoo"
Et lancez le service vz afin qu’il charge les modules nécéssaires au fonctionement d’openvz :
/etc/init.d/vz start
rc-update add vz default
Vérifiez la liste des modules :
lsmod
Module Size Used by
vznetdev 16548 2
vzrst 139792 0
vzcpt 111904 0
tun 12416 2 vzrst,vzcpt
vzmon 32392 4 vznetdev,vzrst,vzcpt
simfs 5068 1
vzdquota 38168 1 [permanent]
vzdev 3204 3 vznetdev,vzmon,vzdquota
A ce niveau, notre Hardware Node est pret à recevoir ses premiers Container (CT).
Vous pouvez bien évidemment utiliser un template préparé OpenVZ que vous pourrez trouver sur www.funtoo.org mais il manquera dans tous ces derniers quelques paquets par exemple pour la configuration du réseau.
Nous allons donc voire comment préparer un template gentoo.
Télécharger un stage3 correspondant à votre architecture :
cd /vz/template/cache
wget http://www.funtoo.org/linux/pentium4/funtoo-pentium4-2008.12.19/stage3-pentium4-2008.12.19.tar.bz2
Décompressez votre archive :
mkdir gentoo
cd gentoo
tar xvjpf stage3-pentium4-2008.12.19.tar.bz2
Copiez votre fichier /etc/make.conf
cp /etc/make.conf /vz/template/cache/gentoo/etc/make.conf
ou éditez le fichier /vz/template/cache/gentoo/etc/make.conf.
Copiez votre fichier /etc/resolv.conf afin d’avoir la résolution DNS pour la préparation de notre template :
cp /etc/resolv.conf /vz/template/cache/gentoo/etc
Copiez l’arbre portage afin d’installer et de mettre à jour le template suivant les USE activés :
cp -a /usr/portage /vz/template/cache/gentoo/usr
Vous pouvez aussi le faire avec un point de montage :
mount -o bind /usr/portage /vz/template/cache/gentoo/usr/portage
Chrootez :
mount -t proc none /vz/template/cache/gentoo/proc
mount -o bind /dev /vz/template/cache/gentoo/dev
chroot /vz/template/cache/gentoo /bin/bash
env-update && source /etc/profile
Mettez à jour le système :
emerge -avuDN world
Installez iproute2 pour le réseau :
emerge -av iproute2
Créez l’interface qui servira aux futurs CTs :
cd /etc/init.d/
ln -s net.lo net.venet0
Les CTs n’ont besoin que de proc :
echo "proc /proc proc defaults 0 0" > /etc/fstab
Editez le fichier /etc/inittab et commentez les lignes suivantes :
# TERMINALS
#c1:12345:respawn:/sbin/agetty 38400 tty1 linux
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux
Editez le fichier /etc/shadow :
root:!:10071:0:::::
Cela désactive le login root ce qui permettra sa ré activation, selon vos besoins, avec la commande suivante :
vzctl set CTID --userpasswd root:password
Supprimer les services inutiles :
rc-update del checkroot boot
rc-update del consolefont boot
Modifiez udev :
=baselayout-1.* :
vi /etc/conf.d/rc
RC_DEVICE_TARBALL="no"
=baselayout-2.* :
vi /etc/conf.d/udev
rc_device_tarball="NO"
Créez les devices qui seront nécéssaires à entrer dans un CT :
cd /lib
mknod udev/devices/ttyp0 c 3 0
mknod udev/devices/ptyp0 c 2 0
mknod udev/devices/ptmx c 5 2
A ce niveau le template est pret.
exit
umount /vz/template/cache/gentoo/proc /vz/template/cache/gentoo/dev /vz/template/cache/gentoo/usr/portage
Créons l’archive de notre template :
tar cvzpf ../gentoo.tar.gz .
cd ..
rm -rf gentoo stage3-pentium4-2008.12.19.tar.bz2
Pour créer un CT maintenant que notre template est pret cela est simple :
vzctl create 777 --ostemplate gentoo
Lancez le CT :
vzctl start 777
Et appréciez :
vzlist
CTID NPROC STATUS IP_ADDR HOSTNAME
777 22 running 192.168.0.2 ct777
vzctl enter 777
Pour les valeurs des ressources système des CT :
cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
777: kmemsize 1314354 2467837 11055923 11377049 0
lockedpages 0 0 256 256 0
privvmpages 58603 85448 131072 139264 36
shmpages 1 2 21504 21504 0
dummy 0 0 0 0 0
numproc 21 44 240 240 0
physpages 29534 54552 0 2147483647 0
vmguarpages 0 0 33792 2147483647 0
oomguarpages 29534 54552 26112 2147483647 0
numtcpsock 3 5 360 360 0
numflock 35 50 188 206 0
numpty 1 2 16 16 0
numsiginfo 0 5 256 256 0
tcpsndbuf 26784 180792 1720320 2703360 0
tcprcvbuf 49152 805544 1720320 2703360 0
othersockbuf 118296 253072 1126080 2097152 0
dgramrcvbuf 0 8376 262144 262144 0
numothersock 81 87 360 360 0
dcachesize 181116 223704 3409920 3624960 0
numfile 680 1086 9312 9312 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 10 10 128 128 0
0: kmemsize 3675498 4827817 2147483647 2147483647 0
lockedpages 0 0 2147483647 2147483647 0
privvmpages 11010 38156 2147483647 2147483647 0
shmpages 2594 3602 2147483647 2147483647 0
dummy 0 0 2147483647 2147483647 0
numproc 70 93 2147483647 2147483647 0
physpages 5464 15614 2147483647 2147483647 0
vmguarpages 0 0 2147483647 2147483647 0
oomguarpages 5482 15647 2147483647 2147483647 0
numtcpsock 18 22 2147483647 2147483647 0
numflock 3 6 2147483647 2147483647 0
numpty 5 6 2147483647 2147483647 0
numsiginfo 0 5 2147483647 2147483647 0
tcpsndbuf 212040 249984 2147483647 2147483647 0
tcprcvbuf 388888 644952 2147483647 2147483647 0
othersockbuf 138384 206184 2147483647 2147483647 0
dgramrcvbuf 0 8376 2147483647 2147483647 0
numothersock 110 126 2147483647 2147483647 0
dcachesize 788352 829068 2147483647 2147483647 0
numfile 1657 2240 2147483647 2147483647 0
dummy 0 0 2147483647 2147483647 0
dummy 0 0 2147483647 2147483647 0
dummy 0 0 2147483647 2147483647 0
numiptent 24 24 2147483647 2147483647 0
La colonne failcnt permet de voir quelle valeur a été trop restrictive pour le bon fonctionement de votre CT.
vzctl set 777 --hostname ct777 --save
vzctl set 777 --ipadd 192.168.0.2 --nameserver 192.168.0.253 --searchdomain gentoofr.org --save
La mesure est 100% par CPU, donc si vous avez deux CPU, vous avez 200%...
Limiter le CT à 15% maxi de l’utilisation du HN :
vzctl set 777 --cpulimit 15 --save
Modifier la mémoire allouée à un CT :
vzctl set 777 --privvmpages $((65536*2)):$((69632*2)) --save
Ne pas mettre à jour la date du dernier accés à l’inode (limite les I/O) :
vzctl set 777 --noatime yes --save
Changer les priorités des entrées/sorties :
vzctl set 777 --ioprio [0-7](default 4) --save
vzquota stat 777
resource usage softlimit hardlimit grace
1k-blocks 931791 1048576 1153434
inodes 170026 200000 220000
le multiplier par deux :
vzctl set 777 --diskspace $((1048576*2)):$((1153434*2)) --save
Le checkpointing est une extension d’OpenVZ permettant de sauver la totalité de l’état d’un CT en fonctionement afin de le restaurer sur le même ou un autre HN de manière transparante pour les applications et les connexions réseau.
Pendant la Migration le CT freeze le temps de synchroniser ses fichiers avec le nouvel HN, lorsque cela est terminé tout reprend normalement :
vzmigrate --online 192.168.0.6 777
Faire le checkpoint manuel :
vzctl chkpnt 777
Les processus courants du CT sont freezés et sauvegardés comme fichier /vz/dump/Dump.777
Si vous obtenez ce genre de méssage :
vzctl chkpnt 777
Setting up checkpoint...
suspend...
dump...
Can not dump container: Invalid argument
Error: iptables-save exited with 255
Checkpointing failed
1. Vous utilisez iptables dans votre CT mais vzctl cherche les binaires iptables-save et iptables-restore dans /sbin ou dans /usr/sbin : vérifiez leur présence ou créez les liens nécéssaires.
2. Si vous n’utilisez pas iptables dans dans le CT, créez les liens iptables-save et iptables-restore renvoyant un code de sortie 0 :
vzctl enter 777
ln -sf /bin/true /sbin/iptables-save
ln -sf /bin/true /sbin/iptables-restore
Pour le restaurer :
vzctl restore 777