WIKI
Linux Administration

6 - Administration avancée

10 min de lecture Mis à jour le 23 juin 2026
Sur cette page

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 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 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.

Sur cette page
Échap

Tape au moins 2 lettres. Plusieurs mots : tous doivent apparaître.