Boot, services, noyau et périphériques
Processus de démarrage
1. Le BIOS et l’UEFI
a. BIOS
Le BIOS (Basic Input Output System) est l’interface logicielle entre le matériel et le logiciel à un niveau très basique. Il fournit l’ensemble des instructions de base utilisées par le système d’exploitation. Il fournit le niveau d’interface le plus bas aux pilotes et périphériques.
Le BIOS est présent sur une mémoire EEPROM (Electrical Erasable Programmable Read-Only Memory) de l’ordinateur. Quand l’ordinateur est électriquement allumé, ou lors d’un reset, un signal appelé powergood est envoyé au microprocesseur. Celui-ci déclenche alors l’exécution du BIOS.
Le BIOS effectue un auto-test de l’allumage (POST) puis recherche les périphériques, notamment ceux utilisés pour démarrer. 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, comme le chapitre Les disques et le système de fichiers vous l’a décrit.
b. UEFI
Le successeur du BIOS se nomme UEFI (Unified Extensible Firmware Interface, interface micrologicielle extensible unifiée), succédant lui-même à EFI. UEFI se prononce comme "Unify" mais sans le n. Linux supporte UEFI mais le chargeur de démarrage doit être adapté en conséquence. La grande majorité des PC et cartes mères vendues depuis le début des années 2010 disposent de UEFI par défaut.
UEFI est un composant logiciel faisant l’interface entre le firmware (micrologiciel) du matériel et le système d’exploitation. Il garantit l’indépendance entre le système d’exploitation et la plate-forme matérielle. Son rôle principal est d’amorcer le système d’exploitation via notamment un "boot manager"....
init System V
1. init System V en 2020
init System V a été largement remplacé par systemd sur toutes les distributions récentes. Plus aucune distribution Linux récente n’utilise init System V par défaut. Vous seriez donc tenté de sauter cette partie.
Ce serait dommage, et en voici les raisons :
-
La première, pragmatique, étant que plusieurs éditeurs n’ont pas encore fait l’effort de porter leurs scripts de démarrage, ceux-ci se plaçant dans /etc/init.d/.
-
La seconde, c’est qu’en entreprise on ne met pas à jour les serveurs aussi vite que les nouvelles versions sortent. On trouve encore beaucoup d’anciennes distributions fonctionnant sous init (en espérant que ces sociétés disposent d’un support étendu).
-
La troisième, c’est que systemd et upstart maintiennent une compatibilité avec la notion de runlevels et de scripts init. C’est évident, ne serait-ce que pour la première raison.
-
La quatrième, c’est que les successeurs d’init sous Linux, ne sont pas POSIX. Init est POSIX. Si vous comprenez son fonctionnement, vous serez à l’aise sur les autres Unix, libres et propriétaires.
Enfin, ces distributions professionnelles, encore supportées, utilisent init System V :
-
Le support ELS des Red Hat 5 se termine en novembre 2020.
-
Le support LTSS des Suse Linux Enterprise Server se termine en mars 2022.
Si, cependant, vous ne rentrez pas dans ce cas de figure, lisez le point suivant, et sautez à la section qui vous concerne.
2. Rôle
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 de init est de démarrer et d’arrêter tous les services. C’est init 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 programme init n’est pas toujours le même d’une distribution à une autre. S’agissant...
systemd
1. Principe
systemd « system daemon » est, tout comme init System V ou upstart, un système d’initialisation et une alternative à l’init classique. Il est spécifiquement conçu pour le noyau Linux. Comme l’init classique, il est le premier processus démarré par le noyau une fois l’initialisation de celui-ci terminée.
Dans la courte guerre des successeurs de init System V, c’est systemd qui a gagné, face à upstart. Outre ses grandes qualités et son adoption par l’ensemble des éditeurs professionnels pour leurs distributions, c’est surtout la décision de Debian en février 2014 d’adopter systemd qui a abattu les dernières résistances, dont celles de Canonical, fondateur d’Ubuntu et auteur de upstart. Toutes les distributions majeures (Red Hat, SuSE, Ubuntu, Debian) et leurs dérivations utilisent systemd.
Le remplaçant d’init systemd est issu d’une réflexion profonde sur le lancement des services, tous systèmes d’exploitation confondus. Son auteur, Lennart Poettering (à qui on doit aussi PulseAudio et Avahi) a notamment comparé init System V, upstart et le système de démarrage de Mac OS X et en a tiré des conclusions intéressantes sur les avantages et les limites de chacun. Ses conclusions sont accessibles sur la page suivante : http://0pointer.de/blog/projects/why.html
Elles sont assez édifiantes.
Dans son plaidoyer sur systemd, Lennart fait quelques constatations intéressantes sur la durée de démarrage d’un système et le nombre de processus lancés avant d’arriver au login. Il invite notamment à regarder quel est le PID du premier processus lancé par vous-même après le démarrage de la machine. Il tourne autour de 150 sur Mac OS, mais autour de 1800 sur une distribution classique. Il y a donc un problème. Systemd propose donc d’accélérer le démarrage des services, toujours basé sur les événements et de manière asynchrone, mais aussi d’aller plus loin, notamment en anticipant les besoins des divers services afin d’accélérer leur chargement futur, de connaître et de gérer l’état...
upstart
1. Principe
upstart est un remplaçant du service init, initialement développé pour Ubuntu par un employé de la société Canonical, fonctionnant de manière asynchrone et basé sur les événements. Il est présent sur Ubuntu jusqu’à la version 14.04, Debian jusqu’à la version 6 ainsi que Red Hat Enterprise Linux 6 et sur certaines Fedora et les versions dérivées associées (Oracle Linux par exemple). De manière plus étonnante upstart est utilisé par Google Chrome OS (et Chromium OS) à la base de tous les Chromebooks du marché.
Pour comprendre la puissance de upstart, vous pouvez vous rendre sur la page dédiée au démarrage et à la gestion des services sur Chrome OS ici : https://www.chromium.org/chromium-os/chromiumos-design-docs/boot-design
Comme vous le constatez, upstart, simple et léger, reste utilisé par de nombreux produits, et comme le support d’une Red Hat Enterprise 6 (ELS) se finit en juin 2024, il est nécessaire de le connaître.
upstart contrôle l’ensemble des services, gère leur démarrage et leur arrêt mais surveille aussi leur fonctionnement. Pour des raisons évidentes, il reste compatible avec init System V : tout service System V fonctionnera avec upstart, cependant les services upstart ne fonctionnent pas avec System V. upstart est maintenant l’init par défaut...
Consulter les traces du système
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 de dmesg est circulaire. Au bout d’un certain nombre de messages, les premiers disparaissent. Cependant ces traces ne sont pas perdues car le service syslogd (chapitre Le réseau) écrit ces éléments dans des fichiers.
Cette commande est généralement la première lancée par un administrateur, ingénieur ou exploitant du système Linux pour vérifier la présence d’éventuelles erreurs. En effet, après le boot les messages continuent d’arriver, notamment lors de la connexion à chaud de périphériques, au chargement de certains modules, lorsque des crashs se produisent, lors d’une corruption du système de fichiers, etc.
L’exemple suivant est volontairement tronqué aux premières lignes du démarrage, la sortie originale en contenant plus de 500. Le début représente le tout début de l’exécution du noyau (informations fournies par le BIOS). Le milieu montre la détection du premier disque dur et de ses partitions. La fin montre ce qu’il se passe à l’insertion d’une clé USB, après le boot au cours d’une utilisation normale, et à sa déconnexion.
# dmesg
[ 0.000000] Linux version 5.4.14-200.fc31.x86_64 (mockbuild@bkernel04.phx2.
fedoraproject.org) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP
Thu Jan 23 13:06:12 UTC 2020
[ 0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.4.14-200.fc31.x86_64
root=/dev/mapper/fedora-root ro resume=/dev/mapper/fedora-swap rd.lvm.lv=fedora/root
rd.lvm.lv=fedora/swap rhgb quiet
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' ...
Services et modules noyau
1. Présentation
Le noyau est le cœur du système d’exploitation Linux. Linux est le noyau, le système d’exploitation en tant que tel développé à l’origine par Linus Torvalds. Le système d’exploitation Linux au sens large est composé du noyau et des outils d’exploitation de base, les outils GNU. Ainsi, nombreux sont ceux disant que Linux devrait être appelé GNU/Linux : GNU pour les outils, Linux pour le noyau, GNU/Linux pour l’OS. Nous en resterons à l’appellation Linux.
Le noyau de Linux est libre. Ses sources sont disponibles. Il est donc possible de le recompiler pour l’adapter finement à ses besoins, de le modifier, d’y rajouter des extensions.
Le noyau Linux fait partie de la famille des noyaux monolithiques. C’est-à-dire que toutes ses fonctionnalités et composants sont regroupés dans un programme unique et ses extensions, appelées modules. Depuis sa version stable 2.0, le noyau est modulaire.
Le noyau est appelé kernel. Il est présent dans /boot et son nom, par convention, commence souvent par vmlinuz-X.Y.Z.p-Vtxt.
On obtient la version du noyau avec la commande uname.
$ uname -r
5.4.14-200.fc31.x86_64
Les lettres ont une signification particulière.
-
X : version majeure du noyau. Entre la version 1 et la version 2, le passage au fonctionnement modulaire a été déterminant, ainsi que la réimplémentation de la couche réseau. La version 3 est sortie durant l’été 2011, la version 4 en avril 2015, la version 5 en mars 2019.
-
Y : jusqu’aux noyaux 2.5, une valeur paire représente une branche stable du noyau, une version impaire représentait une branche de développement (attention !). Chaque incrément représente une évolution importante du noyau.
Les versions 2.6, 3.x, 4.x et 5.x n’ont jamais disposé de branches de développement car elles ont évolué trop vite. Les développeurs ont décidé d’implémenter leurs nouveautés directement dans la version stable après une phase importante de revues et de versions candidates (rc).
-
Z : version mineure du noyau. Quand un lot de modifications par rapport à une version précédente nécessite...
Compiler un noyau
1. Obtenir les sources
a. Sources officielles
Les sources officielles du noyau portent le nom de vanilla. Un noyau (ou kernel) vanilla est un noyau brut, sans ajout de patches, issu directement des développements des contributeurs du noyau, et n’a pas été adapté à une quelconque distribution.
Vous récupérez les sources officielles depuis le site https://www.kernel.org/. La commande wget peut le faire pour vous :
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-5.5.2.tar.xz
Ce sont les sources du noyau qui sont fournies. Vous devez configurer, compiler et installer un noyau, et créer un initrd avant de pouvoir l’utiliser.
Le noyau est fourni sous forme d’archive compressée que vous devez ouvrir avec les outils adaptés. Le format courant de compression utilisé actuellement est le format XZ. Vous devrez probablement installer les outils xz-utils (Debian, Ubuntu) ou xz (Fedora, Red Hat). L’option associée de tar est "J".
# ls
linux-5.5.2.tar.xz
# tar tvJf linux-5.5.2.tar.xz |more
drwxrwxr-x root/root 0 2020-02-04 19:18 linux-5.5.2/
-rw-rw-r-- root/root 15318 2020-02-04 19:18 linux-5.5.2/.clang-format
-rw-rw-r-- root/root 59 2020-02-04 19:18 linux-5.5.2/.cocciconfig
-rw-rw-r-- root/root 71 2020-02-04 19:18 linux-5.5.2/.get_maintainer.ignore
-rw-rw-r-- root/root 62 2020-02-04 19:18 linux-5.5.2/.gitattributes
-rw-rw-r-- root/root 1746 2020-02-04 19:18 linux-5.5.2/.gitignore
-rw-rw-r-- root/root 14461 2020-02-04 19:18 linux-5.5.2/.mailmap
-rw-rw-r-- root/root 423 2020-02-04 19:18 linux-5.5.2/COPYING
-rw-rw-r-- root/root 99600 2020-02-04 19:18 linux-5.5.2/CREDITS
drwxrwxr-x root/root 0 2020-02-04 19:18 linux-5.5.2/Documentation/
...
Les sources du noyau sont placées dans /usr/src/linux, /usr/src/linux-sources-x.y.z ou /usr/src/kernels, selon la distribution. Si plusieurs versions des sources de noyaux sont...
Les fichiers périphériques
1. Introduction
Revenez sur le fonctionnement des périphériques au sein d’un ordinateur. Le principe est généralement le même sur tous les ordinateurs.
Les périphériques sont reliés à un contrôleur, par exemple un contrôleur IDE ou SATA pour les disques IDE, un contrôleur SCSI pour les disques, lecteurs et autres scanners SCSI, ou encore un contrôleur USB. Un contrôleur sait généralement contrôler plusieurs périphériques qui lui sont rattachés.
Le contrôleur communique avec le micro-processeur et la mémoire à l’aide de bus (bus de commandes et bus de données).
Côté Linux le contrôleur et ses périphériques sont gérés à l’aide de pilotes (un pilote pour le contrôleur, et un ou plusieurs pilotes pour les périphériques qui y sont rattachés, par exemple un pilote pour le contrôleur SCSI, puis un pilote pour les disques, un autre pour les scanners, et encore un autre pour un CD-Rom). Le pilote est souvent un module complémentaire du noyau, livré par le constructeur ou déjà présent.
Les périphériques sont vus comme des fichiers. Du coup, les processus accèdent aux périphériques par l’intermédiaire de ces fichiers à l’aide des primitives en langage C, dont le code est dans le noyau, appelées API (Application Programming Interface). Le processus doit d’abord ouvrir le fichier spécial du périphérique (primitive open), puis lire (read) ou écrire (write) des données de ou vers le périphérique comme il le ferait avec un fichier normal. 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
C’est dans le fichier spécial /dev/peripherique que le système de gestion de fichiers trouve les informations nécessaires pour s’adresser au pilote concerné par le périphérique ouvert par un processus.
2. Fichiers spéciaux
Les fichiers spéciaux périphériques sont par convention placés...