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 !