OpenVZ : Mise en place d'OpenVZ

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Flattr-badge-large.png

1 Introduction

OpenVZ est une technologie de virtualisation de niveau système d'exploitation basée sur le noyau Linux. OpenVZ permet à un serveur physique d'exécuter de multiples instances de systèmes d'exploitation isolés, connus sous le nom de serveurs privés virtuels (VPS) ou environnements virtuels (VE).

En comparaison aux machines virtuelles telles que VMware et aux technologies de paravirtualisation telles que Xen, OpenVZ offre moins de flexibilité dans le choix du système d'exploitation : le système d'exploitation invité et hôte doivent être de type Linux (bien que les distributions de Linux peuvent être différentes dans des VEs différents). Cependant, la virtualisation au niveau OS d'OpenVZ offre une meilleure performance, une meilleure scalabilité (i.e. évolution), une meilleure densité, une meilleure gestion de ressource dynamique, et une meilleure facilité d'administration que ses alternatives. Selon le site Web d'OpenVZ, cette méthode de virtualisation introduirait une très faible pénalité sur les performances : 1 à 3% de pertes seulement par rapport à un ordinateur physique.

OpenVZ est la base de Virtuozzo, un produit propriétaire fourni par SWsoft, Inc. OpenVZ est distribué sous la Licence publique générale GNU version 2.

OpenVZ comprend le noyau Linux et un jeu de commandes utilisateurs.

2 Installation

Pour installer OpenVZ, c'est toujours aussi simple sur debian :

Command aptitude
aptitude install vzquota vzctl linux-image-2.6-openvz-amd64 linux-image-openvz-amd64 linux-headers-2.6-openvz-amd64 debootstrap

Nous allons également éditer les sysctl pour ajouter ceci :

Configuration File /etc/sysctl.conf
# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
 
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.ip_forward=1
 
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
 
# Enables the magic-sysrq key
kernel.sysrq = 1
 
# TCP Explict Congestion Notification
#net.ipv4.tcp_ecn = 0
 
# we do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0

Et on va activer ce dont nous avons besoin :

Command
sysctl -p

3 Configuration

3.1 Préparation des environnements

Vous avez la possibilité de créer vos environnements de 2 manières :

  • Par debootstrap
  • Par template

Les 2 solutions se valent. La plus rapide étant le template car elle doit se trouver sur votre machine.

Personnellement, j'ai utilisé longtemps la template. Puis récemment, j'ai du passer mon serveur en Squeeze (actuellement en testing) et aucunes templates n'existaient. J'ai donc opté pour la version debootstrap.

3.1.1 Debootstrap

Vous allez voir que c'est très simple. Pour créer un VE, nous allons donc utiliser la méthode debootstrap. Voici la liste des distributions disponibles :

Command ls
> ls /usr/share/debootstrap/scripts/
breezy	edgy  etch-m68k  gutsy	hoary	      intrepid	karmic	lucid	  potato  sarge.buildd	    sid      stable   unstable	warty.buildd  woody.buildd
dapper	etch  feisty	 hardy	hoary.buildd  jaunty	lenny	maverick  sarge   sarge.fakechroot  squeeze  testing  warty	woody

Pour ma part, j'ai choisis Squeeze, donc :

Command debootstrap
debootstrap --arch amd64 squeeze /mnt/containers/private/101

  • --arch : On choisis l'architecture voulue, ici amd64.
  • squeeze : le nom de la distrib souhaité
  • /mnt/containers/private/101 : l'endroit ou doit être placé mon VE (j'utilise ici l'ID du VE)

3.1.2 Template

Nous n'allons pas créer notre template, mais plutôt en télécharger des déjà existantes à l'adresse suivante : http://wiki.openvz.org/Download/template/precreated et le placer au bon endroit. Pour ma part j'ai modifier le fichier /etc/vz/vz.conf pour modifier les chemins par défaut. Ca pointe donc vers /mnt/containers.

Command
cd /mnt/containers/template/cache
wget http://download.openvz.org/template/precreated/contrib/debian-5.0-amd64-minimal.tar.gz

3.2 Réseaux

3.2.1 En mode NAT

Si vous avez besoin d'avoir plusieurs VE disponible depuis 1 seule IP et que vous ne pouvez pas avoir d'autres IP directement accessibles, il faudra alors passer en mode naté. C'est notamment le cas si vous possédez une Dedibox (Illiad) ou un serveur Kimsufi (OVH) dont une seule IP WAN est disponible (en standard) pour un serveur donné et qu'il vous est impossible de faire du mode bridgé.

Nous allons donc configurer simplement la partie carte réseaux :

Configuration File /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
auto eth0
iface eth0 inet static
        address 88.xx.xx.xx
        netmask 255.255.255.0
        network 88.xx.xx.0
        broadcast 88.xx.xx.255
        gateway 88.xx.xx.xx

Jusque là, tout est classique. Seulement nous allons avoir besoin suite à la création d'un VE de faire du masquerading pour la possibilité d'avoir Internet depuis les VE et du PREROUTING pour tout ce qui est redirection. Nous utiliserons donc ici IPtables qui nous donnera accès à l'extérieur depuis les VE et dont les redirections de ports seront possible depuis l'extérieur vers les VE :

Configuration File /etc/init.d/iptables
#!/bin/bash
 
#-------------------------------------------------------------------------
# Essentials
#-------------------------------------------------------------------------
 
IPTABLES='/sbin/iptables';
modprobe nf_conntrack_ftp
 
#-------------------------------------------------------------------------
# Physical and virtual interfaces definitions
#-------------------------------------------------------------------------
 
# Interfaces
wan_if="eth0";
vpn_if="tap0";
 
#-------------------------------------------------------------------------
# Networks definitions
#-------------------------------------------------------------------------
 
# Networks
wan_ip="x.x.x.x";
lan_net="192.168.90.0/24";
vpn_net="192.168.20.0/24";
 
# IPs
ed_ip="192.168.90.1";
banzai_ip="192.168.90.2";
 
#-------------------------------------------------------------------------
# Global Rules input / output / forward
#-------------------------------------------------------------------------
 
# Flushing tables
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
 
# Define default policy
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
 
$IPTABLES -A INPUT -j ACCEPT -d $lan_net;
$IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
 
#-------------------------------------------------------------------------
# Allow masquerading for VE
#-------------------------------------------------------------------------
 
# Activating masquerade to get Internet from VE
$IPTABLES -t nat -A POSTROUTING -o $wan_if -s $lan_net -j MASQUERADE
 
# Activating masquerade to get VPN access from VE
$IPTABLES -t nat -A POSTROUTING -o tap0 -j MASQUERADE
 
#-------------------------------------------------------------------------
# Allow ports on CT
#-------------------------------------------------------------------------
 
# Allow ICMP
$IPTABLES -A INPUT -j ACCEPT -p icmp
 
# SSH access
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 22
 
#-------------------------------------------------------------------------
# Redirections for incoming connections (wan)
#-------------------------------------------------------------------------
 
# HTTP access
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -d $wan_ip -j DNAT --to-destination $ed_ip:80
 
# HTTPS access
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -d $wan_ip -j DNAT --to-destination $ed_ip:443

Ici j'ai le port 80 et 443 qui sont redirigés vers une machine (Ed).

3.2.2 Avec une interface bridgée

Le gros intérêt de l’interface venet, c’est que ça permet à l’administrateur du serveur physique de décider de la configuration réseau de la machine virtuelle. C’est particulièrement appréciable pour un hébergeur qui souhaite vendre un service d’hébergement de machines virtuelles, car il peut librement laisser ses clients administrer leur serveur virtuel OpenVZ tout en étant certain qu’ils ne pourront pas perturber le réseau, s’attribuer davantage d’adresses IP que prévu, bidouiller les tables de routage, etc. Si vous utilisez OpenVZ pour fournir des services d’hébergement à vos clients, l’interface veth n’est pas faite pour vous. Je ne suis pas dans ce cas de figure, donc les potentiels problèmes de sécurité que peuvent poser l’interface veth pour un hébergeur ne me concernent pas.

J’utilise à la fois venet et veth sur les serveurs que j’administre : veth lorsque j’ai besoin d’avoir un accès aux couches ethernet depuis les serveurs virtuels, et venet dans tous les autres cas. Mais, contrairement à la simplicité offerte par les interfaces venet, pour pouvoir utiliser une interface veth dans un serveur virtuel, il faut faire quelques opérations de configuration complémentaires pour préparer le serveur physique à recevoir des serveurs virtuels utilisant veth. C’est ce que je vais décrire dans les sections suivantes.

Nous allons donc installer le nécessaire :

Command apt-get
apt-get install bridge-utils

Puis créer une configuration type :

Configuration File /etc/network/interfaces
auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet manual
 
auto vmbr0
iface vmbr0 inet static
    bridge_ports eth0
    address 192.168.1.216
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    gateway 192.168.1.254

Rebootez ensuite le serveur.

Afin qu’au lancement d’un serveur virtuel OpenVZ ajoute ou retire dynamiquement une interface veth au bridge, il faut créer quelques fichiers sur le serveur physique. Cette opération est à faire une bonne fois pour toutes sur le serveur physique, indépendamment du nombre de serveurs virtuels qui seront créés par la suite. Il est également possible de la faire sur un serveur qui, au final, n’héberge que des serveurs virtuels utilisant des interfaces venet, cela ne perturbe en rien ces derniers.

D’abord, il faut créer le fichier /etc/vz/vznet.conf, avec le contenu suivant :

Configuration File /etc/vz/vznet.conf
#!/bin/bash
EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"

puis le fichier /usr/sbin/vznetaddbr, avec le contenu suivant :

Configuration File /usr/sbin/vznetaddbr
#!/bin/sh
#
# Add virtual network interfaces (veth's) in a container to a bridge on CT0
 
CONFIGFILE=/etc/vz/conf/$VEID.conf
. $CONFIGFILE
 
NETIFLIST=$(printf %s "$NETIF" |tr ';' '\n')
 
if [ -z "$NETIFLIST" ]; then
   echo >&2 "According to $CONFIGFILE, CT$VEID has no veth interface configured."
   exit 1
fi
 
for iface in $NETIFLIST; do
    bridge=
    host_ifname=
 
    for str in $(printf %s "$iface" |tr ',' '\n'); do
	case "$str" in
	    bridge=*|host_ifname=*)
		eval "${str%%=*}=\${str#*=}" ;;
	esac
    done
 
    [ "$host_ifname" = "$3" ] ||
	continue
 
    [ -n "$bridge" ] ||
	bridge=vmbr0
 
    echo "Adding interface $host_ifname to bridge $bridge on CT0 for CT$VEID"
    ip link set dev "$host_ifname" up
    echo 1 >"/proc/sys/net/ipv4/conf/$host_ifname/proxy_arp"
    echo 1 >"/proc/sys/net/ipv4/conf/$host_ifname/forwarding"
    brctl addif "$bridge" "$host_ifname"
 
    break
done
 
exit 0

Pour info, j'ai modifier la ligne contenant "bridge=" avec mon interface vmbr0.

Il faut également associer le droit d’exécution à ce fichier en tapant la commande :

Command chmod
chmod 0500 /usr/sbin/vznetaddbr

On va maintenant configurer la VE (voir également plus bas comment manager une VE) :

Command vzctl
vzctl set $my_veid --netif_add eth0 --save

Et enfin éditez votre configuration de machine et ajoutez l'interface bridge pour celui ci :

Configuration File /etc/vz/conf/$VEID.conf
CONFIG_CUSTOMIZED="yes"
VZHOSTBR="vmbr0"

La fin de config du fichier de conf doit au final ressembler à ceci :

Configuration File /etc/vz/conf/$VEID.conf
...
OSTEMPLATE="debian-5.0-amd64-minimal"
ORIGIN_SAMPLE="vps.basic"
HOSTNAME="vz.deimos.fr"
CONFIG_CUSTOMIZED="yes"
VZHOSTBR="vmbr0"
IP_ADDRESS=""
NAMESERVER="192.168.100.3"
CAPABILITY="SYS_TIME:on "
NETIF="ifname=eth0,mac=00:18:51:96:D4:8D,host_ifname=veth101.0,host_mac=00:18:51:B8:B8:CF"

Maintenant, il suffit de configurer l'interface eth0 comme vous avez l'habitude de faire sur votre VE.

3.2.3 Avec des vlans

Vous pouvez avoir besoin de créer des vlan dans vos VE. Ca fonctionne même très bien avec une interface bridgée. Pour se faire, sur la machine host, vous devez avoir un vlan de configuré (pour la mise en place, utilisez cette documentation). Pour ceux qui souhaitent quand même un exemple :

Configuration File /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet manual
 
# The bridged interface
auto vmbr0
iface vmbr0 inet static
        address 192.168.100.1
        netmask 255.255.255.0
        gateway 192.168.100.254
        broadcast 192.168.100.255
        network 192.168.100.0
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off
 
# The DMZ Vlan 110
auto vmbr0.110
iface vmbr0.110 inet static
	address 192.168.110.1
	netmask 255.255.255.0
	broadcast 192.168.110.255
	vlan_raw_device vmbr0

Cet exemple est fait avec une interface bridgée car j'ai du KVM qui tourne dessus, mais rien ne vous oblige à ce qu'elle le soit.

Ensuite, lorsque vous créez votre VE, vous n'avez rien de plus à faire lors de la création de votre interface réseau pour votre VE. Lancez ensuite la création de votre VE et n'oubliez pas d'installer le package "vlan" pour pouvoir créer un accès vlan au sein même de votre VE. Voici encore une fois de quoi vous donner une idée de la conf réseau du VE :

Configuration File /etc/vz/conf/VEID.conf
...
CONFIG_CUSTOMIZED="yes"
VZHOSTBR="vmbr0"
IP_ADDRESS=""
NETIF="ifname=eth0,mac=00:18:50:FE:EF:0B,host_ifname=veth101.0,host_mac=00:18:50:07:B8:F4"

Pour la conf du VE, c'est preque identique que pour la machine host, il va falloir créer une interface vlan sur l'interface principale (pas besoin encore une fois d'avoir l'interface principale de configurée, seulement la vlan suffit). Pour les plus perplexes, voici un exemple de configuration dans un VE :

Configuration File /etc/network/interfaces
# This configuration file is auto-generated.
# WARNING: Do not edit this file, your changes will be lost.
# Please create/edit /etc/network/interfaces.head and /etc/network/interfaces.tail instead,
# their contents will be inserted at the beginning and at the end
# of this file, respectively.
#
# NOTE: it is NOT guaranteed that the contents of /etc/network/interfaces.tail
# will be at the very end of this file.
 
# Auto generated lo interface
auto lo
iface lo inet loopback
 
# VE interface
auto eth0
iface eth0 inet manual
 
# VLAN 110 interface
auto eth0.110
iface eth0.110 inet static
	address 192.168.110.2
	netmask 255.255.255.0
	gateway 192.168.110.254
	broadcast 192.168.110.255
	vlan_raw_device eth0

3.2.4 Avec du Bonding

Vous pouvez avoir besoin de créer du bonding bridgé dans vos VE. Pour se faire, sur la machine host, vous devez avoir un bonding de configuré (pour la mise en place, utilisez cette documentation). Pour ceux qui souhaitent quand même un exemple :

Configuration File /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo eth0 eth1
iface lo inet loopback
 
iface eth0 inet manual
iface eth1 inet manual
 
auto bond0
iface bond0 inet manual
    slaves eth0 eth1
    bond_mode active-backup
    bond_miimon 100
    bond_downdelay 200
    bond_updelay 200
 
auto vmbr0
iface vmbr0 inet static
    address 192.168.0.227
    netmask 255.255.255.0
    network 192.168.0.0
    gateway 192.168.0.245
    bridge_ports bond0

3.3 NFS

Je n'aborderais ici que le côté client dans un VE, pas d'un serveur dans un VE.

3.3.1 Serveur

Tout d'abord côté serveur, montez votre serveur NFS en suivant cette documentation.

Puis nous allons installer ceci qui va nous permettre d'utiliser non seulement le protocole v3 d'NFS, mais en plus de pouvoir faire abstraction de la couche kernel (pratique en cas de crash) :

Command aptitude
aptitude install nfs-user-server

3.3.2 Client

  • Sur la machine hôte (HN), ajoutez ces lignes dans sysctl.conf :
Configuration File /etc/sysctl.conf
...
# OpenVZ NFS Client
sunrpc.ve_allow_rpc = 1
fs.nfs.ve_allow_nfs = 1
kernel.ve_allow_kthreads = 1

Puis on applique tout ça à chaud :

Command sysctl
sysctl -p

Activons maintenant le NFS sur les VE qui nous intéressent :

Command vzctl
vzctl set $my_veid --features "nfs:on" --save

Je ne sais pas si cette étape est indispensable, mais dans le doute, je l'ajoute quand même :

Command aptitude
aptitude install nfs-user-server

Ensuite, vous pouvez monter normalement vos points de montage NFS. Il est cependant possible que vous rencontriez quelques soucis. C'est pour quoi sur le serveur, je vous conseil de rajouter l'option 'no_root_squash' dans le fichier export :

Configuration File /etc/export
/mnt/backups/backups 192.168.0.127(rw,no_root_squash)

Et sur le client, ajoutez l'option nolock pour monter le NFS :

Command mount
mount -t nfs -o nolock @IP:/mon/partage mon_point_de_montage

3.4 Mount Bind

Les mount bind peuvent être parfois très pratiques. Voilà comment faire :

3.4.1 Mount script

Créez un script dans /etc/vz/conf/vps.mount pour tous les VE ou /etc/vz/conf/CTID.mount pour un VE en particulier (remplacer CITD par le numéro du VE) :

Configuration File /etc/vz/conf/101.mount
#!/bin/bash
source /etc/vz/vz.conf
source ${VE_CONFFILE}
mount --bind /mnt/disk ${VE_ROOT}/mnt/disk

Et adaptez la dernière ligne avec vos besoins.

3.4.2 Unmount script

Et enfin la même chose pour le script du démontage, donc /etc/vz/conf/vps.umount ou /etc/vz/conf/CTID.umount :

Configuration File /etc/vz/conf/101.umount
#!/bin/bash
source /etc/vz/vz.conf
source ${VE_CONFFILE}
umount ${VE_ROOT}/mnt/disk
exit 0

Et enfin on applique les droits qu'il faut pour que ce soit exécutable :

Command chmod
chmod u+x /etc/vz/conf/CTID.mount /etc/vz/conf/CTID.umount

4 Management

4.1 Créer un VE

Choisissez la méthode voulu en fonction de la méthode de création de la VM que vous souhaitez (template ou debootstrap).

4.1.1 Template

Pour créer un container, utilisez cette commande :

Command vzctl
my_veid=101
vzctl create $my_veid --ostemplate debian-5.0-amd64-minimal --config vps.basic
vzctl set $my_veid --onboot yes --save
vzctl set $my_veid --hostname nagios.mycompany.com --save
vzctl set $my_veid --ipadd 192.168.0.130 --save
vzctl set $my_veid --nameserver 192.168.0.27 --save

Si vous voulez configurer vos interfaces en mode bridgé, n'oubliez pas cette partie.

4.1.2 Debootstrap

A l'époque ou j'écris ces lignes, Squeeze n'est pas encore la version stable, mais vient (aujourd'hui même de freezer pour être stable). Il y a donc quelques petits trucs qui peuvent varier comme ceci qu'il va falloir créer :

Command cp
cp /etc/vz/conf/ve-basic.conf-sample /etc/vz/conf/ve-vps.basic.conf-sample

Nous copions donc ici les paramètres par défaut d'un VE vers un nouveau nom qu'il sera capable de prendre par défaut. Lançons donc sa configuration :

Command vzctl
> my_veid=101
> vzctl set $my_veid --applyconfig vps.basic --save
WARNING: /etc/vz/conf/101.conf not found: No such file or directory
Saved parameters for CT 101

Ensuite nous rajoutons quelques lignes supplémentaires nécessaire dans notre fichier de configuration :

Command
 echo "OSTEMPLATE=debian" >> /etc/vz/conf/$my_veid.conf

Puis on configure les paramètres réseaux :

Command vzctl
vzctl set $my_veid --ipadd 192.168.0.130 --save
vzctl set $my_veid --nameserver 192.168.0.27 --save

Ensuite nous allons supprimer udev qui peut empêcher la VM de booter :

Command rm
rm /mnt/containers/private/101/etc/rcS.d/S02udev

Puis nous allons démarrer le VE et entrer dedans :

Command vzctl
vzctl start $my_veid
vzctl enter $my_veid

Renseignez votre fichier source.list :

Configuration File /etc/apt/source.list
deb http://ftp.fr.debian.org/debian/ squeeze main non-free contrib
deb-src http://ftp.fr.debian.org/debian/ squeeze main non-free contrib
 
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

Puis, lancez ces commandes pour supprimer le superflu et supprimer les gettys (les VEs n'en n'utilisent pas) :

Command
sed -i -e '/getty/d' /etc/inittab
rm -Rf /lib/udev/

Nous résolvons le problème de mtab :

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

4.2 Démarrer un VE

Maintenant vous pouvez démarrer votre VE :

Command vzctl
vzctl start 101

4.3 Changer le mot de passe root d'un VE

Si vous souhaitez changer le mot de passe root :

Command vzctl
vzctl exec 101 passwd

4.4 Lister les VE

Pour lister vos VE, utilisez la commande vzlist :

Command vzlist
$ vzlist 
     VEID      NPROC STATUS  IP_ADDR         HOSTNAME                        
      101          8 running 192.168.0.130   nagios.mycompany.com

4.5 Stopper un VE

Pour arrêter noter VE :

Command vzctl
vzctl stop 101
Stopping container ...
Container was stopped
Container is unmounted

4.6 Redémarrer un VE

Pour redémarrer un VE :

Command vzctl
$ vzctl restart 101
Restarting VE
Stopping VE ...
VE was stopped
VE is unmounted
Starting VE ...
VE is mounted
Adding IP address(es): 192.168.0.130
Setting CPU units: 1000
Configure meminfo: 500000
Set hostname: nagios.mycompany.com
File resolv.conf was modified
VE start in progress...

4.7 Détruire un VE

Pour supprimer définitivement un VE :

Command vzctl
$ vzctl destroy 101
Destroying container private area: /vz/private/101
Container private area was destroyed

4.8 Entrer dans un VE

Command vzctl
$ vzctl enter 101
entered into VE 101

4.9 Limites de VE

Par défaut il y a des limites que les VE ne peuvent passer. Nous allons voir comment les gérer ici. Si vous souhaitez tout de même aller encore plus loin, sachez qu'il y a tout d'expliquer sur le site officiel http://wiki.openvz.org/User_beancounters.

4.9.1 Lister les limites

Pour lister les limites, nous allons exécuter cette commande :

Command vctl
$ vzctl exec 101 cat /proc/user_beancounters
Version: 2.5
      uid  resource                     held              maxheld              barrier                limit              failcnt
     101:  kmemsize                  1301153              3963508             14372700             14790164                    0
           lockedpages                     0                    8                  256                  256                    0
           privvmpages                  8987                49706                65536                69632                    0
           shmpages                      640                  656                21504                21504                    0
           dummy                           0                    0                    0                    0                    0
           numproc                         9                   21                  240                  240                    0
           physpages                    1786                27164                    0  9223372036854775807                    0
           vmguarpages                     0                    0                33792  9223372036854775807                    0
           oomguarpages                 1786                27164                26112  9223372036854775807                    0
           numtcpsock                      3                    6                  360                  360                    0
           numflock                        1                    7                  188                  206                    0
           numpty                          1                    2                   16                   16                    0
           numsiginfo                      0                    2                  256                  256                    0
           tcpsndbuf                  106952               106952              1720320              2703360                    0
           tcprcvbuf                   49152              1512000              1720320              2703360                    0
           othersockbuf                    0                21008              1126080              2097152                    0
           dgramrcvbuf                     0                 5648               262144               262144                    0
           numothersock                   25                   29                  360                  360                    0
           dcachesize                 115497               191165              3409920              3624960                    0
           numfile                       234                  500                 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

Il faut que la dernière ligne soit toujours à 0, sinon c'est que clairement vous avez atteint les limites.

Voici quelques informations importantes :

  • held : Actuellement la valeur de la ressource
  • maxheld : la valeur maximum que la ressource a atteind
  • barrier : la limite soft (avertissement). Ca signifie que la valeur held a déjà été jusqu'à cette valeur
  • limit : la milite hard. La valeur held ne pourra jamais dépasser cette valeur.

Pour les augmenter, limites vous avez 2 solutions :

  • Vous pouvez le faire à la volée.
  • Allez dans /etc/vz/conf/101.conf et augmentez les valeurs qui posent problème. Malheureusement, cela nécessite un redémarrage du VE pour que ces paramètres soient prit en compte.

Il est possible que le failcnt ne soit pas réinitialiser à 0...pas d'inquiétude, il se fera plus tard.

4.9.2 Maximiser les limites

Si vous avez trop de restrictions par rapport à vos besoins ou que vous sentez que le VE que vous allez créer va être lourde, maximisez dès le départ ceci :

Command vzsplit
vzsplit -n 2 -f max-limits

  • 2 : changez ce numéro par le nombre de VM que vous voulez faire tourner sur votre machine et il se chargera de calculer au mieux les limites pour votre VE

Un fichier /etc/vz/conf/ve-max-limits.conf-sample. Vous pouvez l'éditer à tout moment et faire les modifications que vous souhaitez. Si vous voulez l'appliquer à un VE :

Command vzctl
vzctl set 101 --applyconfig max-limits --save

Le VE 101 a maintenant une nouvelle configuration via la config 'max-limits'.

4.9.3 Appliquer des limites à la volée

Par exemple, vous souhaitez changer la taille de la RAM à la volée :

Command vzctl
vzctl set 101 --privvmpages 786432:1048576 --save --setmod restart

  • 786432 : correspondant à la limite soft (barrier)
  • 1048576 : correspondant à la limite hard (limit)

Grâce au 'setmod restart', je peux maintenant appliquer des limites à la volée.

4.9.4 Quotas disques

Vous avez peut être mis des quotas disque et vous arrivez à 100% de votre disque VE. Pas de soucis, on augmente le quota à chaud :

Command vzctl
vzctl set 101 --diskspace 14G:15G --save

Si vous ne voulez pas de quota, ajoutez cette ligne dans la configuration du VE :

Configuration File /etc/vz/conf/VEID.conf
DISK_QUOTA=no

4.9.5 Limiter le CPU

Si vous souhaitez limiter le CPU, il y a plusieurs façons d'y arriver. Soit vous jouez avec le scheduler, sois vous appliquez un pourcentage. Pour des usages basique la deuxième solution vous conviendra :

Command vzctl
> vzctl set $my_veid --cpulimit 80 --save --setmod restart
Setting CPU limit: 80
Saved parameters for CT 102

Par exemple ici j'ai limiter mon VE 102 à 80% de CPU. Pour plus d'infos : http://wiki.openvz.org/Resource_shortage

4.9.6 Désactiver les limites les plus contraignantes

Si vous avez beaucoup de charge sur un VE, vous allez régulièrement devoir augmenter certains paramètres assez régulièrement, ce qui peut vite devenir fatiguant. Pour être tranquile avec certains d'entre eux, on peut tout simplement désactiver les limites en entrant la valeur maximale :

Command vzctl
vzctl set $my_veid --kmemsize unlimited --save --setmod restart
vzctl set $my_veid --lockedpages unlimited --save --setmod restart
vzctl set $my_veid --privvmpages unlimited --save --setmod restart
vzctl set $my_veid --shmpages unlimited --save --setmod restart
vzctl set $my_veid --numproc unlimited --save --setmod restart
vzctl set $my_veid --numtcpsock unlimited --save --setmod restart
vzctl set $my_veid --numflock unlimited --save --setmod restart
vzctl set $my_veid --numpty unlimited --save --setmod restart
vzctl set $my_veid --numsiginfo unlimited --save --setmod restart
vzctl set $my_veid --tcpsndbuf unlimited --save --setmod restart
vzctl set $my_veid --tcprcvbuf unlimited --save --setmod restart
vzctl set $my_veid --othersockbuf unlimited --save --setmod restart
vzctl set $my_veid --dgramrcvbuf unlimited --save --setmod restart
vzctl set $my_veid --numothersock unlimited --save --setmod restart
vzctl set $my_veid --dcachesize unlimited --save --setmod restart
vzctl set $my_veid --numfile unlimited --save --setmod restart
vzctl set $my_veid --numiptent unlimited --save --setmod restart

4.9.7 Validation des limites

Si vous souhaitez faire valider vos limites pour être sur que tout est ok :

Command vzcfgvalidate
> vzcfgvalidate /etc/vz/conf/101.conf 
Validation completed: success

4.9.8 Validation automatique des limites

Si par exemple, vous voulez valider au mieux l'utilisation des ressources de votre machine et également suivre les best practices d'OpenVZ, vous pouvez utiliser l'outil vzcfgvalidate :

Command vzcfgvalidate
vzcfgvalidate -i /etc/vz/conf/101.conf

Ceci va lancer un mode interactif en informant de ce qui ne va pas. A vous de valider si oui ou non vous souhaitez faire les modifications. Si vous n'avez pas les capacité d'analyze nécessaire aux problèmes ou tout simplement que vous n'avez pas envie de vous prendre la tête avec ceci, remplacez l'option '-i' par '-r' qui ajustera automatiquement aux bonne valeurs.

Pour ceux qui ne veulent pas se prendre du tout la tête avec les limites, voici un petit script qui ajustera toutes les limites de tous vos VE automatiquement. Il ne reste plus qu'a le coller en crontab :

Configuration File auto_ajust_ve.sh
#!/bin/sh
# Auto Ajust VE
# Made by Pierre Mavro / Deimos
# Contact : deimos at deimos dot fr
 
# Configure VE directory config path
VE_CONF="/etc/vz/conf"
 
echo "Auto ajustment start :"
for i in `ls $VE_CONF/*.conf` ; do
	if [ $i != "$VE_CONF/0.conf" ] ; then
                echo "Ajusting $i..."
		vzcfgvalidate -r $i
	fi
done
echo "Auto ajustment done"

4.9.9 Ajustement automatique des limites

Que ce soit pour mon travail ou pour chez moi, la modification en permanence des valeurs des ressources me prends un peu la tête. J'ai donc créer un outil permettant de gérer tout celà tout seul appelé vzautobean (OpenVZ Auto Management User Beancounters).

Pour l'installer c'est très simple, nous allons le récupérer et le placer dans le dossier avec les autres binaires d'OpenVZ :

Command
git clone git://git.deimos.fr/git/vzautobean.git
sudo mv vzautobean/vzautobean /usr/sbin/

Ensuite soit vous le lancez et il s'exécutera sur tous vos VE en cours d'utilisation, soit vous pouvez lui spécifier un ou plusieurs VE en particulier :

Command vzautobean
vzautobean -e 102 -e 103

Là il fera le VE 102 et 103. Par défaut il augmente toutes les barrier de 10% et les limites de 20% par rapport au maxheld.

Vous pouvez si vous le souhaitez changer ces valeurs en y ajouter 2 arguments :

Command vzautobean
vzautobean -b 30 -l 50

Ici la barrier devra être mise à 30% au dessus du maxheld et la limite à 50% au dessus. Et cela pour tous les VE en lancés !

Il ne vous reste plus qu'à mettre ça en cron si vous souhaitez que ce programme tourne régulièrement.

4.10 Backup et restore

4.10.1 Installation

Vous pouvez avoir besoin de backuper un environnement entier et pour celà, il y a la commande vzdump :

Command aptitude
aptitude install vzdump

Si vous êtes sur une Debian inférieure à la 6, vous pouvez trouver la commande ici :

Command
wget http://download.proxmox.com/debian/dists/lenny/pve/binary-amd64/vzdump_1.2-11_all.deb
dpkg -i vzdump_1.2-11_all.deb

4.10.2 Backup

Pour backuper, c'est très simple :

Command vzdump
vzdump $my_veid

4.10.3 Restaurer

Si l'on souhaite restaurer :

Command vzrestore
vzrestore backup_101.tar $my_veid

La machine sera restaurée sur le VE correspondant à $my_veid.

5 Services

Il peut arriver que certains services aient quelques problèmes à fonctionner correctement (toujours les mêmes). C'est pourquoi je vais donner les solutions de ceux que j'ai pu rencontrer.

5.1 NTP

Pour le service ntp, il suffit donc de configurer le VE comme ceci :

Command vzctl
vzctl set 101 --capability sys_time:on --save

5.2 GlusterFS

Si vous souhaitez faire du glusterfs dans un VE, vous risquez de vous heurter à des problèmes de droit:

fuse: failed to open /dev/fuse: Permission denied

Pour les contourner on va donc créer le device fuse depuis l'host sur le VE en question et lui rajouter les droits d'admin (un peu moyen en terme de sécu, mais pas le choix) :

Command
vzctl set $my_veid --devices c:10:229:rw --save
vzctl exec $my_veid mknod /dev/fuse c 10 229
vzctl set $my_veid --capability sys_admin:on --save

5.3 Encfs

Si vous souhaitez faire de l'encfs dans un VE, vous risquez de vous heurter à des problèmes de droit:

 EncFS Password: 
fuse: device not found, try 'modprobe fuse' first
fuse failed.  Common problems:
 - fuse kernel module not installed (modprobe fuse)
 - invalid options -- see usage message

Sachez donc qu'il faut déjà au niveau du VZ charger le module fuse pour que les VE en héritent. Ajoutez ceci sur votre VZ pour ne pas avoir à charger le module à chaque boot :

Configuration File /etc/modules
...
# Load Fuse
fuse
...

Puis chargez le dynamiquement pour y avoir accès ensuite :

Command modprobe
modprobe fuse

Pour les contourner on va donc créer le device fuse depuis l'host sur le VE en question et lui rajouter les droits d'admin (un peu moyen en terme de sécu, mais pas le choix) :

Command
vzctl set $my_veid --devices c:10:229:rw --save
vzctl exec $my_veid mknod /dev/fuse c 10 229
vzctl set $my_veid --capability sys_admin:on --save

Il est possible que la deuxième ligne ne fonctionne pas quand le VE est éteint. Lancez là alors une fois allumée puis montez votre partition encfs.

5.4 OpenVPN

Si vous souhaitez faire fonctionner un serveur OpenVPN dans un VE, ajoutez ce type de droits et créez les devices nécessaires :

Command
vzctl set $my_veid --devices c:10:200:rw --save
vzctl set $my_veid --capability net_admin:on --save
vzctl exec $my_veid mkdir -p /dev/net
vzctl exec $my_veid mknod /dev/net/tun c 10 200
vzctl exec $my_veid chmod 600 /dev/net/tun
vzctl set $my_veid --devnodes net/tun:rw --save

6 FAQ

6.1 bridge vmbr0 does not exist!

Putain !!! Ah j'en ai chier sur ce truc de merde ! En effet par défaut Debian attribue à vmbr0 le nom de l'interface pour faire du bridge (certainement une nouvelle nomenclature pour Debian 6). J'avais trouvé ce problème à l'installation de mon serveur et puis comme un con j'avais pas noté ! Lorsque vous faites une mise à jour, celà peut ne plus fonctionner (le bridge de vos VMs) car le fichier /usr/sbin/vznetaddbr peut être remplacé. Ce qui lors du lancement d'un ve vous donne quelque chose comme :

Adding interface veth101.0 to bridge vmbr0 on CT0 for CT101
bridge vmbr0 does not exist!

Pour corriger le problème rapidement modifiez ce fichier et remplacer le nom de cette interface par la bonne (ici br0). Pour ma part, j'ai changé le nom de l'interface pour ne plus être ennuyé à l'avenir.

6.2 J'ai des freeze au boot/arrêt de mes VZ

Si vous avez des freeze au boot ou au stop des VZ et que vous êtes en mode bridge, il faut changer les adresses MAC comme ceci:

Command sed
sed -i -e "s/00:18/FE:FF/g" /etc/vz/conf/*.conf
sed -i -e "s/00:AB:BA/FE:FF:BA/g" /etc/vz/conf/*.conf

7 Ressources

Installing And Using OpenVZ
Some Tips On OpenVZ Deployment
Splitting Resources Evenly Between OpenVZ VMs With vzsplit
Installing And Using OpenVZ On Debian
http://www.libresys.fr/2008/10/14/les-differentes-formes-de-configuration-du-reseau-avec-openvz/
http://www.famille-fontes.net/comments.php?y=10&m=02&entry=entry100208-094400
http://wiki.openvz.org/Backup_of_a_running_container_with_vzdump
http://www.kafe-in.net/Blog/OpenVZ-Les-ressources-syst-me-dans-un-VE