Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 477

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>4. Construire un système racine</title>
<link rel="stylesheet" href="style.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.64.1">
<link rel="home" href="index.html" title="Guide pratique des disquettes d'amorçage">
<link rel="up" href="index.html" title="Guide pratique des disquettes d'amorçage">
<link rel="previous" href="ar01s03.html" title="3. Disques d'amorce et démarrage">
<link rel="next" href="ar01s05.html" title="5. Choisir un noyau">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">4. Construire un système racine</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="ar01s03.html">Précédent</a> </td>
<th width="60%" align="center"> </th>
<td width="20%" align="right"> <a accesskey="n" href="ar01s05.html">Suivant</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" lang="fr">
<div class="titlepage">
<div><div><h2 class="title" style="clear: both">
<a name="buildroot"></a>4. Construire un système racine</h2></div></div>
<div></div>
</div>
<p>
Pour créer un système racine, il faut sélectionner les fichiers
nécessaires au système pour fonctionner. Dans cette section nous
décrivons comment créer un <span class="emphasis"><em>système racine
compressé</em></span>. Une option moins courante est de créer un système
non compressé sur une disquette que l'on monte directement ; cette
alternative est décrite dans la <a href="ar01s09.html#nonramdiskroot" title="9.1. Système racine sans disque mémoire">Section 9.1, « Système racine sans disque mémoire »</a>.
</p>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="id2513127"></a>4.1. Aperçu</h3></div></div>
<div></div>
</div>
<p>
Un système racine doit contenir tout ce qui est nécessaire au bon
fonctionnement d'un système Linux complet. Pour cela, le disque doit
contenir un système Linux minimum :
</p>
<div class="itemizedlist"><ul type="disc">
<li><p>La structure de base des fichiers ;</p></li>
<li><p>Un ensemble minimum de répertoires :
<tt class="filename">/dev</tt>, <tt class="filename">/proc</tt>,
<tt class="filename">/bin</tt>, <tt class="filename">/etc</tt>,
<tt class="filename">/lib</tt>, <tt class="filename">/usr</tt>,
<tt class="filename">/tmp</tt> ;
</p></li>
<li><p>Un ensemble d'utilitaires de base :
<span><b class="command">sh</b></span>, <span><b class="command">ls</b></span>, <span><b class="command">cp</b></span>,
<span><b class="command">mv</b></span>, et cætera ;
</p></li>
<li><p>Un ensemble minimum de fichiers de 
configuration :
<span><b class="command">rc</b></span>, <tt class="filename">inittab</tt>,
<tt class="filename">fstab</tt>, et cætera ;
</p></li>
<li><p>Des périphériques : <tt class="filename">/dev/hd*</tt>,
<tt class="filename">/dev/tty*</tt>, <tt class="filename">/dev/fd0</tt>, et cætera ;
</p></li>
<li><p>Des bibliothèques d'exécution fournissant les fonctions
de base nécessaires aux utilitaires.</p></li>
</ul></div>
<p>
Bien sûr, n'importe quel système devient utile dès que l'on peut faire
tourner quelque chose dessus, et une disquette racine ne devient en
général utilisable que lorsque vous pouvez faire quelque chose du genre
:
</p>
<div class="itemizedlist"><ul type="disc">
<li><p>Contrôler un système de fichiers sur un autre disque ;
par exemple, pour contrôler le système racine de votre disque dur, vous
devez pouvoir démarrer Linux depuis un autre disque, telle qu'une
disquette racine. Vous pouvez alors lancer <span><b class="command">fsck</b></span> sur
votre disque racine habituel tant qu'il n'est pas monté ;
</p></li>
<li><p>Récupérer tout ou partie de votre disque racine initial
à partir d'une sauvegarde en utilisant des utilitaires d'archivage et de
compression tels que <span><b class="command">cpio</b></span>, <span><b class="command">tar</b></span>,
<span><b class="command">gzip</b></span> et <span><b class="command">ftape</b></span>.
</p></li>
</ul></div>
<p>
Nous décrirons comment construire un système
<span class="emphasis"><em>compressé</em></span>, ainsi appelé car il est compressé sur
disque et qu'une fois démarré, le noyau le décompresse dans un disque
mémoire.  <a class="indexterm" name="id2513351"></a> Avec un système compressé vous pouvez
faire tenir beaucoup de fichiers (à peu près six méga-octets) sur une
disquette standard de 1440 ko. Puisque le système de fichiers est 
bien
plus gros que la disquette, il ne peut être construit directement sur la
disquette. Il nous faut le construire ailleurs et le compresser avant de
le copier sur la disquette.
</p>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="creatingrootfs"></a>4.2. Création du système de fichiers</h3></div></div>
<div></div>
</div>
<p>
Pour créer un tel système racine, il vous faut un autre périphérique
capable de stocker tous les fichiers avant leur compression. Ce
périphérique doit pouvoir contenir à peu près quatre
méga-octets. Plusieurs solutions s'offrent à vous :
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<p>Utiliser un <span class="emphasis"><em>disque mémoire</em></span>
(PÉRIPHÉRIQUE = <tt class="filename">/dev/ram0</tt>). Dans ce cas, la mémoire
est utilisée pour simuler un disque physique. Le disque mémoire doit
être suffisamment grand pour contenir un système de fichiers de la bonne
taille. Si vous utilisez <span><b class="command">LILO</b></span>, cherchez dans votre
fichier de configuration (<tt class="filename">/etc/lilo.conf</tt>) une ligne
du type :
</p>
<pre class="programlisting">
RAMDISK_SIZE = nnn
</pre>
<a class="indexterm" name="id2513432"></a><p>
qui détermine combien de mémoire peut être au plus allouée à un disque
mémoire. La valeur par défaut est de 4096 ko, ce qui devrait
suffire. Il ne sert probablement à rien de créer un tel disque mémoire
sur une machine possédant moins de 8 Mo de RAM.
</p>
<p>
Vérifiez que vous avez un périphérique tel que
<tt class="filename">/dev/ram0</tt>, <tt class="filename">/dev/ram</tt> ou
<tt class="filename">/dev/ramdisk</tt>. Si ce n'est pas le cas, créez
<tt class="filename">/dev/ram0</tt> avec mknod (numéro majeur 1, numéro
mineur 0).
</p>
</li>
<li><p>Une partition de disque dur inutilisée et assez grande
(plusieurs méga-octets) est aussi une bonne solution.
</p></li>
<li>
<p>Utiliser un <span class="emphasis"><em>périphérique de boucle
(loopback)</em></span>, qui permet d'utiliser un fichier comme s'il
s'agissait d'un périphérique normal. Avec un périphérique de boucle,
vous pouvez créer un fichier de 3 méga-octets sur votre disque dur et
construire le système de fichiers dedans.
</p>
<p>
Tapez <span><b class="command">man losetup</b></span> pour savoir comment utiliser un
périphérique de boucle. Si vous n'avez pas <span><b class="command">losetup</b></span>,
vous pouvez le récupérer, ainsi que des versions compatibles de
<span><b class="command">mount</b></span> et <span><b class="command">umount</b></span>, dans le paquetage
<span class="emphasis"><em>util-linux</em></span> disponible dans le répertoire <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/" target="_top">
ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/</a>.
</p>
<p>
Si vous n'avez pas de périphérique de boucle
(<tt class="filename">/dev/loop0</tt>, <tt class="filename">/dev/loop1</tt>, et cætera)
sur votre système, vous devez en créer un avec <span><b class="command">mknod /dev/loop0
b 7 0</b></span>. Une fois les exécutables <span><b class="command">mount</b></span> et
<span><b class="command">umount</b></span> spéciaux installés, créez un fichier
temporaire sur le disque dur suffisamment grand (par exemple,
<tt class="filename">/tmp/fsfile</tt>). Vous pouvez utiliser une commande du
type :
</p>
<pre class="programlisting">
dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn
</pre>
<p>
pour créer un fichier de <span class="emphasis"><em>nnn</em></span> blocs.
</p>
<p>
Utilisez le nom du fichier à la place de PÉRIPHÉRIQUE ci-dessous. Quand
vous exécutez une commande <span><b class="command">mount</b></span>, vous devez inclure
l'option <tt class="option">-o loop</tt> pour dire au programme d'utiliser un
périphérique de boucle.  <a class="indexterm" name="id2513629"></a> Par exemple :
</p>
<pre class="programlisting">
mount -o loop -t ext2 /tmp/fsfile /mnt
</pre>
<p>
va monter <tt class="filename">/tmp/fsfile</tt> (par périphérique de boucle)
sur le point de montage <tt class="filename">/mnt</tt>. Un coup de
<span><b class="command">df</b></span> le confirmera.
</p>
</li>
</ul></div>
<p>
Après avoir choisi une de ces options, préparez le PÉRIPHÉRIQUE avec :
</p>
<pre class="programlisting">
dd if=/dev/zero of=PÉRIPHÉRIQUE bs=1k count=4096
</pre>
<p>
Cette commande initialise à zéro le périphérique. Cette étape est
importante pour la compression ultérieure du système de fichiers, afin
que toutes les portions inutilisées soient remplies de zéros pour une
compression maximum.  Gardez cela à l'esprit si vous déplacez ou effacez
des fichiers sur le système de fichiers. Le système de fichiers va
désallouer correctement les blocs, <span class="emphasis"><em>mais ne va pas les
initialiser à zéro à nouveau </em></span>. Si vous effectuez beaucoup
d'effacements et de copies, votre système de fichiers compressé risque
d'être bien plus grand que nécessaire.
</p>
<a class="indexterm" name="id2513707"></a><p>
Ensuite, créez le système de fichiers. Le noyau Linux sait charger
automatiquement deux types de système de fichiers dans un disque mémoire
: minix et ext2, avec une préférence pour ext2. Si vous le choisissez,
vous voudrez peut-être utiliser l'option <tt class="option">-i</tt> afin de
créer plus d'i-nœuds que par défaut ; <tt class="option">-i 2000</tt> est une
bonne valeur qui vous évitera de tomber à court d'i-nœuds. Vous pouvez
sinon économiser des i-nœuds en supprimant pas mal de fichiers
<tt class="filename">/dev/</tt> inutiles. <span><b class="command">mke2fs</b></span> crée par
défaut 360 i-nœuds sur une disquette de 1,44 Mo. Je trouve 
120 i-nœuds largement suffisants pour ma disquette racine 
de secours, mais si vous conservez tous les périphériques dans le 
répertoire <tt class="filename">/dev</tt> vous dépasserez facilement les 360.
L'utilisation d'un système racine compressé permet de créer un système
de fichiers plus grand, contenant donc plus d'i-nœuds par défaut, mais
vous pourrez quand même vouloir réduire le nombre de fichiers ou
augmenter le nombre d'i-nœuds.
</p>
<p>
Vous allez donc taper une commande du genre :
</p>
<pre class="programlisting">
mke2fs -m 0 -i 2000 <i class="replaceable"><tt>PÉRIPHÉRIQUE</tt></i>
</pre>
<p>
(Si vous utilisez un périphérique de boucle, le fichier que vous
utilisez doit être indiqué à la place de ce 
<i class="replaceable"><tt>PÉRIPHÉRIQUE</tt></i>. <span><b class="command">mke2fs</b></span> vous 
demandera alors si vous voulez vraiment faire cela ; répondez oui.)
</p>
<a class="indexterm" name="id2513762"></a><p>
La commande <span><b class="command">mke2fs</b></span> détectera automatiquement l'espace
disponible et se configurera selon ce dernier. Le paramètre <tt class="option">-m 0
</tt> permet de ne pas réserver d'espace pour root, et laisse donc plus
d'espace disponible sur le disque.
</p>
<p>
Ensuite, montez le périphérique :
</p>
<pre class="programlisting">
mount -t ext2 PÉRIPHÉRIQUE /mnt
</pre>
<p>
(Vous devez créer un point de montage <tt class="filename">/mnt</tt> s'il
n'existe pas encore.) Dans les sections suivantes, tous les répertoires
destination sont supposés relatifs à <tt class="filename">/mnt</tt>.
</p>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="id2513859"></a>4.3. Remplissage du système de fichiers</h3></div></div>
<div></div>
</div>
<p>
Voici un minimum raisonnable de répertoires à créer sur votre système
racine 
<sup>[<a name="id2513870" href="#ftn.id2513870">1</a>]</sup> :
</p>
<div class="itemizedlist"><ul type="disc">
<li><p> <tt class="filename">/dev</tt> : Périphériques, nécessaires
aux E/S ;</p></li>
<li><p> <tt class="filename">/proc</tt> : Répertoire de base
nécessaire au système de fichiers proc ;</p></li>
<li><p> <tt class="filename">/etc</tt> : Fichiers de configuration
du système ;</p></li>
<li><p> <tt class="filename">/sbin</tt> : Exécutables systèmes
critiques ;</p></li>
<li><p> <tt class="filename">/bin</tt> : Exécutables de base
considérés comme partie intégrante du système ;</p></li>
<li><p> <tt class="filename">/lib</tt> : Bibliothèques partagées
nécessaires à l'exécution des programmes ;</p></li>
<li><p> <tt class="filename">/mnt</tt> : Un point de montage pour la
maintenance des autres disques ;</p></li>
<li><p> <tt class="filename">/usr</tt> : Utilitaires et applications
supplémentaires.</p></li>
</ul></div>
<a class="indexterm" name="id2513990"></a><a class="indexterm" name="id2514002"></a><a class="indexterm" name="id2514014"></a><p>
Trois de ces répertoires resteront vides sur les systèmes racine, il
suffit donc de les créer avec <span><b class="command">mkdir</b></span>. Le répertoire
<tt class="filename">/proc</tt> n'est qu'une base sous laquelle le système
proc est placé. <tt class="filename">/mnt</tt> et <tt class="filename">/usr</tt>
ne sont que des points de montage utilisés une fois que le système
amorce/racine tourne. Encore une fois, il suffit de créer ces
répertoires.
</p>
<p>
Les quatre autres répertoires sont décrits dans les sections suivantes.
</p>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2514071"></a>4.3.1. <tt class="filename">/dev</tt></h4></div></div>
<div></div>
</div>
<p>
<a class="indexterm" name="id2514081"></a>
Tous les systèmes Linux ont besoin d'un répertoire
<tt class="filename">/dev</tt> contenant un fichier spécial par périphérique
accessible au système. Le répertoire en lui-même est normal, et peut
être créé avec <span><b class="command">mkdir</b></span> de la manière habituelle. Les
fichiers spéciaux de périphérique doivent par contre être créés
différemment, à l'aide de la commande <span><b class="command">mknod</b></span>.
</p>
<p>
Il y a un raccourci par contre : copiez le contenu de votre répertoire
<tt class="filename">/dev</tt> existant, puis supprimez ceux dont vous n'avez
pas besoin. Il suffit juste de copier les fichiers spéciaux avec
l'option <tt class="option">-R</tt>. Cela copie le répertoire sans tenter de
copier le contenu des fichiers. <span class="emphasis"><em>Attention à bien utiliser un R
en majuscule !</em></span> Si vous utilisez l'option en minuscule
<tt class="option">-r</tt>, vous allez vous retrouver en train de copier le
contenu complet de votre disque dur — ou au moins tout ce que pourra en
contenir une disquette ! Prenez donc vos précautions, et utilisez par
exemple les commandes :
</p>
<pre class="programlisting">
cp -dpR /dev/fd[01]* /mnt/dev
cp -dpR /dev/tty[0-6] /mnt/dev
</pre>
<p>
en supposant que la disquette est montée sur <tt class="filename">/mnt</tt>.
Les options <tt class="option">dp</tt> demandent la copie des liens symboliques
en tant que lien, plutôt que celle du fichier qui se trouve au bout de
celui-ci, et la conservation des attributs originaux des fichiers, pour
garder les bons propriétaires.
</p>
<p>
Si vous voulez le faire vous-mêmes, utilisez <span><b class="command">ls -l</b></span>
pour afficher les numéros majeurs et mineurs des périphériques qui vous
intéressent, et créez-les sur la disquette en utilisant
<span><b class="command">mknod</b></span>.
</p>
<p>
Quelle que soit la manière retenue pour copier les périphériques, il
faut vérifier que tous les périphériques dont vous aurez besoin sont
bien présents sur la disquette de secours. Par exemple,
<span><b class="command">ftape</b></span> utilise les périphériques de bande, qu'il vous
faudra donc tous copier si vous comptez utiliser votre lecteur de bande
depuis le disque amorce.
</p>
<p>
À noter qu'un i-nœud est nécessaire pour chaque fichier de
périphérique, et que les <span class="emphasis"><em>i-nœuds</em></span> sont parfois une
ressource rare, spécialement sur les systèmes de fichiers sur disquette.
Il n'est donc pas idiot d'enlever du répertoire
<tt class="filename">/dev</tt> de la disquette tous les fichiers de
périphérique dont vous n'avez pas besoin. Bien des périphériques ne sont
clairement pas nécessaires sur des systèmes spécifiques. Par exemple, si
vous n'avez pas de disques SCSI vous pouvez tranquillement enlever tous
les fichiers commençant par <tt class="filename">sd</tt>. De même, si vous ne
comptez pas utiliser de port série vous pouvez supprimer tous les
fichiers commençant par <tt class="filename">ttyS</tt>.
</p>
<p>
Si, en construisant le système de fichiers, vous obtenez l'erreur :
</p>
<pre class="programlisting">
No space left on device
</pre>
<p>
et que la commande <span><b class="command">df</b></span> indique qu'il reste de l'espace
disponible, c'est sans doutes qu'il n'y a plus d'i-nœud disponible.
Un <span><b class="command">df -i</b></span> affichera l'utilisation des i-nœuds.
</p>
<p>
<span class="emphasis"><em>N'oubliez pas d'inclure les fichiers suivants dans le
répertoire :</em></span> <tt class="filename">console</tt>,
<tt class="filename">kmem</tt>, <tt class="filename">mem</tt>,
<tt class="filename">null</tt>, <tt class="filename">ram0</tt>,
<tt class="filename">tty1</tt>.
</p>
</div>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2514340"></a>4.3.2. <tt class="filename">/etc</tt></h4></div></div>
<div></div>
</div>
<a class="indexterm" name="id2514348"></a><p>
Ce répertoire doit contenir un certain nombre de fichiers de
configuration. Ce qu'il devrait contenir dépend des programmes que vous
avez l'intention d'exécuter. Sur la plupart des systèmes, on peut les
répartir en trois groupes :
</p>
<div class="orderedlist"><ol type="1">
<li><p>Nécessaires à tout moment, par exemple
<tt class="filename">rc</tt>, <tt class="filename">fstab</tt>,
<tt class="filename">passwd</tt> ;</p></li>
<li><p>Peut-être nécessaires, mais on n'en est pas sûr
;</p></li>
<li><p>Du bazar oublié là.</p></li>
</ol></div>
<p>
Les fichiers non essentiels peuvent être identifiés avec la
commande :
</p>
<pre class="programlisting">
ls -ltru
</pre>
<p>
Les fichiers sont classés dans l'ordre inverse de dernière date
d'accès, donc tout fichier qui n'est jamais lu peut être exclu d'une
disquette racine.
</p>
<p>
Sur mes disquettes racine, je n'ai que 15 fichiers de
configuration. Mon travail se réduit alors à gérer trois groupes de
fichiers :
</p>
<div class="orderedlist"><ol type="1">
<li>
<p>Ceux que je dois configurer pour un système d'amorce et
racine :
  </p>
<div class="orderedlist"><ol type="a">
<li><p><tt class="filename">rc.d/*</tt> : scripts de démarrage du
système et de changement de niveau d'exécution ;</p></li>
<li><p><tt class="filename">fstab</tt> : liste des systèmes de
fichiers à monter ;</p></li>
<li><p><tt class="filename">inittab</tt> : paramètres pour le
processus <span><b class="command">init</b></span>, le premier à être lancé au
démarrage.</p></li>
<li><p><tt class="filename">gettydefs</tt> : paramètres pour le
processus <span><b class="command">init</b></span>, le premier à être lancé au
démarrage.</p></li>
</ol></div>
<p>
</p>
</li>
<li>
<p>Ceux que je dois nettoyer pour un système d'amorce et
racine :
</p>
<div class="orderedlist"><ol type="a">
<li><p><tt class="filename">passwd</tt> : liste des utilisateurs,
des répertoires utilisateurs, et cætera ;</p></li>
<li><p><tt class="filename">group</tt> : groupes d'utilisateurs
;</p></li>
<li><p><tt class="filename">shadow</tt> : mots de passe cachés des
utilisateurs. Il se peut que vous n'ayez pas ce fichier
;</p></li>
<li><p><tt class="filename">termcap</tt> : la base de données de
fonctionnalités des terminaux.</p></li>
</ol></div>
<p>
Si la sécurité est importante, <tt class="filename">passwd</tt> et
<tt class="filename">shadow</tt> doivent être nettoyés pour ne pas copier de
mots de passe d'utilisateurs hors du système et pour qu'en cas de
démarrage sur disquette, les logins indésirables soient rejetés.
<a class="indexterm" name="id2514585"></a>
</p>
<p>
Assurez-vous que <tt class="filename">passwd</tt> contienne au moins
<span class="emphasis"><em>root</em></span>. Si vous comptez donner accès à d'autres
utilisateurs, vérifiez l'existence de leurs répertoires utilisateurs et
de leurs shells.
</p>
<p>
<tt class="filename">termcap</tt>, la base de données de terminaux, fait en
général plusieurs centaines de kilo-octets. Vous devrez faire du ménage
dans la version de votre disquette d'amorce/racine pour ne conserver que
le ou les terminaux que vous utilisez, ce qui se réduit en général à
l'entrée <span class="emphasis"><em>linux</em></span> ou
<span class="emphasis"><em>linux-console</em></span>.
</p>
</li>
<li><p>Le reste. Ils fonctionnent très bien tels quel, je ne
les modifie donc pas.
</p></li>
</ol></div>
<p>
Parmi tout cela, je n'ai en réalité que deux fichiers à configurer, et
ils ne doivent contenir qu'étonnamment peu de choses.
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<p><tt class="filename">rc</tt> doit contenir :
</p>
<pre class="programlisting">
#!/bin/sh
/bin/mount -av
/bin/hostname Kangaroo
</pre>
<p>
Vérifiez qu'il est exécutable, qu'il contient bien une ligne
<span><b class="command">#!/bin/sh</b></span> au début et que ce sont les bons
répertoires. Il n'est pas réellement nécessaire de lancer
<span><b class="command">hostname</b></span>, mais cela donne juste une meilleure allure.
</p>
</li>
<li>
<p><tt class="filename">fstab</tt> doit au moins contenir :
</p>
<pre class="programlisting">
/dev/ram0       /       ext2    defaults
/dev/fd0        /       ext2    defaults
/proc           /proc   proc    defaults
</pre>
<p>
Vous pouvez copier des lignes de votre vrai <tt class="filename">fstab</tt>, 
mais vous ne devriez pas monter automatiquement de partitions de
votre disque dur ; utilisez le mot clé <span class="emphasis"><em>noauto</em></span> pour
celles-là. Votre disque peut être endommagé ou mort quand vous utilisez
le disque d'amorce.
</p>
</li>
</ul></div>
<p>
Votre <tt class="filename">inittab</tt> doit être modifié pour que la ligne
<span><b class="command">sysinit</b></span> lance <span><b class="command">rc</b></span> ou quelque autre
script basique d'amorce. De plus, si vous ne souhaitez pas que les
utilisateurs se loguent sur les ports série, commentez toutes les
entrées <span><b class="command">getty</b></span> qui font référence à des périphériques
<tt class="filename">ttys</tt> ou <tt class="filename">ttyS</tt> à la fin de la
ligne. Laissez les ports <tt class="filename">tty</tt> pour pouvoir vous
connecter sur la console.
</p>
<p>
Un fichier <tt class="filename">inittab</tt> minimal contient ce qui suit :
</p>
<pre class="programlisting">
id:2:initdefault
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
</pre>
<p>
Le fichier <tt class="filename">inittab</tt> décrit ce que va lancer le
système dans divers états, dont le démarrage, le passage en mode multi
utilisateurs, et cætera. Attention aux noms de fichiers référencés dans
<tt class="filename">inittab</tt> ; si <span><b class="command">init</b></span> ne peut
trouver le programme, le disque d'amorce s'arrêtera, et vous n'aurez
peut-être même pas de message d'erreur.
</p>
<a class="indexterm" name="id2514836"></a><p>
Notez que certains programmes ne peuvent être déplacés en raison
d'autres programmes qui référencent en dur leur position. Par exemple
sur mon système, <tt class="filename">/etc/shutdown</tt> référence en dur
<tt class="filename">/etc/reboot</tt>. Si je déplace
<span><b class="command">reboot</b></span> vers <span><b class="command">/bin/reboot</b></span>, et que je
lance une commande <span><b class="command">shutdown</b></span>, elle va échouer en ne
trouvant pas le fichier <span><b class="command">reboot</b></span>.
</p>
<a class="indexterm" name="id2514891"></a><p>
Pour le reste, copiez juste tous les fichiers texte de votre répertoire
<tt class="filename">/etc</tt>, ainsi que tous les exécutables présents dans
<tt class="filename">/etc</tt> dont vous n'êtes pas sûr de pouvoir vous
passer. Basez-vous sur l'exemple de l'<a href="apc.html" title="C. Exemple de contenu de répertoires sur un disque racine">Annexe C, <i>Exemple de contenu de répertoires sur un disque racine</i></a>.  Il
vous suffira probablement de copier ces fichiers, mais les systèmes
pouvant être très différents, il n'est pas certain que le même ensemble
de fichiers sur votre système soit équivalent aux fichiers listés. La
seule méthode sûre est de partir d'<tt class="filename">inittab</tt> et d'en
déduire ce qui est nécessaire.
</p>
<p>
La plupart des systèmes utilisent maintenant un répertoire
<tt class="filename">/etc/rc.d/</tt> contenant des scripts shell pour les
différents niveaux d'exécution. Il faut au minimum avoir un script
<span><b class="command">rc</b></span> unique, mais il peut être plus simple de carrément
copier <tt class="filename">inittab</tt> et le répertoire
<tt class="filename">/etc/rc.d</tt> depuis votre système puis de nettoyer les
scripts shell dans le répertoire <tt class="filename">rc.d</tt> pour enlever
tous les traitements inutiles pour un système sur disquette.
</p>
</div>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2514989"></a>4.3.3. <tt class="filename">/bin</tt> et <tt class="filename">/sbin</tt></h4></div></div>
<div></div>
</div>
<p>
<a class="indexterm" name="id2515006"></a>
<a class="indexterm" name="id2515013"></a>
Le répertoire <tt class="filename">/bin</tt> est un endroit pratique pour
tous les utilitaires nécessaires aux opérations de base, tels que
<span><b class="command">ls</b></span>, <span><b class="command">mv</b></span>, <span><b class="command">cat</b></span> et
<span><b class="command">dd</b></span>. Voir l'<a href="apc.html" title="C. Exemple de contenu de répertoires sur un disque racine">Annexe C, <i>Exemple de contenu de répertoires sur un disque racine</i></a> pour un
exemple d'ensemble de fichiers pouvant aller dans les répertoires
<tt class="filename">/bin</tt> et <tt class="filename">/sbin</tt>. Il ne contient
aucun des utilitaires nécessaires à la récupération d'une sauvegarde,
tels que <span><b class="command">cpio</b></span>, <span><b class="command">tar</b></span> et
<span><b class="command">gzip</b></span>. C'est parce que je place ceux-ci sur une
disquette utilitaire séparée, pour conserver de la place sur la
disquette d'amorce et racine. Une fois la disquette d'amorce/racine
démarrée, elle est copiée sur le disque mémoire, laissant ainsi le
lecteur de disquette libre pour en monter une autre, la disquette
utilitaire. En général je la monte sur <tt class="filename">/usr</tt>.
</p>
<p>
La création d'une <span class="emphasis"><em>disquette utilitaire</em></span> est décrite
ci-dessous dans la <a href="ar01s09.html#utilitydisk" title="9.2. Construire un disque utilitaire">Section 9.2, « Construire un disque utilitaire »</a> . Il est probablement
souhaitable d'y maintenir une copie des mêmes versions d'utilitaires de
sauvegarde que ceux utilisés pour écrire les sauvegardes, histoire de ne
pas perdre de temps en essayant d'installer des versions qui ne peuvent
pas lire vos bandes de sauvegarde.
</p>
<p>
<span class="emphasis"><em>Vérifiez que vous y mettez les programmes suivants :</em></span>
<span><b class="command">init</b></span>, <span><b class="command">getty</b></span> ou un équivalent,
<span><b class="command">login</b></span>, <span><b class="command">mount</b></span>, un shell capable de
faire tourner votre script <span><b class="command">rc</b></span>, un lien de
<span><b class="command">sh</b></span> vers le shell en question.
</p>
<a class="indexterm" name="id2515175"></a><a class="indexterm" name="id2515187"></a><a class="indexterm" name="id2515199"></a><a class="indexterm" name="id2515212"></a>
</div>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2515220"></a>4.3.4. <tt class="filename">/lib</tt></h4></div></div>
<div></div>
</div>
<p>
<a class="indexterm" name="id2515230"></a>
<a class="indexterm" name="id2515237"></a>
Vous mettez dans <tt class="filename">/lib</tt> les bibliothèques partagées
et les chargeurs nécessaires. Si les bibliothèques nécessaires ne sont pas
trouvées dans <tt class="filename">/lib</tt>, le système ne pourra pas
démarrer. Avec de la chance, un message vous expliquera pourquoi.
</p>
<p>
Pratiquement tous les programmes ont au moins besoin de la bibliothèque
<tt class="filename">libc</tt>,
<tt class="filename">libc.so.</tt><span class="emphasis"><em>N</em></span>,
<span class="emphasis"><em>N</em></span> étant le numéro de version courant. Vérifiez
votre répertoire <tt class="filename">/lib</tt>,
<tt class="filename">libc.so.N</tt> est en général un lien symbolique vers un
fichier avec un numéro de version complet :
</p>
<pre class="programlisting">
% ls -l /lib/libc.so*
-rwxr-xr-x   1 root     root      4016683 Apr 16 18:48 libc-2.1.1.so*
lrwxrwxrwx   1 root     root           13 Apr 10 12:25 libc.so.6 -&gt; libc-2.1.1.so*
</pre>
<p>
Dans le cas présent, il vous faut <tt class="filename">libc-2.1.1.so</tt>.
Pour trouver les autres bibliothèques nécessaires, il faut lancer la
commande <span><b class="command">ldd</b></span> sur tous les exécutables que vous
prévoyez de mettre sur la disquette. Par exemple :
</p>
<pre class="programlisting">
% ldd /sbin/mke2fs
libext2fs.so.2 =&gt; /lib/libext2fs.so.2 (0x40014000)
libcom_err.so.2 =&gt; /lib/libcom_err.so.2 (0x40026000)
libuuid.so.1 =&gt; /lib/libuuid.so.1 (0x40028000)
libc.so.6 =&gt; /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)
</pre>
<p>
Tous les fichiers à droite sont nécessaires. Le fichier peut en
réalité être un lien symbolique.
</p>
<p>
Notez que certaines bibliothèques sont <span class="emphasis"><em>assez
grosses</em></span> et ne tiendront pas facilement sur votre système
racine. Par exemple, la <tt class="filename">libc.so</tt> citée précédemment
fait environ 4 méga-octets. Vous devrez probablement nettoyer les
bibliothèques avant de les copier sur votre système racine.
Reportez-vous à la <a href="ar01s08.html" title="8. Réduire la taille du système racine">Section 8, « Réduire la taille du système racine »</a> pour plus d'informations.
</p>
<a class="indexterm" name="id2515379"></a><a class="indexterm" name="id2515385"></a><a class="indexterm" name="id2515392"></a><a class="indexterm" name="id2515399"></a><p>
Il faut également inclure dans <tt class="filename">/lib</tt> un chargeur
pour les bibliothèques. Il s'agira soit de <tt class="filename">ld.so</tt>
(pour les bibliothèques a.out), soit de <tt class="filename">ld-linux.so</tt>
(pour les bibliothèques ELF). Les versions  récentes de
<span><b class="command">ldd</b></span> vous indiquent de quel chargeur vous avez besoin,
comme dans l'exemple ci-dessus, mais de plus anciennes versions ne le
font pas forcément. Si vous ne savez pas duquel vous avez besoin,
utilisez la commande <span><b class="command">file</b></span> sur la bibliothèque. Par
exemple :
</p>
<pre class="programlisting">
% file/lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
</pre>
<p>
Le mot <span class="emphasis"><em>QMAGIC</em></span> indique que
<span class="emphasis"><em>4.7.2</em></span> est pour les bibliothèques a.out, et
<span class="emphasis"><em>ELF</em></span> que <span class="emphasis"><em>5.4.33</em></span> et
<span class="emphasis"><em>2.1.1</em></span> sont pour les ELF.
</p>
<a class="indexterm" name="id2515487"></a><a class="indexterm" name="id2515493"></a><p>
Copiez le ou les chargeurs dont vous avez besoin sur le système racine
que vous êtes en train de construire. Les bibliothèques et chargeurs
doivent être testés <span class="emphasis"><em>attentivement</em></span> avec les
exécutables inclus. Si le noyau ne peut charger une bibliothèque
nécessaire, il s'arrêtera en général brutalement, sans message d'erreur.
</p>
</div>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="PAMNSS"></a>4.4. Utilisation de PAM et NSS</h3></div></div>
<div></div>
</div>
<p>
Votre système peut utiliser des bibliothèques chargées dynamiquement
mais invisibles pour <tt class="filename">ldd</tt>. Si vous ne les incluez pas,
vous risquez de ne pas pouvoir vous connecter ou utiliser votre
disquette d'amorce.
</p>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2515543"></a>4.4.1. PAM (Pluggable Authentication Modules)</h4></div></div>
<div></div>
</div>
<p>
Si votre système utilise PAM (Pluggable Authentication Modules, soit
Modules Externes d'authentification), tenez-en compte dans la
construction de votre disque d'amorce, sans quoi vous ne pourrez pas
vous connecter. En quelques mots, PAM est une méthode modulaire
sophistiquée pour authentifier les utilisateurs et contrôler leur accès
aux services. Pour déterminer simplement si votre système utilise PAM,
cherchez dans le répertoire <tt class="filename">/etc</tt> de votre disque
dur un fichier <tt class="filename">pam.conf</tt> ou un répertoire
<tt class="filename">pam.d</tt> ; si l'un des deux existe, vous devez prévoir
un minimum de support pour PAM. (Vous pouvez aussi lancer
<tt class="filename">ldd</tt> sur votre exécutable <tt class="filename">login</tt>
; si la sortie contient <tt class="filename">libpam.so</tt>, vous avez besoin
de PAM.)
</p>
<p>
Heureusement, la sécurité est rarement un problème avec les disques
d'amorce étant donné que quiconque avec un accès physique à la
machine peut en général faire tout ce qu'il veut dessus. Vous pouvez
donc complètement désactiver PAM en créant un fichier
<tt class="filename">/etc/pam.conf</tt> simple sur votre système racine
contenant :
</p>
<pre class="programlisting">
OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so
</pre>
<p>
Copiez également le fichier
<tt class="filename">/lib/security/pam_permit.so</tt> sur votre système
racine. Cette bibliothèque ne fait qu'environ 8 ko et ne coûte donc
pas grand chose.
</p>
<p>
Notez bien que cette configuration donne à tous un accès complet aux
fichiers et services de votre machine. Si vous avez des impératifs de
sécurité sur votre disque d'amorce pour une raison ou une autre, vous
devrez copier une partie, voire l'ensemble de la configuration PAM de
votre disque dur vers le système racine. Lisez bien attentivement la
documentation de PAM, et copiez toutes les bibliothèques nécessaires
depuis <tt class="filename">/lib/security</tt> vers votre système racine.
</p>
<p>
Vous devez aussi inclure <tt class="filename">/lib/libpam.so</tt> sur le
disque racine. Mais vous le saviez déjà puisque vous avez lancé
<span><b class="command">ldd</b></span> sur <tt class="filename">/bin/login</tt> qui vous a
montré cette dépendance.
</p>
</div>
<div class="sect3" lang="fr">
<div class="titlepage">
<div><div><h4 class="title">
<a name="id2515695"></a>4.4.2. NSS (Name Service Switch)</h4></div></div>
<div></div>
</div>
<p>
Si vous utilisez <span class="emphasis"><em>glibc</em></span> (appelée aussi
<span class="emphasis"><em>libc6</em></span>), vous devez tenir compte des services de
noms sans quoi vous ne pourrez pas vous connecter. Le fichier
<tt class="filename">/etc/nsswitch.conf</tt> contrôle les recherches dans les
bases de données pour divers services. Si vous ne comptez pas accéder à
des services du réseau (tels que des recherches DNS ou NIS), un simple
fichier <tt class="filename">nsswitch.conf</tt> comme suit suffit :
</p>
<pre class="programlisting">
passwd:     files
shadow:     files
group:      files
hosts:      files
services:   files
networks:   files
protocols:  files
rpc:        files
ethers:     files
netmasks:   files
bootparams: files
automount:  files
aliases:    files
netgroup:   files
publickey:  files
</pre>
<p>
Ce fichier spécifie que tous les services ne sont fournis que par des
fichiers locaux de la machine. Vous devez aussi inclure le fichier
<tt class="filename">/lib/libnss_files.so.X</tt>, où X vaut 1 pour une glibc
2.0 et 2 pour une glibc 2.1. Cette bibliothèque est chargée
dynamiquement pour gérer les recherches dans les fichiers.
</p>
<p>
Si vous comptez accéder au réseau depuis votre disque d'amorce, vous
pouvez créer un fichier <tt class="filename">nsswitch.conf</tt> plus complet.
Voir la page de manuel de <tt class="filename">nsswitch</tt> pour plus de
détails. N'oubliez pas d'inclure un fichier
<tt class="filename">/lib/libnss_</tt><span class="emphasis"><em>service</em></span><tt class="filename">.so.1
</tt>
pour chaque <span class="emphasis"><em>service</em></span> que vous ajoutez.
</p>
</div>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="id2515801"></a>4.5. Modules</h3></div></div>
<div></div>
</div>
<p>
<a class="indexterm" name="id2515808"></a>
Si votre noyau est modulaire, vous devez savoir quels modules vous
voudrez charger depuis votre disque d'amorce une fois le système
démarré. Il vous faudra inclure les modules <span><b class="command">ftape</b></span> et
<span><b class="command">zftape</b></span> si vos sauvegardes sont sur bandes, les
modules pour périphériques SCSI si vous en avez, et éventuellement ceux
pour le support PPP ou SLIP si vous souhaitez accéder au réseau en cas
d'urgence.
</p>
<a class="indexterm" name="id2515840"></a><p>
Ces modules doivent être placés dans <tt class="filename">/lib/modules</tt>.
Vous devez aussi inclure <span><b class="command">insmod</b></span>,
<span><b class="command">rmmod</b></span> et <span><b class="command">lsmod</b></span>. Si vous souhaitez
charger les modules automatiquement, prenez <span><b class="command">modprobe</b></span>,
<span><b class="command">depmod</b></span> et <span><b class="command">swapout</b></span>. Et si vous
utilisez <span><b class="command">kerneld</b></span>, prenez le avec son fichier de
configuration <tt class="filename">/etc/conf.modules</tt>.
</p>
<p>
Néanmoins, le principal avantage d'utiliser les modules est que vous
pouvez déplacer les modules non essentiels sur un disque utilitaire et
ne les charger que lorsque c'est nécessaire, ce qui prend alors moins de
place sur le disque racine. Si vous devez gérer beaucoup de
périphériques, il vaut mieux procéder de cette manière plutôt que de
construire un seul gros noyau contenant tous les gestionnaires.
</p>
<a class="indexterm" name="id2515927"></a><p>
<span class="emphasis"><em>Attention, pour démarrer avec un système de fichiers ext2
compressé, vous devez avoir inclus le support pour disque mémoire et
ext2.</em></span> Ils ne peuvent être installés par des modules.
</p>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="id2515948"></a>4.6. Quelques ultimes détails</h3></div></div>
<div></div>
</div>
<p>
Certains programmes, tels que <span><b class="command">login</b></span>, se plaignent si
le fichier <tt class="filename">/var/run/utmp</tt> et le répertoire
<tt class="filename">/var/log</tt> n'existent pas.
</p>
<a class="indexterm" name="id2515975"></a><p>
Donc :
</p>
<pre class="programlisting">
mkdir -p /mnt/var/{log,run}
touch /mnt/var/run/utmp
</pre>
<p>
Enfin, après avoir installé toutes les bibliothèques dont vous avez
besoin, lancez <span><b class="command">ldconfig</b></span> pour refabriquer
<tt class="filename">/etc/ld.so.cache</tt> sur le système racine. Le cache
indique au loader où trouver les bibliothèques. Pour refabriquer
<tt class="filename">ld.so.cache</tt>, lancez la commande suivante :
</p>
<a class="indexterm" name="id2516026"></a><a class="indexterm" name="id2516039"></a><pre class="programlisting">
ldconfig -r /mnt
</pre>
</div>
<div class="sect2" lang="fr">
<div class="titlepage">
<div><div><h3 class="title">
<a name="wrappingitup"></a>4.7. C'est dans la poche</h3></div></div>
<div></div>
</div>
<p>
Une fois le système racine construit, démontez-le, copiez-le dans un
fichier et compressez-le :
</p>
<pre class="programlisting">
umount /mnt
dd if=PÉRIPHÉRIQUE bs=1k | gzip -v9 &gt; rootfs.gz
</pre>
<p>
Une fois cette étape effectuée, vous obtenez un fichier
<tt class="filename">rootfs.gz</tt> contenant votre système racine compressé.
Vérifiez sa taille pour être sûr qu'il tient sur une disquette. Si ça
n'est pas le cas vous devrez y retourner pour supprimer certains
fichiers. La <a href="ar01s08.html" title="8. Réduire la taille du système racine">Section 8, « Réduire la taille du système racine »</a> vous donnera des astuces pour y
arriver.
</p>
</div>
<div class="footnotes">
<br><hr width="100" align="left">
<div class="footnote"><p><sup>[<a name="ftn.id2513870" href="#id2513870">1</a>] </sup>
La structure de répertoires présentée ici concerne une disquette racine
seule.  Les vrais systèmes Linux obéissent à un ensemble de règles bien plus
complexes et contrôlées, appelé le <a href="http://www.pathname.com/fhs/2.2/" target="_top">Filesystem Hierarchy 
Standard</a>, pour déterminer où les fichiers doivent aller.
</p></div>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="ar01s03.html">Précédent</a> </td>
<td width="20%" align="center"><a accesskey="u" href="index.html">Niveau supérieur</a></td>
<td width="40%" align="right"> <a accesskey="n" href="ar01s05.html">Suivant</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">3. Disques d'amorce et démarrage </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td>
<td width="40%" align="right" valign="top"> 5. Choisir un noyau</td>
</tr>
</table>
</div>
</body>
</html>