Administration Linux

Le système de fichiers Linux : arborescence, chemins, liens, montages et disques

Débutant12 min de lectureMis à jour

Cette page a été traduite de l'anglais avec l'aide de l'IA, puis vérifiée par rapport à l'original. Lire la version anglaise

À la fin de ce guide, vous saurez à quoi sert chaque répertoire de premier niveau, comment lire une ligne de ls -l, pourquoi liens physiques et liens symboliques se comportent différemment, comment les partitions sont greffées sur l'arborescence avec mount et /etc/fstab, et comment retrouver où est passé l'espace disque. Les exemples visent les systèmes Debian/Ubuntu et de la famille RHEL actuels.

Ce que vous allez apprendre

  • Décrire le rôle des principaux répertoires de la FHS, comme /etc, /var, /usr, /opt, /proc et /run
  • Lire une ligne de ls -l et y repérer le type de fichier, les permissions, le nombre de liens, le propriétaire et la taille
  • Expliquer la différence entre un lien physique et un lien symbolique, et choisir le bon
  • Examiner les périphériques bloc et les montages avec lsblk, findmnt et df, et ajouter une entrée persistante dans /etc/fstab
  • Retrouver des fichiers avec find et mesurer la taille des répertoires avec du

Linux ne connaît pas les lettres de lecteur. Il n'existe qu'une seule arborescence, enracinée en /, et chaque disque, clé USB, partage réseau, et même la comptabilité interne du noyau, vient s'y greffer quelque part. Une fois les conventions de rangement connues, un serveur inconnu cesse d'être un labyrinthe : la configuration est dans /etc, les données variables dans /var, la vue en direct du noyau sur la machine dans /proc, et ainsi de suite. Ce guide parcourt l'arborescence, explique les objets qui la peuplent (fichiers, répertoires, liens, périphériques) et montre comment le stockage y est rattaché et comment l'inspecter.

Une arborescence, plusieurs systèmes de fichiers

L'expression système de fichiers désigne deux choses différentes, et bien les distinguer évite beaucoup de confusion.

L'arborescence est l'espace de noms logique : /home/alice/notes.txt est un chemin dans l'arborescence. Un système de fichiers, au sens stockage, est une structure de données posée sur un périphérique bloc — ext4, XFS, Btrfs, FAT — qui stocke fichiers et répertoires. L'arborescence est assemblée au démarrage en montant des systèmes de fichiers sur des répertoires : le système de fichiers racine est monté sur /, et d'autres peuvent l'être sur /boot, /home, /var/lib/postgresql ou n'importe où ailleurs. Pour un programme qui parcourt l'arborescence, les coutures sont invisibles.

Debian et Ubuntu s'installent par défaut en ext4 ; les distributions de la famille RHEL (Rocky Linux, AlmaLinux, RHEL) retiennent XFS par défaut. Ce sont deux systèmes de fichiers journalisés éprouvés ; XFS ne peut pas être réduit après sa création, et c'est la principale différence opérationnelle que vous risquez de rencontrer.

Les répertoires standard

Le Filesystem Hierarchy Standard (FHS) définit l'organisation ci-dessous. Les distributions le suivent de près, avec quelques variantes modernes signalées au passage.

RépertoireCe qu'on y trouve
/bin, /sbin, /libSur les distributions actuelles, ce sont des liens symboliques vers /usr (le « usr merge »). sbin contenait historiquement les binaires réservés à l'administrateur.
/usrL'essentiel des logiciels installés : /usr/bin pour les commandes, /usr/lib et /usr/lib64 pour les bibliothèques partagées, /usr/share pour les données indépendantes de l'architecture, comme les pages de manuel et les fichiers de locale. En lecture seule en fonctionnement normal.
/usr/localLes logiciels que vous compilez ou installez à la main, organisés comme /usr. Les gestionnaires de paquets n'y écrivent jamais : rien de ce que vous placez dans /usr/local/bin ne sera écrasé par une mise à jour.
/optLes applications tierces autonomes, un répertoire chacune (/opt/jdk-21, /opt/myapp).
/etcLa configuration propre à la machine, en texte brut. Aucun binaire.
/varLes données qui changent pendant que le système tourne : logs (/var/log), caches de paquets (/var/cache/apt), état des applications (/var/lib/mysql), files de courrier, et /var/tmp pour les fichiers temporaires qui doivent survivre à un redémarrage.
/homeLes répertoires personnels des utilisateurs. /root est celui du superutilisateur, tenu à part pour rester disponible même si /home ne parvient pas à se monter.
/tmpUn espace de travail temporaire qui peut être vidé au démarrage (souvent un tmpfs en RAM).
/runL'état d'exécution depuis le dernier démarrage : fichiers PID, sockets, fichiers de verrou. Un tmpfs, vide après chaque redémarrage.
/bootL'image du noyau, le disque RAM initial et les fichiers du chargeur d'amorçage. Souvent une petite partition séparée.
/devLes fichiers de périphériques, créés dynamiquement par le noyau et udev.
/proc, /sysDes systèmes de fichiers virtuels qui exposent l'état du noyau et du matériel ; ils n'occupent aucun espace disque.
/srvLes données servies par la machine (contenu web, arborescences FTP) quand l'administrateur préfère les garder hors de /var.
/mnt, /mediaDes points de montage temporaires, respectivement pour l'administrateur et pour les supports amovibles.
/lost+foundL'endroit où fsck dépose les données orphelines récupérées sur un système de fichiers ext. Il en existe un par système de fichiers ext.

Quelques-uns méritent qu'on s'y attarde.

/etc : la configuration sous forme de texte

Presque tout ce qui détermine le comportement d'une machine est un fichier lisible sous /etc : /etc/hostname, /etc/hosts, /etc/fstab, /etc/passwd, /etc/ssh/sshd_config, /etc/systemd/system/ pour vos unités de service, /etc/nginx/ ou /etc/httpd/ pour les serveurs web. Comme il s'agit de texte brut, /etc se compare avec diff, se versionne et s'audite avec grep. Quand quelque chose se comporte bizarrement, un grep -r dans /etc est souvent plus rapide que la lecture de la documentation.

Beaucoup de paquets acceptent un répertoire drop-in *.d à côté de leur fichier principal — /etc/sudoers.d/, /etc/apt/sources.list.d/, /etc/systemd/system/app.service.d/. Placez vos modifications dans un nouveau fichier à cet endroit plutôt que de modifier le fichier du paquet, et les mises à jour ne les écraseront pas.

/proc et /sys : le noyau sous forme de fichiers

/proc est une fenêtre sur le noyau en cours d'exécution. /proc/cpuinfo et /proc/meminfo décrivent le matériel ; /proc/loadavg est ce que lit uptime ; chaque processus possède un répertoire /proc/<pid>/ qui contient sa ligne de commande, son environnement, ses descripteurs de fichiers ouverts (fd/), ses projections mémoire et son répertoire de travail courant. Des outils comme ps, top et lsof ne font rien de plus exotique que lire ces fichiers.

cat /proc/loadavg              # 0.42 0.31 0.28 1/412 18342
ls -l /proc/$$/fd              # descripteurs de fichiers du shell courant
cat /proc/$(pgrep -o nginx)/cmdline | tr '\0' ' '

/sys expose le modèle de périphériques : quels pilotes sont associés à quels périphériques, les paramètres des périphériques bloc, les statistiques des interfaces réseau. Écrire dans certains de ses fichiers modifie le comportement du noyau à chaud (par exemple l'ordonnanceur d'E/S d'un disque dans /sys/block/sda/queue/scheduler).

/dev : tout est fichier

Les périphériques apparaissent comme des fichiers spéciaux, si bien que les mêmes appels open/read/write fonctionnent sur un disque, un terminal ou une source de nombres aléatoires. Les disques s'appellent /dev/sda, /dev/nvme0n1, /dev/vda et leurs partitions /dev/sda1, /dev/nvme0n1p1. Quelques pseudo-périphériques servent au quotidien :

  • /dev/null absorbe tout ce qu'on y écrit et se lit comme vide — c'est là qu'on envoie traditionnellement la sortie dont on ne veut pas.
  • /dev/zero produit un flux infini d'octets nuls, pratique pour créer des fichiers vierges.
  • /dev/urandom produit des octets aléatoires.
  • /dev/tty est le terminal de contrôle du processus courant.

Lire une ligne de ls -l

ls -l condense beaucoup d'informations sur une seule ligne. Prenons ces entrées de /etc :

-rw-r--r-- 1 root root  1354 Mar 14 09:12 fstab
drwxr-xr-x 2 root root  4096 Aug 30 17:40 cron.d
lrwxrwxrwx 1 root root    21 Jan  6 10:02 localtime -> /usr/share/zoneinfo/UTC

De gauche à droite : le type de fichier (- fichier ordinaire, d répertoire, l lien symbolique, c périphérique caractère, b périphérique bloc, s socket, p tube nommé), neuf bits de permission en trois groupes pour le propriétaire, le groupe et tous les autres, le nombre de liens physiques, le propriétaire, le groupe, la taille en octets, la date de modification et le nom. Les permissions ont leur propre guide : Utilisateurs, groupes et permissions.

Deux détails piègent souvent. Les fichiers dont le nom commence par un point sont masqués par un simple ls ; utilisez ls -a (ou -A pour omettre . et ..). Et la taille d'un répertoire affichée par ls est celle de sa liste d'entrées, pas de son contenu ; pour cela, il faut du.

Inodes, liens physiques et liens symboliques

Chaque fichier d'un système de fichiers est décrit par un inode : un enregistrement qui contient le propriétaire, les permissions, les horodatages, la taille et la liste des blocs de données — tout, sauf le nom. Un répertoire n'est qu'une table qui associe des noms à des numéros d'inode. ls -i affiche ces numéros et stat l'enregistrement complet :

$ stat /etc/fstab
  File: /etc/fstab
  Size: 1354        Blocks: 8          IO Block: 4096   regular file
Device: 259,2   Inode: 1572867     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Comme le nom ne fait pas partie de l'inode, un même inode peut porter plusieurs noms. Un lien physique (hard link) est une seconde entrée de répertoire pour le même inode ; le compteur Links ci-dessus indique combien il en existe. Supprimer un nom ne fait que décrémenter ce compteur, et les données ne sont libérées que lorsqu'il tombe à zéro et qu'aucun processus ne garde le fichier ouvert. Les liens physiques ne peuvent ni franchir les systèmes de fichiers (les numéros d'inode sont propres à chacun) ni pointer vers des répertoires.

Un lien symbolique (symlink) est d'une tout autre nature : un petit fichier dont le contenu est un chemin. Le noyau suit ce chemin quand vous ouvrez le lien. Un symlink peut pointer n'importe où, y compris vers un répertoire, vers un autre système de fichiers ou vers une cible qui n'existe pas encore — on parle alors de lien cassé (dangling).

ln  /var/lib/app/data.db  /backup/data.db        # lien physique : même inode
ln -s /opt/app-2.4.1  /opt/app                   # symlink : pointeur vers la « version courante »
readlink -f /opt/app/bin/start                   # résout tous les liens du chemin

Le schéma /opt/app -> /opt/app-2.4.1 est un grand classique du déploiement : on décompresse la nouvelle version à côté de l'ancienne, puis on bascule le lien de façon atomique avec ln -sfn /opt/app-2.5.0 /opt/app. Revenir en arrière ne demande qu'un autre ln.

Un symlink relatif (ln -s ../shared/config.yml config.yml) est résolu par rapport au répertoire qui contient le lien, ce qui le garde valide si toute l'arborescence est déplacée ou copiée ; un lien absolu, lui, casse dans ce cas. Préférez les cibles relatives à l'intérieur d'une arborescence de projet, et les cibles absolues pour les pointeurs à l'échelle du système.

Chemins et navigation

Un chemin absolu commence par / ; un chemin relatif est résolu par rapport au répertoire de travail courant, que pwd affiche et que cd modifie. Chaque répertoire contient deux entrées spéciales : . (le répertoire lui-même) et .. (son parent). Le shell remplace ~ par votre répertoire personnel et ~bob par celui de Bob.

cd /var/log          # absolu
cd ../lib            # relatif : /var/lib
cd -                 # retour au répertoire précédent
cd                   # répertoire personnel

Les commandes de fichiers du quotidien sont ls, cp, mv, rm, mkdir et rmdir. Trois options comptent plus que les autres : mkdir -p crée les répertoires intermédiaires et ne se plaint pas si le chemin existe déjà ; cp -a copie récursivement en préservant permissions, propriétaire, horodatages et symlinks (ce qu'il faut pour une sauvegarde, contrairement à un simple cp -r) ; et rm -rf supprime sans rien demander — tapez le chemin, relisez-le, et seulement ensuite appuyez sur Entrée.

Disques, partitions et montages

lsblk dresse le tableau du stockage : périphériques, partitions, tailles, types de systèmes de fichiers et point de montage de chacun.

$ lsblk -f
NAME        FSTYPE FSVER LABEL UUID                                 MOUNTPOINTS
nvme0n1
├─nvme0n1p1 vfat   FAT32       6E1A-3B7C                            /boot/efi
├─nvme0n1p2 ext4   1.0         3f2c8a1e-4b5d-4f6a-9c1d-2e3f4a5b6c7d /
└─nvme0n1p3 swap   1           9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d [SWAP]

findmnt liste les montages sous forme d'arbre avec leurs options ; mount sans argument affiche les mêmes informations sous l'ancienne forme à plat. Pour rattacher un système de fichiers à la main :

sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
sudo umount /mnt/data        # échoue avec "target is busy" si un processus l'utilise

Un montage manuel disparaît au redémarrage. Les montages persistants se déclarent dans /etc/fstab, une ligne par système de fichiers : périphérique, point de montage, type, options, et deux nombres pour l'ordre de dump et de fsck.

# <device>                                 <mount>    <type> <options>            <dump> <pass>
UUID=3f2c8a1e-4b5d-4f6a-9c1d-2e3f4a5b6c7d  /          ext4   errors=remount-ro    0      1
UUID=6E1A-3B7C                             /boot/efi  vfat   umask=0077           0      1
UUID=b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e  /srv/data  xfs    defaults,nofail      0      2

Identifiez les périphériques par leur UUID (obtenu avec blkid ou lsblk -f), jamais par /dev/sdX : les noms de périphériques dépendent de l'ordre de détection et peuvent changer quand on ajoute un disque. L'option nofail indique au processus de démarrage de continuer si ce périphérique est absent : c'est toute la différence entre un serveur qui démarre sans son disque de données et un serveur qui tombe dans un shell d'urgence. Après avoir modifié fstab, sudo mount -a monte tout ce qui ne l'est pas encore et valide votre syntaxe au lieu de vous laisser découvrir l'erreur au prochain redémarrage ; sur les machines sous systemd, lancez d'abord sudo systemctl daemon-reload pour régénérer les unités de montage.

Où est passé l'espace disque ?

df indique l'espace libre de chaque système de fichiers monté ; du mesure ce qu'occupe une arborescence. Utilisés ensemble, ils répondent à la plupart des alertes « disque plein ».

df -h                              # tailles lisibles, une ligne par système de fichiers
df -i                              # usage des inodes — un système de fichiers peut être « plein » avec des octets libres
sudo du -sh /var/* | sort -h       # quel répertoire de premier niveau sous /var est le plus gros
sudo du -xh --max-depth=2 /var/log | sort -h | tail

du -x reste sur un seul système de fichiers, ce qui compte lorsque /proc ou un montage réseau seraient sinon comptabilisés. L'épuisement des inodes est une panne classique des files de courrier et des répertoires de sessions qui contiennent des millions de minuscules fichiers.

Quand df et du ne sont pas d'accord, cherchez les fichiers supprimés mais encore ouverts :

sudo lsof -nP +L1                  # fichiers avec un nombre de liens à 0 encore ouverts

Le coupable habituel est un fichier de log supprimé avec rm pendant que le service continuait d'y écrire. Le tronquer via son descripteur de fichier libère l'espace sans redémarrage : : > /proc/<pid>/fd/<n>.

Retrouver des fichiers

find parcourt une arborescence et applique des tests et des actions à chaque entrée. Son langage d'expressions récompense l'apprentissage d'une poignée de primitives :

find /var/log -name '*.log' -size +100M                  # gros fichiers de log
find /etc -type f -mtime -1                              # fichiers modifiés dans les dernières 24 h
find /srv/app -type d -name node_modules -prune -o -name '*.js' -print
find /tmp -type f -atime +7 -delete                      # nettoie les vieux fichiers temporaires
find . -name '*.orig' -exec rm -v {} +                   # lance rm une seule fois avec de nombreux chemins
find /home -type f -perm -o+w                            # fichiers modifiables par tous : signal d'alerte

-mtime -1 signifie « modifié il y a moins d'un jour », +7 « il y a plus de sept jours » ; la même convention de signe s'applique à -size. Mettez les motifs entre guillemets pour que le shell ne les développe pas avant que find ne les voie. -exec ... {} + regroupe les chemins en aussi peu d'invocations que possible, alors que \; lance la commande une fois par fichier.

Pour les seuls noms de fichiers, locate (paquet plocate ou mlocate) répond en quelques millisecondes à partir d'un index mis à jour chaque nuit ; lancez updatedb après l'avoir installé. which et type indiquent vers quel exécutable se résout un nom de commande.

Archiver et copier des arborescences

tar regroupe une arborescence dans un seul fichier, généralement compressé :

tar -czf site-2026-09-07.tar.gz -C /var/www example.com      # création, gzip
tar -tzf site-2026-09-07.tar.gz | head                       # liste du contenu
tar -xzf site-2026-09-07.tar.gz -C /tmp/restore              # extraction ailleurs
tar --zstd -cf app.tar.zst --exclude='*.log' /opt/app        # zstd : plus rapide, taux comparable

-C dir change de répertoire avant l'archivage, si bien que l'archive stocke example.com/... plutôt que var/www/example.com/.... Listez toujours une archive de provenance inconnue avant de l'extraire : une archive créée depuis / avec des chemins absolus peut écraser des fichiers système.

Pour copier des arborescences entre répertoires ou entre machines, rsync -a surclasse cp et scp : il préserve les métadonnées, saute les fichiers inchangés et reprend après une interruption.

rsync -a --delete /srv/data/ backup:/srv/data/       # miroir ; barre oblique finale = « le contenu de »

Erreurs fréquentes

Monter par nom de périphérique. /dev/sdb1 dans fstab fonctionne jusqu'au jour où un nouveau disque décale les lettres. Utilisez UUID= ou LABEL=.

Confondre cp -r et cp -a. La copie récursive simple suit les symlinks, attribue les fichiers à l'utilisateur qui copie et met à jour les horodatages. Sauvegardes et migrations réclament -a.

Stocker des données dans /tmp. Il peut résider en RAM et il est couramment vidé au démarrage ou par un timer. Utilisez /var/tmp si les données doivent survivre à un redémarrage, ou l'emplacement adéquat /var/lib/<app> s'il s'agit réellement d'un état.

Modifier directement les fichiers de paquets dans /etc. La mise à jour suivante risque de vous demander de fusionner les changements, ou de les remplacer sans prévenir. Passez par le répertoire .d du paquet ou par un mécanisme de surcharge quand il en existe un.

Supprimer un fichier ouvert pour libérer de l'espace. L'espace n'est rendu qu'à la fermeture du fichier par le processus qui écrit dedans. Tronquez-le plutôt (: > file), ou faites une vraie rotation du log.

Extraire des archives tar non fiables en root. Inspectez-les d'abord avec tar -tf, extrayez-les dans un répertoire vide, et n'extrayez jamais une archive contenant des chemins absolus ou des composants ...

Points clés à retenir

  • Il n'y a qu'une arborescence ; disques, systèmes de fichiers virtuels et partages réseau sont montés sur des répertoires de celle-ci.
  • La FHS vous dit où chaque chose a sa place : /etc pour la configuration, /var pour les données qui changent, /usr pour les logiciels installés, /opt et /usr/local pour les logiciels hors gestionnaire de paquets, /run et /tmp pour les fichiers éphémères.
  • Un inode contient tout ce qui concerne un fichier, sauf son nom ; les liens physiques sont des noms supplémentaires pour un même inode, les symlinks sont des fichiers qui contiennent un chemin.
  • lsblk, findmnt et df montrent le stockage ; /etc/fstab rend les montages persistants et doit référencer les périphériques par UUID, avec nofail sur les disques non essentiels.
  • du -xh --max-depth, df -i et lsof +L1 expliquent à eux trois presque tous les incidents « disque plein ».
  • find avec -name, -type, -mtime, -size et -exec ... + remplace une bonne partie des scripts improvisés.

Sources et lectures complémentaires

Questions fréquentes

Quelle différence entre /usr/local et /opt ?
Les deux accueillent des logiciels qui ne proviennent pas du gestionnaire de paquets de la distribution. /usr/local reproduit la structure de /usr (bin, lib, share) et sert à ce que vous compilez ou installez vous-même et qui doit se fondre dans le PATH du système. /opt accueille des paquets tiers autonomes qui gardent tous leurs fichiers dans un seul répertoire, comme /opt/myapp, ce qui permet de les supprimer d'un bloc.
Pourquoi ne puis-je pas créer de lien physique vers un répertoire ou vers un autre disque ?
Un lien physique n'est qu'une entrée de répertoire supplémentaire qui pointe vers le même inode, et un numéro d'inode n'a de sens qu'à l'intérieur d'un système de fichiers : un lien ne peut donc pas franchir un point de montage. Les liens physiques vers des répertoires sont refusés parce qu'ils permettraient des cycles dans l'arborescence, ce qui casserait tous les outils qui la parcourent. Dans les deux cas, utilisez un lien symbolique.
Où mon application doit-elle écrire ses données et ses logs ?
L'état persistant va dans /var/lib/<app>, les logs dans /var/log/<app> (ou dans le journal), les caches reconstructibles dans /var/cache/<app>, et les fichiers d'exécution comme les fichiers PID ou les sockets dans /run/<app>. La configuration se place dans /etc/<app>. En respectant ces conventions, les outils de sauvegarde, de rotation des logs et de supervision trouvent vos fichiers là où ils les attendent.
Pourquoi df annonce-t-il un disque plein alors que du ne trouve pas les fichiers ?
En général, un processus garde ouvert un fichier supprimé. L'entrée de répertoire a disparu, donc du ne le compte pas, mais les blocs ne sont libérés qu'à la fermeture du dernier descripteur de fichier. Lancez lsof +L1 (ou lsof -nP | grep deleted) pour trouver le processus, puis redémarrez-le ou tronquez le fichier via /proc/<pid>/fd.