<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1055"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1055/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1055/atom/feed</id>
  <updated>2008-10-28T22:12:27+01:00</updated>
  <entry>
    <title>Créer un environnement de test &#039;la(p|m)p&#039; avec Chroot</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1055" />
    <id>http://artisan.karma-lab.net/node/1055</id>
    <published>2008-10-03T12:31:12+02:00</published>
    <updated>2008-10-28T22:12:27+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Serveurs" />
    <category term="drupalfr.org" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
   Lorsque l'on a besoin de créer un environnement de test il est nécessaire que sa composition soit strictement contrôlé (paramétrages, applications et services disponibles et lancées, etc). Il n'est du coup généralement pas conseillé d'utiliser sa machine de travail, sauf si elle ne sert qu'à cela, sous peine d'en détériorer le fonctionnement en cas de test malheureux ou de modifier sans le vouloir le comportement de ce que l'on cherche à tester. Nous sommes alors contraints d'avoir soit une machine virtuelle dédiée aux tests, soit une machine physique supplémentaire. 
</p>
<p>
  Ce serait sans compter sur la commande <kbd>chroot</kbd> qui permet dans certaines conditions d'obtenir un environnement de test ou d'intégration identique à celui en production, sans machine physique supplémentaire et sans que la machine principale soit ralentie ou compromise. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   Lorsque l'on a besoin de créer un environnement de test il est nécessaire que sa composition soit strictement contrôlé (paramétrages, applications et services disponibles et lancées, etc). Il n'est du coup généralement pas conseillé d'utiliser sa machine de travail, sauf si elle ne sert qu'à cela, sous peine d'en détériorer le fonctionnement en cas de test malheureux ou de modifier sans le vouloir le comportement de ce que l'on cherche à tester. Nous sommes alors contraints d'avoir soit une machine virtuelle dédiée aux tests, soit une machine physique supplémentaire. 
</p>
<p>
  Ce serait sans compter sur la commande <kbd>chroot</kbd> qui permet dans certaines conditions d'obtenir un environnement de test ou d'intégration identique à celui en production, sans machine physique supplémentaire et sans que la machine principale soit ralentie ou compromise. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Qu'est-ce qu'un chroot?</h2>
	
<p>
  Comme vous le savez sûrement déjà, le système fichier d'un *NIX est construit autour d'une racine (le <kbd>/</kbd>) sur laquelle les partitions sont ensuite "montées" formant ainsi l'espace de fichier accessible. Ce que l'on sait moins c'est que cette racine est un paramètre du processus. Tout processus lancé peut avoir pour racine un chemin arbitraire issu de celle de son processus parent. Si ce paramètre n'est pas définit, ce qui est généralement le cas, c'est '/' qui est utilisé par défaut, en quelque sorte la racine de la racine du parent. La commande <kbd>chroot</kbd> permet de lancer une commande et dans la foulée de définir ce paramètre pour le processus engendré. 
</p>
<p>
  La commande <kbd>chroot</kbd> peut donc avoir deux paramètres principaux : un chemin dans l'arborescence et une commande. Ainsi, si en tant qu'utilisateur <kbd>root</kbd> nous lançons <kbd>chroot /lapp /bin/bash</kbd>, voilà ce qui se passe :
  <ol>
   <li>La commande <kbd>chroot</kbd> engendre un processus qui a pour racine la même que celle de son processus parent, généralement le <kbd>/</kbd> (mais rien n'empêche de faire des poupées russes...).</li>
   <li>En interne, <kbd>chroot</kbd> appel de la fonction kernel <kbd>chroot("/lapp")</kbd>. Le kernel va donc modifier la valeur de la racine pour ce processus et lui associer la valeur <kbd>/lapp</kbd>.</li>
   <li>Le processus de <kbd>chroot</kbd>, exécute la commande passée en 2nd paramètre, <kbd>/bin/bash</kbd>. Comme la racine de <kbd>chroot</kbd> a été changée, c'est en quelque sorte bien le <kbd>/bin/bash</kbd> à partir de la nouvelle racine <kbd>/lapp</kbd> qui va être exécuté.</li>
   <li>Cette exécution débouche sur la création d'un processus fils de celui du <kbd>chroot</kbd> qui hérite donc de cette nouvelle racine.</li>
   <li>Tout ce que <kbd>/bin/bash</kbd> lancera par la suite héritera de cette nouvelle racine jusqu'à ce que l'on tape <kbd>exit</kbd> qui mettra fin au processus <kbd>/bin/bash</kbd>, et par domino à celui du <kbd>chroot</kbd> qui a permis son lancement.
  </ol>
</p>

<p>
  Le premier constat que nous pouvons tire de cela est qu'il faut que notre dossier <kbd>/lapp</kbd> contienne un <kbd>bin/bash</kbd>, mais aussi toutes les librairies dont a besoin <kbd>bash</kbd> pour fonctionner, ainsi que tous les dossiers systèmes qui lui sont nécessaire et qu'il s'attend à trouver comme sous une "vraie" racine. Ainsi la seule problématique posée sera le peuplement de notre nouvelle racine. 
</p>
<p>
  Le second constat est qu'un chroot <strong>n'est pas une virtualisation</strong>. Une virtualisation définit des conteneurs bien hermétiques avec leur mémoire propre, leur espace disque propre, leurs périphériques propres, etc. Le chroot ne fait rien de tout cela. La mémoire, le CPU, les périphériques (réseau, disque, écran, etc) sont partagées par l'environnement racine et chrooté. C'est d'ailleurs pour cela qu'un chroot est aussi rapide que si tout était lancé sur la racine principale. 
</p>
<p>
  Chroot ne fait donc que "faire croire" à un processus qu'il travaille sous la "vraie racine" alors qu'il n'est que dans un sous-dossier. Ainsi la seule garantie que fournit le <kbd>chroot</kbd> est l'<strong>étanchéité des fichiers</strong> dans le sens enfant-parent. C'est pour cet aspect que le <kbd>chroot</kbd> est d'ailleurs généralement utilisé, pour "mettre en prison" des applications critiques (serveur web, serveur mail, etc.) de sorte à ce que si une vulnérabilité permet à un cracker de casser le serveur, il ne puisse atteindre les fichiers se trouvant hors du chroot et ainsi limiter les dégâts. A noter que ce billet <strong>ne traite pas</strong> de cette utilisation critique du chroot et que d'un point de vue général il existe nombre d'exploits permettant de s'échapper de cette prison. 
</p>

<p>
  Malgré ses limitations, le <kbd>chroot</kbd> est juste parfait pour une utilisation : la création d'un environnement de test et/ou d'intégration pour des applications WEB. Il permet en effet très facilement de créer une configuration LA(P|M)P (Linux-Apache-Postgres/MySQL-PHP), facile à maintenir, facile à recréer, testable de la machine principale sans modification particulière comme si tout était installé "localement". 
</p>


	<a name='chapter_2'></a>
  <h2>Mise en oeuvre</h2>
	
<p>
  Notre but est donc ici de créer un environnement chrooté comprenant un Linux de base, Apache, Postgresql et PHP. La première étape est donc de créer notre future racine. Je le fait en <kbd>/lapp</kbd> mais cela pourrait être virtuellement n'importe où, y compris sur le dossier d'une clef mémoire ou sur un espace volatile type <kbD>tmpfs</kbd>. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> <span class="sy0">/</span>lapp
  </div>
  
  </div>
</p>
<p>
  Maintenant vient le moment de peupler notre racine. Là, il y a trois approches possibles. 
</p>
<p>
  Nous avons l'approche dite "bourrine" consistant à dupliquer sauvagement son environnement principal :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/cp"><span class="kw2">cp</span></a> -a <span class="sy0">/</span>usr <span class="sy0">/</span>bin <span class="sy0">/</span>lib <span class="sy0">/</span>sbin <span class="sy0">/</span>var <span class="sy0">/</span>lapp
  </div>
  
  </div>
</p>
<p>
  L'inconvénient est que c'est souvent très volumineux et peu adapté à un environnement de test contrôlé dans la mesure où des tas de choses inutiles sont injectées dans la nouvelle racine. 
</p>
<p>
  Ensuite il y a l'approche "minimaliste" qui cherche à ne copier que ce qui est nécessaire. Cela peut se faire à la main avec la commande <kbd>ldd</kbd> ou beaucoup plus simplement, comme me l'a indiqué Guyou, avec les outils <a class='external' target='_blank' href='http://www.floc.net/makejail/' >makejail</a> ou <a class='external' target='_blank' href='http://freshmeat.net/projects/chrootbin/' >chrootbin</a>. Mais cette technique est plus adaptée au lancement d'un serveur dans une prison chroot qu'à notre besoin. 
</p>
<p>
  Enfin nous avons l'approche "raisonnable" consistant à utiliser les outils fournis par les debian's et autres mandriva's qui permettant d'installer tout simplement sur une racine arbitraire une distribution complète. C'est clairement dans notre cas cette approche qui s'impose. 
</p>
<p>
  Sous mandriva (et distributions dérivées), l'installation d'un linux de base sur une racine se fait simplement par la commande suivante :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> urpmi basesystem urpmi locales-fr --root <span class="sy0">/</span>lapp
  </div>
  
  </div>
</p>

<p>
  Simple et diablement efficace. Comme vous l'aurez noté, ce sont trois paquets qui sont ici installés: le linux de base, la langue française et le système de gestion de paquets. Ce dernier point nous offrira beaucoup de souplesse car au sein même du chroot il sera du coup possible d'installer, désinstaller ou même mettre à jour la distribution.
</p>
<div class='inline-box note'>
  A noter que ce n'est pas du "one shot", il est toujours possible d'ajouter des paquets à la racine "de l'exterieur" par :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> urpmi un_paquer --root <span class="sy0">/</span>lapp
  </div>
  
  </div>
</div>

<p>
  Les distributions basées sur debian disposent elle aussi d'une méthode très efficace pour créer une racine minimale en utilisant cette fois la commande <kbd>debootsrap</kbd>. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> debootstrap --arch i386 &nbsp;--<span class="re2">include=</span>locales-all &nbsp;sid <span class="sy0">/</span>lapp http:<span class="sy0">//</span><a target="blank" href="http://pwet.fr/man/linux/commandes/ftp"><span class="kw2">ftp</span></a>.fr.debian.org<span class="sy0">/</span>debian
  </div>
  
  </div>
</p>

<p>
  Vous pouvez remplacer <kbd>sid</kbd> par toute distribution debian disponible (etch, sarge, etc..). Pour le reste cela fonctionne comme la méthode précédente a la différence que la gestion de paquet n'est pas optionnelle et vous aurez donc automatiquement accès à apt-get dans le chroot. 
</p>

<div class='inline-box note'>
   Un détail intéressant est que la commande <kbd>debootstrap</kbd> est aussi disponible sous Mandriva et vous permet sans aucun problème, d'installer une racine de debian dans une mandriva. 
</div>


<p>
  Notre racine étant maintenant peuplée et les utilitaires que nous avons utilisé ont normalement pris soin de créer à la "racine" les dossier vitaux <kbd>tmp</kbd>, <kbd>var</kbd>, <kbd>dev</kbd>, <kbd>sys</kbd> et <kbd>proc</kbd>. Si ce n'est pas le cas, faites le vous-même. 
</p>

<p>
  Maintenant comme vous le savez, certains dossiers de Linux ne sont pas de "vrais" dossier mais une vue sur des variables du système. C'est le cas de <kbd>/proc</kbd>, <kbd>/sys</kbd> et <kbd>/dev</kbd>. Si nous lancions maintenant notre nouvelle racine, ces dossiers seraient donc vides provoquant des erreurs sur certaines fonctions. Il nous faut donc avant monter ces dossiers. Pour ce faire, nous allons simplement les "relier" (mount --bind) aux mêmes dossiers de la vraie racine.

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> -bind <span class="sy0">/</span>dev <span class="sy0">/</span>lapp<span class="sy0">/</span>dev <br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> -bind <span class="sy0">/</span>proc <span class="sy0">/</span>lapp<span class="sy0">/</span>proc<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> -bind <span class="sy0">/</span>sys <span class="sy0">/</span>lapp<span class="sy0">/</span>sys
  </div>
  
  </div>
</p>

<p>
  Concernant le réseau dans un chroot, la configuration sera la même que celle de l'environnement parent. Tout fonctionnera donc sans avoir à faire quoi que ce soit. En revanche il est important de vérifier que la résolution de noms se fait correctement. Pour cela nous allons simplement recopier le fichier <kbd>/etc/resolv</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/cp"><span class="kw2">cp</span></a> <span class="sy0">/</span>etc<span class="sy0">/</span>resolv.conf <span class="sy0">/</span>lapp<span class="sy0">/</span>etc<span class="sy0">/</span>resolv.conf
  </div>
  
  </div>
</p>

<p>
Maintenant tout est en place, c'est le moment du lancement. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/chroot"><span class="kw2">chroot</span></a> <span class="sy0">/</span>lapp <span class="sy0">/</span>bin<span class="sy0">/</span>bash
  </div>
  
  </div>
</p>

<p>
  Voilà, une fois ceci exécuté, nous sommes "prisonnier" de la nouvelle racine et toutes les commandes qui suivent sont contrainte dans cet espace. Pour en sortir il suffit de faire un "exit". Comme vous le voyez tout fonctionne, vous pouvez utiliser le réseau, installer des paquets, etc. C'est ce que nous allons faire pour mettre en place notre environnement de test :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  urpmi apache-mod_php postgresql-server
  </div>
  
  </div>
</p>

<p>
  Ceci fait, vous pouvez constater que votre système fonctionne en lançant les services :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>httpd start<br />
<span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>postgresql start
  </div>
  
  </div>
</p>
<p>
  Maintenant, en allant, sur votre environnement principal aidé d'un navigateur web sur l'adresse <kbd>http://localhost</kbd>, vous devriez avoir accès à la page de test du serveur Apache. Pour le reste, à vous de jouer...
</p>


	<a name='chapter_3'></a>
  <h2>Automatisation</h2>
	
<p>
   Comme vous l'aurez constaté, le chroot n'effectue pas, et heureusement, un démarrage réel du linux installé à la nouvelle racine. Il se contente d'exécuter <kbd>/bin/bash</kbd> ce qui vous oblige de votre côté à lancer les services à la main. 
</p>
<p>
  Pour rendre cela beaucoup plus simple à utiliser sur une base quotidienne, le plus propre reste de créer un service dédié au lancement de notre racine qui va créer le montages et lancer apache, postgres, etc... Son arrêt ferra l'inverse :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#!/bin/sh</span><br />
<br />
<span class="co0"># chkconfig: 345 56 50</span><br />
<span class="co0"># description: This startup script launches Chroot Starter</span><br />
<br />
<span class="co0">### BEGIN INIT INFO</span><br />
<span class="co0"># Provides: lappd</span><br />
<span class="co0"># Required-Start: </span><br />
<span class="co0"># Required-Stop: </span><br />
<span class="co0"># Default-Start: 345</span><br />
<span class="co0"># Short-Description: Chroot Starter</span><br />
<span class="co0"># Description: This startup script launches Chroot Starter</span><br />
<span class="co0">### END INIT INFO</span><br />
<br />
<span class="re2">PATH=</span><span class="sy0">/</span>usr<span class="sy0">/</span>sbin:<span class="sy0">/</span>usr<span class="sy0">/</span>bin:<span class="sy0">/</span>sbin:<span class="sy0">/</span>bin<br />
<span class="re2">NAME=</span>lapp<br />
<span class="re2">DESC=</span><span class="st0">&quot;Chroot Starter for $NAME&quot;</span><br />
<span class="re2">ROOT=</span><span class="sy0">/</span><span class="re1">$NAME</span><br />
<br />
<span class="co0"># Source function library.</span><br />
. <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>functions<br />
<br />
<span class="kw1">case</span> <span class="st0">&quot;$1&quot;</span> <span class="kw1">in</span><br />
&nbsp; start<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="sy0">!</span> -z <span class="st0">&quot;$(mount | grep $ROOT)&quot;</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; gprintf <span class="st0">&quot;$NAME is already started<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span><br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
&nbsp; &nbsp; gprintf <span class="st0">&quot;Starting chroot for %s&quot;</span> <span class="st0">&quot;$NAME&quot;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> --bind <span class="sy0">/</span>proc <span class="re1">$ROOT</span><span class="sy0">/</span>proc<br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> --bind <span class="sy0">/</span>dev <span class="re1">$ROOT</span><span class="sy0">/</span>dev<br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> --bind <span class="sy0">/</span>sys <span class="re1">$ROOT</span><span class="sy0">/</span>sys<br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/chroot"><span class="kw2">chroot</span></a> <span class="re1">$ROOT</span> <span class="sy0">/</span>init.<a target="blank" href="http://pwet.fr/man/linux/commandes/sh"><span class="kw2">sh</span></a> start<br />
&nbsp; &nbsp; echo_success<br />
&nbsp; &nbsp; <span class="kw3">echo</span><br />
&nbsp; &nbsp; <span class="sy0">;;</span><br />
<br />
&nbsp; stop<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> -z <span class="st0">&quot;$(mount | grep $ROOT)&quot;</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; gprintf <span class="st0">&quot;$NAME is already stopped<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span><br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
&nbsp; &nbsp; gprintf <span class="st0">&quot;Stopping chroot for %s&quot;</span> <span class="st0">&quot;$NAME&quot;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/chroot"><span class="kw2">chroot</span></a> <span class="re1">$ROOT</span> <span class="sy0">/</span>init.<a target="blank" href="http://pwet.fr/man/linux/commandes/sh"><span class="kw2">sh</span></a> stop<br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/umount"><span class="kw2">umount</span></a> <span class="re1">$ROOT</span><span class="sy0">/</span>proc <br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> -ne <span class="nu0">0</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; echo_failure<br />
&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span>;<br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/umount"><span class="kw2">umount</span></a> <span class="re1">$ROOT</span><span class="sy0">/</span>dev<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> -ne <span class="nu0">0</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; echo_failure<br />
&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span>;<br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/umount"><span class="kw2">umount</span></a> <span class="re1">$ROOT</span><span class="sy0">/</span>sys<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> -ne <span class="nu0">0</span> <span class="br0">&#93;</span> ; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; echo_failure<br />
&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">3</span>;<br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; echo_success<br />
&nbsp; &nbsp; <span class="kw3">echo</span><br />
&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">0</span><br />
&nbsp; &nbsp; <span class="sy0">;;</span><br />
<br />
&nbsp; restart<span class="sy0">|</span>force-reload<span class="br0">&#41;</span><br />
&nbsp; &nbsp; $<span class="nu0">0</span> stop<br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/sleep"><span class="kw2">sleep</span></a> <span class="nu0">1</span><br />
&nbsp; &nbsp; $<span class="nu0">0</span> start<br />
&nbsp; &nbsp; <span class="sy0">;;</span><br />
<span class="kw1">esac</span><br />
<span class="kw3">exit</span> <span class="nu0">0</span>
  </div>
  <div class='caption'>/etc/init.d/lapp</div>
  </div>
</p>
<p>
  Ensuite dans notre racine il faut rajouter, et rendre exécutable, un fichier <kbd>/init.sh</kbd> contenant le démarrage/arrêt des services <kbd>httpd</kbd> et <kbd>postgresql</kbd>, et qui prendra en paramètre <kbd>start</kbd> ou <kbd>stop</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh </span><br />
<br />
<span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>httpd $<span class="nu0">1</span><br />
<span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>postgresql $<span class="nu0">1</span>
  </div>
  <div class='caption'>/init.sh</div>
  </div>
</p>
<p>
  Après, vous pouvez rendre le lancement de ce service automatique (avec <kbd>chkconfig</kbd> ou l'outil dédié à cela pour votre distribution), ou faire cela à la main :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='co0'># lancement du service</div><div class='command'><span class='prompt'>gaston$</span>sudo /etc/init.d/lapp start</div><div class='result'>Starting chroot for lapp                                        [  OK  ]</div><div class='result'>&nbsp;</div><div class='co0'># ouverture d'une session sur la racine</div><div class='command'><span class='prompt'>gaston$</span>sudo chroot /lapp /bin/sh</div><div class='co0'># ...</div><div class='co0'># exit</div><div class='result'>&nbsp;</div><div class='co0'># extinction du service</div><div class='command'><span class='prompt'>gaston$</span>sudo /etc/init.d/lapp stop</div><div class='result'>Starting chroot for lapp                                        [  OK  ]</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  <div class='caption'>exemple d&#039;utilisation</div>
  </div>
</p>
<p>
  Personnellement j'ai mis ce service en démarrage manuel et ajouté un profile dans <kbd>gnome-terminal</kbd> qui me lance directement la commande <kbd>chroot /lapp /bin/sh</kbd>. 
</p>



	<a name='chapter_4'></a>
  <h2>Conclusion</h2>
	
<p>
La commande chroot ne manque donc pas d'intérêt en restant très simple à mettre en oeuvre si on en saisi bien les fondamentaux. C'est une bonne alternative à la "lourdeur" de la virtualisation et permet de créer à une vitesse record des environnements de développement rapides, efficaces et non-polluant pour le reste du système. 
</p>

    ]]></content>
  </entry>
</feed>
