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#

Ordre : firmware (BIOS/UEFI) → boot device → GRUB2 → kernel → initramfs → systemd → 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
en'est pas persistante. Pour qu'elle survive au reboot, il faut passer par/etc/default/grubpuisgrub2-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...
💡
rescuemonte le FS et demande le mot de passe root ;emergencyest 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/shadowest 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#

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 quietde la lignelinuxdans 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/fstabempêche le boot. Toujours tester avecmount -a+findmnt --verifyavant 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=disableddans/etc/selinux/confign'est plus pleinement supporté — pour vraiment désactiver SELinux il faut le paramètre kernelselinux=0dans 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
🚨
chconvsrestorecon— LE piège classique :
chconchange le label à la main → écrasé dès qu'unrestoreconou un/.autorelabelpasse.- La bonne méthode persistante =
semanage fcontext(déclare la règle) puisrestorecon(l'applique). À l'examen, utilisez toujourssemanage fcontext + restorecon, jamaischconseul.
# 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, ousemanage 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:zpour 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 systemdest 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 systemdreste 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.

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.


💡
$(( ... ))= arithmétique entière.-gt -lt -eq -ge -le -nepour comparer des entiers ;=/!=pour les chaînes ;-zchaîne vide,-ffichier,-drépertoire.