OpenVZ sur Ubuntu Hardy avec LVM

Installation de OpenVZ sur Ubuntu Server 8.04 Hardy

tiré de la doc https://help.ubuntu.com/community/OpenVZ, de http://www.howtoforge.com/installing-and-using-openvz-on-ubuntu8.04-p2 et de http://wiki.openvz.org/Main_Page

Mon serveur est un Sun X4100 avec un processeur amd64. Le disque est partitionné et possède une partition pour LVM.
L'OS de base est Ubuntu Server 8.04 LTS installé comme serveur ssh seulement. Le kernel livré est le 2.6.24-16.

Installation du kernel patché

On installe OpenVZ :
sudo apt-get install linux-openvz vzctl

Une image patchée pour OpenVZ sur un kernel 2.6.24-19 vient s'ajouter au kernel de base 2.6.24-16, ce qui est une bonne chose car le patch 2.6.24-18 était connu pour avoir un bug minime. Par défaut, elle prend la première place dans le menu.lst de grub.
On supprime alors le kernel initial (remplacer le mot server par le mot generic dans une install desktop) :
sudo apt-get remove --purge --auto-remove `dpkg -l linux-image-*server | awk '$1 ~ /ii/ {print $2}'`

On édite immédiatement le fichier de conf /etc/sysctl.conf et on s'assure que les assertions suivantes y sont (le plus simple est de tout laisser tel quel et de copier ceci en fin de fichier):

modification de la conf

net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.ip_forward=1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.eth0.proxy_arp=1

Et si on a besoin que les serveurs virtuels VPS soient sur un réseau différent de l'hôte, il faut aussi changer cette assertation dans /etc/vz/vz.conf
NEIGHBOUR_DEVS=all

Un petit lien symbolique au cas où certains utilitaires essaient de trouver openvz là où il n'est pas :
sudo ln -s /var/lib/vz /vz

Ne pas oublier de redémarrer pour charger le nouveau kernel :
sudo reboot

Installation de LVM

L'idé générale est de donner à chaque serveur virtuel VPS un volume logique dédié et de donner aussi un volume logique à l'espace des templates.
Pour gérer la partition LVM, on installe lvm2 :
sudo apt-get install lvm2

On crée un disque physique pour lvm, sans se tromper sous risque de formater la mauvaise partition :
sudo pvcreate /dev/sda4

On crée le volume groupe principal (je le nomme "mainvg") qui contiendra les volumes logiques (un par container) et on vérifie dans la foulée :
sudo vgcreate mainvg /dev/sda4
sudo vgdisplay mainvg

On crée tout de suite le volume pour les templates à venir. On le nomme templates et on lui donne 1GB pour commencer :
sudo lvcreate -n templates -L 1g mainvg
sudo lvdisplay

On le formate et on le monte sur son répertoire :
sudo mkfs -t ext3 /dev/mainvg/templates
sudo mount /dev/mainvg/templates/ /var/lib/vz/template
sudo mkdir /var/lib/vz/template/cache # on récrée le sous-répertoire cache de template perdu par le mount
df -h


On pense aussi dans la foulée à reporter le montage /var/lib/vz/template sur /dev/mainvg/templates dans /etc/fstab (attention à l'écriture /dev/mapper/mainvg-NomVolume) :

sudo nano /etc/fstab
/dev/mapper/mainvg-templates     /var/lib/vz/template ext3    defaults    0    2


ATTENTION : si le nom du volume logique contient des tirets, il faut les doubler dans le path de la fstab ex : /dev/mapper/nomduVolumeGroup-Nom--du--Volume--Logique

Création d'un premier VPS

Un VPS a besoin pour être créé de s'appuyer sur un template. Un template peut être créé de toutes pièces, par exemple avec debootstrap comme pour vserver (voir ici), soit être téléchargé tout fait. Pour notre premier VPS, nous allons récupérer un template tout prèt ici : http://wiki.openvz.org/Download/template/precreated

Si on veut placer les VE dans une autre destination que l'emplacement d'installation par défaut d'Ubuntu, à savoir /var/lib/vz, il faut éditer le fichier /etc/vz/vz.conf et modifier par exemple LOCKDIR, DUMPDIR, VE_ROOT et VE_PRIVATE. Penser, dans ce cas, à copier l'arborescence existante dans /var/lib/vz dans le nouveau chemin.
cd /var/lib/vz/template/cache
sudo wget http://download.openvz.org/template/precreated/ubuntu-8.04-i386-minimal.tar.gz # penser à $http_proxy si besoin

Les VPS sont identifiés par un chiffre. Par convention, on prend la valeur du dernier octet de son adresse. Ex : 50 pour un VPS sur la 10.230.1.50. Cependant, on lui associera un nom plus parlant dès la création.
On crée donc son espace de stockage dans LVM et dans ./private/nomduVPS.
Mes conventions :
  • nom du LV = nom du VPS (toto dans mon exemple)
  • LV monté sur private/nomduVPS
  • VPS créé dans private/nomduVPS/VPSID (VPSID = 50, dans mon exemple)
(La création d'un VPS sur un répertoire existant n'est pas autorisée)

création et montage du LV

sudo lvcreate -n toto -L 3g mainvg
sudo mkfs -t ext3 /dev/mainvg/toto
sudo mkdir /var/lib/vz/private/toto
sudo mount /dev/mainvg/toto/ /var/lib/vz/private/toto

Et on reporte ce montage dans la fstab (attention à l'écriture /dev/mapper/mainvg-NomVolume )

sudo nano /etc/fstab
/dev/mapper/mainvg-toto /var/lib/vz/private/toto        ext3    defaults        0       2


création et configuration du VPS

sudo vzctl create 50 --ostemplate ubuntu-8.04-i386-minimal --config vps.basic --private=/vz/private/toto/50
sudo vzctl set 50 --name toto --save # on lui donne un nom plus facile à retenir que l'ID

à partir de là, on peut utiliser indifféremment dans les commandes vzctl soit le nom, soit l'ID : toto ou 50
sudo vzctl set toto --ipadd 10.230.1.50 --save # une adresse IP (--ipdel pour supprimer l'IP)
sudo vzctl set toto --hostname toto.univ.run --save # un hostname
sudo vzctl set toto --nameserver 195.220.151.50 --save # un DNS


SERAIT BIEN ICI DE COPIER LE /etc/apt/sources.list DE l'HOTE VERS LE GUEST

Attention : par défaut, un VPS a ses quotas de disques activés. Si on veut se reposer seulement sur la contrainte imposée par LVM pour l'espace disque utilisable,
 il faut désactiver les quotas
:
sudo nano /etc/vz/conf/50.conf

ajouter au début du bloc relatif aux quotas de disques (cf UserGuide p49) :
DISK_QUOTA=no

Et on le démarre :
vzctl start toto # vzctp stop toto pour arrêter, vzctl restart toto pour redémarrer

Puis on entre dedans :
 
vzctl enter toto

où on peut faire tout la config classique : création de comptes, passwd, etc Sans entrer, on peut depuis l'hôte faire exécuter une commante au VPS :
vzctl exec toto commande

Pour faire un snapshot :
sudo vzctl chkpnt toto --dumpfile nomdufichier

Récupérer un snapshot :
sudo vzctl restore toto --dumpfile nomdufichier

Pour lister les VPS :
sudo vzlist # VPS actifs
sudo vzlist -a # tous les VPS

Et pour détruire un VPS, sans oublier de détruire son LV :
sudo vzctl stop toto
sudo vzctl destroy toto
sudo umount /vz/private/toto
sudo lvremove /dev/mainvg/toto
sudo rmdir /vz/toto/

Si on souhaite que le VPS redémarre automatiquement au reboot de l'hôte, il faut le préciser dans le fichier de conf :

echo ONBOOT="yes" >> /etc/vz/conf/1010.conf
On peut aussi faire un plus élégant :
sudo vzctl set toto --onboot yes --save



Configuration

ref : http://wiki.openvz.org/User_Guide/Managing_Resources

Pour configurer un VPS en termes de CPU et RAM, on peut soit produire un fichier de configuration à la main, soit s'appuyer directement
sur la configuration de l'hôte.

Avec vzsplit

La commande vzsplit permet de générer automatiquement un fichier de configuration avec un jeu de paramètres basés sur les valeurs de la machine hôte.
Pour cela on spécifie un quantième diviseur de la configuration de l'hôte. Exemple :

sudo vsplit -n 1 -f full va créer un fichier ve-full.conf-sample permettant à un VPS de disposer de toutes les ressources disponibles de l'hôte
sudo vsplit -n 2 -f half va créer un fichier ve-half.conf-sample permettant à un VPS de disposer de la moitié des ressources disponibles de l'hôte
sudo vsplit -n 3 -f tiers va créer un fichier ve-tiers.conf-sample permettant à un VPS de disposer du tierss des ressources disponibles de l'hôte

etc ...

Donc si on veut que plusieurs VPS sur le même hôte puissent utiliser de façon concurrente toutes les ressources disponibles,
on leur appliquera à tous une configuration de type full de l'exemple précédent.

On applique donc les paramètres à chaque nouveau VPS :

sudo vzctl stop toto
sudo vzctl set toto --applyconfig full --save
sudo vzctl start toto


A la main

Le fichier de configuration du VPS créé se trouve là : /etc/vz/conf/50.conf

La configuration fine des paramètres se fait normalement à l'aide de vzcalc en applicant ensuite des fonctions de proportionnalités entre les paramètres (lire la pénible documentation chez openVZ).

Par exemple, j'ai un serveur bi-processeur AMD opteron avec 8G de RAM.
Mon fichier de configuration ressemble à ceci :

ONBOOT="yes"

# UBC parameters (in form of barrier:limit)
KMEMSIZE="134217728:134217728"
LOCKEDPAGES="16384:32768"
PRIVVMPAGES="262144:524287"
SHMPAGES="65536:65536"
NUMPROC="4096:4096"
PHYSPAGES="0:9223372036854775807"
VMGUARPAGES="262144:9223372036854775807"
OOMGUARPAGES="262144:9223372036854775807"
NUMTCPSOCK="4096:4096"
NUMFLOCK="1024:1024"
NUMPTY="16:16"
NUMSIGINFO="1024:1024"
TCPSNDBUF="20971520:31457280"
TCPRCVBUF="20971520:31457280"
OTHERSOCKBUF="20971520:31457280"
DGRAMRCVBUF="262144:262144"
NUMOTHERSOCK="4096:4096"
DCACHESIZE="50331648:50331648"
NUMFILE="65536:65536"
AVNUMPROC="2048:2048"
NUMIPTENT="256:256"

# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="1048576:1153024"
DISKINODES="200000:220000"
QUOTATIME="0"

# CPU fair sheduler parameter
CPUUNITS="60283"

VE_ROOT="/var/lib/vz/root/$VEID"
VE_PRIVATE="/vz/private/rails/50"
OSTEMPLATE="ubuntu-8.04-i386-minimal"
ORIGIN_SAMPLE="vps.basic"
NAME="rails"
IP_ADDRESS="10.230.1.50"
HOSTNAME="rails.univ.run"
NAMESERVER="195.220.151.50"


Merci à cet exemple très détaillé avec tous les calculs : http://file.mistur.org/vz-sample.conf
Au cas où la page venait à disparaitre, je la copie ici.