Cours Linux / Monter un système de fichiers et vérifier l’espace disponible

Monter un système de fichiers consiste à le rendre accessible à un chemin de l’arborescence Linux. Vérifiez la source et le point de montage avant d’écrire, puis utilisez findmnt pour confirmer la source, le chemin et les options réellement appliqués. Pour un manque d’espace, distinguez la capacité en octets de la disponibilité des inodes : ces deux limites ne répondent pas à la même question.

Les exemples visent une machine virtuelle Ubuntu 26.04 LTS ou Rocky Linux 9 administrée pour la pratique. Le cours sur disque, partition et système de fichiers distingue les objets ; le cours de préparation de la machine virtuelle prévoit la console et la récupération. L’atelier ci-dessous est indépendant de l’image précédente et ne formate qu’un nouveau fichier temporaire, jamais un disque existant.

Savoir ce qu’un point de montage montre et masque

Le point de montage est le chemin auquel on attache un système de fichiers. Si ce répertoire contenait des fichiers, un nouveau montage les masque pendant qu’il est en place ; il ne les efface pas. Ils redeviennent accessibles après le démontage. Utiliser un répertoire de pratique neuf réduit cette ambiguïté.

findmnt -T "$HOME"
df -hT "$HOME"
df -i "$HOME"

findmnt -T cherche le système de fichiers contenant ce chemin, même si le chemin lui-même n’est pas un point de montage exact. Pour vérifier un point précis, utilisez --mountpoint. Le manuel de findmnt définit cette différence ; le manuel de mount décrit le masquage du contenu préexistant.

df -hT donne une vue de la capacité avec le type de système de fichiers, et df -i celle des inodes. Un inode est une structure de métadonnées décrivant un objet du système de fichiers. Un grand nombre de petits objets peut épuiser les inodes alors qu’il reste des octets, selon le format et ses règles d’allocation. Ne cherchez pas uniquement le plus gros fichier lorsque le message indique un espace insuffisant.

Préparer une pratique isolée avec un fichier image

Le script complet suivant crée une image ext4 de 128 Mio, lui associe un périphérique de boucle, monte celui-ci dans un répertoire neuf, écrit une seule note après vérification de la source, puis démonte. Un périphérique de boucle permet au noyau de présenter un fichier comme un périphérique bloc ; son nom n’est pas fixé à l’avance.

Il faut Bash, les outils util-linux et e2fsprogs, ainsi qu’une autorisation administrative pour les opérations de boucle, montage et écriture dans ce système de fichiers. Les commandes de préparation des paquets sont sudo apt install util-linux e2fsprogs sur Ubuntu et sudo dnf install util-linux e2fsprogs sur Rocky Linux, après examen du plan, selon le cours APT et DNF. Dans une image minimale, certains outils de base peuvent aussi manquer.

Utilisez une machine virtuelle personnelle où personne d’autre ne modifie simultanément les montages. Un conteneur peut ne pas avoir les droits noyau nécessaires, même avec sudo ; ne réduisez pas son isolation pour forcer cet atelier. Prévoyez de conserver l’image et les messages pour examiner tout échec.

Enregistrez le bloc complet sous mount-lab.sh avec des fins de ligne LF, puis lancez bash mount-lab.sh depuis le terminal de la machine virtuelle. Le contrôle sudo -v authentifie ou actualise le cache selon la configuration ; il ne prouve pas que toutes les commandes suivantes sont autorisées. Chaque opération vérifie donc encore son résultat.

Exécuter le cycle montage, écriture et démontage

#!/usr/bin/env bash
set -u
set -o pipefail
for tool in mktemp truncate mkfs.ext4 losetup mount umount mountpoint findmnt sudo tee cat mkdir; do
  command -v "$tool" >/dev/null || { printf 'Missing tool: %s\n' "$tool" >&2; exit 1; }
done
sudo -v || exit 1
lab=$(mktemp -d "$HOME/linux-mount-lab.XXXXXX") || exit 1
img=$lab/disk.img
mnt=$lab/mnt
loop=''

contains_loop_source() {
  local item
  while IFS= read -r item; do
    if [[ "$item" == "$loop" || "$item" == "$loop["* ]]; then
      return 0
    fi
  done <<< "$1"
  return 1
}

cleanup() {
  result=$?
  trap - EXIT
  if [[ -n "$loop" ]]; then
    safe_to_detach=1
    mountpoint -q -- "$mnt"
    lookup=$?
    if (( lookup == 0 )); then
      if source=$(findmnt -rn --mountpoint "$mnt" -o SOURCE); then
        if [[ "$source" == "$loop" ]]; then
          sudo umount -- "$mnt" || { result=1; safe_to_detach=0; }
        else
          printf 'Different source; inspect: %s\n' "$mnt" >&2
          result=1; safe_to_detach=0
        fi
      else
        printf 'Cannot read mount source: %s\n' "$mnt" >&2
        result=1; safe_to_detach=0
      fi
    elif (( lookup != 32 )); then
      printf 'Cannot verify mountpoint: %s\n' "$mnt" >&2
      result=1; safe_to_detach=0
    fi
    if (( safe_to_detach )); then
      if sources=$(findmnt -rn -o SOURCE); then
        if contains_loop_source "$sources"; then
          printf 'Loop still mounted; keeping: %s\n' "$loop" >&2
          result=1
        else
          sudo losetup --detach "$loop" || result=1
        fi
      else
        printf 'Cannot read mount table; keeping: %s\n' "$loop" >&2
        result=1
      fi
    fi
  fi
  printf 'Lab retained for inspection: %s\n' "$lab"
  exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM

[[ ! -e "$img" && ! -L "$img" ]] || exit 1
truncate -s 128M "$img" || exit 1
[[ -f "$img" && ! -L "$img" && ! -b "$img" ]] || exit 1
mkfs.ext4 -F "$img" || exit 1
mkdir -- "$mnt" || exit 1
candidate=$(sudo losetup --find --show -- "$img") || exit 1
if [[ "$candidate" =~ ^/dev/loop[0-9]+$ ]]; then
  loop=$candidate
else
  printf 'Unexpected loop response; inspect allocation manually\n' >&2
  exit 1
fi
sudo mount -t ext4 -o nodev,nosuid "$loop" "$mnt" || exit 1
source=$(findmnt -rn --mountpoint "$mnt" -o SOURCE) || exit 1
[[ "$source" == "$loop" ]] || { printf 'Mount source mismatch; no write\n' >&2; exit 1; }
printf 'mounted storage\n' | sudo tee "$mnt/note.txt" >/dev/null || exit 1
cat "$mnt/note.txt" || exit 1
findmnt --mountpoint "$mnt" -o SOURCE,TARGET,FSTYPE,OPTIONS || exit 1
sudo umount -- "$mnt" || exit 1
mountpoint -q -- "$mnt"
lookup=$?
(( lookup == 32 )) || { printf 'Unmount not verified\n' >&2; exit 1; }
printf 'Unmount verified\n'

En cas de réussite, la sortie comprend mounted storage, la ligne de montage de l’image, puis Unmount verified et le chemin du dossier conservé. Les noms de boucle et de dossier varient. Ne considérez pas ces mots comme une preuve si une erreur les accompagne : lisez l’état de fin et les messages du script.

La création du système de fichiers reste confinée au nouveau fichier ordinaire. Le script ne fixe pas un numéro /dev/loop à copier depuis un exemple : il conserve seulement une réponse de forme /dev/loop suivie de chiffres. Il vérifie ensuite que le montage exact a cette source avant d’écrire note.txt. Les options nodev et nosuid ont été demandées pour ce montage et figurent dans la consultation des options effectives.

Le manuel de losetup décrit l’association et le détachement. Une demande de détachement peut être différée par le noyau selon les références restantes ; son retour ne dispense pas de la vérification des usages avant une suppression de l’image.

Comprendre les contrôles de fin et les limites du script

La fonction cleanup conserve l’état de sortie, intervient à la fin et tente de terminer uniquement les ressources identifiées de cet atelier. Si le point est monté, elle exige que sa source corresponde à la boucle enregistrée avant de demander umount. Une source différente, un échec de consultation ou un échec de démontage déclenche un message et empêche ce nettoyage du périphérique.

mountpoint distingue 0 pour un point de montage, 32 lorsqu’il n’en est pas un et 1 pour certains problèmes d’appel, de permissions ou de système. Son manuel définit ces états. Une simple requête findmnt qui ne trouve rien peut aussi échouer pour d’autres raisons ; le script ne transforme pas indistinctement son état non nul en permission de détacher.

Pour la boucle, cleanup demande une liste des sources montées et exige que cette lecture réussisse. La petite fonction contains_loop_source compare ensuite chaque ligne à la boucle et aux formes de source comprenant un sous-répertoire entre crochets. Une présence conserve la boucle ; une erreur de lecture conserve également la boucle. L’absence n’est retenue qu’après une consultation réussie dans l’espace de montage du script.

Ce contrôle ne transforme pas le script en gestionnaire de stockage de production : d’autres espaces de montage ou des changements concurrents peuvent sortir de ses observations. La vérification et l’écriture sont deux instants distincts. L’hypothèse d’une machine de pratique sans autre administrateur changeant ces ressources reste nécessaire.

Le dossier, le point vide et l’image ne sont jamais effacés automatiquement. En cas d’échec, utilisez le chemin affiché avec findmnt --mountpoint et examinez sudo losetup --list avant toute autre action. Si une ressource demeure utilisée ou si l’état est incertain, conservez le fichier. Une nouvelle exécution crée un nouveau dossier au lieu de formater l’ancien.

Traiter un démontage refusé sans forcer à l’aveugle

Un système de fichiers peut être occupé par le répertoire courant d’un shell, un fichier ouvert, un service ou un autre usage. Déplacez d’abord vos terminaux hors du montage et terminez normalement le travail qui l’utilise. Le manuel de umount décrit les causes courantes de l’état busy.

Si les outils sont installés, fuser -vm suivi du chemin exact, ou lsof adapté au besoin, aident à identifier les processus concernés. Leur visibilité dépend des droits. N’envoyez pas de signaux à tous les résultats sans identifier les applications et leurs données ; les notions de processus et signaux Linux permettent de distinguer une demande de terminaison d’une interruption brutale.

Un démontage différé ou forcé a des conditions et conséquences particulières. Il ne remplace pas le traitement de l’usage actif dans cet atelier. Après résolution, refaites la consultation et le démontage de la seule ressource identifiée, puis contrôlez son état avant d’envisager la suppression du fichier image.

Lire une entrée fstab avant de prévoir un montage automatique

/etc/fstab décrit des montages et d’autres usages de stockage prévus. L’exemple suivant illustre un système de fichiers ext4 auxiliaire déjà préparé ; ne le recopiez pas tel quel et n’y inscrivez pas automatiquement l’image temporaire de cet atelier :

UUID=REPLACE_WITH_ACTUAL_UUID /srv/data ext4 defaults,nodev,nosuid 0 2
Champ Rôle dans cet exemple
Source UUID réel du système de fichiers, après identification du bon support
Cible Répertoire /srv/data préparé pour cet usage
Type ext4, à adapter au format réellement présent
Options Options de montage demandées, à vérifier avec les besoins des applications
dump 0 : pas de sélection par ce champ pour dump
Ordre fsck 2 : ordre prévu ici pour un système de fichiers auxiliaire à vérifier

UUID signifie Universally Unique Identifier. Cet identifiant est souvent plus stable qu’un nom de périphérique dépendant de l’ordre de détection, mais les copies peuvent le dupliquer. Confirmez le support et les éventuels doublons. Le manuel de fstab définit les six champs et les échappements nécessaires si un chemin contient des espaces.

Avant une modification réelle, sauvegardez le fichier dans un emplacement distinct et notez comment le restaurer depuis la console. Examinez ensuite sudo findmnt --verify --verbose. Sur un système systemd, sudo systemctl daemon-reload fait relire les définitions produites à partir de fstab ; il ne monte pas à lui seul le stockage. Testez délibérément le seul montage voulu avec son identité confirmée, sans lancer au hasard tous les montages configurés.

Une validation ne reproduit pas toutes les conditions du prochain démarrage. Gardez le retour par console, contrôlez la source et les options après l’essai et, si le changement est abandonné, restaurez l’entrée précédente puis relancez la validation et la relecture nécessaires. La documentation des montages systemd explique cette conversion en unités.

nofail peut éviter qu’un stockage facultatif absent bloque le démarrage, mais il n’empêche pas une application d’écrire dans le répertoire sous-jacent resté vide de montage. Un stockage obligatoire demande une dépendance et un contrôle adaptés au service. ro, nodev, nosuid et noexec ont aussi des effets distincts ; ces options doivent correspondre au besoin, sans être traitées comme une protection universelle.

Comparer df et du pour comprendre un manque d’espace

df -hT "$HOME"
df -i "$HOME"
du -xhd1 "$HOME" | sort -h

df décrit l’allocation du système de fichiers contenant le chemin. du additionne l’espace des fichiers qu’il peut parcourir ; -x limite le franchissement vers un autre système de fichiers et -d1 limite la profondeur affichée. La lecture d’une grande arborescence peut elle-même produire beaucoup d’entrées-sorties.

Un fichier supprimé du répertoire mais encore ouvert par un processus peut continuer d’occuper des blocs. Les permissions empêchant du d’entrer dans certains chemins, les réserves et les métadonnées peuvent aussi expliquer des écarts. Nous ne masquons pas les diagnostics de du : un total obtenu malgré des refus de lecture peut être incomplet. Les manuels GNU de df et GNU de du détaillent leurs périmètres.

Avant de supprimer un gros fichier, identifiez son propriétaire, l’application et les règles de conservation. Traitez les journaux par leur rotation et les caches par les méthodes du programme concerné. Pour l’image de pratique, une suppression n’est appropriée qu’après contrôle de l’absence de montage et d’association encore utilisée ; si vous avez modifié fstab, corrigez aussi cette configuration au lieu de laisser une référence sans cible.