VServer : Mise en place de VServer
Contents
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 therss
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