OpenVz et Debian

http://www.deimos.fr/blocnotesinfo/index.php?title=OpenVZ_:_Mise_en_place_d%27OpenVZ

OpenVZ : Mise en place d’OpenVZ

De Bloc Notes Informatique.

Sommaire

[masquer]

 

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 :

Config 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 <a rel="nofollow" href="http://download.openvz.org/template/precreated/contrib/debian-5.0-amd64-minimal.tar.gz">http://download.openvz.org/template/precreated/contrib/debian-5.0-amd64-minimal.tar.gz</a>

 

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 :

Config 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 :

Config File : /etc/init.d/iptables
  1. #!/bin/bash
  2. #-------------------------------------------------------------------------
  3. # Essentials
  4. #-------------------------------------------------------------------------
  5. IPTABLES='/sbin/iptables';
  6. modprobe nf_conntrack_ftp
  7. #-------------------------------------------------------------------------
  8. # Physical and virtual interfaces definitions
  9. #-------------------------------------------------------------------------
  10. # Interfaces
  11. wan_if="eth0";
  12. vpn_if="tap0";
  13. #-------------------------------------------------------------------------
  14. # Networks definitions
  15. #-------------------------------------------------------------------------
  16. # Networks
  17. wan_ip="x.x.x.x";
  18. lan_net="192.168.90.0/24";
  19. vpn_net="192.168.20.0/24";
  20. # IPs
  21. ed_ip="192.168.90.1";
  22. banzai_ip="192.168.90.2";
  23. #-------------------------------------------------------------------------
  24. # Global Rules input / output / forward
  25. #-------------------------------------------------------------------------
  26. # Flushing tables
  27. $IPTABLES -F
  28. $IPTABLES -X
  29. $IPTABLES -t nat -F
  30. # Define default policy
  31. $IPTABLES -P INPUT DROP
  32. $IPTABLES -P OUTPUT ACCEPT
  33. $IPTABLES -P FORWARD ACCEPT
  34. $IPTABLES -A INPUT -j ACCEPT -d $lan_net;
  35. $IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
  36. #-------------------------------------------------------------------------
  37. # Allow masquerading for VE
  38. #-------------------------------------------------------------------------
  39. # Activating masquerade to get Internet from VE
  40. $IPTABLES -t nat -A POSTROUTING -o $wan_if -s $lan_net -j MASQUERADE
  41. # Activating masquerade to get VPN access from VE
  42. $IPTABLES -t nat -A POSTROUTING -o tap0 -j MASQUERADE
  43. #-------------------------------------------------------------------------
  44. # Allow ports on CT
  45. #-------------------------------------------------------------------------
  46. # Allow ICMP
  47. $IPTABLES -A INPUT -j ACCEPT -p icmp
  48. # SSH access
  49. $IPTABLES -A INPUT -j ACCEPT -p tcp --dport 22
  50. #-------------------------------------------------------------------------
  51. # Redirections for incoming connections (wan)
  52. #-------------------------------------------------------------------------
  53. # HTTP access
  54. $IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -d $wan_ip -j DNAT --to-destination $ed_ip:80
  55. # HTTPS access
  56. $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 :

Config 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 :

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

 

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

Config 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 &gt;&amp;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 &gt;"/proc/sys/net/ipv4/conf/$host_ifname/proxy_arp"
    echo 1 &gt;"/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 :

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

 

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

Config 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 :

Config 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 :

Config 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 :

Config 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 :

Config 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 :
Config 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 :

Config 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) :

Config 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 :

Config 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
&gt; my_veid=101
&gt; 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" &gt;&gt; /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 :

Config 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 <strong>2</strong> -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 <strong>101</strong> --applyconfig <strong>max-limits</strong> --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 <strong>786432:1048576</strong> --save <strong>--setmod restart</strong>

 

  • 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 :

Config 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
&gt; vzctl set 102 --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

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 :

Config 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.