<p class="spip">Le but de l’atelier était de comprendre les étapes d’amorcage d’un systeme GNU/Linux. Le lecteur de salon n’est qu’un prétexte pour arriver à cette finalité.</p>

<p class="spip">Il nous faut arrivé à lancer un ogg123 et un mixeur audio sur un systeme le plus minimaliste possible (le système complet pesant une quinzaine de Mo à la fin). Nous allons, pour cela copier fichier par fichier ce que nous aurons besoin depuis un systeme GNU/Linux fonctionnel.</p>

<p class="spip">Je pars du principe que vous avez un système fonctionnel et que les commandes de base sont connus.</p>

<p class="spip">Nous avons une partition vide d’au moins 20mo monté dans /mnt/hd.
Le document se base sur une slackware 9.1, mais tout autre distribution/version donnera des résultats semblable.</p>

<h2>Le noyau</h2>
<h3>Copie du noyau</h3>
<p class="spip">Le noyau est le première élément lancé (après le programme d’amorçage). Il est nécessaire de le copier sur la partition libre.</p>

<p class="spip">Le noyau se trouve usuellement dans /boot et à un nom du type vmlinuz- ????.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># mkdir /mnt/hd/boot<br />
# cp -L /boot/vmlinuz-ide-2.4.22 /mnt/hd/boot/vmlinuz</code></div>
<p class="spip">L’option -L de cp permet de copier le fichier cible et non d’éventuel lien symbolique (merci Dont-Panic pour l’astuce).</p>

<p class="spip">Il est courant que les distributions utilisent initrd. Initrd est un petit système de fichier permettant de charger des modules au noyau. Cela permet de compiler en modules la prise en charge de son système de fichier (ext3, reiserfs, ...).</p>

<p class="spip">Si vous utilisez initrd, il est nécessaire de le copier :
<code class='spip_code' dir='ltr'># cp -L /boot/initrd.img-ide-2.4.22 /mnt/hd/boot/initrd.img</code></p>

<h3>Configuration du programme d’amorçage</h3>
<p class="spip">Une fois le noyau copier (et éventuellement le initrd), il nous faut configurer le programme d’amorçage.</p>

<h4>lilo</h4>
<p class="spip">Editer /etc/lilo.conf ajouter à la fin une section du type (il est préférable de s’inspirer de sa configuration de GNU/Linux actuelle) :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># vi /etc/lilo.conf<br />
image = /mnt/hd/boot/vmlinuz<br />
  root = /dev/hda3<br />
  #seulement si vous utilisez initrd<br />
  initrd = /boot/initrd.img<br />
  label = MicroLinux<br />
  read-only<br />
# lilo<br />
Added Linux *<br />
Added MicroLinux</code></div>
<p class="spip">Le read-only est ici obligatoire. En effet, nous éteindrons la machine de façon brutale.</p>

<h4>grub</h4>
<div style='text-align: left;' class='spip_code' dir='ltr'><code># vi /boot/grub/menu.lst<br />
  title              MicroLinux<br />
  root               hd(0,5)<br />
  kernel             /boot/vmlinuz root=/dev/hda6 ro<br />
  #seulement si vous utilisez initrd<br />
  initrd             /boot/initrd.img<br />
  savedefault</code></div>
<p class="spip">Le "ro" est ici obligatoire. En effet, nous éteindrons la machine de façon brutale.</p>

<h4>Premier test</h4>
<p class="spip">Nous redémarrons sur cette partition. Nous ne devrions pas aller plus loin que les lignes suivantes :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>Warning: unable to open an initial console.<br />
Kernel panic: No init found. Try passing init= option to kernel.</code></div>
<h2>init</h2>
<p class="spip">Comme l’indique le message précédent, le noyau n’est pas capable de trouver le programme init. Il nous faut l’ajouter.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># mkdir /mnt/hd/sbin<br />
# cp /sbin/init /mnt/hd/sbin</code></div>
<p class="spip">Au démarrage, nous avons le message suivant :</p>

<p class="spip"><code class='spip_code' dir='ltr'>Warning: unable to open an initial console.</code></p>

<p class="spip">Attention, si vous avez encore le message disans que init n’est pas trouvable, voir le paragraphe "ls" pour copier les bibliothèques manquantes.</p>

<h2>le périphérique console</h2>
<p class="spip">Créons le périphérique "console". Sous Unix, tout est fichier. Même les périphériques. Ces fichiers sont spéciaux, il utilise un numéro majeur et mineur pour communiquer aux systèmes d’exploitation. Il existe deux types de fichiers spéciaux : les blocs (b) et les caractères (c). La différence avec les deux, c’est la présence d’un buffer pour les périphériques en mode bloc.</p>

<p class="spip">Pour récupérer ces numéros et créer les fichiers, il suffit de faire :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ls -l /dev/console<br />
crw-------    1 root     tty     5,     1 May   8 10:19 /dev/console<br />
# mknod /mnt/hd/dev/console c 5 1</code></div>
<p class="spip">Au démarrage nous avons le message suivant :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>INIT: version 2.84 booting<br />
INIT: No inittab file found<br />
INIT: can't open (/etc/ioctl.save, O_WRONLY): No such file or directory<br />
<br />
Enter runlevel: 3<br />
INIT: can't open (/etc/ioctl.save, O_WRONLY): No such file or directory<br />
INIT: Entering runlevel: 3<br />
INIT: no more processes left in this runlevel</code></div>
<p class="spip">Il nous faut donc le fichier de configuration inittab.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># mkdir /mnt/hd/etc<br />
# vi /mnt/hd/etc/inittab<br />
id:3:initdefault:<br />
si::sysinit:/bin/ls<br />
c1:1235:respawn:/sbin/agetty 38400 tty1 linux</code></div>
<p class="spip">Le fichier est composer de ligne divisé en quatre partie séparer par des " :".</p>

<p class="spip">La première est un identifiant de ligne de deux caractères.</p>

<p class="spip">La deuxième correspond au runlevel (il peut en avoir plusieurs).</p>

<p class="spip">La troisième correspond à l’action : initdefault (runlevel), wait (attend que le processus soit fini pour continuer, respawn (redemarre le processus quand il se termine), ...</p>

<p class="spip">La quatrième définit le programme lancé.</p>

<h2>Notre première application : ls</h2>
<p class="spip">Comme vous pouvez le voir nous cherchons à lancer un ls. Il nous font donc le copier.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># mkdir /mnt/hd/bin<br />
# cp /bin/ls /mnt/hd/bin</code></div>
<p class="spip">Au démarrage nous avons :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>INIT: version 2.84 booting<br />
INIT: cannot execute "/bin/ls"<br />
INIT: Entering runlevel: 3<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: id "c1" respawning too fast: disabled for 5 minutes<br />
INIT: no more processes left in this runlevel</code></div>
<p class="spip">Etrangement, il ne trouve pas ls. Revenons au système valide pour voir ce qu’il se passe.</p>

<p class="spip">Nous allons utiliser la commande chroot. Celle-ci permet de modifier la racine. Cela permet de lancer une commande comme si nous avons démarrer sur une partition différente.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># chroot /mnt/hd/ /bin/ls<br />
chroot: /bin/ls: No such file or directory</code></div>
<p class="spip">Il nous manque quelque chose. Regardons du côté des bibliothèques partagées et copions celle qui manque. Pour cela nous allons utiliser la commande ldd :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ldd /mnt/hd/bin/ls<br />
       librt.so.1 => /lib/librt.so.1 (0x40019000)<br />
       libc.so.6 => /lib/libc.so.6 (0x4002c000)<br />
       libpthread.so.0 => /lib/libpthread.so.0 (Ox40162000)<br />
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)<br />
# mkdir /mnt/hd/lib<br />
# cp -L /lib/librt-2.3.2.so /mnt/hd/lib/</code></div>
<p class="spip">Il faut faire pareil avec les 3 autres bibliotheques.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># chroot /mnt/hd/ /bin/ls<br />
bin  boot  dev  etc  lib  sbin</code></div>
<p class="spip">Redémarrons pour tester :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>INIT: version 2.84 booting<br />
bin  boot  dev  etc  lib  sbin<br />
INIT: Entering runlevel: 3<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: cannot execute "/sbin/agetty"<br />
INIT: id "c1" respawning too fast: disabled for 5 minutes<br />
INIT: no more processes left in this runlevel</code></div>
<p class="spip">Donc ls fonctionne correctement.</p>

<p class="spip">La suite, dans le deuxième atelier sur le sujet.</p>