<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 -> 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 => /lib/libext2fs.so.2 (0x40014000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) libc.so.6 => /lib/libc.so.6 (0x4002c000) /lib/ld-linux.so.2 => /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 > 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>