Vous utilisez sûrement Linux sur votre serveur ou même sur votre ordinateur de tous les jours, mais savez-vous ce qui se passe lorsque votre système Linux démarre ? Dans cet article, on va découvrir le processus de démarrage de Linux.
L'étape matérielle
Quand on parle de la phase matérielle du démarrage de notre système, on parle notamment, du boot primaire.
Power On Selft Test (POST)
Cette première étape matérielle est réalisée par le BIOS ou l'UEFI, son rôle est de vérifier le bon fonctionnement du matériel. Pendant cette étape, le BIOS/UEFI qui est stocké sur la carte mère de notre ordinateur, va vérifier le bon fonctionnement de nos composants matériels (processeur, RAM, disque). Il va aussi chercher un périphérique de démarrage (disque dur, SSD, clé USB).
Localisation du bootloader
En fonction de notre carte mère, cette dernière va embarquer un firmware de type BIOS (Legacy) ou UEFI. Dans cette phase, notre système va localiser le bootloader puis lui passer la main.
Dans le cas où notre système utilise un BIOS (Legacy), ce dernier va lire le premier secteur du périphérique de stockage, qui correspond au MBR (Master Boot Record) qui fait toujours 512 octets. Le MBR contient la table de partition ainsi que l'emplacement du bootloader sur le disque. Le MBR a pour rôle de charger notre bootloader.
Sur les ordinateurs modernes, on retrouve maintenant un firmware UEFI, dans ce cas, pas de MBR. L'UEFI va aller chercher le fichier EFI qui contient notre bootloader. Ce dernier se situe sur la partition EFI (souvent dans /boot/efi/EFI).
Le bootloader
Après en avoir parlé plusieurs fois, parlons maintenant du bootloader.
Le bootloader permet de localiser le noyau linux et l'initramfs et de pouvoir démarrer le système d'exploitation par la suite. On parle aussi de boot secondaire.
Il existe différents bootloader pour les systèmes Linux. Le plus connu est GRUB, mais on peut aussi retrouver Lilo. On parlera ici essentiellement de GRUB.
GRUB va interpréter sa configuration située dans /boot/grub/grub.cfg. Il chargera ensuite en mémoire notre noyau Linux situé dans /boot/vmlinuz-<version_noyau>, ainsi que l'initramfs qui est un système de fichiers temporaire situé en mémoire. Après ça GRUB va donner la main au noyau.
L'initialisation du noyau (Kernel)
On passe ensuite à l'initialisation du noyau et son exécution. Voici alors les étapes qui sont réalisées :
- Décompression du noyau en mémoire.
- Détection du matériel.
- Configuration de la mémoire virtuelle et des interruptions.
- Montage du filesystem temporaire initramfs en tant que racine (/).
- Exécution du /init qui va monter le système de fichiers racine final de Linux.
- Le script /init désactive l'initramfs et libère la mémoire.
- Lancement de l'init système (systemd, ou équivalent).
L'init system
Le rôle de l'init system, comme systemd est de démarrer les services, les démons et les processus utilisateurs. Systemd est lancé par le kernel. Il s'agit du PID 1, on le voit parfois comme /sbin/init. Cependant, on peut voir qu'il y a un lien symbolique vers /lib/systemd/systemd.
Systemd va ensuite consulter les fichiers de configuration situés sous :
- /etc/systemd/system/ => config utilisateur
- /usr/lib/systemd/system/ => config par défaut
Systemd va charger les fichiers .service et .target situés dans les deux répertoires ci-dessus. Il active aussi les dépendances pour chaque service. Les services sont lancés dans l'ordre des dépendances. A la fin, systemd active le .target par défaut, comme multi-user.target pour un OS sans interface graphique ou graphical.target pour un GUI.
Conslusion
J'espère que cet article vous aura permis de comprendre un peu mieux ce qui se passe au démarrage de votre système Linux. Je ne suis pas rentré dans tous les détails afin d'éviter que l'article ne soit trop long.
Pour ceux qui souhaiteraient aller plus loin en regardant plus en détail ce qui se passe voici quelques commandes et chemins de fichiers pour analyser le démarrage de votre système.
Lister les cibles actives :
systemctl list-units --type=target
Voir les services qui ralentissent le boot :
systemd-analyze blame
Voir les logs du boot actuel :
journalctl -b
Voir le temps de boot :
systemd-analyse
Voir le processus PID 1 :
ps -p 1 -o comm=
Log du noyau :
dmesg
Les fichiers de configuration GRUB sont sous /etc/grub.d (attention si vous les modifiées).