Niveau :      
Résumé : bios, bootloader, noyau, init, rc

Je ne me souviens pas avoir fait un article complet sur le processus de boot. Il y en avait un partiel ici. En voici un !

BIOS

Le bios est le premier élément à être lancé, si on excepte l'appui sur le bouton ON et quelques autres détails. Celui-ci initialise le processeur ainsi qu'une partie du matériel, comme la carte vidéo ou le clavier.

Le bios est constitué d'une mémoire (rom ou flash) placée sur la carte mère.

Notez que quasiment tous les bios étant maintenant des flash il est possible de les mettre à jour, voire de les remplacer. Et justement un projet existe pour remplacer les bios propriétaires par des bios libres (comme Max): coreboot de son ancien nom linuxbios.

Le bios est configuré pour choisir un périphérique sur lequel booter. En général c'est le premier disque dur, mais cela peut aussi être une clé usb ou un lecteur disquette. Il est même possible de choisir au moment du boot.

Sur le périphérique en question, et à l'exception du lecteur CD qui a son protocole (el torito), le bios charge le premier secteur (512 octets), le met en RAM, et le lance.

Notez que le "BIOS" est spécifique aux PC, d'autres architectures ont des firmware EFI (Apple) ou des OpenBoot (Sun).

Bootloader

Dans ce premier secteur se trouve le bootloader (grub, lilo, silo, syslinux, mbr dos ...).

Le bootloader est découpé en plusieurs morceaux à cause de la limite des 512 octets. Sa première activité est de réussir à se charger complètement.

Celui de windows est assez simpliste, mais sous linux on en trouve avec plein de fonctionnalités sympa.

Une fois qu'il est prêt, il lit sa configuration puis choisit un périphérique et une partition où lire le noyau et éventuellement un initrd. Et enfin il passe la main au noyau en lui donnant quelques paramètres.

Noyau

Le noyau est déjà chargé, il n'a "presque" plus rien à faire. Si ce n'est tout initialiser : les interruptions, le mode du processeur, les périphériques ...

Une fois qu'il a fini (ou même un peu avant) il monte la racine (/) à partir de de qui lui a été spécifié en ligne de commande.

Et enfin il lance init en lui passant quelques paramètres provenant de sa propre ligne de commande.

Si un initrd est chargé, il l'utilise comme racine et prend l'init s'y trouvant. Dans ce cas il ne cherche pas à monter la racine. Sinon GoTo init.

Initrd

Initrd est un intermédiaire qui a été rajouté au processus de boot pour permettre le chargement dynamique de driver ainsi que la configurations de certain éléments comme le réseau ou le NFS.

Initrd est un ancien nom. En pratique, c'est maintenant un initramfs qui est chargé (c'est la même chose mais en mieux, le premier est un block device et le second une archive) avant le montage de la racine. Celui-ci est monté à la racine. Son boulot, rendre la vraie racine accessible. NFS, driver manquant, LVM, toutes les raisons sont bonnes pour utiliser un initrd.

Et enfin celui-ci charge le vrai init pour l'étape suivante.

Init

Init est cette fois un vrai processus unix lancé par le noyau, et comme c'est le premier il a pour pid 1. Il prend sa configuration dans /etc/inittab. Dans sa configuration il y a quelques processus à lancer et à surveiller, il s'agit essentiellement des terminaux locaux.

Mais surtout il lance /etc/init.d/rc en lui passant en paramètre le runlevel dans lequel on est sensé fonctionner.

rc

rc est un simple script qui a pour pour seul objectif de lancer les différents démons qu'on trouve dans /etc/rcX.d où X est un runlevel

Et voila, à partir de là on peut considérer que le système est lancé.

Notez que sous certains systèmes comme ubuntu on trouve des outils comme upstart qui remplacent à la fois init et rc pour faire à peu près la même chose.