WIKI Retour au Portfolio

Dernière mise à jour : 23 juin 2026

6 - Administration avancée

Gestion du boot (GRUB2, targets, dépannage), scripting bash, et les deux gros morceaux sécurité/conteneurs de l'EX200 : SELinux et Podman.


A. Gestion de la procédure de boot

A.1 Séquence de démarrage RHEL 9

Schéma de la séquence de boot RHEL : firmware → boot device → GRUB2 → kernel → initramfs → systemd → early services → services → shell

Ordre : firmware (BIOS/UEFI)boot deviceGRUB2kernelinitramfssystemd → services early → services → shell.

A.2 GRUB2

# Au démarrage du PC, presser « e » pour accéder/éditer le menu GRUB2
# La ligne qui commence par "linux" indique comment le kernel boote
# (modif via « e » = NON persistante, valable un seul boot)

# Pour une modif PERSISTANTE : éditer /etc/default/grub puis recompiler grub.cfg
vim /etc/default/grub

# Recompiler la config (le chemin dépend du firmware) :
grub2-mkconfig -o /boot/grub2/grub.cfg            # systèmes BIOS / MBR
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg   # systèmes UEFI

# Savoir si on est en MBR ou UEFI :
lsblk
# Si /boot/efi est monté en vfat → UEFI

🚨 Piège : la modification au menu e n'est pas persistante. Pour qu'elle survive au reboot, il faut passer par /etc/default/grub puis grub2-mkconfig.

A.3 Systemd targets (ex-runlevels)

Une target est un groupe d'unit files. Quand on enable une unité, elle est ajoutée à une target spécifique. Certaines targets sont isolables : elles définissent l'état final du système.

Target Rôle Ancien runlevel
poweroff.target Éteint la machine 0
rescue.target Mono-utilisateur, FS local monté, demande mdp root 1
multi-user.target Multi-utilisateur, réseau, sans GUI 3
graphical.target Multi-utilisateur + interface graphique 5
reboot.target Redémarre 6
emergency.target Shell minimal, / en lecture seule, rien d'autre monté
systemctl get-default              # affiche la target par défaut
systemctl set-default multi-user.target   # définir une nouvelle target par défaut
systemctl isolate graphical.target # changer de target à chaud (sans reboot)
systemctl list-dependencies        # voir les unités/target courantes

Pour booter sur une target spécifique : au menu GRUB, ajouter à la ligne linux :

systemd.unit=rescue.target    # ou emergency.target, multi-user.target...

💡 rescue monte le FS et demande le mot de passe root ; emergency est plus bas niveau (/ en lecture seule, aucun service). En cas d'échec de boot, essayer rescue d'abord, emergency si rescue échoue.

A.4 Réinitialiser le mot de passe root oublié

# 1. Au menu GRUB, presser « e », sur la ligne "linux" ajouter à la fin :
rd.break
# (méthode RHEL 9 recommandée ; alternative historique : init=/bin/bash)
# Puis Ctrl+x pour booter

# 2. Le système s'arrête dans initramfs, / réel monté en lecture seule sur /sysroot
mount -o remount,rw /sysroot   # remonter en lecture/écriture
chroot /sysroot                # basculer dans le système réel

# 3. Changer le mot de passe
passwd root

# 4. Forcer le relabel SELinux au prochain boot (SINON le login échoue)
touch /.autorelabel

# 5. Sortir et continuer le boot
exit
exit

🚨 Piège majeur : oublier touch /.autorelabel. Sans relabel SELinux, le contexte de /etc/shadow est faux et le login root échoue après reboot. C'est l'erreur n°1 sur cet exercice à l'examen.

A.5 Debug shell (early boot)

# Root shell sur TTY9, SANS mot de passe root — utile si le boot plante tôt
systemctl enable --now debug-shell.service
# Accès : Ctrl+Alt+F9
systemctl disable --now debug-shell.service   # à désactiver après usage (risque sécurité)

B. Dépannage (Troubleshooting)

B.1 Schéma de dépannage par étape de boot

Schéma de dépannage : à chaque étape de boot correspond un point d'entrée — boot disk au firmware, grub prompt/grub shell à GRUB, rd.break à l'initramfs, init=/bin/bash à systemd, emergency.target tôt, rescue.target plus haut

Chaque étape de la séquence de boot a son point d'intervention : boot disk (firmware), grub prompt / grub shell (GRUB), rd.break et init=/bin/bash (kernel/initramfs/systemd), emergency.target puis rescue.target (systemd).

💡 Pour voir tous les messages de boot (utile au dépannage) : supprimer rhgb quiet de la ligne linux dans GRUB.

B.2 Dépannage du système de fichiers

mount -o remount,rw /        # remonter / en lecture/écriture
vim /etc/fstab               # corriger une entrée fautive
mount -a                     # vérifier que tout se monte bien depuis fstab
findmnt --verify             # vérifier la syntaxe de /etc/fstab
xfs_repair /dev/...          # réparer un FS XFS corrompu (FS démonté)
xfs_fsr                      # défragmenter du XFS
e4defrag /dev/...            # défragmenter de l'ext4
reboot                       # valider après modif de fstab

🚨 Piège : une entrée fautive dans /etc/fstab empêche le boot. Toujours tester avec mount -a + findmnt --verify avant de rebooter.

B.3 Dépannage réseau

Les causes fréquentes : masque, passerelle/route, ou DNS (/etc/resolv.conf).

ip addr show              # vérifier l'adressage IP / masque
ip route show             # vérifier la route par défaut (gateway)
ping 8.8.8.8              # connectivité IP brute
cat /etc/resolv.conf      # vérifier les serveurs DNS
ping google.com           # test résolution + connectivité
dig google.com            # diagnostic DNS détaillé

B.4 Dépannage performance

Quatre types de problèmes : mémoire, charge CPU, charge disque, réseau. Outil principal : top.

top
# Load average : ne doit pas dépasser le nombre de CPU
# %CPU : si 'id' (idle) = 0 → CPU saturé
# 'k' : tuer un process (saisir le PID)
# Ligne Mem  : regarder 'free'
# Ligne Swap : regarder 'avail'
vmstat 2 25               # surveiller si l'ajout de swap impacte le trafic (cols si/so)

B.5 Dépannage logiciel & mémoire

# Dépendances : pas de souci, RPM installe depuis les repos
ldconfig                  # mettre à jour le cache des librairies partagées
# Pénurie mémoire : si free memory basse → la machine swappe
# vmstat 2 25 → colonnes 'si'/'so' (swap in/out) pour voir l'impact
# Boot GRUB : mem=1G pour limiter artificiellement la RAM (test)
# Solution réelle de fond : ajouter de la RAM physique

C. SELinux

Sécurité (SELinux) est un objectif explicite de l'EX200 et la source n°1 d'échec à l'examen. ⚠️ Quasi absent des notes brutes — section reconstituée.

C.1 Concept

SELinux = MAC (Mandatory Access Control) en plus des permissions classiques (DAC). Chaque process et chaque fichier a un contexte : user:role:type:level. La règle clé : le type du process (domaine) doit être autorisé à accéder au type du fichier. C'est le type enforcement qui fait 90 % du travail.

C.2 Modes

Mode Comportement
enforcing Politique appliquée, accès non autorisés bloqués + loggés
permissive Rien n'est bloqué, violations seulement loggées (debug)
disabled SELinux désactivé (déconseillé)
getenforce               # mode courant
sestatus                 # statut détaillé
setenforce 0             # passer en permissive (temporaire)
setenforce 1             # passer en enforcing (temporaire)

# Persistant : éditer /etc/selinux/config → SELINUX=enforcing|permissive

🚨 Piège RHEL 9 : SELINUX=disabled dans /etc/selinux/config n'est plus pleinement supporté — pour vraiment désactiver SELinux il faut le paramètre kernel selinux=0 dans GRUB. À l'examen, on reste enforcing.

C.3 Contextes de fichiers

ls -Z /var/www/html              # voir le contexte (option -Z partout : ps -Z, id -Z...)
ps -Z                            # contexte des process

# Changer un contexte TEMPORAIREMENT (perdu au relabel) :
chcon -t httpd_sys_content_t /web/page.html

# Définir la règle PERSISTANTE puis appliquer :
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web              # applique la politique sur le disque

🚨 chcon vs restorecon — LE piège classique :

  • chcon change le label à la main → écrasé dès qu'un restorecon ou un /.autorelabel passe.
  • La bonne méthode persistante = semanage fcontext (déclare la règle) puis restorecon (l'applique). À l'examen, utilisez toujours semanage fcontext + restorecon, jamais chcon seul.
# Copier le contexte d'un fichier de référence vers un autre :
restorecon -Rv /var/www/html     # remet les contextes par défaut
semanage fcontext -l | grep httpd  # lister les règles de contexte existantes

C.4 Booleans

Les booleans activent/désactivent des comportements de la politique sans la réécrire.

getsebool -a                          # lister tous les booleans
getsebool httpd_enable_homedirs       # état d'un boolean
setsebool httpd_enable_homedirs on    # changer (temporaire)
setsebool -P httpd_enable_homedirs on # -P = PERSISTANT
semanage boolean -l                   # description + état des booleans

🚨 Piège : oublier -P. Sans -P, le boolean repasse à sa valeur d'origine au reboot.

C.5 Ports SELinux

semanage port -l                                  # lister les ports autorisés par type
semanage port -a -t http_port_t -p tcp 8888       # autoriser un port non standard
semanage port -m -t http_port_t -p tcp 8888       # modifier une règle existante

C.6 Dépannage SELinux

# Les refus sont loggés (AVC denials). Outils :
ausearch -m AVC -ts recent          # chercher les refus récents
sealert -a /var/log/audit/audit.log # analyse + suggestions (paquet setroubleshoot-server)
tail -f /var/log/audit/audit.log    # suivre en direct

# Méthode : passer en permissive → reproduire → lire les AVC → corriger (fcontext/boolean/port)

💡 Réflexe examen : « ça marche en permissive mais pas en enforcing » = problème SELinux. Chercher l'AVC, puis corriger avec le bon outil (restorecon, setsebool -P, ou semanage port).


D. Tuning de performance (tuned)

⚠️ Absent des notes brutes — au programme « performance ».

tuned applique des profils d'optimisation système selon l'usage.

systemctl enable --now tuned     # activer le service
tuned-adm active                 # profil actif
tuned-adm list                   # lister les profils disponibles
tuned-adm profile throughput-performance   # appliquer un profil
tuned-adm recommend              # profil recommandé pour la machine
tuned-adm profile_info virtual-guest

Profils courants : balanced, powersave, throughput-performance, virtual-guest, desktop.


E. Conteneurs avec Podman

Gérer les conteneurs (Podman) est un objectif EX200. ⚠️ Absent des notes brutes — section reconstituée. Podman est sans démon et rootless (un utilisateur non-root peut lancer des conteneurs).

E.1 Installation & images

dnf install container-tools      # méta-paquet podman, skopeo, buildah...

podman login registry.redhat.io  # s'authentifier à un registre
podman search ubi9               # rechercher une image
podman pull registry.access.redhat.com/ubi9/ubi   # télécharger
podman images                    # lister les images locales
podman rmi <image>               # supprimer une image
podman inspect <image>           # détails (variables d'env, ports...)

Configuration des registres : /etc/containers/registries.conf.

E.2 Cycle de vie des conteneurs

podman run -d --name web -p 8080:80 ubi9/httpd-24   # lancer en détaché, map de port
podman ps                        # conteneurs actifs (-a pour tous)
podman stop web / podman start web
podman rm web                    # supprimer (-f pour forcer)
podman exec -it web /bin/bash    # shell interactif dans le conteneur
podman logs web                  # logs du conteneur

E.3 Volumes (stockage persistant)

# Monter un répertoire hôte. :Z = relabel SELinux privé au conteneur (INDISPENSABLE)
podman run -d --name db \
  -v /home/user/dbdata:/var/lib/mysql:Z \
  -e MYSQL_ROOT_PASSWORD=secret rhel9/mariadb-105

🚨 Piège SELinux + volumes : sans le suffixe :Z (ou :z pour un volume partagé), SELinux bloque l'accès du conteneur au répertoire hôte. C'est un grand classique d'examen.

E.4 Variables d'environnement & rootless

podman run -e VAR=value ...      # passer des variables d'environnement
# Rootless : lancé en simple utilisateur, stockage dans ~/.local/share/containers
# Ports < 1024 interdits en rootless → mapper sur un port haut (ex : -p 8080:80)
loginctl enable-linger <user>    # permet aux conteneurs de tourner sans session ouverte

E.5 Conteneur en service systemd (utilisateur)

# Démarrer un conteneur au boot, en tant qu'utilisateur, via systemd --user
mkdir -p ~/.config/systemd/user
podman generate systemd --new --name web --files   # génère container-web.service
cp container-web.service ~/.config/systemd/user/

systemctl --user daemon-reload
systemctl --user enable --now container-web.service
loginctl enable-linger <user>    # OBLIGATOIRE : service survit à la déconnexion

💡 podman generate systemd est la méthode RHCSA 9. ⚠️ Déprécié sur RHEL 10+ au profit des fichiers Quadlet (~/.config/containers/systemd/*.container) — pour l'EX200 (RHEL 9), generate systemd reste valable.

🚨 Piège : oublier loginctl enable-linger. Sans linger, le conteneur s'arrête dès la déconnexion de l'utilisateur et ne démarre pas au boot.


F. Automatisation avec Bash

Un script shell est un exécutable qui enchaîne des commandes pour automatiser des tâches. Il gère variables et structures de contrôle (for, if, case, while). Python/Ansible sont plus avancés.

F.1 Nomenclature

#!/bin/bash          # 1re ligne : indique le shell qui exécute le script
# ceci est un commentaire
key=value            # définir une variable (pas d'espace autour du =)
echo $key            # afficher la valeur
echo $1              # 1er argument passé au script ($1, $2, ...)
chmod +x script.sh   # rendre exécutable
./script.sh arg      # lancer
bash -x script.sh arg  # mode debug : affiche l'enchaînement des commandes

F.2 Tests & conditions

test (ou [ ]) évalue propriétés de fichiers, chaînes, entiers. Utilisé avec if/then/else/fi.

Script bash de tests conditionnels : if test -z, comparaison de chaîne avec hello, et test -f sur un fichier

F.3 Boucles while et for

while répète tant que la condition est vraie. for itère sur une série d'éléments.

Script bash de compte à rebours : conversion des minutes en secondes puis boucle while qui décompte jusqu'à zéro

Script bash de sauvegarde : boucle for itérant sur les fichiers .txt d'un répertoire, copie en .bak puis déplacement dans /tmp

💡 $(( ... )) = arithmétique entière. -gt -lt -eq -ge -le -ne pour comparer des entiers ; = / != pour les chaînes ; -z chaîne vide, -f fichier, -d répertoire.