🐧 Linux – Fondamentaux & Administration
Guide complet IDEO‑Lab sur le noyau, les distros, les permissions, FHS et systemd.
Vue d'ensemble
Kernel, Distro (Debian vs RHEL), Shell.
Kernel Distro ShellPartitionnement
/, /boot, swap, /home, GPT, LVM.
/ (root) swap LVMInstallation (Pratique)
Ubuntu/Debian vs Rocky/RHEL.
Ubuntu Rocky Linux apt/dnfArborescence (FHS)
/etc, /var, /usr, /bin, /sbin, /home.
FHS /etc /varArborescence (Avancé)
/opt, /srv, /mnt, /media, /tmp.
/opt /srv /tmpUtilisateurs & Groupes
useradd, usermod, /etc/passwd, groupadd.
useradd usermod /etc/passwdSudo & Privilèges
sudo, /etc/sudoers, visudo.
Permissions (rwx)
chmod (Octal & Symbolique), chown.
Permissions Avancées
umask, SUID, SGID, Sticky Bit.
Systemd (Services)
systemctl (start, stop, enable, status).
Journald (Logs)
journalctl (logs centralisés).
Cheat-sheet CLI
ls, cd, cp, mv, rm, grep, find, ps, free.
cheat cliLinux = Le Noyau (Kernel)
Strictement parlant, "Linux" n'est que le **Noyau** (Kernel) du système d'exploitation. C'est le composant central créé par Linus Torvalds en 1991. Le noyau est le "traducteur" entre le matériel (CPU, RAM, Disque) et les logiciels (applications).
GNU/Linux = La Distribution (Distro)
Ce que nous utilisons est une **Distribution GNU/Linux**. C'est une collection cohérente de logiciels (outils GNU comme bash, grep, gcc, serveur graphique, applications...) assemblée *autour* du noyau Linux.
[Image d'une architecture OS] +------------------------------------------------------+ | Applications (Firefox, VSCode, Serveur Web) | +------------------------------------------------------+ | Shell (Interface utilisateur, ex: Bash, Zsh) | +------------------------------------------------------+ | Outils GNU (Coreutils: ls, cp, grep...) | +------------------------------------------------------+ | NOYAU LINUX (Kernel) | | (PID 1, Gestion RAM, CPU, Pilotes) | +------------------------------------------------------+ | Matériel (CPU, RAM, Disque Dur, Réseau) | +------------------------------------------------------+
Les deux grandes familles (Serveur)
Il existe des centaines de distros, mais elles descendent de deux familles principales :
| Critère | Famille Debian | Famille RHEL (Red Hat) |
|---|---|---|
| Basée sur | Debian | Red Hat Enterprise Linux (RHEL) |
| Gestion Paquets | .deb | .rpm |
| Outil principal | apt (apt install ...) | dnf (ou yum) (dnf install ...) |
| Distros populaires | Ubuntu Server, Debian, Linux Mint | Rocky Linux, AlmaLinux, CentOS Stream, Fedora |
| Philosophie | Communauté, stabilité (Debian), "up-to-date" (Ubuntu). | Entreprise, stabilité extrême (Rocky), innovation (Fedora). |
Rocky Linux est le successeur communautaire de CentOS, 100% compatible avec RHEL.
Le Shell (Interface en ligne de commande)
Le Shell est votre interface principale avec le système. C'est un interpréteur de commandes.
bash(Bourne Again Shell) : Le shell par défaut sur la plupart des systèmes.zsh(Z Shell) : Une version améliorée debash, souvent utilisée avec "Oh My Zsh" pour l'autocomplétion.sh(Bourne Shell) : L'ancêtre, souvent un lien symbolique versbashoudash.
Quand vous ouvrez un terminal, vous lancez bash (ou zsh). Le shell affiche un prompt et attend vos commandes.
# [utilisateur]@[hostname]:[répertoire_actuel]$ ideo_user@serveur-web:~$ ls -l # Le prompt 'root' se termine par '#' root@serveur-web:/var/log#
GPT vs MBR (Table de partition)
Avant de créer des partitions, le disque a besoin d'une "table des matières".
- MBR (Master Boot Record) : L'ancien standard. Limité à 4 partitions primaires et aux disques de < 2To. Obsolète.
- GPT (GUID Partition Table) : Le standard moderne (requis par UEFI). Supporte 128 partitions et des disques > 2To. Toujours utiliser GPT.
Partitions & Points de Montage
Contrairement à Windows (C:, D:), Linux utilise un système de fichiers unifié (/). Les partitions sont "montées" dans des répertoires.
Voici un schéma de partitionnement standard pour un serveur :
| Partition | Point de Montage | Taille Recommandée | Description |
|---|---|---|---|
| (EFI) | /boot/efi | 256M - 512M | Requis par UEFI/GPT. Contient le bootloader. |
| (Boot) | /boot | 1G | Contient le Noyau (Kernel) et l'initramfs. (Parfois non séparé de /) |
| (Racine) | / (root) | 20G - 50G | Le système de base, /etc, /bin, /usr... |
| (Swap) | [swap] | RAM (si < 8G) ou 8G | La "mémoire virtuelle" sur disque. |
| (Home) | /home | Reste de l'espace | Dossiers des utilisateurs. (Permet de réinstaller / sans perdre les données user). |
Sur un serveur, on sépare aussi /var (pour les logs et le web) pour éviter que des logs saturent la partition racine (/).
LVM (Logical Volume Management)
LVM est une couche d'abstraction **optionnelle** (mais recommandée) entre vos partitions physiques et le système.
Avantages :
- Redimensionnement à chaud : Agrandir une partition (ex:
/var) sans redémarrer. - Snapshots : "Geler" l'état d'un volume pour un backup.
- Flexibilité : Étendre un volume sur plusieurs disques.
[Disque 1 (/dev/sda2)] --+
|--> [Volume Group (VG) "vg_main"]
[Disque 2 (/dev/sdb1)] --+
|
|--> [Logical Volume (LV) "lv_root"] --> Monté sur /
|
|--> [Logical Volume (LV) "lv_var"] --> Monté sur /var
|
|--> [Logical Volume (LV) "lv_home"] --> Monté sur /home
La plupart des installeurs (Ubuntu, Rocky) proposent "Utiliser LVM" en un clic.
Post-Installation (apt)
Après une installation minimale d'Ubuntu Server ou Debian.
# 1. Mettre à jour le cache et les paquets sudo apt update sudo apt upgrade -y # 2. Installer les essentiels sudo apt install -y curl wget git ufw bash-completion build-essential # 3. Configurer le pare-feu (UFW) sudo ufw allow ssh # (ou 22/tcp) sudo ufw allow http sudo ufw allow https sudo ufw enable # 4. Installer un serveur web (Ex: Nginx + PHP) sudo apt install -y nginx php-fpm # (Démarré et activé automatiquement)
Post-Installation (dnf)
Après une installation minimale de Rocky Linux ou RHEL.
# 1. Mettre à jour les paquets sudo dnf update -y # 2. Ajouter le dépôt EPEL (Extra Packages) sudo dnf install -y epel-release # 3. Installer les essentiels sudo dnf install -y curl wget git bash-completion sudo dnf groupinstall -y "Development Tools" # 4. Configurer le pare-feu (firewalld) sudo systemctl start firewalld sudo systemctl enable firewalld sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=httpss --permanent sudo firewall-cmd --reload # 5. Installer un serveur web (Ex: Nginx + PHP) sudo dnf install -y nginx php-fpm sudo systemctl enable --now nginx sudo systemctl enable --now php-fpm
Bonnes pratiques post-install (Tous)
- Ne pas utiliser
root: Créez un utilisateur administrateur avecsudo(fait lors de l'installation). - Sécuriser SSH :
- Éditer
/etc/ssh/sshd_config. - Désactiver le login root :
PermitRootLogin no. - Désactiver le login par mot de passe (si vous avez des clés SSH) :
PasswordAuthentication no. - Redémarrer :
sudo systemctl restart sshd.
- Éditer
- Configurer
fail2ban: (apt install fail2ban) Banni les IPs qui échouent aux logins SSH. - Régler le fuseau horaire :
sudo timedatectl set-timezone 'Europe/Paris'.
Filesystem Hierarchy Standard (FHS)
Le FHS définit la structure des répertoires sous Linux pour garantir la cohérence.
/ (La racine) ├── bin/ (Binaires essentiels, ex: ls, cp) ├── sbin/ (Binaires système, ex: reboot, fdisk) ├── lib/ (Bibliothèques (libs) essentielles) ├── lib64/ (Libs 64-bit) ├── boot/ (Noyau Linux, GRUB) ├── dev/ (Fichiers de périphériques, ex: /dev/sda) ├── root/ (Dossier /home de l'utilisateur 'root') ├── home/ │ ├── ideo_user/ │ └── autre_user/ │ ├── etc/ (Configuration, voir onglet 2) ├── var/ (Données variables, voir onglet 3) ├── usr/ (Logiciels utilisateur, voir onglet 4) ├── opt/ (Logiciels optionnels) ├── srv/ (Données de services) ├── mnt/ (Montage manuel) ├── media/ (Montage auto, ex: clés USB) └── tmp/ (Fichiers temporaires)
/etc (Et Cetera / Configuration)
Contient tous les fichiers de configuration du système et des logiciels installés. C'est le répertoire le plus important à sauvegarder.
/etc/fstab: Table des partitions à monter au démarrage./etc/passwd: Liste des utilisateurs./etc/group: Liste des groupes./etc/shadow: Mots de passe chiffrés./etc/sudoers: Permissionssudo./etc/ssh/sshd_config: Configuration du serveur SSH./etc/nginx/: Configuration Nginx./etc/systemd/system/: Fichiers de service Systemd (vos services)./etc/default/(Debian) : Variables d'environnement pour les services.
/var (Variable Data)
Contient les données qui changent constamment (données "variables"). C'est le répertoire qui risque le plus de saturer, d'où l'intérêt de le mettre sur sa propre partition.
/var/log/: Le répertoire des journaux (logs)./var/log/syslog(oumessages) : Logs système./var/log/nginx/access.log: Logs Nginx./var/log/auth.log: Logs d'authentification (SSH).
/var/www/html/: (Par défaut) Racine des sites web (Apache/Nginx)./var/lib/mysql/: Données MariaDB./var/lib/postgresql/: Données PostgreSQL./var/spool/: Files d'attente (mail, cron).
/tmp (Temporaire)
Fichiers temporaires. Vidé à chaque redémarrage.
/usr (Unix System Resources)
Contient la majorité des logiciels et librairies "statiques" (qui ne changent pas), installés par le gestionnaire de paquets (apt, dnf). Ne pas confondre avec /home/user.
/usr/bin/: Binaires des applications (ex:python3,nginx)./usr/sbin/: Binaires d'administration (ex:sshd)./usr/lib/: Bibliothèques des applications./usr/share/: Fichiers partagés (docs, icônes)./usr/local/: Logiciels compilés manuellement (pour les isoler deapt/dnf).
/opt (Optional)
Pour les logiciels "optionnels", auto-contenus, installés manuellement (souvent propriétaires).
Ex: Vous téléchargez un .tar.gz (ex: un IDE, Discord). Vous le décompressez dans /opt/.
/opt/
├── Google/
│ └── Chrome/
└── jetbrains/
└── pycharm-2025.1//srv (Service Data)
Pour les **données** servies par votre machine.
C'est une alternative plus "propre" à /var/www.
/srv/
├── http/
│ └── www.ideolab.com/
├── ftp/
└── git/
└── mon_repo.git/mnt & /media
/mnt(Mount) : Point de montage **temporaire** et **manuel** (ex:sudo mount /dev/sdb1 /mnt)./media: Point de montage **automatique** pour les périphériques amovibles (clés USB, CD-ROM).
Fichiers de configuration
/etc/passwd (Liste des utilisateurs)
# login : pass : UID : GID : GECOS : home : shell root:x:0:0:root:/root:/bin/bash www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin ideo_user:x:1000:1000:Ideo User:/home/ideo_user:/bin/bash
x: Le mot de passe (stocké dans/etc/shadow).- UID (User ID) : 0 = root. 1-999 = Système (ex:
www-data). 1000+ = Utilisateurs humains. - GID (Group ID) : L'ID du groupe principal.
/usr/sbin/nologin: Coquille "vide" pour les utilisateurs de service qui ne doivent pas se connecter.
/etc/shadow (Mots de passe)
Contient les hashs des mots de passe. Lisible uniquement par root.
Commandes Utilisateur (root ou sudo)
# Ajouter un utilisateur (interactif, crée /home/...) sudo adduser ideo_user # Ajouter un utilisateur (non-interactif) sudo useradd -m -s /bin/bash dev_user # -m : Crée le /home # -s : Définit le shell # Définir le mot de passe sudo passwd dev_user # Modifier un utilisateur # (Ex: Ajouter 'dev_user' au groupe 'sudo') sudo usermod -aG sudo dev_user # -a (Append) -G (Groupes secondaires) # Changer le shell d'un utilisateur sudo usermod -s /bin/zsh ideo_user # Supprimer un utilisateur (et son /home) sudo userdel -r ideo_user
/etc/group (Liste des groupes)
# nom_groupe : pass : GID : membres root:x:0: sudo:x:27:ideo_user,dev_user ideo_user:x:1000:
Commandes Groupe (root ou sudo)
# Créer un groupe sudo groupadd developpeurs # Supprimer un groupe sudo groupdel developpeurs # Ajouter 'ideo_user' au groupe 'developpeurs' sudo gpasswd -a ideo_user developpeurs # (ou 'usermod -aG developpeurs ideo_user') # Retirer 'ideo_user' du groupe 'sudo' sudo gpasswd -d ideo_user sudo # Voir les groupes d'un utilisateur groups ideo_user # ideo_user : ideo_user sudo www-data developpeurs
sudo (SuperUser Do)
Permet à un utilisateur normal d'exécuter une commande en tant que root (ou un autre utilisateur), après avoir entré *son propre* mot de passe.
Cela évite de se connecter en root (mauvaise pratique).
# Commande normale (Échoue) apt install nginx # Permission denied... # Commande 'sudo' (Réussit) sudo apt install nginx # [sudo] password for ideo_user:
Configuration (/etc/sudoers)
Ce fichier définit QUI peut faire QUOI.
⚠️ NE JAMAIS ÉDITER /etc/sudoers DIRECTEMENT.
Utilisez toujours visudo. Cela vérifie la syntaxe avant de sauvegarder (évite de se bloquer hors du système).
sudo visudo
Syntaxe (sudoers)
# L'utilisateur 'root' peut tout faire root ALL=(ALL:ALL) ALL # Les membres du groupe 'sudo' (Ubuntu) ou 'wheel' (RHEL) # peuvent tout faire. # (C'est la ligne à utiliser) %sudo ALL=(ALL:ALL) ALL %wheel ALL=(ALL:ALL) ALL # [Qui] [Où=(En_tant_que:Groupe)] [Quoi] # Exemple : Autoriser 'dev_user' à redémarrer nginx # (sans mot de passe) dev_user ALL=(ALL) NOPASSWD: /usr/sbin/systemctl restart nginx
Lire les permissions (ls -l)
Chaque fichier/dossier a 3 niveaux de permissions : pour son **Propriétaire** (User), son **Groupe** (Group), et **Tous les autres** (Others).
$ ls -l /var/www/html/ -rw-r--r-- 1 www-data www-data 1204 Nov 1 10:00 index.html drwxr-x--- 2 ideo_user admin 4096 Nov 1 11:00 assets
Analyse de drwxr-x--- (dossier 'assets') :
d: Type (d=Directory,-=File,l=Link)rwx(User) : Le propriétaire (ideo_user) peut Lire (read), Écrire (write) et Exécuter (execute).r-x(Group) : Le groupe (admin) peut Lire (r) et Exécuter (x), mais pas Écrire.---(Others) : Les autres n'ont aucun droit.
Note sur les dossiers : x (Exécuter) est requis pour cd (entrer) dans un dossier.
2. chmod (Mode Octal)
La méthode la plus rapide. On additionne les valeurs pour chaque niveau (User, Group, Other).
- 4 = Read (r)
- 2 = Write (w)
- 1 = Execute (x)
| Valeur | Permission (rwx) | Description |
|---|---|---|
| 7 (4+2+1) | rwx | Contrôle total (pour User). |
| 6 (4+2+0) | rw- | Lecture/Écriture (fichiers). |
| 5 (4+0+1) | r-x | Lecture/Exécution (dossiers). |
| 4 (4+0+0) | r-- | Lecture seule. |
| 0 (0+0+0) | --- | Aucun droit. |
# Donne 'rwx' (7) au User, 'r-x' (5) au Group, 'r-x' (5) aux Others sudo chmod 755 mon_script.sh # Donne 'rw-' (6) au User, 'r--' (4) au Group, 'r--' (4) aux Others sudo chmod 644 index.html # Récursif (DANGER) sudo chmod -R 644 /var/www/html # (Attention: 'chmod -R 777' est une énorme faille de sécurité)
3. chmod (Mode Symbolique)
Plus verbeux, mais plus précis pour ajouter/retirer un seul droit.
- Qui :
u(User),g(Group),o(Others),a(All). - Action :
+(Ajouter),-(Retirer),=(Définir). - Quoi :
r,w,x.
# Ajouter 'x' (Exécuter) pour le User chmod u+x mon_script.sh # Retirer 'w' (Écrire) pour le Group et les Others chmod go-w config.ini # Mettre les droits exacts chmod u=rw,g=r,o= /var/log/secret.log # (Donne rw-------)
4. chown (Change Owner)
Change le **propriétaire** (User) et/ou le **Groupe**.
# Changer le propriétaire sudo chown ideo_user rapport.pdf # Changer le propriétaire ET le groupe sudo chown ideo_user:developpeurs rapport.pdf # Changer juste le groupe sudo chgrp developpeurs rapport.pdf # (ou sudo chown :developpeurs rapport.pdf) # Récursif (pour un dossier entier) # (Donne tout /var/www à l'utilisateur 'www-data') sudo chown -R www-data:www-data /var/www/html
umask (Masque par défaut)
Le umask (user file-creation mode mask) définit les permissions *inverses* qui sont appliquées par défaut lors de la création d'un fichier ou dossier.
Permissions de base (max) :
Fichiers: 666 (rw-rw-rw-)
Dossiers: 777 (rwxrwxrwx)
umask commun : 0022
# Calcul Fichier (touch new_file) 666 (base) - 022 (umask) = 644 (rw-r--r--) # Calcul Dossier (mkdir new_dir) 777 (base) - 022 (umask) = 755 (rwxr-xr-x)
# Voir le umask umask # 0022 # Changer le umask (pour la session) umask 0027 # (Les nouveaux fichiers seront 640)
SUID (Set User ID)
Quoi : chmod u+s (affiche un s : -rwsr-xr-x).
Effet : Quand un utilisateur exécute ce fichier, il l'exécute **en tant que propriétaire du fichier** (souvent root), et non en tant que lui-même.
Exemple (passwd) :
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root ... /usr/bin/passwd
Un utilisateur normal peut changer *son propre* mot de passe, car en exécutant passwd, il devient temporairement root (qui a le droit d'écrire dans /etc/shadow).
SGID (Set Group ID)
Quoi : chmod g+s (affiche -rwxrwsr-x).
Effet (sur un dossier) : Tous les nouveaux fichiers/dossiers créés dans ce dossier **héritent automatiquement du groupe du dossier parent** (et non du groupe principal de l'utilisateur).
Très utile pour les partages de fichiers (/var/www/html/uploads).
Sticky Bit
Quoi : chmod +t (affiche t : drwxrwxrwt).
Effet (sur un dossier) : Dans un dossier "public" (où tout le monde a w), le Sticky Bit empêche les utilisateurs de supprimer les fichiers... sauf s'ils en sont le propriétaire.
Exemple (/tmp) :
$ ls -ld /tmp drwxrwxrwt 1 root root ... /tmp
Tout le monde peut écrire dans /tmp, mais "Alice" ne peut pas supprimer un fichier créé par "Bob".
Systemd (Le Gestionnaire de Système)
Systemd est le PID 1 (le premier processus lancé au démarrage). Il remplace l'ancien système "init".
Il est responsable de :
- Lancer tous les autres services (SSH, Nginx, BDD...).
- Gérer les "dépendances" (ex: "démarrer la BDD avant l'app web").
- Superviser les services (les redémarrer s'ils plantent).
- Gérer les "targets" (ex: multi-user.target, graphical.target).
- Centraliser les logs (via Journald).
L'outil de contrôle de Systemd est systemctl.
systemctl (Gestion des services)
La commande unique pour gérer les "units" (services, timers, sockets...).
Commandes de base (ex: nginx.service)
# Démarrer un service sudo systemctl start nginx # Arrêter un service sudo systemctl stop nginx # Redémarrer un service sudo systemctl restart nginx # Recharger la configuration (sans couper) sudo systemctl reload nginx # Voir le statut (Très utile !) sudo systemctl status nginx
Activer / Désactiver (Démarrage auto)
# Lancer au prochain boot sudo systemctl enable nginx # Ne plus lancer au prochain boot sudo systemctl disable nginx # Vérifier s'il est activé sudo systemctl is-enabled nginx # Masquer (empêche tout démarrage, même manuel) sudo systemctl mask nginx
journalctl (Lecteur de logs)
Systemd (via Journald) capture le stdout/stderr de tous les services qu'il gère, et les stocke dans un journal binaire (centralisé, non dans /var/log).
(Note: Sur Ubuntu/Debian, les logs sont *aussi* envoyés vers /var/log/syslog pour la rétrocompatibilité).
# Suivre TOUS les logs en direct (tail -f) journalctl -f # Voir les logs d'un service spécifique journalctl -u nginx.service # Suivre les logs d'un service journalctl -f -u nginx.service # Voir les 50 dernières lignes journalctl -n 50 # Voir les logs depuis une date/heure journalctl --since "2025-11-01 10:00:00" journalctl --since "1 hour ago" # Filtrer par priorité (erreurs et plus grave) journalctl -p err # (p: emerg, alert, crit, err, warning, notice, info, debug) # Voir les logs du kernel (erreurs disque, OOM) journalctl -k
Navigation
pwd # (Print Working Directory) Où suis-je ? cd /var/log # (Change Directory) cd .. # Remonter d'un niveau cd - # Aller au dossier précédent ls # Lister les fichiers ls -l # Lister (format long) ls -la # Lister (long, 'a' = tous, y compris cachés) ls -lh # Lister (long, 'h' = humainement lisible)
Gestion Fichiers/Dossiers
touch fichier.txt # Créer un fichier vide mkdir mon_dossier # Créer un dossier cp src.txt dest.txt # Copier cp -r src_dir/ dest_dir/ # Copier (Récursif) mv old.txt new.txt # Renommer (Move) mv file.txt dir/ # Déplacer rm fichier.txt # Supprimer (Remove) rm -r mon_dossier # Supprimer dossier (Récursif) rm -rf mon_dossier # Supprimer (Récursif, Forcé) (DANGER)
Recherche
# 'grep' (Chercher DANS les fichiers) grep "erreur" /var/log/syslog grep -r "mon_ip" /etc/nginx/ # 'find' (Chercher DES fichiers) find . -name "*.py" find /etc -name "ssh*" find /var/log -mtime -1 # (Modifiés il y a < 1 jour) find . -type f -size +100M # (Fichiers > 100MB)
Lecture & Texte
cat fichier.txt # Afficher tout le contenu less fichier.txt # Afficher (interactif, 'q' pour quitter) head -n 20 file.txt # 20 premières lignes tail -n 20 file.txt # 20 dernières lignes tail -f /var/log/syslog # Suivre (Follow) le fichier
Processus & Système
ps aux # Lister tous les processus top # Moniteur de tâches (temps réel) htop # 'top' amélioré (apt install htop) free -h # Voir RAM (Humain) df -h # Voir espace disque (Disk Free) (Humain) du -sh /var/log # Voir taille dossier (Disk Usage) uname -a # Version du Kernel
Réseau
ip a # (Nouveau) Voir les IPs ifconfig # (Ancien) ss -tulpn # (Nouveau) Voir les ports ouverts netstat -tulpn # (Ancien) ping google.com curl -I http://localhost # (Tester un header HTTP)
