Adrien's log

Yet Another Note Pad

Installation et prise en main d’OpenVZ

by adrien on 23 janvier 2011

OpenVZ ?

OpenVZ est une solution open source d’isolation de contexte pour linux.

L’isolation de contexte est une méthode de virtualisation que l’on peut aussi trouver sous le nom de virtualisation en conteneur. Il s’agit de créer un environnement isolé du système hôte, un peu à la manière des prisons du monde BSD. L’avantage de ce type de virtualisation, c’est que les différents environnements partagent le même noyau, ainsi les performances par rapport à un système réel sont proches des 100%. Chaque machine virtuelle dispose de sa propre interface réseau, des limitations que vous pouvez attribuer comme bon vous semble et, le plus important, de ses propres utilisateurs, processus et programme. Chacune d’entre elles fonctionnent indépendamment les unes des autres, ainsi, un bricolage sur le serveur Apache de votre blog perso n’influera pas sur le serveur Apache de votre site pro.

Il existe des solutions concurrentes, par exemple Linux-vserver. Mais j’ai choisi d’utiliser OpenVZ car le premier, d’après les dire, semble avoir des problèmes au niveau de la couche réseau, notamment pour les bases de données en cluster ou même les services VPN. Deplus, Linux-vserver ne semble pas supporter le processus de Live Migration qui consiste à déplacer la machine virtuel d’un hôte à l’autre sans coupure.

Ce genre de solution à l’avantage de pouvoir être utilisé sur des vieilles machines (sans les instructions de virtualisations), il n’y a qu’à voir la configuration minimal :

  • IBM PC-compatible computer
  • Intel Celeron, Pentium II ou encore AMD Athlon
  • Au minimum 128 Mo de mémoire vive
  • Et 4 Go d’espace disque

C’est partit !

Installation des outils

Bon, la première étape consiste à installer le noyau patché pour OpenVZ.

apt-get install linux-image-2.6.26-2-openvz-686

Avec ça, il devrait vous installer également les paquets vzctl et vzquota, le premier étant l’outil de gestion et le second sert à la gestion des quotas.

Une fois finit, vous n’avez plus qu’à redémarrer la machine qui devrait automatique booter sur le bon noyau. Vous pouvez vérifier en tapant :

uname -r

De même, en tapant la commande ‘ifconfig’, vous verrez une nouvelle interface « venet0 ». Il va maintenant falloir la configurer.

Configuration du réseau

Le réseau est crée par OpenVZ via une sorte de switch virtuel, l’hôte servant de routeur entre ce réseau et votre LAN. Il va donc falloir attribuer une adresse à la nouvelle interface et configurer l’hôte pour qu’il redirige les paquets vers nos VM.

Commençons par attribuer une adresse à cette interface, voyons le fichier /etc/network/interfaces. Après la configuration de vos interfaces physiques, vous devrez ajouter ces lignes en modifiant, bien sûr, à votre convenance :

auto venet0
allow-hotplug venet0
iface venet0 inet static
address 192.168.2.1
netmask 255.255.255.0

Puis, redémarrons le service réseau :

/etc/init.d/networking restart

Nous pouvons vérifier que l’interface à bien une adresse en tapant la commande ‘ip a’.

Ensuite nous devons nous rendre dans le fichier /etc/sysctl.conf pour y ajouter des lignes concernant le routage NAT :

#Activer les touches magiques
kernel.sysrq=1
net.ipv4.conf.all.rp_filter=1
#Configuration de la redirection
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1

Un petit ‘sysctl -p’ pour que le système prenne en compte les modifications. Puis on passe à la configuration d’iptables.

Pour ce dernier, nous devons lui dire dans un premier temps d’activer le routage NAT :

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to 192.168.1.13

Cette règle permet aux VEs d’avoir accès à votre LAN et, accessoirement, à internet.

Ensuite, pour que l’extérieur puisse avoir accès à vos VEs il faudra créer des règles supplémentaires, prenons l’exemple d’un serveur web :

iptables -t nat  -A PREROUTING -p tcp -d 192.168.1.13 --dport 80 -i eth0 -j DNAT  --to-destination 192.168.2.2:80

Ici, nous redirigeons les paquets qui ont pour destination le port 80 de la machine 192.168.1.13 vers le VE 192.168.2.2.

Évidement, ces règles sont à mettre dans votre fichier firewall.sh, celui qui se lance pour configurer iptables à votre sauce.

Création d’un template

Afin de créer un VE, il nous faut une fondation, il s’agit d’un template. Ils sont stockés dans /var/lib/vz/template/cache mais ne chercher pas, par défaut, il n’y en a pas ! Mais vous pouvez aller en télécharger directement sur le site d’OpenVZ. Nous, nous allons faire autrement. Nous allons créer notre propre template.

Ce n’est pas bien compliqué, et peut s’avérer super pratique pour éviter les taches répétitives de création de VE.

Première étape, installons debootstrap :

apt-get install debootstrap

Ensuite, plaçons nous dans le dossier /var/lib/vz/private et créons un dossier nommé par un nombre, exemple :

mkdir 100

Rentrons de ce dossier et lançons la commande

debootstrap lenny

Cette commande va nous installer un Debian lenny directement dans le dossier actuel. La vitesse dépend de votre connexion, mais ça reste relativement rapide.

Ensuite nous allons entrer une suite de commande pour configurer le VE.

vzctl set 100 --applyconfig vps.basic --save
sh -c 'echo "OSTEMPLATE=debian-5.0" >> /etc/vz/conf/100.conf'
vzctl set 100 --ipadd 192.168.2.2 --save
vzctl set 100 --nameserver 192.168.1.1 --save

Dans Debian Squeeze, il faut remplacer ‘vps.basic’ en ‘basic’ tout court.

La première créé un fichier de configuration de base, la seconde renseigne le nom de la distribution de le fichier de configuration et les deux dernières configurent une adresse IP et un serveur DNS.

Maintenant nous pouvons entrer dans le VE avec la commande

vzctl enter 100

Voila, vous êtes à la racine de votre VE, désormais toute commande tapée affectera uniquement ce VE. Vous pouvez en profiter pour configurer le template à votre guise : logiciels indispensables, éditeur par défaut, etc … Profitez-en aussi pour vider le cache apt et mettre le système à l’heure. Les deux commandes qui suivent peuvent être utile si vous voulez que les programme qui lise le système de fichier (genre ‘df’) fonctionne :

rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab

Une fois terminé, tapez ‘exit’ pour sortir du VE et revenir sur l’hôte.

Maintenant que le template est prêt, supprimons son adresse IP. En effet, à chaque fois que vous créerez un VE vous devrez renseigner une adresse IP unique.

vzctl set 100 --ipdel all --save

Stoppons le VE :

vzctl stop 100

Retournons dans le dossier de notre VE/template si nous y sommes pas, : /var/lib/vz/private/100. Lançons ensuite une bête commande ‘tar’ pour créer notre template :

tar czf /var/lib/vz/template/cache/debian-5.0-i386.tar.gz ./

Libre à vous de personnaliser le nom du template.

Vous pouvez dès à présent tester le template par la suite de commande :

vzctl create 101 --ostemplate debian-5.0-i386
vzctl start 101
vztcl exec 101 hostname

Cela va créer un VE sur la base de votre template, le démarrer et exécuter la commande ‘hostname’. Si vous avez un retour, c’est bien, sinon, vous vous êtes planté quelque part. Entrez la suite de commande pour détruire le VE que nous venons de créer :

vzctl stop 101
vzctl destroy 101
rm -f /etc/vz/conf/101.conf.destroyed

Oui, la création d’un VE créé un fichier qui ne sera pas supprimé lors de la destruction du VE. Faisons de même pour le VE servant de base au template

vzctl destroy 100
rm -f /etc/vz/conf/100.conf.destroyed

Voilà, c’est terminer pour le template. C’est finalement pas bien compliquer.

Afin de ne pas avoir à tout le temps mettre l’argument ‘ostemplate’, il vous faut modifier la ligne ‘DEF_TEMPLATE’ du fichier /etc/vz/vz.conf pour remplacer son contenu par le nom de votre template par défaut.

Les options de création de VE

Nous allons maintenant faire un listing de quelques options de création de VE. Toutes ces options sont à mettre après ‘vzctl set IDVE’

--onboot yes/no   #Permet de démarrer le VE en même temps que le système;
 
--disabled yes/no   #Permet d'empécher le demarrage d'un VE.
 
--name LENOM    #Donne un nom à votre VE, cela permet de remplacer le veid dans le reste des commande
 
--ipadd ADDR    #Ajoute une adresse IP au VE
 
--ipdel ADDR/all    #Supprime une ou toutes les adresses IP du VE
 
--nameserver ADDR   #Ajoute l'adresse d'un serveur DNS
 
--searchdomaine NAME   #Ajoute un domaine de recherche
 
--netif_add IFNAME[MAC, HOST_IFNAME, HOST_MAC]   #Ajoute une interface réseau au VE, IFNAME est le nom de l'interface (veth)
 
--netif_del IFNAME/all   #Supprime une ou toutes les interfaces du VE

Maintenant, voyons comment limiter les ressources attribuées à un VE. Chaque option prend un nombre au minimum une option, certaines en prennent 2.

vzctl set IDVE --numproc 2:3  #Nous limitons le système à ouvrir un maximum de 3 processus.

En limitation, il y a également :

--numtcpsock   num:num   #Nombre de socket TCP par VE
 
--numothersock num:num   #La même avec tout les socket non-TCP
 
--vmguardpages num:num   #Limitation de la mémoire pour un VE(en pages, une page = 4096 octets)
 
--kmemsize num:num    #Limitation de la mémoire noyau (prévoir 40-50ko par processus)
 
--tcpsndbuf num:num    #Taille maximale du buffer d'envoi de paquet TCP(2.5ko environ)
 
--tcprcvbuf num:num    #Taille maximale du buffer de réception de paquet TCP
 
--othersockbuf num:num     #Taille maximale des buffers de paquet non TCP
 
--numfile num:num    #Nombre maximum de fichiers ouverts
 
--numpty num:num     #Nombre maximum de console pour un VE (max 255)
 
--cpulimit num   #Limitation de l'utilisation du CPU, notez que pour utiliser 100% d'un CPU dual-core, il faudra mettre 200%
 
--cpuunits num   #Priorité pour le CPU des VE, plus la valeurs, plus la priorité sera grande.
 
--diskspace num:num    #Application de quotat d'utilisation de l'espace disque au VE
 
--quotatime secondes   #Période de grâce quand l'utilisateur à atteint la limite soft.

Nous nous arrêterons là pour les limitations, il y a déjà largement de quoi faire.

Checkpoint et restauration

Il est également possible, à l’instar des solutions de virtualisations classiques, de prendre des snapshots et de les restaurer si besoin est.

Voyons comment prendre un snapshot :

chkpnt IDVE [--dumpfile nomdufichier]

Toujours pareil, IDVE étant l’identifiant de votre VE et le paramètre sert à indiquer le chemin où l’on veut stocker le checkpoint (par défaut, c’est /var/lib/vz/dump/Dump.IDVE)

Pour la restauration, c’est pas plus compliqué, il suffit de remplacer ‘chkpnt’ par ‘restore’ :

restore IDVE [--dumpfile nomdufichier]

Ce sera tout pour les snapshots.

Résumé des commandes usuelles

Voici un petit résumé des commandes utiles lors de l’exploitation d’un environnement OpenVZ:

  • Créer un VE
vzctil create IDVE
  • Détruire un VE
vzctl destroy IDVE
rm -f /etc/vz/conf/IDVE.conf.destroyed
  • Lancer un VE
vzctl start IDVE
  • Arrêter un VE
vzctl stop IDVE
  • Entrer dans un VE
vzctl enter IDVE
  • Status d’un VE
vzctl status IDVE
  • Executer une commande sur un VE depuis l’hôte
vzctl exec IDVE LACOMMANDE

Source : Wiki officiel d’OpenVZ

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *