La virtualisation est de plus en plus utilisée et le sera d’autant plus dans les années à venir, et cela pour plusieurs raisons :
- économie de matériels (serveurs physiques), et donc de place : au lieu d’acheter 10 serveurs physiques à héberger, on se retrouve à placer dans la baie (et le coût n’est pas négligeable…) qu’un seul serveur physique avec 10 serveurs virtuels (VMWare, VServer, ...).
- cloisonnement des serveurs : on peut architecturer de façon un peu plus propre et pérenne son parc : serveur par type de services, on pensera par type de services à : PHP (voire n serveurs / versions), Rails, passerelle SMTP, SGBDR, ... chaque serveur est spécialisé. L’administrateur sait alors précisément les versions et les modules qui tournent sur ces serveurs, leurs mises à jour, gestion, et sauvegardes s’en trouve simplifiées.
- accès : ce cloisonnement permet aussi l’accès de la part de tiers qui souhaiteraient avoir toute la main sur leur serveur : imaginons un LAMP sur lequel on donnerait l’accès root à un client, celui-ci ne voit que SON serveur et rien d’autre.
Pour ces raisons, j’ai mis en place des serveurs virtuels sous VServer, peu consommateur en ressources. Chaque serveur utilise le même noyau, et les mêmes ressources que le serveur maître (host), mais on peut limiter pour chaque serveur virtuel (guest) les ressources allouées.
Environnement
Le cas décrit se base sur les spécifications suivantes (host) :
- Debian Etch
- version 2.6.20(.4) du noyau (2.6.20.11 à l’heure où j’écris ce billet)
- patch 2.2.0 de vserver disponible en page d’accueil
root@nestor:~# uname -a
Linux nestor 2.6.20.4-vs2.2.0-vs #1 Thu Apr 12 07:39:33 CEST 2007 i686 GNU/Linux
Nous aurons besoin des utilitaires vserver (vserver, vapt-get, vserver-stat, ...):
$ apt-get install util-vserver
Compilation et installation du noyau patché
Télécharger les sources 2.6.20 (ou pour la dernière version prendre le bz2 qui convient au patch vserver). Télécharger le patch vserver (ou la version appropriée à votre noyau).
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.4.tar.bz2
$ wget http://ftp.linux-vserver.org/pub/kernel/vs2.2/patch-2.6.20.4-vs2.2.0.diff
Mettre les sources dans /usr/src et les patcher :
$ bzip2 -cd linux-2.6.20.4.tar.bz2 | tar xvf -
$ cp patch-2.6.20.11-vs2.2.0.diff linux-2.6.20.4
$ cd linux-2.6.20.4
$ patch -p1 < patch-2.6.20.4-vs2.2.0.diff
On prend une configuration et on l’adapte pour la prise en compte du VServer :
$ cp /boot/config- /usr/src/linux-2.6.20.4/.config
$ make menuconfig
La dernière commande permet de configurer votre noyau selon vos besoins. Il faut au moins activer la configuration VServer. Ma configuration de ce fichier :
#
# Linux VServer
#
# CONFIG_VSERVER_LEGACY is not set
CONFIG_VSERVER_LEGACYNET=y
CONFIG_VSERVER_REMAP_SADDR=y
CONFIG_VSERVER_COWBL=y
# CONFIG_VSERVER_VTIME is not set
CONFIG_VSERVER_PROC_SECURE=y
CONFIG_VSERVER_HARDCPU=y
CONFIG_VSERVER_IDLETIME=y
# CONFIG_VSERVER_IDLELIMIT is not set
# CONFIG_TAGGING_NONE is not set
# CONFIG_TAGGING_UID16 is not set
# CONFIG_TAGGING_GID16 is not set
CONFIG_TAGGING_ID24=y
# CONFIG_TAGGING_INTERN is not set
# CONFIG_TAG_NFSD is not set
# CONFIG_PROPAGATE is not set
CONFIG_VSERVER_PRIVACY=y
CONFIG_VSERVER_CONTEXTS=256
CONFIG_VSERVER_WARN=y
# CONFIG_VSERVER_DEBUG is not set
CONFIG_VSERVER=y
Compiler (méthode Debian) et installer le package :
$ make-kpkg clean
$ fakeroot make-kpkg --append_to_version -vs --initrd --revision=vserver.01 kernel_image modules_image
$ dpkg -i linux-image-2.6.20.4*.deb
puis rebooter…
$ shutdown -r now
Création d’un serveur virtuel (guest)
A ce stade, votre noyau contient le module VServer, nous pouvons dès lors créer notre 1er vserver. Les serveurs seront installés sur /var/lib/vservers. On pourra penser à l’utilisation de LVM pour la création d’une partition logique par vserver. Cela permet de faciliter la maintenance : ajout d’espace disque simplifié, séparation de la partition vserver du host, ...on en parlera lors d’un prochain billet.
Une commande suffit, on peut aussi exclure certains packages à ne pas installer lors de la préparation du gest. Création d’un guest nommé nestor-wiki, avec l’IP 192.168.1.180, le n° du context doit être unique :
$ REMOVE_PACKAGES="sparc-utils,dhcp-client,lilo,makedev,pcmcia-cs,ppp,pppconfig,pppoe,pppoeconf,setserial,\ syslinux,fdutils,libpcap0,iptables,pciutils" $ vserver nestor-wiki build -m debootstrap --context 49800 --hostname nestor-wiki --interface eth0:192.168.1.180/32 --force -- -d etch -- --exclude=$REMOVE_PACKAGES I: Retrieving Release I: Retrieving Packages I: Validating Packages I: Resolving dependencies of required packages... I: Resolving dependencies of base packages... I: Checking component main on http://ftp.debian.org/debian... I: Retrieving adduser I: Validating adduser I: Retrieving apt ... I: Base system installed successfully.
Le système a été installé dans /var/lib/vservers/nestor-wiki.
Exécution et configuration de base
Il reste maintenant à exécuter le vserver, à y installer au moins ssh pour l’accès, ainsi que vos services qui répondent à vos besoins.
$ vserver nestor-wiki start
$ vserver-stat
49800 2 3.8M 1.4M 0m00s00 0m00s00 0m22s11 nestor-wiki
On copie les sources apt-get du host sur le vserver : cp /etc/apt/sources.list /var/lib/vservers/nestor-wiki/etc/apt/ Soit on entre dans le contexte du vserver pour une mise à jour et y installer ssh et sudo, soit on utilise vapt-get (mais à ce stade, on préférera la 1ère méthode) :
- par vserver, on entre sur le guest :
$ vserver nestor-wiki enter
$ apt-get update
$ apt-get upgrade
$ apt-get install ssh
$ apt-get install sudo
$ adduser zorky
$ visudo => ajouter zorky
$ exit
- par vapt-get (à partir du host):
$ vapt-get nestor-wiki -- update
$ vapt-get nestor-wiki -- upgrade
$ vapt-get nestor-wiki -- install ssh
$ vapt-get nestor-wiki -- install sudo
$ vserver nestor-wiki enter
$ adduser zorky
$ visudo => ajouter zorky
ça y est, vous pouvez dès lors utiliser votre client ssh préféré pour vous logguer sur votre nouveau vserver : putty sous windows, ssh sous linux.
On vérifie les IPs utilisées.
root@nestor:~# ip addr 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0f:3d:f8:a7:73 brd ff:ff:ff:ff:ff:ff inet 192.168.1.104/24 brd 192.168.1.255 scope global eth0 inet 192.168.1.170/32 scope global eth0 inet 192.168.1.150/32 scope global eth0 inet 192.168.1.160/32 scope global eth0 inet 192.168.1.140/32 scope global eth0 inet6 fe80::20f:3dff:fef8:a773/64 scope link valid_lft forever preferred_lft forever
Utilitaires
- Connaître le statut des serveurs :
root@nestor:~$ vserver-stat CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME 0 70 300.9M 81M 3h10m56 24m03s81 25d22h25 root server 20 9 161.6M 118.1M 10m21s23 1m28s19 25d18h20 nestor-rails 60 16 206.5M 71.1M 6m22s87 1m10s88 25d18h20 nestor-php 70 12 139.6M 43.9M 1m09s60 0m28s40 25d18h20 nestor-sympa 49700 8 90.5M 38.7M 4m25s27 1m20s93 25d18h20 nestor-mysql
- apt-get sur un ou l’ensemble des serveurs, cela peut s’avérer pratique pour les mises à jour sécurité par exemple :
$ vapt-get --all -- update vapt-get: operating on vserver nestor-mysql Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait.. $ vapt-get --all -- upgrade
- un top global qui permet d’afficher l’ensemble des processus de tous les serveurs (host et guests) :
$ vtop top - 18:47:13 up 25 days, 22:29, 3 users, load average: 1.75, 1.08, 0.46 Tasks: 117 total, 2 running, 115 sleeping, 0 stopped, 0 zombie Cpu(s): 93.3%us, 6.0%sy, 0.0%ni, 0.0%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10954 www-data 15 0 51380 38m 2292 S 0.0 10.2 1:33.04 mongrel_rails 10957 www-data 15 0 50996 38m 2292 S 0.0 10.1 1:12.22 mongrel_rails 10951 www-data 15 0 50944 38m 2280 S 0.0 10.1 1:11.03 mongrel_rails 9516 identd 18 0 78240 34m 5076 S 0.0 9.2 5:29.84 mysqld 31726 sympa 17 0 35736 31m 2680 S 0.0 8.2 0:02.85 wwsympa.fcgi 337 www-data 21 0 18328 6680 4028 S 0.0 1.7 0:41.14 apache2 340 www-data 15 0 18320 6572 3924 S 0.0 1.7 0:27.31 apache2 458 www-data 15 0 18276 6512 3944 S 0.0 1.7 0:28.01 apache2 1209 www-data 15 0 18340 6512 3928 S 0.0 1.7 0:20.88 apache2 336 www-data 18 0 18284 6484 3908 S 0.0 1.7 0:26.89 apache2 4603 www-data 15 0 18336 6456 3796 S 0.0 1.7 0:21.96 apache2 339 www-data 15 0 18276 6404 3832 S 0.0 1.7 0:22.79 apache2 11082 www-data 15 0 18284 6256 3712 S 0.0 1.6 0:02.87 apache2
- vps pour afficher l’ensemble des processus, par serveurs :
$ vps xau
- vkill pour tuer un processus d’un vserver
Contexts
Lors du chargement du vserver, il inscrit dans /var/run/vservers sous forme de fichiers les serveurs qui sont lancés, avec le n° du context sur lequel le vserver est lancé.
$ ls /var/run/vservers
total 16
-rw-r--r-- 1 root root 6 2007-04-12 23:21 nestor-mysql
-rw-r--r-- 1 root root 3 2007-04-12 23:21 nestor-php
-rw-r--r-- 1 root root 3 2007-04-12 23:21 nestor-rails
-rw-r--r-- 1 root root 3 2007-04-12 23:21 nestor-sympa
$ cat /var/run/vservers/nestor-mysql
49700
S’il s’avérait qu’un problème se passe (reboot involontaire du host, ...), il suffit de supprimer un des fichiers pour résoudre le défaut de lancement du vserver si celui-ci ne se lançait pas le cas échéant.