Skip to Content

Première partie de la création d’un mini lecteur de salon, arriver à lancer ls

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é.

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.

Je pars du principe que vous avez un système fonctionnel et que les commandes de base sont connus.

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.

Le noyau

Copie du noyau

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.

Le noyau se trouve usuellement dans /boot et à un nom du type vmlinuz- ????.

# mkdir /mnt/hd/boot
# cp -L /boot/vmlinuz-ide-2.4.22 /mnt/hd/boot/vmlinuz

L’option -L de cp permet de copier le fichier cible et non d’éventuel lien symbolique (merci Dont-Panic pour l’astuce).

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, ...).

Si vous utilisez initrd, il est nécessaire de le copier :
# cp -L /boot/initrd.img-ide-2.4.22 /mnt/hd/boot/initrd.img

Configuration du programme d’amorçage

Une fois le noyau copier (et éventuellement le initrd), il nous faut configurer le programme d’amorçage.

lilo

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) :

# vi /etc/lilo.conf
image = /mnt/hd/boot/vmlinuz
 root = /dev/hda3
 #seulement si vous utilisez initrd
 initrd = /boot/initrd.img
 label = MicroLinux
 read-only
# lilo
Added Linux *
Added MicroLinux

Le read-only est ici obligatoire. En effet, nous éteindrons la machine de façon brutale.

grub

# vi /boot/grub/menu.lst
 title              MicroLinux
 root               hd(0,5)
 kernel             /boot/vmlinuz root=/dev/hda6 ro
 #seulement si vous utilisez initrd
 initrd             /boot/initrd.img
 savedefault

Le "ro" est ici obligatoire. En effet, nous éteindrons la machine de façon brutale.

Premier test

Nous redémarrons sur cette partition. Nous ne devrions pas aller plus loin que les lignes suivantes :

Warning: unable to open an initial console.
Kernel panic: No init found. Try passing init= option to kernel.

init

Comme l’indique le message précédent, le noyau n’est pas capable de trouver le programme init. Il nous faut l’ajouter.

# mkdir /mnt/hd/sbin
# cp /sbin/init /mnt/hd/sbin

Au démarrage, nous avons le message suivant :

Warning: unable to open an initial console.

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

le périphérique console

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.

Pour récupérer ces numéros et créer les fichiers, il suffit de faire :

# ls -l /dev/console
crw-------    1 root     tty     5,     1 May   8 10:19 /dev/console
# mknod /mnt/hd/dev/console c 5 1

Au démarrage nous avons le message suivant :

INIT: version 2.84 booting
INIT: No inittab file found
INIT: can't open (/etc/ioctl.save, O_WRONLY): No such file or directory

Enter runlevel: 3
INIT: can't open (/etc/ioctl.save, O_WRONLY): No such file or directory
INIT: Entering runlevel: 3
INIT: no more processes left in this runlevel

Il nous faut donc le fichier de configuration inittab.

# mkdir /mnt/hd/etc
# vi /mnt/hd/etc/inittab
id:3:initdefault:
si::sysinit:/bin/ls
c1:1235:respawn:/sbin/agetty 38400 tty1 linux

Le fichier est composer de ligne divisé en quatre partie séparer par des " :".

La première est un identifiant de ligne de deux caractères.

La deuxième correspond au runlevel (il peut en avoir plusieurs).

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), ...

La quatrième définit le programme lancé.

Notre première application : ls

Comme vous pouvez le voir nous cherchons à lancer un ls. Il nous font donc le copier.

# mkdir /mnt/hd/bin
# cp /bin/ls /mnt/hd/bin

Au démarrage nous avons :

INIT: version 2.84 booting
INIT: cannot execute "/bin/ls"
INIT: Entering runlevel: 3
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: id "c1" respawning too fast: disabled for 5 minutes
INIT: no more processes left in this runlevel

Etrangement, il ne trouve pas ls. Revenons au système valide pour voir ce qu’il se passe.

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.

# chroot /mnt/hd/ /bin/ls
chroot: /bin/ls: No such file or directory

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 :

# ldd /mnt/hd/bin/ls
      librt.so.1 => /lib/librt.so.1 (0x40019000)
      libc.so.6 => /lib/libc.so.6 (0x4002c000)
      libpthread.so.0 => /lib/libpthread.so.0 (Ox40162000)
      /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
# mkdir /mnt/hd/lib
# cp -L /lib/librt-2.3.2.so /mnt/hd/lib/

Il faut faire pareil avec les 3 autres bibliotheques.

# chroot /mnt/hd/ /bin/ls
bin  boot  dev  etc  lib  sbin

Redémarrons pour tester :

INIT: version 2.84 booting
bin  boot  dev  etc  lib  sbin
INIT: Entering runlevel: 3
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: cannot execute "/sbin/agetty"
INIT: id "c1" respawning too fast: disabled for 5 minutes
INIT: no more processes left in this runlevel

Donc ls fonctionne correctement.

La suite, dans le deuxième atelier sur le sujet.

Commentaires

Première partie de la création d’un mini lecteur de salon, arriv

Le but était au début de comprendre comment fonctionne le démarrage. A vrai dire, la 1er fois que j’avais fait cela, c’etait pour un lecteur MP3 de base pour salon. Le tout fonctionnant avec un script bash maison et mpg123. C’était plus pour apprendre que pour une réel utilisation.

Il existe déjà des distributions spécialisés dans la MAO mais je suppose que tu es déjà au courant. Bon courage pour la suite ;)

Première partie de la création d’un mini lecteur de salon, arriv

Merci pour cet article, en effet malgrés l’absence de fin de ce projet, il me permet de comprendre l’utilisation du systeme linux dans une application dedié, le miens étant de faire un linux orienté mao (midi) a partir d’un vieux pentium 400 avec 128 mo de ram. (oui oui c’est possible)

Première partie de la création d’un mini lecteur de salon, arriv

L’atelier n’a jamais été réalisé, il n’y a donc pas, malheureusement de seconde partie.

Première partie de la création d’un mini lecteur de salon, arriv

Dites moi si je ne suis pas bien reveillé mais je n’arrive pas à trouver la seconde partie de cet article.

Merci de m’indiquer où je pourrais la trouver.

Cordialement, 40tude

Première partie de la création d’un mini lecteur de salon, arriv

Quel superbe article !
C’est exactement ce que je voulais faire,mais avec le peu de connaissance que j’ai c’était mal parti,enfin j’avais dans l’idée de ma lancer dans un LFS,mais ça me semblait arriver à une "distribution" un peu trop importante !

Je vous remercie...Vivement la suite !