Le processus de démarrage d'un système Linux traditionnel, après le transfert du contrôle par le BIOS et le chargeur d'amorçage, suit une séquence d'initialisation rigoureuse. Une fois que le système d'exploitation prend le relais, l'environnement devient entièrement programmable et configurable.
- Chargement du noyau
Après la prise en charge du matériel, le système lit l'image du noyau située dans le répertoire /boot. Ce répertoire contient les fichiers essentiels au démarrage, notamment l'image compressée du noyau (vmlinuz) et le système de fichiers initial en mémoire RAM (initrd).
$ ls -la /boot
System.map-5.15.0-76-generic
config-5.15.0-76-generic
grub/
initrd.img-5.15.0-76-generic
vmlinuz-5.15.0-76-generic
- Exécution du processus d'initialisation
Une fois le noyau chargé en mémoire, il exécute le tout premier programme de l'espace utilisateur : /sbin/init. Ce processus a pour rôle d'initialiser l'environnement système. Étant le premier processus lancé, il se voit attribuer l'identifiant de processus (PID) 1. Tous les autres processus du système en seront des descendants directs ou indirects.
- Définition du niveau d'exécution (Runlevel)
Les services système, également appelés démons (daemons), doivent être lancés au démarrage. Le processus init est chargé de les exécuter. Étant donné que les besoins diffèrent selon l'usage de la machine (serveur, station de travail, maintenance), Linux utilise des "niveaux d'exécution" (runlevels) pour regrouper les configurations de démarrage.
Les systèmes SysVinit définissent sept niveaux d'exécution (0 à 6). Le niveau 0 correspond à l'arrêt du système, le 1 au mode mono-utilisateur (maintenance), et le 6 au redémarrage. Les niveaux 2 à 5 sont généralement utilisés pour le mode multi-utilisateur standard.
Le comportement par défaut est défini dans le fichier /etc/inittab :
id:3:initdefault:
Dans cette configuration, la valeur 3 indique que le système démarrera en mode multi-utilisateur réseau (sans interface graphique par défaut). Chaque niveau d'exécution possède un répertoire dédié dans /etc listant les services à démarrer ou arrêter :
$ ls /etc/rc3.d/
K01smartmontools
README
S01sysstat
S02cron
S03networking
S04rsyslog
Les noms de fichiers suivent une convention stricte : une lettre suivie d'un nombre à deux chiffres et du nom du service. La lettre S (Start) indique un service à lancer avec l'argument start, tandis que K (Kill) indique un service à stopper avec l'argument stop lors d'un changement de niveau. Les chiffres déterminent l'ordre d'exécution séquentielle (par exemple, S02cron s'exécute avant S03networking).
- Gestion centralisée des scripts
Pour éviter la duplication des scripts de démarrage dans chaque répertoire /etc/rcN.d, ces fichiers sont en réalité des liens symboliques pointant vers un emplacement centralisé : /etc/init.d/.
$ ls -l /etc/rc3.d/
lrwxrwxrwx 1 root root 17 oct 12 09:00 S02cron -> ../init.d/cron
lrwxrwxrwx 1 root root 22 oct 12 09:00 S03networking -> ../init.d/networking
Lorsque init parcourt le répertoire du niveau d'exécution cible, il exécute les scripts référencés dans /etc/init.d/. Cette architecture facilite également l'administration manuellle. Pour interagir directement avec un service, l'administrateur peut invoquer son script de manière isolée :
$ sudo /etc/init.d/postgresql restart
- Phase d'authentification utilisateur
Une fois les services essentiels initialisés, le système est prêt à accepter les connexions. L'authentification s'effectue via trois canaux principaux :
- Console locale (TTY) :
initlance le programmegettypour afficher l'invite de connexion. Après la saisie des identifiants, le programmeloginvérifie les droits (souvent via les modules PAM). En cas de succès, le shell défini dans/etc/passwdest exécuté. - Accès distant (SSH) : Le démon
sshdécoute les requêtes réseau, gère le chiffrement et l'authentification PAM, puis instancie le shell utilisateur. - Environnement graphique : Un gestionnaire d'affichage (Display Manager comme
gdm3oulightdm) est démarré parinit. Après authentification, il charge la session graphique (via des scripts tels que/etc/X11/Xsession).
- Initialisation du Login Shell
Le shell alloué lors de la connexion initiale est appelé "login shell". Sur un système configuré avec Bash, ce shell évalue une série de fichiers de configuration pour définir l'environnement de travail.
La séquence de chargement commence par le fichier global /etc/profile. Ensuite, Bash recherche les fichiers de configuration personnels de l'utilisateur dans un ordre précis :
~/.bash_profile~/.bash_login~/.profile
Bash exécute uniquement le premier fichier trouvé dans cette liste et ignore les suivants. Dans le cas d'une connexion via un environnement graphique, les distributions chargent généralement /etc/profile suivi de ~/.profile, en omettant les fichiers spécifiques à Bash comme ~/.bash_profile.
- Configuration du Non-Login Shell
Lorsqu'un utilisateur ouvre un nouvel émulateur de terminal après s'être connecté, le système crée un "non-login shell". Contrairement au login shell, celui-ci n'évalue pas les fichiers de profil globaux ou personnels (/etc/profile, ~/.profile), mais se concentre sur la configuraton interactive locale via le fichier ~/.bashrc.
Pour garantir que les paramètres définis dans ~/.bashrc soient appliqués dès la connexion initiale, une redirection est généralement implémentée dans le fichier ~/.profile :
# Extrait de ~/.profile
if [ -n "${BASH_VERSION:-}" ]; then
if [ -r "${HOME}/.bashrc" ]; then
source "${HOME}/.bashrc"
fi
fi
Ce bloc vérifie que l'interpréteur en cours est bien Bash, puis évalue ~/.bashrc s'il existe et est lisible. Cependant, si un fichier ~/.bash_profile est présent, il bloquera l'exécution de ~/.profile en raison de la règle de priorité de Bash. Pour résoudre ce problème d'héritage, ~/.bash_profile doit explicitement appeler ~/.profile :
# Extrait de ~/.bash_profile
if [ -f "${HOME}/.profile" ]; then
. "${HOME}/.profile"
fi
Cette imbrication garantit que les variables d'environnement globales et les alias interactifs sont correctement iintialisés, quelle que soit la méthode de connexion utilisée.