L'installation a été réalisée sur une vmware x86_64 SMP tournant sur debian lenny et elle présente quelques particularités justifiant ce billet à l'heure où je l'écris.
Il est fort possible que les prochaines versions des outils pour linux-vserver prennent en compte celles-ci.

  1. Environnement
  2. Installation et compilation du noyau
  3. Installation des util-vserver
  4. Creation du premier vserver
  5. Tests
  6. Liens


1) Environnement:

raid:/# uname -a
Linux raid 2.6.28.1-vs2.3.0.36.4 #1 SMP Sun Jan 25 15:25:25 CET 2009 x86_64 GNU/Linux

raid:/# ifconfig | grep 192
          inet adr:192.168.0.16  Bcast:192.168.0.255  Masque:255.255.255.0

raid:/# df -hT
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1     ext3    3,8G  1,6G  2,0G  45% /
tmpfs        tmpfs    124M     0  124M   0% /lib/init/rw
udev         tmpfs     10M   80K   10M   1% /dev
tmpfs        tmpfs    124M     0  124M   0% /dev/shm
/dev/sdb1     ext3    2,0G  252M  1,7G  14% /opt/vservers

raid:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l


Un dns local sur une autre machine gère le domaine net.caen et le serveur virtuel que je vais créer s'appellera raidvs1.net.caen ayant pour adresse ip 192.168.0.17.



2) Installation et compilation du noyau:


Je downloade les sources du dernier kernel puisque comme on va le voir, linux-vserver fournit un patch pour celui-ci:

raid:/# cd /usr/src

raid:/usr/src# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.1.tar.gz

Les patchs sont disponibles à cette adresse:

http://vserver.13thfloor.at/Experimental/


Le mot Experimental dans l'URL ne doit pas être pris au pied de la lettre. J'utilise (et je suis loin d'être le seul, la branche dite Experimentale de linux-vserver depuis plus d'un an et je n'ai jamais eu à m'en plaindre).

Je récupère donc le patch correspondant au noyau téléchargé à l'étape précédente:

raid:/usr/src# wget http://vserver.13thfloor.at/Experimental/patch-2.6.28.1-vs2.3.0.36.4.diff

Puis je détarre le noyau et applique le patch:

raid:/usr/src# tar zxvf linux-2.6.28.1.tar.gz

raid:/usr/src# cd linux-2.6.28.1

raid:/usr/src/linux-2.6.28.1# patch -p1 < ../patch-2.6.28.1-vs2.3.0.36.4.diff

Et je configure le noyau:

raid:/usr/src/linux-2.6.28.1# make menuconfig

Le fichier de config utilisé est disponible ici: ATTENTION : il s'agit d'une config spécifique à une vmware et cela ne fonctionnera probablement pas pour une machine en dur. Il vous faudra au moins revoir notamment la rubrique Device Drivers concernant la gestion des disques durs.

Je laisse à dispo ici un fichier de config pour le noyau 2.6.27.10 utilisé sur une machine physique (le serveur que vous consultez) sachant que c'est un environnement 32-bits, CPU P805D, CM MSI 945P Neo2, disques SATA, carte réseau RealTek 8139.

Je lance le make puis l'install des modules, la copie du system.map et du noyau dans /boot et je mets grub à jour:


raid:/usr/src/linux-2.6.28.1# make
.....

raid:/usr/src/linux-2.6.28.1# make modules_install

raid:/usr/src/linux-2.6.28.1# cp System.map /boot/System.map-2.6.28.1-vs2.3.0.36.4

raid:/usr/src/linux-2.6.28.1# cp .config /boot/config-2.6.28.1-vs2.3.0.36.4

raid:/usr/src/linux-2.6.28.1# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.28.1-vs2.3.0.36.4

raid:/usr/src/linux-2.6.28.1# update-grub

Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.28.1-vs2.3.0.36.4
Found kernel: /boot/vmlinuz-2.6.28-rc3-deb
Found kernel: /boot/vmlinuz-2.6.28-rc3
Found kernel: /boot/vmlinuz-2.6.26-1-amd64
Found kernel: /boot/vmlinuz-2.6.24-1-amd64
Updating /boot/grub/menu.lst ... done


3) Installation des util-vserver

Pour gérer les vservers il existe un paquet debian mais les différentes discussions que j'ai pu voir sur le canal irc de linux-vserver m'ont encouragé ... à ne pas l'utiliser. Je vais donc le compiler moi-même.

raid:/# cd /usr/local

raid:/usr/local#  wget http://ftp.linux-vserver.org/pub/utils/util-vserver/util-vserver-0.30.215.tar.bz2

A l'heure où j'écris c'est encore la version 0.30.215 mais celle-ci devrait bientôt passer en .216. Il existe déjà des pre-releases disponible (vous trouverez les liens à la fin de ce document)

Avant d'aller plus loin petite précision: chaque machine que vous installerez prendra au minimum 250 Mo d'espace disque (je parle d'une distrib debian lenny de base). Prévoyez donc suffisamment d'espace disque dispo voire carrément une parition dédiée à l'installation des futures machines virtuelles. Pour ma part c'est une partition dédiée montée sur /opt/vservers. On verra un peu plus bas qu'on renforcera la sécurité sur ce répertoire.

De plus, pour vous éviter quelques galères, il faut savoir que:

a) il faudra installer les paquets vlan et libbeecrypt6

raid:/usr/local/util-vserver-0.30.215# apt-get install libbeecrypt6 vlan

ii  libbeecrypt6                   4.1.2-7                        open source C library of cryptographic algorithms
ii  vlan                           1.9-3                          user mode programs to enable VLANs on your ethernet devices

b) les util-vserver préconisent d'utiliser dietlibc. Or le paquet (toujours à l'heure où j'écris) n'est pas encore dispo dans les dépôts debian. On va donc installer les sources et le compiler:

raid:/usr/local# apt-get source dietlibc

raid:/usr/local# cd dietlibc-0.31/

raid:/usr/local/dietlibc-0.31# make

raid:/usr/local/dietlibc-0.31# install bin-x86_64/diet /usr/local/bin

Ces prérequis étant réglés, on peut passer à la suite.


raid:/usr/local# tar jxvf util-vserver-0.30.215.tar.bz2 && mv util-vserver-0.30.215.tar.bz2 src

raid:/usr/local# cd util-vserver-0.30.215

Sauf besoins vraiment particuliers, il suffira de passer en paramètre le répertoire où seront stockés les vservers. Je configure donc comme ceci:

raid:/usr/local/util-vserver-0.30.215# ./configure --with-vrootdir=/opt/vservers

raid:/usr/local/util-vserver-0.30.215# make

raid:/usr/local/util-vserver-0.30.215# make install

raid:/usr/local/util-vserver-0.30.215# make install-distribution


Pour mettre à jour le cache des librairies fraichement installées (dans /usr/local/lib donc) je passe la commande suivante:

raid:/usr/local/util-vserver-0.30.215# ldconfig -v

raid:/usr/local/util-vserver-0.30.215#

Comme précisé plus haut, on renforce également la sécurité sur le répertoire des vservers en 2 étapes:

raid:/usr/local/util-vserver-0.30.215# chmod 0000 /opt/vservers

raid:/usr/local/util-vserver-0.30.215# setattr --barrier /opt/vservers


On vérifie :

raid:/usr/local/util-vserver-0.30.215# ls -la /opt
total 16
drwxr-xr-x  4 root root 4096 jan 25 15:36 .
drwxr-xr-x 22 root root 4096 nov  8 17:46 ..
drwxr-xr-x  6 root root 4096 jan 25 15:36 diet
d---------  5 root root 4096 jan 25 16:03 vservers


raid:/usr/local/util-vserver-0.30.215# showattr /opt
---bui- /opt
---bui- /opt/diet
---Bui- /opt/vservers

C'est bon. On va pouvoir rebooter sur le nouveau noyau.


4) Création du premier vserver

raid:/# uname -a
Linux raid 2.6.28.1-vs2.3.0.36.4 #1 SMP Sun Jan 25 15:25:25 CET 2009 x86_64 GNU/Linux

Linux-vserver masque pour la sécurité certaines entrées de /proc pour les machines virtuelles. Cette opération est réalisée par le script:

/usr/local/etc/init.d/vprocunhide auquel on passera le parametre start avant le démarrage des vservers. On pourra l'intégrer dans le /etc/rc.local si on le souhaite.

raid:/# /usr/local/etc/init.d/vprocunhide start
Fixing /proc entries visibility....

Maintenant que l'on tourne sur un noyau vserver on peut utiliser certains outils et je vous conseille de récupérer le script suivant:

http://vserver.13thfloor.at/Stuff/SCRIPT/testme.sh. Celui-ci lance une série de test (!) permettant de s'assurer que les différentes opérations spécifiques à linux-vserver sont possibles:

raid:/usr/local/bin# ./testme.sh
Linux-VServer Test [V0.17] Copyright (C) 2003-2006 H.Poetzl
chcontext is working.
chbind is working.
Linux 2.6.28.1-vs2.3.0.36.4 #1 SMP Sun Jan 25 15:25:25 CET 2009 x86_64
Ea 0.30.215 236/glibc (DSa) <v13,net,v21,v22,v23,netv2>
VCI: 0002:0304 236 13000fb1 (TbsPHIW)
---
[000]# succeeded.
[001]# succeeded.
[011]# succeeded.
[031]# succeeded.
[101]# succeeded.
[102]# succeeded.
[201]# succeeded.
[202]# succeeded.

C'est bon. On continue.


raid:/# vserver-stat    =>Nous fournira la liste des vservers en cours d'exécution.
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME


raid:/# vserver-info    => Nous donnera certaines infos sur un vserver ou sur l'environnement d'exécution
Versions:
                   Kernel: 2.6.28.1-vs2.3.0.36.4
                   VS-API: 0x00020304
             util-vserver: 0.30.215; Jan 25 2009, 15:45:12

Features:
               CC: gcc, gcc (Debian 4.3.2-1.1) 4.3.2
                      CXX: g++, g++ (Debian 4.3.2-1.1) 4.3.2
                 CPPFLAGS: ''
                   CFLAGS: '-g -O2 -std=c99 -Wall -pedantic -W -funit-at-a-time'
                 CXXFLAGS: '-g -O2 -ansi -Wall -pedantic -W -fmessage-length=0 -funit-at-a-time'
               build/host: x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu
             Use dietlibc: yes
       Build C++ programs: yes
       Build C99 programs: yes
           Available APIs: v13,net,v21,v22,v23,netv2
            ext2fs Source: e2fsprogs
    syscall(2) invocation: alternative
      vserver(2) syscall#: 236/glibc
               crypto api: beecrypt

Paths:
                   prefix: /usr/local
        sysconf-Directory: ${prefix}/etc
            cfg-Directory: ${prefix}/etc/vservers
         initrd-Directory: $(sysconfdir)/init.d
       pkgstate-Directory: ${prefix}/var/run/vservers
          vserver-Rootdir: /opt/vservers


Assumed 'SYSINFO' as no other option given; try '--help' for more information.


La création du premier vserver va s'effectuer comme suit (sur une seule ligne)

raid:/# vserver raidvs1 build --force -m debootstrap --hostname raidvs1.net.caen --netdev eth0 --interface 192.168.0.17/24  -- -d lenny -m http://ftp.fr.debian.org/debian/

Là on se heurte à un petit soucis: vserver ne trouve pas le bon fichier debootstrap. Heureusement, ces outils ont été très bien pensés et on nous indique le correctif:
il faut créer un fichier comme suit:

raid:/usr/local/etc/vservers/.defaults/apps# cat debootstrap/uri
http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.10_all.deb

Il faudra donc créer le répertoire usr/local/etc/vservers/.defaults/app/debootstrap qui n'existe pas par défaut et ensuite créer dans celui-ci le fichier uri contenant aujourd'hui l'url indiquée ci-dessus.

Je relance la commande et la construction du vserver commence.

I-Retrieving base-file
I-validating base-file
etc....

Normalement lorsque c'est terminé on peut démarrer le vserver par un simple:

raid:/# vserver raidvs1 start

Décidemment ça n'est pas mon jour car je vérifie et voila le résultat:

raid:/# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME

En clair, aucun vserver de démarré. Un petit tour sur l'irc de vserver où l'on me fait remarquer qu'il faut au moins configurer un service à démarrer sur la machine. De fait je constate qu'il n'y a aucun lien dans /etc/rc*.d du vserver (soit : /opt/vservers/raidvs1/etc/rc*.d). Je configure simplement syslog en créant les liens symboliques qui vont bien (sachant que par défaut un vserver démarre en init 3) et ça se passe nettement mieux:

raid:/# ll /opt/vservers/raidvs1/etc/rc3.d/
total 12
drwxr-xr-x  2 root root 4096 jan 25 16:40 .
drwxr-xr-x 39 root root 4096 jan 25 16:05 ..
-rw-r--r--  1 root root  556 aoû 12 16:09 README
lrwxrwxrwx  1 root root   17 jan 25 16:40 S20rsyslog -> ../init.d/rsyslog
lrwxrwxrwx  1 root root   18 jan 25 16:05 S99rc.local -> ../init.d/rc.local


Et c'est tout bon:

raid:/# vserver raidvs1 start
Starting enhanced syslogd: rsyslogd.

raid:/# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
40006    3 108.6M   1.2M   0m00s16   0m00s52   0m06s81 raidvs1


Je vais maintenant effectuer quelques tests:




5) Tests

Sur l'hôte je peux déjà vérifier que l'adresse IP assignée au vserver est utilisée:

raid:/# ip addr ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ef:4c:8d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.16/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.17/24 brd 192.168.0.255 scope global secondary eth0
    inet6 fe80::20c:29ff:feef:4c8d/64 scope link
       valid_lft forever preferred_lft forever

L'ip 17 est bien celle que j'ai passé dans la ligne de commande lors de la création du vserver.

Je vais maintenant entrer dans celui-ci:

raid:/# vserver raidvs1 enter
raidvs1:/#

raidvs1:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:ef:4c:8d 
          inet addr:192.168.0.17  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55404 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35307 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:64391091 (61.4 MiB)  TX bytes:3039450 (2.8 MiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

raidvs1:/# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
24126 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
24272 ?        R+     0:00 login                                                                                               
24300 pts/2    Ss     0:00 /bin/bash -login
24305 pts/2    R+     0:00 ps ax

raidvs1:/# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/hdv1      ufs    2.0G  252M  1.7G  14% /
none         tmpfs     16M     0   16M   0% /tmp

Je paramètre son sources.list pour utiliser mon mirroir local:

raidvs1:/# cat /etc/apt/sources.list

deb http://192.168.0.63:3142/mir2.ovh.net/debian/ lenny main non-free contrib
deb-src http://192.168.0.63:3142/mir2.ovh.net/debian/ lenny main non-free contrib
deb http://192.168.0.63:3142/security.debian.org/ lenny/updates main contrib non-free
deb-src http://192.168.0.63:3142/security.debian.org/ lenny/updates main contrib non-free

raidvs1:/# apt-get update
Hit http://192.168.0.63 lenny Release.gpg
Get:1 http://192.168.0.63 lenny/updates Release.gpg [189B]
Hit http://192.168.0.63 lenny Release
Get:2 http://192.168.0.63 lenny/updates Release [40.8kB]
Hit http://192.168.0.63 lenny/main Packages/DiffIndex
etc.....

raidvs1:/# apt-get install apache2
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  apache2-mpm-worker apache2-utils apache2.2-common file libapr1 libaprutil1 libdb4.5 libexpat1 libkeyutils1 libkrb53 libldap-2.4-2 libmagic1
  libmysqlclient15off libpcre3 libpq5 libsqlite3-0 mime-support mysql-common openssl openssl-blacklist perl perl-modules python python-minimal
  python2.5 python2.5-minimal ssl-cert
Suggested packages:
  www-browser apache2-doc apache2-suexec apache2-suexec-custom krb5-doc krb5-user ca-certificates perl-doc libterm-readline-gnu-perl
  libterm-readline-perl-perl python-doc python-tk python-profiler python2.5-doc binfmt-support
The following NEW packages will be installed:
  apache2 apache2-mpm-worker apache2-utils apache2.2-common file libapr1 libaprutil1 libdb4.5 libexpat1 libkeyutils1 libkrb53 libldap-2.4-2
  libmagic1 libmysqlclient15off libpcre3 libpq5 libsqlite3-0 mime-support mysql-common openssl openssl-blacklist perl perl-modules python
  python-minimal python2.5 python2.5-minimal ssl-cert
0 upgraded, 28 newly installed, 0 to remove and 0 not upgraded.
Need to get 26.4MB of archives.
After this operation, 83.3MB of additional disk space will be used.
Do you want to continue [Y/n]? Y

.........
Get:26 http://192.168.0.63 lenny/main apache2-mpm-worker 2.2.9-10+lenny2 [257kB]                                                                       
Get:27 http://192.168.0.63 lenny/main apache2 2.2.9-10+lenny2 [44.5kB]                                                                                 
Get:28 http://192.168.0.63 lenny/main ssl-cert 1.0.23 [13.1kB]                                                                                         
Fetched 26.4MB in 6s (3960kB/s)      

L'install se déroule correctement mais cela me permet de constater que les locales ne sont pas installées, donc:

raidvs1:/# apt-get install locales


Je vérifie ensuite qu'apache tourne bien:

raidvs1:/# netstat -lnp           
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      25302/apache2  
Sockets du domaine UNIX actives(seulement serveurs)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Chemin
unix  2      [ ACC ]     STREAM     LISTENING     46635    25305/apache2       /var/run/apache2/cgisock.25302

Là petite remarque: il est préférable de définir explicitement l'adresse ip sur laquelle apache devra écouter, faute de quoi on risque des conflits. Ceci est d'ailleurs valable pour la plupart des services que l'on souhaiterait installer : ssh, ftp, mail etc...

Pour apache il suffit de modifier /etc/apache2/ports.conf et de le relancer:

raidvs1:/# cat /etc/apache2/ports.conf |egrep -v '^#|^$'
NameVirtualHost 192.168.0.17:80
Listen 192.168.0.17:80
<IfModule mod_ssl.c>
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    Listen 192.168.0.17:443
</IfModule>

raidvs1:/# apache2ctl stop
raidvs1:/# apache2ctl start

raidvs1:/# netstat -lnp
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 192.168.0.17:80         0.0.0.0:*               LISTEN      26445/apache2  
Sockets du domaine UNIX actives(seulement serveurs)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Chemin
unix  2      [ ACC ]     STREAM     LISTENING     47692    26446/apache2       /var/run/apache2/cgisock.26445


Je vais tester depuis une autre machine (mon desktop en l'occurence):

root@p733:/tmp# wget http://192.168.0.17
--18:44:36--  http://192.168.0.17/
           => `index.html'
Connexion vers 192.168.0.17:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: 45 [text/html]

100%[===========================================================================================================>] 45            --.--K/s            

18:44:37 (9.75 MB/s) - « index.html » sauvegardé [45/45]

Voilà c'est tout bon.

Pour sortir du vserver c'est la combinaison de touche CTRL-d


Il ne reste plus qu'à se familiariser avec les différentes commandes sachant que depuis l'hôte on peut lancer ce que l'on veut sur un vserver:

exemple:

raid:/# vserver raidvs1 exec ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
24126 ?        Sl     0:00 /usr/sbin/rsyslogd -c3
26445 ?        Ss     0:00 /usr/sbin/apache2 -k start
26446 ?        S      0:00 /usr/sbin/apache2 -k start
26447 ?        Sl     0:00 /usr/sbin/apache2 -k start
26448 ?        Sl     0:00 /usr/sbin/apache2 -k start
26511 ?        R+     0:00 ps ax

ou bien encore:

raid:/# vserver raidvs1 exec apt-get install <paquet>

Le répertoire contenant les fichiers de config du vserver sont situés dans : /usr/local/etc/vserver/<nom du vserver>

Je vous invite à consulter cette page  pour vous donner une petite idée des options disponibles.


6) Liens


Vous trouverez sur cette page les différents liens que je collecte à propos de linux-vserver:

http://ext23.pmenier.net/wiki/index.php?title=Accueil