Chapitre 411 minIntermédiaire
L'arborescence Linux (FHS), les fichiers et les liens
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- dire ce que contient chaque dossier de la racine ;
- savoir où chercher une configuration, un journal ou des données ;
- reconnaître les types de fichiers dans
ls -l; - distinguer un lien physique d'un lien symbolique.
3 exercices corrigés1 schéma
L'arborescence Linux est l'organisation unique de tous les fichiers du système, à partir d'une racine /, selon une norme commune aux distributions : le FHS (Filesystem Hierarchy Standard). Ce chapitre dit ce que contient chaque dossier principal, où chercher une configuration, un journal ou des données, explique les types de fichiers, les liens physiques et symboliques, et ce qui change avec Debian 13.
Une seule arborescence
Sous Windows, chaque disque ou partition a sa lettre : C:\, D:\. Sous Linux, il n'y a qu'un seul arbre, qui part de /. Un deuxième disque, une clé USB ou un partage réseau ne reçoivent pas de lettre : on les monte dans un dossier de l'arbre, par exemple /srv/journaux ou /mnt/usb (chapitre 13). Pour l'utilisateur, c'est un dossier comme un autre.
Le rôle de chaque dossier
| Dossier | Contenu | Exemple chez Sorbier |
|---|---|---|
/etc | La configuration du système et des services, en fichiers texte | /etc/nginx/sites-available/suivi, /etc/ssh/sshd_config |
/home | Les dossiers personnels des utilisateurs | /home/clambert |
/root | Le dossier personnel de root (pas dans /home, pour rester accessible si /home est sur un autre disque) | |
/var | Les données variables : journaux (/var/log), données des services (/var/lib), files d'attente (/var/spool), cache des paquets (/var/cache/apt) | /var/log/nginx/access.log, /var/lib/mysql |
/srv | Les données servies par la machine (sites, dépôts, fichiers échangés) | /srv/www/suivi, /srv/journaux |
/usr | Les programmes et bibliothèques installés par les paquets : /usr/bin (commandes), /usr/sbin (commandes d'administration), /usr/lib, /usr/share (documentation, données) | /usr/sbin/nginx |
/usr/local | Ce que l'administrateur installe à la main, hors paquets (scripts maison) | /usr/local/bin/archive-journaux |
/opt | Les logiciels livrés en bloc par un éditeur | /opt/zabbix… selon l'éditeur |
/boot | Le noyau (vmlinuz-…), l'image de démarrage (initrd.img-…) et GRUB | |
/dev | Les périphériques, sous forme de fichiers spéciaux | /dev/sda, /dev/null |
/proc, /sys | Des systèmes de fichiers virtuels : le noyau y expose les processus et le matériel | /proc/cpuinfo, /proc/meminfo |
/run | Données d'exécution, effacées à chaque démarrage (fichiers PID, sockets) | /run/sshd.pid |
/tmp | Fichiers temporaires, accessibles à tous | |
/mnt, /media | Points de montage temporaires (/mnt) et supports amovibles (/media) |
Deux réflexes à prendre : une configuration se cherche dans /etc, un journal dans /var/log (ou avec journalctl, chapitre 10). Et la documentation d'un paquet s'installe dans /usr/share/doc/<paquet>, souvent avec des exemples de configuration.
Les fichiers de /etc à connaître
Une poignée de fichiers de /etc reviennent dans presque toutes les interventions. Ce sont des fichiers texte : cat pour les lire, sudoedit pour les modifier, après une copie de sauvegarde.
| Fichier | Contenu | Chapitre |
|---|---|---|
/etc/os-release | Nom et version de la distribution (. /etc/os-release; echo $PRETTY_NAME) | 1 |
/etc/debian_version | Version précise de Debian (par exemple 13.1) | 2 |
/etc/hostname, /etc/hosts | Nom de la machine, résolution locale de quelques noms | 11 |
/etc/resolv.conf | Serveurs DNS utilisés | 11 |
/etc/network/interfaces | Configuration réseau (ifupdown) | 11 |
/etc/passwd, /etc/shadow, /etc/group | Comptes, mots de passe hachés, groupes | 5 |
/etc/sudoers, /etc/sudoers.d/ | Règles de sudo | 5 |
/etc/fstab | Systèmes de fichiers montés au démarrage | 13 |
/etc/apt/sources.list, /etc/apt/sources.list.d/ | Dépôts de paquets | 8 |
/etc/ssh/sshd_config, /etc/ssh/sshd_config.d/ | Configuration du serveur SSH | 12 |
/etc/systemd/system/ | Unités systemd de l'administrateur et surcharges | 9 |
/etc/cron.d/, /etc/crontab | Tâches planifiées du système | 15 |
/etc/login.defs, /etc/adduser.conf | Règles de création des comptes (plages d'UID, umask) | 5 |
Beaucoup de logiciels suivent la même organisation : un fichier principal livré par le paquet (nginx.conf, sshd_config), et un dossier en .d/ où l'administrateur dépose ses propres fichiers, lus en plus du principal (conf.d/, sshd_config.d/, sudoers.d/). Écrire dans le dossier .d/ plutôt que modifier le fichier principal évite qu'une mise à jour du paquet ne remplace ou ne bloque ta configuration.
Ce qui change avec Debian 13 pour /tmp
Sur une installation neuve de Debian 13, /tmp est un système de fichiers en mémoire (tmpfs), limité par défaut à la moitié de la mémoire vive, et vidé à chaque redémarrage. De plus, les fichiers de /tmp non utilisés depuis 10 jours sont supprimés automatiquement, et ceux de /var/tmp (qui, lui, survit aux redémarrages) après 30 jours.
clambert@srv-web:~$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS
/tmp tmpfs tmpfs rw,nosuid,nodev,size=1004084k,nr_inodes=1048576,inode64
Conséquence pratique : un programme ne doit jamais garder dans /tmp un fichier dont il aura besoin après un redémarrage, ni y écrire de très gros fichiers (ils consomment de la mémoire). Pour revenir à un /tmp sur disque, l'administrateur tape sudo systemctl mask tmp.mount et redémarre. Un serveur mis à niveau depuis Debian 12 garde l'ancien comportement de nettoyage, grâce au fichier /etc/tmpfiles.d/tmp.conf créé par la mise à niveau.
Les types de fichiers
« Sous Linux, tout est fichier » : un document, un dossier, un disque, un terminal, un canal entre deux processus. Le premier caractère de ls -l indique le type :
| Caractère | Type | Exemple |
|---|---|---|
- | Fichier ordinaire | /etc/hostname |
d | Dossier (directory) | /etc/nginx |
l | Lien symbolique | /bin → usr/bin |
b | Périphérique en mode bloc (disque) | /dev/sda |
c | Périphérique en mode caractère (terminal, /dev/null) | /dev/tty1 |
s | Socket (canal de communication local) | /run/systemd/journal/socket |
p | Tube nommé (named pipe) |
L'extension d'un fichier (.conf, .sh) n'a aucune valeur pour le système : c'est une convention pour les humains. Un script s'exécute parce qu'il a le droit d'exécution, pas parce qu'il finit par .sh. file et stat donnent la nature et les métadonnées d'un fichier.
Inodes, liens physiques et liens symboliques
Sur le disque, un fichier est un inode : une fiche qui porte son type, ses droits, son propriétaire, sa taille, ses dates et l'emplacement de ses données, mais pas son nom. Le nom est rangé dans le dossier, qui associe des noms à des numéros d'inode. ls -i affiche ces numéros.
- Un lien physique (hard link,
ln source lien) est un deuxième nom pour le même inode. Les deux noms sont parfaitement équivalents ; les données ne disparaissent qu'à la suppression du dernier nom. Un lien physique ne peut ni désigner un dossier, ni traverser vers un autre système de fichiers. - Un lien symbolique (symlink,
ln -s cible lien) est un petit fichier qui contient le chemin de sa cible. Il peut pointer vers un dossier ou un autre disque ; si la cible est supprimée ou déplacée, le lien est cassé.
nginx en fait un usage typique sur Debian : les sites sont décrits dans sites-available, et on active un site en créant un lien symbolique dans sites-enabled :
clambert@srv-web:~$ sudo ln -s /etc/nginx/sites-available/suivi /etc/nginx/sites-enabled/suivi
clambert@srv-web:~$ ls -l /etc/nginx/sites-enabled/
lrwxrwxrwx 1 root root 32 4 nov. 09:41 suivi -> /etc/nginx/sites-available/suivi
Pour désactiver le site, on supprime le lien (sudo rm /etc/nginx/sites-enabled/suivi) : la configuration reste intacte dans sites-available. Les droits rwxrwxrwx d'un lien symbolique ne comptent pas : ce sont ceux de la cible qui s'appliquent.
Exercices
Exercice 1 sur 3 Où chercher ? Réussi À revoir
Dans quel dossier cherches-tu :
- le fichier qui liste les comptes utilisateurs ;
- les journaux d'accès du serveur web ;
- le programme
ip; - les fichiers du site de suivi des livraisons ;
- le script d'archivage écrit par Moussa Diallo ;
- le modèle du processeur de la machine.
Voir la réponseMasquer la réponse de l'exercice 1
/etc/passwd./var/log/nginx/(access.log,error.log)./usr/sbin/ip(accessible aussi par/sbin/ip, lien de la fusion de/usr) ;which iple confirme./srv/www/suivi: les données servies par la machine vont dans/srv. Le paquet nginx de Debian propose/var/www/htmlpour sa page par défaut ; les deux se rencontrent./usr/local/bin/: les programmes installés à la main, hors paquets./proc/cpuinfo(ou la commandelscpu).
Tu avais trouvé ?
Exercice 2 sur 3 Liens physiques et symboliques Réussi À revoir
On exécute dans /tmp/essai :
echo "version 1" > config.txt
ln config.txt copie-physique
ln -s config.txt lien-symbolique
rm config.txt
Que donnent ensuite cat copie-physique et cat lien-symbolique ? Pourquoi ?
Voir la réponseMasquer la réponse de l'exercice 2
cat copie-physiqueafficheversion 1.copie-physiqueest un second nom du même inode : supprimerconfig.txtretire un nom, mais l'inode et ses données restent tant qu'un nom existe.cat lien-symboliqueaffiche une erreurcat: lien-symbolique: Aucun fichier ou dossier de ce nom. Le lien contient le cheminconfig.txt, qui n'existe plus : il est cassé.ls -ll'affiche encore, avec sa flèche vers une cible absente.
Tu avais trouvé ?
Exercice 3 sur 3 Un fichier temporaire perdu Réussi À revoir
Un script de srv-web prépare chaque nuit un export dans /tmp/export-livraisons.csv, qu'un second script envoie le lendemain matin. Depuis l'installation de srv-web sous Debian 13, l'envoi échoue chaque lundi, après le redémarrage hebdomadaire du dimanche. Explique et corrige.
Voir la réponseMasquer la réponse de l'exercice 3
Sous Debian 13, /tmp est un tmpfs en mémoire : il est vidé à chaque redémarrage. L'export du samedi soir disparaît au redémarrage du dimanche, d'où l'échec du lundi. Les fichiers qu'on doit retrouver après un redémarrage se rangent ailleurs : dans /var/tmp (conservé, nettoyé après 30 jours) ou, mieux, dans un dossier de l'application comme /var/lib/suivi/exports, créé avec les bons droits. Le dossier /tmp ne sert qu'aux fichiers de travail éphémères.
Tu avais trouvé ?