Quelles sont les étapes du démarrage d’un PC UEFI sur Linux ?
Comment fonctionne le démarrage de Linux avec le Secure Boot ?
Cet article explique le fonctionnement de GRUB dans un environnement UEFI avec le Secure Boot activé.
Vous trouverez aussi la séquence de démarrage d’un PC Linux UEFI.
Ainsi quelques explications sur les mécanismes du démarrage sécurisé (Secure Boot) d’un PC UEFI avec Linux.
Mais aussi les fonctions du chargeur de démarrage (Boot loader) GRUB dans Linux.
Table des matières
Comprendre le fonctionnement du Secure boot sur les PC UEFI
Avant de débuter, il faut parler des PC UEFI (Unified Extensible Firmware Interface) et plus particulièrement du Secure Boot.
Le Secure Boot (démarrage sécurisé) est un mécanisme de sécurité qui vise à interdire l’exécution de code inconnu.
Il protège des rootkits et plus particulièrement des bootkits.
Pour cela, il vérifie la signature numérique des firmwares.
Si un firmware non signé ou inconnu est exécuté, le Secure Boot empêche le démarrage du PC.
Un message de violation de l’intégrité ou de sécurité s’affiche.
Ce mécanisme fonctionne à travers des bases de données d’autorisations mais aussi de listes noires.
Enfin seul Microsoft peut signer des UEFI Loader.
L’article suivant détails tout cela :
GRUB et les firmwares UEFI dans Linux
Les firmwares UEFI shimx64 et grubx64 dans Linux
Pour démarrer en UEFI, Linux propose deux firmwares UEFI :
- EFI/XXXX/shimx64.efi – C’est le composant SHIM qui agit comme UEFI Boot Loader. Microsoft le signe et SHIM intègre une autre clé CA spécifique à la distribution. Cette dernière est utilisée pour signer à son tour d’autres programmes (par exemple Linux, GRUB, fwupdate).
- EFI/XXXX/grubx64.efi – c’est le Bootloader GRUB qui charge ensuite le noyau Linux (Kernel).
XXXX correspond en général au nom de la distribution.
Par exemple pour Ubuntu, on a les fichiers suivants :
- EFI/ubuntu/shimx64.efi
- EFI/ubuntu/grubx64.efi
Ci-dessous les firmwares UEFI de Debian :
Architecture | Chemin |
amd64 | \EFI\debian\grubx64.efi |
i386 | \EFI\debian\grubia32.efi |
arm64 | \EFI\debian\grubaa64.efi |
armhf | \EFI\debian\grubarm.efi |
Tous ces firmwares se trouvent bien sûr dans la partition EFI qui est formatée en FAT32.
SHIM : l’UEFI Loader Linux
SHIM est un projet libre multi-distribution afin de permettre à Linux de démarrer dans un environnement UEFI.
Le firmware SHIM est signé avec le CA Microsoft mais embarque à son tour son propre CA.
Ce certificat sert à son tour à signer tous les sous-composants Linux : le boot loader Grub et le kernel Linux.
Shim devient alors la racine de confiance pour tous les autres programmes UEFI fournis par la distribution.
Cela assure leur intégrité et aucune falsification par un malware.
Chaque distribution possède alors son propre binaire shim pour fonctionner sur les PC UEFI.
La séquence complète du démarrage d’un PC UEFI sur Linux
Voici maintenant la séquence complète avec toutes les étapes de démarrage de Linux.
A partir de l’étape Load Kernel, le démarrage est identique sur un PC MBR et UEFI.
La différence est en amont puisque le démarrage d’un PC MBR et UEFI diffère complètement.
Le démarrage du BIOS UEFI
Tout d’abord pour avoir une vue d’ensemble des phases de démarrage d’un PC, suivez ce tutoriel :
Le PC charge le BIOS UEFI et le matériel du PC à travers les différents phases :
- SEC Phase : C’est la phase d’initialisation où rien n’est exécuté. Il s’agit de vérifier le matériel.
- PEI Phase : elle prépare la plate-forme pour l’initialisation du système principal dans la phase DXE.
- DXE Phase : Cette phase exécute des pilotes basée sur les ressources découvertes et décrites dans la phase PEI.
- BDS : On localise le l’OS Boot Manager depuis les périphériques de démarrage (USB, Disque locaux ou réseau). La partition EFI est trouvée et le firmware shim est chargé, si sa signature numérique est valide.
La phase BDS plus en détails
Voici un exemple de séquence complète d’un PC Linux UEFI
- Microsoft signe le chargeur de démarrage de premier étage shimx64.efi avec son «Microsoft Corporation UEFI CA».
- Lorsque le système démarre et que le secure boot est activé, le micrologiciel vérifie que ce premier chargeur de démarrage est signé avec une clé dans la base de données. Dans ce cas, “Microsoft Corporation UEFI CA”)
- Puis il exécute le chargeur de démarrage GRUB grubx64.efi qui lui est signé avec la clé de la distribution. Le chargeur de démarrage du premier étage shim vérifie que le chargeur de démarrage grub2 du deuxième étage est correctement signé.
Si Grub est corrompu, c’est à ce stade que l’on peut rencontrer des erreurs.
Il faut alors réparer GRUB :
GRUB exécute le kernel Linux
Le chargeur de démarrage grub2 démarre un noyau Linux et vérifie sa signature numérique.
- Si le noyau n’est pas signé, grub2 appellera ExitBootServices avant de démarrer le noyau non signé)
- Sinon le noyau Linux se charge
Initialisation du kernel Linux et systemd ou init
Le noyau Linux s’initiale et monte la partition système /.
Cela peut se faire au préalable par le disque Ram initramfs.
Lorsque celle-ci est marquée comme propre (clean), le boot continue.
Sinon vous pouvez avoir une erreur qui indique d’effectuer une analyse et réparation sfck.
Dans ces là, Linux demande le mot de passe root.
Puis charge systemd ou init (selon la distribution et le système privilégié).
Enfin ce dernier charge les scripts de démarrage dans un ordre prédéfini, selon la configuration et les dépendances.
Chargement des daemons et display manager ou terminal
Linux termine de booter pour lancer les daemons et services un à un.
Ci-dessous par exemple Avahi mDNS, OpenVPN Service, NetWork Manager, etc.
Enfin le démarrage se termine par le chargement du Display Manager (gdm, kdm, etc) ou simplement d’un terminal si aucune environnement graphique n’est installée.
Exemple le display manager d’Ubuntu :
Je rappelle d’ailleurs ce tutoriel concernant les daemons Linux :