Démarrage du Système¶
Dans ce chapitre, vous apprendrez comment le système démarre.
Objectifs : Dans ce chapitre, les futurs administrateurs Linux vont apprendre :
Les différentes étapes du processus de démarrage ;
Comment Rocky Linux prend en charge ce démarrage en utilisant GRUB2 et systemd ;
Comment protéger GRUB2 d'une attaque ;
Comment gérer les services ;
Comment accéder aux journaux depuis journald
.
utilisateurs
Connaissances :
Complexité :
Temps de lecture : 23 minutes
Le processus de démarrage¶
Il est important de comprendre le processus de démarage de Linux afin de pouvoir résoudre les problèmes qui peuvent se produire.
Le processus de démarrage comprend :
BIOS startup¶
Le BIOS (Basic Input/Output System) effectue le POST (auto-test) pour détecter, tester et initialiser les composants matériels du système.
Il charge ensuite le MBR (Master Boot Record).
L'enregistrement d'amorçage principal (MBR)¶
L'enregistrement d'amorçage principal est les 512 premiers octets du disque d'amorçage. Le MBR découvre le périphérique d'amorçage et charge le chargeur de démarrage GRUB2 en mémoire et lui transfère le contrôle.
Les 64 octets suivants contiennent la table de partitions du disque.
Le chargeur de démarrage GRUB2¶
Le chargeur de démarrage par défaut pour la distribution Rocky 8 est GRUB2 (GRand Unified Bootloader n° 2). GRUB2 remplace l'ancien chargeur d'amorçage GRUB (également appelé legacy GRUB).
Le fichier de configuration GRUB 2 se trouve sous /boot/grub2/grub.cfg
mais ne doit pas être édité directement.
Les paramètres de configuration du menu GRUB2 sont situés dans /etc/default/grub
et sont utilisés pour générer le fichier grub.cfg
.
# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
Si des modifications sont apportées à un ou plusieurs de ces paramètres, la commande grub2-mkconfig
doit être exécutée pour régénérer le fichier /boot/grub2/grub.cfg
.
[root] # grub2-mkconfig –o /boot/grub2/grub.cfg
- GRUB2 recherche l'image du noyau compressé (le fichier
vmlinuz
) dans le répertoire/boot
. - GRUB2 charge l'image du noyau en mémoire et extrait le contenu du fichier image
initramfs
dans un dossier temporaire en mémoire en utilisant le système de fichierstmpfs
.
Le noyau¶
Le noyau démarre le processus systemd
avec PID 1.
root 1 0 0 02:10 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
systemd
¶
Systemd est le parent de tous les processus système. Il lit la cible du lien /etc/systemd/system/default.target
(par exemple, /usr/lib/systemd/system/multi-user.target
) pour déterminer la cible par défaut du système. Le fichier définit les services à démarrer.
Systemd place ensuite le système dans l'état défini par la cible en effectuant les tâches d'initialisation suivantes :
- Définir le nom de la machine
- Initialiser le réseau
- Initialiser SELinux
- Afficher la bannière de bienvenue
- Initialiser le matériel en se basant sur les arguments donnés au noyau au démarrage
- Monter les systèmes de fichiers, y compris les systèmes de fichiers virtuels comme /proc
- Nettoyer les répertoires dans /var
- Lancer la mémoire virtuelle (swap)
Protéger le chargeur de démarrage GRUB2¶
Pourquoi protéger le chargeur de démarrage avec un mot de passe ?
- Empêcher l'accès en mode utilisateur Single - Si un attaquant peut démarrer en mode mono-utilisateur, il devient l'utilisateur root.
- Empêcher l'accès à la console GRUB - Si un attaquant parvient à utiliser la console GRUB, il peut modifier sa configuration ou collecter des informations sur le système en utilisant la commande
cat
. - Empêcher l'accès aux systèmes d'exploitation non sécurisés. S'il y a un double démarrage sur le système, un attaquant peut sélectionner un système d'exploitation tel que DOS au démarrage qui ignore les contrôles d'accès et les autorisations de fichiers.
Pour protéger par mot de passe le chargeur de démarrage GRUB2 :
-
Retirer
-unrestricted
de l'instruction principaleCLASS=
dans le fichier/etc/grub.d/10_linux
. -
Si un utilisateur n'a pas encore été configuré, utilisez la commande
grub2-setpassword
pour fournir un mot de passe à l'utilisateur root :
# grub2-setpassword
Un fichier /boot/grub2/user.cfg
sera créé s'il n'est pas déjà présent. Il contient le mot de passe haché du GRUB2.
Remarque
Cette commande ne prend en charge que les configurations ne contenant qu'un seul utilisateur root.
[root]# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.CC6F56....A21
- Recrée le fichier de configuration avec la commande
grub2-mkconfig
:
[root]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f9725b0c842348ce9e0bc81968cf7181
Found initrd image: /boot/initramfs-0-rescue-f9725b0c842348ce9e0bc81968cf7181.img
done
- Redémarrez le serveur et vérifiez.
Toutes les entrées définies dans le menu GRUB nécessiteront maintenant la saisie d'un utilisateur et d'un mot de passe à chaque démarrage. Le système ne démarre pas un noyau sans intervention directe de l'utilisateur à partir de la console.
- Lorsque l'utilisateur est demandé, entrez
root
; - Quand un mot de passe est demandé, indiquez le mot de passe fourni à la commande
grub2-setpassword
.
Pour ne protéger que l'édition des entrées du menu GRUB et l'accès à la console, l'exécution de la commande grub2-setpassword
est suffisante. Il se peut que vous ayez de bonnes raisons de le faire. Cela peut être particulièrement vrai dans un centre de données à distance où entrer un mot de passe chaque fois qu'un serveur est redémarré, est difficile ou impossible à faire.
Systemd¶
systemd est un gestionnaire de services pour des systèmes d'exploitation Linux.
Il est développé pour :
- rester compatible avec les anciens scripts d'initialisation SysV,
- fournissent de nombreuses fonctionnalités, telles que le lancement en parallèle des services système au démarrage, l'activation à la demande des démons, le support des snapshots, ou la gestion des dépendances entre les services.
Remarque
Le service systemd est la procédure d'initialisation du système par défaut depuis la version 7 de RedHat/CentOS 7.
La suite logicielle systemd introduit le concept d'unités système (systemd units).
Type | Extension de fichier | Observation |
---|---|---|
Unité de service | .service |
Service système |
Target unit | .target |
Un groupe d'unités système |
Monter l'unité | .automount |
Un point de montage automatique pour le système de fichiers |
Remarque
Il existe de nombreuses unités dans le cadre de systemd : Device unit, Mount unit, Path unit, Scope unit, Slice unit, Snapshot unit, Socket unit, Swap unit, Timer unit.
-
Systemd prend en charge les sauvegardes d'état du système et la restauration.
-
Les points de montage peuvent être configurés en tant que cibles pour systemd.
-
Au démarrage, systemd crée des sockets d'écoute pour tous les services système qui supportent ce type d'activation et transmet ces sockets à ces services dès qu'ils sont démarrés. Cela permet de redémarrer un service sans perdre un seul message envoyé par le réseau pendant son indisponibilité. Le socket correspondant reste accessible et tous les messages sont mis en attente.
-
Les services du système qui utilisent D-BUS pour leurs communications inter-processus peuvent être lancés à la demande dès la première fois qu'ils sont utilisés par un client.
-
Le système arrête ou redémarre uniquement les services en cours d'exécution. Les versions précédentes (avant RHEL7) tentaient d'arrêter les services directement sans vérifier leur état actuel.
-
Les services système n'héritent d'aucun contexte (comme les variables d'environnement HOME et PATH). Chaque service fonctionne dans son propre contexte d'exécution.
Toutes les opérations des unités de service sont soumises à un délai de 5 minutes par défaut pour éviter qu'un service défectueux ne bloque le système.
Gestion des services du système¶
Les unités de service se terminent par l'extension de fichier .service
et ont un but similaire à celui des scripts init. La commande systemctl
est utilisée pour afficher
, start
, stop
, redémarrez
un service système :
systemctl | Observation |
---|---|
systemctl start name.service | Lance un service |
systemctl stop name.service | Arrête un service |
systemctl restart name.service | Redémarre un service |
systemctl reload name.service | Recharge une configuration |
systemctl status name.service | Vérifie si un service est en cours d'exécution |
systemctl try-restart name.service | Redémarre un service uniquement s'il est en cours d'exécution |
systemctl list-units --type service --all | Affiche l'état de tous les services |
La commande systemctl
est également utilisée pour activer
ou désactiver
un service et afficher les services associés :
systemctl | Observation |
---|---|
systemctl enable name.service | Activer un service |
systemctl disable name.service | Désactiver un service |
systemctl list-unit-files --type service | Liste tous les services et vérifie s'ils sont en cours d'exécution |
systemctl list-dependencies --after | Liste les services qui commencent avant l'unité spécifiée |
systemctl list-dependencies --before | Liste les services qui commencent après l'unité spécifiée |
Exemples :
systemctl stop nfs-server.service
# ou bien
systemctl stop nfs-server
Pour lister toutes les unités actuellement chargées :
systemctl list-units --type service
Pour lister toutes les unités à vérifier si elles sont activées :
systemctl list-unit-files --type service
systemctl enable httpd.service
systemctl disable bluetooth.service
Exemple d'un fichier .service pour le service postfix¶
postfix.service Unit File
What follows is the content of the /usr/lib/systemd/system/postfix.service unit file as currently provided by the postfix package:
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
Utilisation des cibles du système¶
Sur Rocky8/RHEL8, le concept de niveaux d'exécution a été remplacé par des cibles systemd.
Les cibles systemd sont représentées par les unités cibles. Les unités cibles se terminent par l' extension .target
et leur seul but est de regrouper d'autres unités systemd dans une chaîne de dépendances.
Par exemple, l'unité graphical.target
qui est utilisée pour démarrer une session graphique, démarre les services système tels que le gestionnaire d'affichage GNOME (gdm.service
) ou le service de comptes **** (accounts-daemon.service
) et active également l'unité multi-utilisateur.target
.
De même, l'unité multi-user.target
démarre d'autres services système essentiels, tels que NetworkManager (NetworkManager. ervice
) ou D-Bus (dbus.service
) et active une autre unité cible nommée basic.target
.
Target Units | Observation |
---|---|
poweroff.target | Arrête le système et le désactive |
rescue.target | Active un shell de secours |
multi-user.target | Active un système multi-utilisateur sans interface graphique |
graphical.target | Active un système multi-utilisateur avec une interface graphique |
reboot.target | Arrête et redémarre le système |
L'unité cible par défaut¶
Pour déterminer quelle est la cible utilisée par défaut :
systemctl get-default
Cette commande recherche la cible du lien symbolique situé dans /etc/systemd/system/default.target
et affiche le résultat.
$ systemctl get-default
graphical.target
La commande systemctl
peut également fournir une liste de cibles disponibles :
systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Encrypted Volumes
getty.target loaded active active Login Prompts
graphical.target loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target loaded active active Paths
remote-fs.target loaded active active Remote File Systems
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
timers.target loaded active active Timers
Pour configurer le système pour qu'il utilise une cible par défaut différente :
systemctl set-default name.target
Exemple :
# systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
Pour passer à une autre unité cible de la session courante :
systemctl isolate name.target
Le mode sauvetage Rescue Mode fournit un environnement simple pour réparer votre système dans les cas où il est impossible d'effectuer un processus de démarrage normal.
En mode de sauvetage
, le système tente de monter tous les systèmes de fichiers locaux et de démarrer plusieurs services système importants, mais n'active pas d'interface réseau et ne permet pas à d'autres utilisateurs de se connecter au système en même temps.
Sur Rocky 8, le mode de secours
est équivalent à l'ancien mode utilisateur unique
et nécessite le mot de passe root.
Pour changer la cible actuelle et entrer dans le mode de secours Rescue Mode
dans la session en cours :
systemctl rescue
Le mode d'urgence fournit l'environnement le plus minimaliste possible et permet de réparer le système même dans des situations où le système est incapable de passer en mode sauvetage. En mode d'urgence, le système monte le système de fichiers root uniquement pour la lecture. Il n'essayera pas de monter un autre système de fichiers local, n'activera aucune interface réseau et démarrera certains services essentiels.
Pour modifier la cible actuelle et passer en mode d'urgence dans la session en cours :
systemctl emergency
Fermeture, suspension et hibernation¶
La commande systemctl
remplace un certain nombre de commandes de gestion d'énergie utilisées dans les versions précédentes :
Ancienne commande | Nouvelle commande | Observation |
---|---|---|
halt |
systemctl halt |
Arrête le système. |
poweroff |
systemctl poweroff |
Éteint le système. |
reboot |
systemctl reboot |
Redémarre le système. |
pm-suspend |
systemctl suspend |
Suspend le système. |
pm-hibernate |
systemctl hibernate |
Mise en veille prolongée du système. |
pm-suspend-hybrid |
systemctl hybrid-sleep |
Mise en veille prolongée et interrompt le système. |
Le processus journald
¶
Les fichiers journaux peuvent, en plus de rsyslogd
, être également gérés par le démon journald
qui est un composant de systemd
.
Le démon journald
capture les messages du Syslog, les messages du noyau, les messages de la mémoire vive initiale et depuis le début du démarrage, ainsi que les messages écrits vers la sortie standard et la sortie d'erreur standard de tous les services, puis les indexe et les met à la disposition de l'utilisateur.
Le format du fichier journal natif, qui est un fichier binaire structuré et indexé, améliore les recherches et permet une execution plus rapide, il stocke également les informations de métadonnées, telles que les horodatages ou les identifiants d'utilisateur.
La commande journalctl
¶
La commande journalctl
affiche les fichiers journaux.
journalctl
La commande liste tous les fichiers journaux générés sur le système. La structure de cette sortie est similaire à celle utilisée dans /var/log/messages/
mais elle offre quelques améliorations :
- la priorité des entrées est mise en valeur visuellement ;
- les horodatages sont convertis dans le fuseau horaire local de votre système ;
- toutes les données enregistrées sont affichées, y compris les logs rotatifs ;
- le début d'un lancement est marqué par une ligne spéciale.
Utilisation de l'affichage continu¶
Avec un affichage continu, les messages de log sont affichés en temps réel.
journalctl -f
Cette commande retourne une liste des dix lignes de log les plus récentes. L'utilitaire journalctl continue alors à s'exécuter et attend que de nouveaux changements se produisent avant de les afficher immédiatement.
Filtrage des messages¶
Il est possible d'utiliser différentes méthodes de filtrage pour extraire des informations qui répondent à différents besoins. Les messages de log sont souvent utilisés pour suivre les comportements erronés dans le système. Voir les entrées avec une priorité sélectionnée ou supérieure :
journalctl -p priority
Vous devez remplacer priority par un des mots-clés suivants (ou un nombre) :
- debug (7),
- info (6),
- notice (5),
- warning (4),
- err (3),
- crit (2),
- alert (1),
- emerg (0).