Académique Documents
Professionnel Documents
Culture Documents
Le processus de démarrage
Il est important de comprendre le processus de démarrage de Linux pour pouvoir résoudre les
problèmes qui peuvent y survenir.
Le processus de démarrage comprend :
Le démarrage du BIOS
Le BIOS (Basic Input/Output System) effectue le test POST (power on self test) pour
détecter, tester et initialiser les composants matériels du système.
Il charge ensuite le MBR (Master Boot Record).
GRUB2 cherche 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 fichier
tmpfs.
Le noyau
Le noyau démarre le processus systemd avec le PID 1.
root 1 0 0 02:10 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
systemd
Systemd est le père de tous les processus du 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éfini les services à démarrer.
Systemd positionne ensuite le système dans l’état défini par la cible en effectuant les tâches
d’initialisations suivantes :
1. Paramétrer le nom de machine
2. Initialiser le réseau
3. Initialiser SELinux
4. Afficher la bannière de bienvenue
5. Initialiser le matériel en se basant sur les arguments fournis au kernel lors du
démarrage
6. Monter les systèmes de fichiers, en incluant les systèmes de fichiers virtuels comme
/proc
7. Nettoyer les répertoires dans /var
8. Démarrer la mémoire virtuelle (swap)
Systemd
Systemd est un gestionnaire de service pour les systèmes d’exploitation Linux.
Il est développé pour :
rester compatible avec les anciens scripts d’initialisation SysV,
fournir de nombreuses fonctionnalités comme le démarrage en parallèle des services
systèmes au démarrage du système, l’activation à la demande de démons, le support
des instantanés ou la gestion des dépendances entre les services.
Systemd est le système d’initialisation par défaut depuis la RedHat/CentOS 7.
Systemd introduit le concept d’unités systemd.
Table 1. Principaux types d’unités systemd disponibles
Extension du
Type Observation
fichier
Unité de service .service Service système
Unité cible .target Un groupe d’unités systemd
Un point de montage automatique pour système de
Unité automount .automount
fichiers
Il existe de nombreux types d’unités : Device unit, Mount unit, Path unit, Scope unit, Slice
unit, Snapshot unit, Socket unit, Swap unit, Timer unit.
Systemd supporte les instantanés de l’état du système et leur restauration.
Les points de montage peuvent être configurés comme des cibles systemd.
Au démarrage, systemd créé des sockets en écoute pour tous les services systèmes qui
supportent ce type d’activation et passe ces sockets à ces services aussitôt qu’elles sont
démarrées. Cela rend possible la relance d’un service sans perdre un seul message qui
lui est envoyé par le réseau durant son indisponibilité. La socket correspondante reste
accessible et tous les messages sont mis en file d’attente.
Les services systèmes qui utilisent D-BUS pour leurs communications inter-process
peuvent être démarrés à la demande dès la première utilisation par un client.
Systemd stoppe ou relance uniquement les services en cours de fonctionnement. Les
versions précédentes de CentOS tentaient directement de stopper les services sans
vérifier leur état en cours.
Les services systèmes n’héritent d’aucun contexte (comme les variables
d’environnements 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 timeout par défaut de 5 minutes
pour empêcher un service mal-fonctionnant de geler le système.
Gérer les services systèmes
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, lancer, arrêter,
redémarrer, activer ou désactiver des services système.
Les commandes service et chkconfig sont toujours
disponibles dans le système et fonctionnent comme
prévu, mais sont uniquement incluses pour des
raisons de compatibilité et doivent être évitées.
Table 2. Comparaison des utilitaires service et systemctl
[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
Cet article décrit le processus de démarrage pour les systèmes CentOS / RHEL 7.x. Bien qu'il
puisse rester similaire aux versions précédentes, avec RHEL 7, systemd est en cours
d'introduction. En plus du processus de démarrage, je fournirai des conseils et des astuces de
dépannage tout au long du processus.
Puissance + poste.
Recherche de périphérique de micrologiciel.
Le micrologiciel lit le chargeur de démarrage.
Le chargeur de démarrage charge la configuration (grub2).
Le chargeur de démarrage charge le noyau et les initramfs.
Le chargeur de démarrage passe le contrôle au noyau.
Le noyau initialise le matériel + s'exécute /sbin/initcomme pid 1.
Systemd exécute toutes les cibles initrd (monte le système de fichiers /sysroot).
La racine du noyau FS est passée de initramfs root ( /sysroot) à system rootfs ( /) et
systemd est réexécuté en tant que version du système.
Systemd recherche la cible par défaut et démarre / arrête les unités configurées lors de
la résolution automatique des dépendances et la page de connexion apparaît.
Cibles Systemd
Les cibles sont essentiellement des vérifications de dépendance. Ils ont une configuration
«avant» et «après» pour exactement quels services sont nécessaires pour atteindre cet objectif.
Par exemple: arp.ethernet.service, firewalld.serviceet ainsi de suite doivent être
commencé à travailler avant et network.targetpeut être atteint. Si ce n'est pas atteint, des
services tels que httpd, nfset ldapne peut pas être démarré. Il y a 4 cibles qui peuvent être
définies dans RHEL / CentOS 7.
Pour afficher la cible de démarrage par défaut actuelle, utilisez ce qui suit:
systemctl get-default
N'oubliez pas que vous pouvez modifier cela au moment de l'exécution en isolant la cible.
Cela démarrera / arrêtera tous les services associés à la nouvelle cible, donc soyez prudent
(voir systemctl isolate new.target).
1. Interrompez le menu grub2 en appuyant sur "e" pour modifier lorsque vous y êtes
invité avec le menu grub.
2. Recherchez la ligne qui spécifie la version du noyau ( vmlinuz ) et ajoutez-y ce qui
suit:systemd.unit=rescue.target
3. Appuyez sur "Ctrl + x" pour commencer.
4. Vous serez ensuite invité avec le mot de passe root à continuer, une fois que vous
quittez le shell de sauvetage, le processus de démarrage continuera à charger votre
cible par défaut.
Ce processus est un peu différent de ce que nous avons utilisé dans les versions précédentes,
mais c'est une tâche simple et nécessite très peu d'étapes pour le faire. Si vous devez récupérer
des informations d'identification, vous pouvez utiliser cette méthode pour accéder à une
machine virtuelle. Vous pouvez toujours démarrer à partir d'un CD live, monter le système de
fichiers racine et modifier le mot de passe, mais cette méthode est datée et nécessite plus
d'efforts.
1. Redémarrez le système.
2. Interrompez le menu grub2 en appuyant sur "e" pour modifier lorsque vous y êtes
invité avec le menu grub.
3. Déplacez le curseur à la fin de la ligne qui spécifie le noyau ( vmlinuz ). Vous
souhaiterez peut-être supprimer toutes les autres consoles autres que TTY0, mais cette
étape peut ne pas être nécessaire dans votre environnement.
4. Ajoutez rd.break( sans guillemets ) qui interrompra le processus de démarrage juste
avant que le contrôle ne soit transmis des initramfs au système réel.
5. Ctrl + x pour démarrer.
À ce stade, un shell racine est présenté avec le système de fichiers racine monté en mode
lecture seule sur /sysroot. Nous devrons le remonter avec des privilèges d'écriture.
Remonter /sysroot.
# chroot /sysroot
Modifiez le mot de passe de l'utilisateur pour lequel nous avons des informations
d'identification obsolètes.
# passwd <username>
Si vous utilisez SElinux, vous devez envisager de ré-étiqueter tous les fichiers avant de
poursuivre le processus de démarrage. Cette partie peut être ignorée si vous n'utilisez pas
SElinux.
# touch /.autorelabel
Quittez deux fois et le système démarrera proprement à partir du moment où nous l'avons
interrompu.
Examen des journaux des démarrages précédents
Il peut être utile d'afficher les journaux des précédentes tentatives de démarrage ayant échoué.
Si les journaux journald ont été rendus persistants (normalement stockés en mémoire et
libérés au démarrage), cela peut être fait avec l' journalctloutil. Suivez ces étapes si vous
devez configurer la journalisation de démarrage persistante.
En tant que root, créez le fichier journal pour que ces informations soient stockées.
Pour inspecter les journaux d'un démarrage précédent, utilisez l' -boption avec journalctl.
Sans aucun argument, -bne filtrera la sortie que pour les messages relatifs au dernier
démarrage. Un nombre négatif à cet argument filtrera sur les initialisations précédentes. Par
exemple:
Cela vous montrera les journaux d'erreurs du démarrage qui se sont produits avant le plus
récent. Vous devez modifier la valeur numérique pour refléter le démarrage que vous devez
afficher.
L'une des erreurs de démarrage les plus courantes est un /etc/fstabfichier mal configuré .
Vous NE POUVEZ PAS utiliser le rescue.targetpour corriger une /etc/fstaberreur. La
plupart de ces problèmes nous obligeront à utiliser le emergency.target"sauvetage" qui
nécessite un système plus fonctionnel.
# systemctl daemon-reload
Voici un exemple pas à pas. Nous allons démarrer en mode d'urgence pour supprimer une
fausse entrée /etc/fstab.
1. Interrompez le menu grub2 en appuyant sur "e" pour modifier lorsque vous y êtes
invité avec le menu grub.
2. Recherchez la ligne qui spécifie la version du noyau ( vmlinuz ) et ajoutez-y ce qui
suit:systemd.unit=emergency.target
3. Appuyez sur "Ctrl + x" pour démarrer.
4. Vous serez invité avec le mot de passe root à continuer.
5. Remontez /pour que nous puissions apporter des modifications au fstabfichier:#
mount -oremount,rw /
6. Nous pouvons utiliser la mountcommande pour voir quelle entrée est à l'origine de
l'erreur:# mount -a
7. Supprimez l'entrée incriminée du fstabfichier.
8. Utilisez à mount -anouveau pour vous assurer que l'erreur a été résolue.
9. Utilisez systemctl daemon-reloadcomme je l'avais mentionné précédemment pour
recharger tous les fichiers d'unité et recréer l'arborescence de dépendance entière.
Une fois que vous avez quitté le shell d'urgence, le système terminera le démarrage à partir de
la cible d'urgence, vous pourrez alors continuer comme d'habitude à partir de ce point. Cet
exemple vient d'être utilisé pour vous montrer le processus d'utilisation de la cible d'urgence
pour apporter des modifications persistantes aux fichiers du système.
/boot/grub2/grub.cfg
|
|__________________
| |
/etc/default/grub /etc/grub.d/*
Important: Pour modifier le fichier grub.cfg principal, vous devrez apporter les
modifications souhaitées /etc/default/grubaux fichiers dans /etc/grub.d/et ensuite en
créer un nouveau grub.cfgen exécutant:
Dépannage de grub
Tout d'abord, les entrées amorçables sont encodées dans des blocs «menuentry». Dans
ces blocs, linux16et les initrd16lignes indiquent que le noyau à charger à partir du
disque (ainsi que la ligne de commande du noyau) et les initramfs à charger. Pendant
l'édition interactive au démarrage, tab est utilisé pour trouver ces lignes.
Les lignes "set root" à l'intérieur de ces blocs ne pointent pas vers le système de
fichiers racine pour le système RHEL / CentOS 7, mais pointent plutôt vers le système
de fichiers à partir duquel grub2 doit charger le noyau et les fichiers initramfs. La
syntaxe est harddrive.partitionoù se hd0trouve le premier disque dur du système
et hd1le second. Les partitions sont indiquées comme msdos1pour la première
partition MBR ou gpt1pour la première partition GPT.
Exemple de /boot/grub2/grub.cfg:
# grub2-install <device>
Pour les cas où le système ne démarre pas après avoir atteint le menu grub2.
Vous devez commencer par modifier le menu grub et rechercher les erreurs de
syntaxe. Si vous en trouvez un, corrigez-le et accédez au système pour apporter des
modifications persistantes afin de résoudre le problème.
Si vous ne trouvez aucune erreur, reportez-vous à la section ci-dessus où nous
démarrons dans la cible d'urgence. Vous devrez à nouveau remonter root ( /).
Affichez la configuration actuelle de grub2 avec la commande suivante: # grub2-
mkconfig
Si vous ne voyez aucune erreur, il est probable que quelqu'un ait modifié le
/boot/grub2/grub.cfgfichier. Ne modifiez pas ce fichier. Reconstruisez la
configuration avec la commande suivante:# grub2-mkconfig >
/boot/grub2/grub.cfg
Une fois que vous avez reconstruit la configuration de grub, vous devriez pouvoir redémarrer
sans aucun problème.
Le gestionnaire de système et de service par défaut pour la plupart des distributions Linux est
désormais systemd.
Le systemd processus remplace le SysV init. Il s'exécute comme le premier processus après
le démarrage du noyau et est chargé de mettre l'hôte Linux dans l'état où il peut être utilisé. Il
est responsable du démarrage et de la gestion des services, du montage des systèmes de
fichiers, de la gestion du matériel, de la génération de l'invite de connexion, et bien plus
encore.
Un avantage clé par rapport à SysV est que systemd démarre autant de services que possible
en parallèle, accélérant ainsi le processus de démarrage, et cela fait apparaître l'écran de
connexion plus rapidement.
Unités
Les éléments gérés par systemd sont appelés unités. Les fichiers d'unité se trouvent dans
/lib/systemd/système.
Unités de service
Pour la gestion des services, les unités cibles sont des unités de service, qui ont des fichiers
d'unité avec un suffixe de .un service.
Vous pouvez laisser le suffixe .service. Par exemple, pour démarrer le serveur Apache sur
Ubuntu:
Cela vous montrera l'état du service et les premières lignes du fichier journal. Ainsi, pendant
que le service est en cours d'exécution, la sortie de
is
La sortie n'a que deux colonnes Fichier d'unité et État. L'état sera généralement activé,
désactivé, statique ou masqué.
Statique: Cela signifie que l'unité ne peut pas être activée, effectue une action
ponctuelle ou est une dépendance d'une autre unité et ne peut pas être exécutée par
elle-même.
Masqué: Une unité répertoriée comme masquée signifie qu'elle ne peut pas être
démarrée, car elle est liée à / dev / null. C'est ce qu'on appelle le masquage de l'unité.
Cela empêche le service de démarrer, manuellement ou automatiquement.
Pour voir toutes les unités de service actives, utilisez list-units avec -t service filter
Conclusion
J'espère que cela vous donne une idée de l'utilisation de systemctl pour gérer les services sous
Linux. Si vous souhaitez en savoir plus, vous pouvez consulter ceci Cours de maîtrise Linux.