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/precreatedSi 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.