Boot, services, noyau et périphériques
Processus de démarrage
Le démarrage du système a pour but de charger le noyau Linux, de monter les systèmes de fichiers nécessaires puis de démarrer les différents services pour permettre aux applications d’accéder aux ressources de la machine et de répondre aux demandes des utilisateurs.
La mise en route de la machine ou le redémarrage complet du système enclenche un processus enchaînant plusieurs phases décrites dans ce chapitre.
1. Le BIOS et l’UEFI
Ces deux interfaces alternatives ont pour fonction de localiser et de charger en mémoire le gestionnaire d’amorçage de Linux.
a. BIOS
Le BIOS (Basic Input Output System) est une interface logicielle de bas niveau entre le matériel et le logiciel. Il fournit l’ensemble des instructions de base utilisées par le système d’exploitation et les pilotes de périphériques.
Le BIOS est stocké dans une mémoire EEPROM (Electrical Erasable Programmable Read-Only Memory) de l’ordinateur. Quand l’ordinateur est électriquement allumé, ou lors d’un redémarrage, un signal appelé powergood est envoyé au microprocesseur. Celui-ci déclenche alors l’exécution du BIOS.
Le BIOS effectue un autotest (POST) puis recherche les périphériques. Les informations sur le matériel sont stockées de manière permanente dans une petite mémoire CMOS alimentée par une batterie. À la fin du processus, le périphérique de démarrage est sélectionné.
Le BIOS lit et exécute le premier secteur physique du média de démarrage. Il s’agit généralement des 512 premiers octets du premier disque dur (le MBR) ou de la partition active (le PBR) si aucun code n’est présent dans le MBR.
b. UEFI
Le successeur du BIOS se nomme UEFI (Unified Extensible Firmware Interface), succédant lui-même à EFI. La grande majorité des PC et cartes mères vendues depuis le début des années 2010 disposent de UEFI par défaut. Linux est compatible UEFI.
UEFI est un composant logiciel faisant l’interface entre le micrologiciel (firmware) du matériel et le système d’exploitation. Il garantit...
init System V
Le mode de démarrage du système init System V (SysVinit), d’origine Unix, a été le plus souvent remplacé par systemd dans les distributions récentes. D’autre part, il est possible d’avoir à administrer des serveurs de production fonctionnant encore avec ce mode de démarrage.
1. Rôle d’init
Le programme init, premier démarré et dernier stoppé au sein du système, est celui qui lance toutes les autres tâches. Le rôle d’init est de démarrer et d’arrêter tous les services. C’est également lui qui va exécuter les diverses tâches initiales nécessaires au bon fonctionnement de Linux via l’exécution de plusieurs commandes et scripts.
Une fois le système démarré et les services lancés, init reste actif pour gérer les changements d’état des processus qu’il contrôle et des niveaux d’exécution.
Le processus init est le parent de tous les processus et possède toujours le PID 1. Il est démarré par le noyau, qui porte le PID « virtuel » 0.
Sa configuration est présente dans le fichier /etc/inittab. Si ce fichier est absent ou corrompu, il faut démarrer en mode single (S, s, 1, Single) et le réparer, ou démarrer depuis un support externe ou un disque de secours.
2. Niveaux d’exécution
Un niveau d’exécution, ou runlevel, correspond à un état de fonctionnement de Linux (y compris l’arrêt). Chaque niveau d’exécution est contrôlé par init et dispose de sa propre configuration (soit par etc/inittab, soit par des scripts appelés initscripts). Un niveau d’exécution peut par exemple être utilisé pour lancer Linux en mode mono-utilisateur, un autre en multi-utilisateur, avec ou sans réseau, avec ou sans mode graphique.
Tous les niveaux d’exécution sont configurables par l’administrateur. Ils sont généralement définis comme ceci sur les distributions de type Red Hat et OpenSUSE:
Niveau |
Effet |
0 |
Arrêt : stoppe le système d’exploitation, éteint la machine. |
1 |
Mode mono-utilisateur, pour la maintenance sur console. |
2 |
Multi-utilisateur, sans réseau.... |
systemd
systemd (system daemon) est, comme init System V ou upstart, un système d’initialisation, mais il est plus récent et spécifiquement conçu pour Linux. Comme l’init classique, il est le premier processus démarré par le noyau une fois l’initialisation de celui-ci terminée.
Parmi les successeurs d’init System V, systemd est le plus utilisé. Toutes les distributions majeures (Red Hat, SuSE, Ubuntu, Debian) l’utilisent.
systemd est issu d’une réflexion profonde sur le lancement du système et des services. Son auteur, Lennart Poettering (à qui on doit aussi les programmes PulseAudio et Avahi) a notamment comparé les programmes de démarrage Linux et celui d’autres systèmes, en particulier MacOS, en matière de rapidité et de nombre de processus nécessaires.
systemd propose donc d’accélérer le démarrage des services, en les basant sur des événements et avec un fonctionnement asynchrone, mais aussi de connaître et de gérer l’état exact de chaque processus constituant un service, en contrôlant ceux-ci grâce à une interface en ligne de commande ou graphique, mais aussi en remplaçant les scripts shell par un programme compilé.
systemd utilise des mécanismes performants faisant appel à des fonctions (API) uniquement présentes dans le noyau Linux, non conformes POSIX, et donc non portable vers d’autres systèmes de type Unix.
1. Unités cibles et services
Dans systemd, la notion de niveau d’exécution n’est conservée que dans un but de compatibilité avec init System V. L’état souhaité du système après l’exécution des services se nomme l’unité cible (target unit).
Le composant de base de systemd est l’unité ou unit. Il en existe plusieurs : services, sockets, périphériques, cibles, etc. Une cible est essentiellement le point de synchronisation entre unités à atteindre. Les unités cibles correspondent aux anciens niveaux d’exécution, mais sont beaucoup plus souples et configurables.
Une cible peut en regrouper d’autres. On peut activer et définir plusieurs cibles en même temps. Par exemple...
upstart
upstart est un successeur du service init, initialement développé pour Ubuntu, fonctionnant de manière asynchrone et basé sur les événements. Il a été utilisé dans les anciennes versions de certaines distributions (Ubuntu jusqu’à la version 14.04, Debian jusqu’à la version 6, Red Hat Enterprise Linux 6…). Il est utilisé par Google Chrome OS (et Chromium OS).
upstart contrôle l’ensemble des services, gère leur démarrage et leur arrêt mais surveille aussi leur fonctionnement. Il est compatible avec init System V : cependant les services upstart ne fonctionnent pas avec System V.
Avec upstart, les services peuvent être démarrés de manière asynchrone et peuvent donc être parallélisés, et non lancés séquentiellement comme avec init. Il est donc possible de définir les dépendances entre les services et d’optimiser leurs arrêts et démarrages. Étant basé sur des événements, upstart pourra par exemple démarrer les services Bluetooth uniquement si une clé USB de ce genre est insérée, et non inutilement et systématiquement au démarrage de la machine.
1. Configuration
Les fichiers de configuration d’upstart sont dans /etc/init. Ce sont des fichiers...
Consulter les traces du système
Différents outils permettent de suivre l’activité du système et des applications, via des fichiers d’enregistrement d’événements (fichiers journaux ou logs). L’administrateur doit pouvoir consulter régulièrement ces fichiers pour détecter d’éventuels problèmes et contrôler l’adéquation des ressources matérielles face à l’évolution des besoins.
1. dmesg
La commande dmesg permet de récupérer les messages du noyau émis au démarrage de la machine, puis les messages émis par la suite. Le tampon utilisé par dmesg est circulaire. Au bout d’un certain nombre de messages, les premiers disparaissent.
Cette commande permet de vérifier la présence d’éventuelles erreurs, au démarrage ou par la suite. En effet, après le démarrage, des messages continuent d’être enregistrés, notamment lors de la connexion à chaud de périphériques, au chargement de certains modules, lors d’une corruption du système de fichiers, etc.
Exemple
dmesg
[ 0.000000] microcode: microcode updated early to revision 0x2f, date = 2019-02-17
[ 0.000000] Linux version 5.14.0-162.23.1.el9_1.x86_64 (mockbuild@x86-vm-07.build.
eng.bos.redhat.com) (gcc (GCC) 11.3.1 20220421 (Red Hat 11.3.1-2), GNU ld version
2.35.2-24.el9) #1 SMP PREEMPT_DYNAMIC Thu Mar 23 20:08:28 EDT 2023
[ 0.000000] The list of certified hardware and cloud instances for Red Hat Enterprise
Linux 9 can be viewed at the Red Hat Ecosystem Catalog, https://catalog.redhat.com.
[ 0.000000] Command line:...
Le noyau et ses modules
Le noyau est le cœur du système d’exploitation. Au sens strict, Linux est le noyau du système d’exploitation, créé à l’origine par Linus Torvalds. Le système d’exploitation Linux au sens large est composé du noyau et d’un ensemble d’outils permettant son exploitation par des applications : les outils GNU. Linux devrait donc plutôt être appelé GNU/Linux : GNU pour les outils, Linux pour le noyau.
Le noyau Linux est de type monolithique : ses fonctionnalités et composants sont regroupés dans un programme unique. Cependant il est complété par un ensemble d’extensions indépendantes, appelées modules, chargeables ou déchargeables dynamiquement.
Le noyau
Le noyau (kernel) est stocké dans un fichier du répertoire /boot. Son nom, par convention, est de la forme vmlinuz-X.Y.Z-VersText.
Exemple
# ls /boot/vmlinuz*
vmlinuz-5.14.0-162.23.1.el9_1.x86_64
On obtient la version du noyau courant avec la commande uname -r.
Exemple
uname -r
5.14.0-162.23.1.el9_1.x86_64
Les lettres ont une signification particulière.
-
X : version majeure du noyau. La version 3 est sortie durant l’été 2011, la version 4 en avril 2015, la version 5 en mars 2019, la version 6 en octobre 2022.
-
Y : chaque incrément représente une évolution importante du noyau.
-
Z : version mineure du noyau. Quand un lot de modifications par rapport à une version précédente nécessite la diffusion d’un nouveau noyau, on incrémente ce chiffre.
-
Vers : version propre à la distribution.
-
Text : texte fournissant des précisions sur le noyau.
1. uname
La commande uname (unix name) permet d’obtenir de nombreuses informations concernant la version en cours de Linux.
Syntaxe
Option |
Description |
-m (machine) |
Type matériel de la machine. |
-n (nodename) |
Nom d’hôte de la machine. |
-r (release) |
Version (numéro) du noyau. |
-s (system name) |
Nom du système d’exploitation. Par défaut. |
-p (processor) |
Type de processeur. |
-i |
Plate-forme matérielle. |
-v (version) |
Version du système. |
-a (all) |
Toutes les informations. |
Exemple
# uname -a
Linux srvrh 5.14.0-162.23.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar
23 20:08:28 EDT 2023 x86_64 x86_64...
Les fichiers associés aux périphériques
Les périphériques sont gérés à l’aide de pilotes logiciels, souvent sous forme de modules complémentaires du noyau.
Les périphériques sont associés à des fichiers de type spécial, qui ne sont pas des fichiers disque mais des moyens de communication avec les pilotes correspondants. Les processus peuvent accéder aux périphériques par l’intermédiaire de ces fichiers, en lecture et en écriture. Le processus ouvre le fichier spécial du périphérique (appel système open()), puis lit (appel système read()) ou écrit (appel système write()) des données de ou vers le périphérique. Ces opérations de lecture/écriture sont ensuite interprétées par le pilote du périphérique.
Linux accède aux périphériques via des fichiers spéciaux
1. Fichiers spéciaux
Les fichiers spéciaux associés aux périphériques sont par convention placés dans le répertoire /dev. Le premier caractère affiché par la commande ls -l FicSpec identifie le type du fichier spécial FicSpec :
-
c : périphérique en mode caractère.
-
b : périphérique en mode bloc .
Ces modes différencient le type d’échange de données entre le module de gestion de fichiers et le pilote du périphérique.
En mode caractère, il n’y a pas d’utilisation des buffers du système et la communication s’effectue octet par octet.
En mode bloc, le système accède au périphérique via des buffers du système. L’échange de données s’effectue donc plus rapidement pour les périphériques comme les disques.
Les deux autres attributs essentiels d’un fichier périphérique sont la paire d’informations que vous trouvez à la place de la taille du fichier, le numéro majeur et le numéro mineur :
-
Le numéro majeur identifie le pilote gérant ce type de périphérique.
-
Le numéro mineur est une information fournie au pilote, généralement l’identifiant du périphérique...