VServer : Mise en place de VServer

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Linux-VServer est un isolateur des contextes de sécurité combiné à du routage segmenté, chroot, quotas étendus et autres outils standards.

Projet lancé à l'origine par Jacques Gélinas à l'origine du patch CTX, Linux-VServer consiste en un patch pour le noyau Linux qui permet de faire tourner plusieurs applications dans différents contextes de sécurité sur une même machine hôte. Linux-VServer est également muni d'un ensemble d'outils pour installer/gérer ces contextes.

Ce projet permet de faire tourner un ou plusieurs environnements d'exploitation (systèmes d'exploitation sans le noyau) autrement dit il permet de faire tourner une ou plusieurs distributions sur une distribution.

Linux-VServer est une solution de virtualisation beaucoup plus poussée que le simple chroot.

À ne pas confondre avec le Linux Virtual Server Project.

2 Retour d'expérience

Vserver est un excellent produit pour les applications ne nécessitant pas beaucoup de connexions réseaux simultanées. Niveau processeur / ram, je n'ai jamais rencontré de soucis particulié. C'est vraiment côté réseaux qu'il y a quelques bizarreries. Par exemple un Nagios va avoir du mal avec + de 800 checks, ou bien une réplication MySQL ne va pas forcément correctement fonctionner etc...

Vserver reste cependant un atout majeur, mais doit être utilisé selon des besoins spécifiques sans grosse charge réseaux.

3 Installation

Installez le minimum requis :

apt-get install linux-image-vserver-686 util-vserver vserver-debiantools ssh

Maintenant rebooter sur le nouveau kernel.

4 Création d'un VServer

Créer le dossier où sera installer votre VServer puis entrez dedans :

mkdir -p /home/deimos/vserver/vservertest && cd /home/deimos/vserver/

Créer un VServer comme ceci :

newvserver --vsroot $(pwd) --hostname vservertest --domain mydomain.local --ip 192.168.0.70/24 --dist etch --mirror http://ftp.fr.debian.org/debian --interface eth0

Note : mettez dummy0 si vous avez mis une interface dummy !

  • vsroot - par défaut dans /var/lib/vservers, c'est là ou sera installé le vserver
  • Hostname - le nom du vserver
  • Domain - le domaine du vserver (comme celui de la machine)
  • IP Address- l'adresse IP du vserver
  • CIDR Range - le CIDR (masque sous réseau)
  • Dist - la distribution à utiliser
  • Debian Mirror - le mirroir Debian
  • Interface - l'interface réseau à utiliser (eth0 par défaut sur la plupart des systèmes)

5 Management des VServer

Pour démarrer un VServer et se connecter dessus :

vserver vservertest start; vserver vservertest enter

Voici les options de base :

  • Démarrer un vserver : vserver nom_du_vserver start
  • Arrêter un vserver : vserver nom_du_vserver stop
  • Redémarrer un vserver : vserver nom_du_vserver restart
  • Entrer dans un shell d'un vserver : vserver nom_du_vserver enter

5.1 Memory Limits

A vserver kernel keeps track many resources used by each guest (context). Some of these relate to memory usage by the guest. You can place limits on these resources to prevent guests from using all the host memory and making the host unusable.

Two resources are particularly important in this regard:

  • The Resident Set Size (rss) is the amount of pages currently present in RAM.
  • The Address Space (as) is the total amount of memory (pages) mapped in each process in the context.

Both are measured in pages, which are 4 kB each on Intel machines (i386). So a value of 200000 means a limit of 800,000 kB, a little less than 800 MB.

Each resource has a soft and a hard limit.

  • If a guest exceeds the rss hard limit, the kernel will invoke the Out-of-Memory (OOM) killer to kill some process in the guest.
  • The rss soft limit is shown inside the guest as the maximum available memory. If a guest exceeds the rss soft limit, it will get an extra "bonus" for the OOM killer (proportional to the oversize).
  • If a guest exceeds the as hard limit, memory allocation attempts will return an error, but no process is killed.
  • The as soft limit is not in utilized until now. In the future it may be used to penalizing guests over that limit or it could be used to force swapping on them and such ...

Bertl explained the difference between rss and as with the following example. If two processes share 100 MB of memory, then only 100 MB worth of virtual memory pages can be used at most, so the RSS use of the guest increases by 100 MB. However, two processes are using it, so the AS use increases by 200 MB.

This makes me think that limiting AS is less useful than limiting RSS, since it doesn't directly reflect real, limited resources (RAM and swap) on the host, that deprive other virtual machines of those resources. Bertl says that AS limits can be used to give guests a "gentle" warning that they are running out of memory, but I don't know how much more gentle it is, or how to set it accurately.

For example, 100 processes each mapping a 100 MB file would consume a total of 10 GB of address space (AS), but no more than 100 MB of resources on the host. But if you set the AS limit to 10 GB, then it will not stop one process from allocating 4 GB of RAM, which could kill the host or result in that process being killed by the OOM killer.

You can set the hard limit on a particular context, effective immediately, with this command:

/usr/sbin/vlimit -c <xid> --<resource> <value>

<xid> is the context ID of the guest, which you can determine with the /usr/sbin/vserver-stat command.

For example, if you want to change the rss hard limit for the vserver with <xid> 49000, and limit it to 10,000 pages (40 MB), you could use this command:

/usr/sbin/vlimit -c 49000 --rss 10000

You can change the soft limit instead by adding the -S parameter.

Changes made with the vlimit command are effective only until the vserver is stopped. To make permanent changes, write the value to this file:

/etc/vservers/<name>/rlimits/<resource>.hard

To set a soft limit, use the same file name without the .hard extension. The rlimits directory is not created by default, so you may need to create it yourself.

Changes to these files take effect only when the vserver is started. To make immediate and permanent changes to a running vserver, you need to run vlimit and update the rlimits file.

The safest setting, to prevent any guest from interfering with any other, is to set the total of all RSS hard limits (across all running guests) to be less than the total virtual memory (RAM and swap) on the host. It should be sufficiently less to leave room for processes running on the host, and some disk cache, perhaps 100 MB.

However, this is very conservative, since it assumes the worst case where all guests are using the maximum amount of memory at one time. In practice, you can usually get away with contended resources, i.e. allowing guests to use more than this value.

5.2 Réseau

Pour configurer les vservers pour qu'ils aient une adresse IP bien distincte, il faut modifier le fichier /etc/network/interfaces de l'hôte principale :

# The loopback network interface
auto lo bond0 dummy0
iface lo inet loopback

# Bonding interface
iface bond0 inet static
        address 192.168.0.98
        netmask 255.255.255.0
        gateway 192.168.0.248
        network 192.168.0.0
        up ifenslave bond0 eth0 eth1
        down ifenslave -d bond0 eth0 eth1

# Vserver interface
iface dummy0 inet static
        address 192.168.0.10
        netmask 255.255.255.0

Ensuite redémarrez le réseau :

/etc/init.d/network restart

Maintenant créez un vserver et entrez comme interface dummy0 :

newvserver --vsroot $(pwd) --hostname hostname --domain mydomain.local --ip 192.168.0.12/24 --dist lenny --mirror http://ftp.fr.debian.org/debian --interface dummy0

Puis ajoutez un fichier name comportant le dernier numéro de l'IP que vous avez attribuez à :

echo 12 > /etc/vservers/hostname/interfaces/0/name

Démarrez votre vserver et si vous faites un ifconfig, vous devriez avoir quelquechose ressemblant à ceci :

dummy0    Lien encap:Ethernet  HWaddr 22:22:xx:xx:CF:xx  
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:0 (0.0 b)  TX bytes:210 (210.0 b)
 
dummy0:12 Lien encap:Ethernet  HWaddr 22:22:xx:xx:CF:xx 
          inet adr:192.168.0.12  Bcast:192.168.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1

5.2.1 Binding

Important : Si jamais vous souhaitez installer un soft tournant sur un port déjà en écoute sur un autre vserver, essayer de binder sur l'adresse du serveur correspondant. Ex : avec ssh, éditez le fichier /etc/ssh/sshd_config et rensignez le bind avec l'IP du vserver en cours.

Voici un tableau d'Applications avec fichiers de configuration à modifier pour le Bind :

Application Fichier de conf Ligne
OpenSSH /etc/ssh/sshd_config ListenAddress 192.168.0.12
Postgresql /etc/postgresql/8.1/main/postgresql.conf listen_addresses = '192.168.0.12'
Apache2 /etc/apache2/ports.conf Listen 192.168.0.12:80
Munin /etc/munin/munin-node.conf host 192.168.0.12
Tomcat5.5 /etc/tomcat5.5/server.xml <Server address="192.168.0.12" port="8005" shutdown="SHUTDOWN">
MySQL /etc/mysql/my.cnf bind-address = 192.168.0.12
Postfix /etc/postfix/main.cf inet_interfaces = 192.168.0.12
Lighttpd /etc/lighttpd/lighttpd.conf server.bind = "192.168.0.12"
Nagios NRPE /etc/nagios/nrpe.cfg server_address=192.168.0.12

5.2.2 Montage NFS

Pour des raisons de sécurité, nous ne pouvons pas par défaut monter des partages nfs. Pour outrepasser cette sécu, il suffit de créer un fichier un fichier "bcapabilities" dans la configuration du vserver en question :

echo "CAP_SYS_ADMIN" > /etc/vservers/mon_vserver/bcapabilities

Ensuite derémarrez votre vserver et il vous aurez la possibilité de monter des partages nfs :-)

Vous rencontrerez peut être des problèmes de connection à cause du serveur car vous n'avez pas renseigner la machine principale du Vserver :

mount: block device backuppc:/mnt/backups/disk_array0/intranet is write-protected, mounting read-only
mount: cannot mount block device backuppc:/mnt/backups/disk_array0/intranet read-only

Editez sur le serveur le fichier /etc/export :

/mnt/backups/disk_array0/intranet     IP_du_Serveur_Principale(sync,insecure,rw,no_root_squash)   IP_du_Vserver(sync,insecure,rw,no_root_squash)

5.3 VPS

Voici un espèce de ps mais pour VServer :

# vps -ef
root    8102     0 MAIN       8100  0 12:40 pts/1    00:00:00 -bash
root    8210 49159 ns0        5542  0 12:49 ?        00:00:00 sshd: root@pts/2 
root    8212 49159 ns0        8210  0 12:49 pts/2    00:00:00 -bash
root    8271     1 ALL_PROC   8102  0 12:57 pts/1    00:00:00 vps -ef
root    8272     1 ALL_PROC   8271  0 12:57 pts/1    00:00:00 ps -ef

5.4 Démarrage automatique d'un Vserver au boot de la machine

Pour démarrer automatiquement un vserver au boot de la machine, il suffit de créer un fichier mark sur la machine souhaité et lui insérer default :

echo "default" > /etc/vservers/mon_vserver/apps/init/mark

Ici le vserver appellé "mon_vserver" démarrera automatiquement au boot de la machine.

5.5 Monter un dossier à plusieurs endroits en même temps

Modifiez le fichier "/etc/vservers/mon_serveur/fstab". Voici un exemple :

/mnt/backups/disk_array0 /mnt/backups/disk_array0 none acl,bind 0 0

5.6 Changer la taille du TMP

Modifier le fichier "/etc/vservers/mon_serveur/fstab", par defaut le /tmp est a 16Mo, il suffit de modifier le paramettre Size et redémarrer le Vserver ensuite :

none    /tmp            tmpfs   size=2g,mode=1777       0 0

6 Informations sur les vms en cours

Pour obtenir des informations, il faut faire une commande pour prendre le numéro d'une vm qui nous intéresse :

# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
0       71   1.1G 101.1M   2h33m03   7m39s14   4d01h03 root server
49159    2  14.8M   1.4M   0m00s00   0m00s00  29m09s20 deb-vserv1
49163    2  14.8M   1.4M   0m00s00   0m00s00   0m00s69 deb-vserv2

Le numéro de la colonne CTX correspond au numéro d'une VM.

6.1 RAM

Ici si nous prennons par exemple la 49159, nous pouvons connaitre la ram actuelle :

# cat /proc/virtual/49159/limit
PROC:            2               4              -1           0
VM:           3808           11410          100000           0
VML:             0               0              -1           0
RSS:           282            1163              -1           0
ANON:           81              81              -1           0
FILES:          37              37              -1           0
OFD:            22              22              -1           0
LOCKS:           1               1              -1           0
SOCK:            1               1              -1           0
MSGQ:            0               0              -1           0
SHM:             0               0              -1           0

Ici, nous avons donc 3808ko d'utilisé, 11410ko est le maximum de mémoire qui a déjà été utilisé, et la limite est fixée à 100000ko.

6.2 Load Average

Pour le load average, c'est pas mal aussi puisque on peut contrôler d'autres choses. Toujours sur la 49159 :

cat cvirt
BiasUptime:     347673.95
SysName:        Linux
NodeName:       deb-vserv1
Release:        2.6.18-4-xen-vserver-amd64
Version:        #1 SMP Wed Apr 18 20:24:37 UTC 2007
Machine:        x86_64
DomainName:     (none)
nr_threads:     2
nr_running:     0
nr_unintr:      0
nr_onhold:      0
load_updates:   418
loadavg:        0.00 0.00 0.00
total_forks:    38

Là nous avons pas mal d'infos sur l'OS en plus.

7 FAQ

7.1 Je rencontre divers problèmes réseau

7.1.1 Setting network flags (nflags)

  • Add the flags to a file named nflags:
echo HIDE_NETIF >> nflags
  • The default nflags are:
HIDE_NETIF

7.1.2 Setting network capabilities (ncaps)

  • Add the capabilities to a file named ncapabilities:
echo ^12 >> ncapabilities
  • There are no default ncaps.

7.2 La résolution DNS ne fonctionne pas

Il est possible que vous ayez un serveur Bind de cache sur votre machine hôte qui vous empêche de résoudre via d'autres serveur DNS. Dans ce cas, autorisez simplement le range de vos machines virtuelles à résoudre via ce serveur bind.

8 Ressources

Virtualisation de serveur grace a linux vserver
Documentation on Memory Allocation
Documentation Multi Vservers
Xen et vserver : monitoring des VM sur une page PHP
Documentation on Setting up a Web Server with Apache, LVS and Heartbeat 2
Capabilities and Flags
Un peu plus loin avec Linux vserver
http://linux-vserver.org/Networking_vserver_guests
http://fr.wikibooks.org/wiki/Linux_VServer