Cours Ubuntu 26.04 / Préparer un disque supplémentaire et configurer son montage avec fstab

Pour monter durablement un disque supplémentaire sur Ubuntu, reliez l’UUID réel de son système de fichiers à un point de montage dans /etc/fstab. Vérifiez le périphérique effectivement monté avant toute écriture, puis testez le redémarrage et l’absence du disque : voir un dossier ou des fichiers ne prouve pas que les données vont sur le bon support.

Identifier le disque et choisir entre préparation et simple montage

lsblk -o NAME,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
findmnt -rno SOURCE,TARGET,FSTYPE,OPTIONS

Comparez taille, identité, signatures et montages. Écartez la racine, les périphériques de démarrage et les sauvegardes existantes. Un nom tel que /dev/sdb peut changer après ajout de matériel ; il ne désigne pas universellement un disque neuf.

Si le disque de laboratoire possède déjà un système de fichiers à conserver, sautez entièrement la création de partitions et le formatage. Relevez son UUID et son montage, puis poursuivez à la préparation de fstab. Un disque contenant des données à récupérer ne doit pas être reformaté pour devenir montable.

Préparer uniquement un nouveau disque virtuel vide

Dans VirtualBox, arrêtez la VM, ouvrez Configuration → Stockage et utilisez l’ajout d’un disque dur sur le contrôleur prévu pour créer un nouveau VDI de laboratoire, par exemple 8 Gio. Sélectionnez un nouveau fichier sans données, jamais un disque physique de l’hôte ou un disque existant contenant des fichiers utiles. Ne partagez pas ce même disque en écriture entre plusieurs VM.

Depuis la console Server, comparez le nouveau disque de l’hyperviseur à son modèle, sa taille, son numéro de série et son chemin /dev/disk/by-id. Les outils requis sont Bash, lsblk, readlink, wipefs, fdisk, awk, udevadm, mkfs.ext4 et blkid. Vérifiez leur présence avec command -v et préparez les paquets Ubuntu nécessaires avant l’opération.

Le script complet ci-dessous conserve les contrôles du laboratoire : disque entier inscriptible, absence de dépendances et de montage, absence de signature détectée, puis deux confirmations du périphérique. Ces contrôles ne prouvent pas à eux seuls qu’un disque ne contient aucune donnée : sa provenance de nouveau VDI vide doit déjà être établie.

Enregistrez le bloc dans un nouveau fichier ~/prepare-empty-lab-disk.sh sans écraser un script existant. Exécutez bash ~/prepare-empty-lab-disk.sh suivi du véritable chemin by-id du nouveau disque. À l’invite fdisk, g prépare une table GPT, n crée une partition ; utilisez les valeurs par défaut adaptées au disque neuf, puis p pour relire la cible et les limites. w écrit réellement la table ; q permet d’abandonner avant l’écriture. En cas de doute, annulez avant w.

set -euo pipefail
if [ "$#" -ne 1 ]; then
    printf 'Usage: bash prepare-empty-lab-disk.sh /dev/disk/by-id/ACTUAL_NEW_DISK\n' >&2; exit 2
fi
case "$1" in /dev/disk/by-id/*) ;; *) printf 'Use the verified by-id path.\n' >&2; exit 2 ;; esac
disk=$(readlink -e -- "$1")
test -b "$disk"
if [ "$(lsblk -dnro TYPE "$disk")" != disk ] || [ "$(lsblk -dnro RO "$disk")" != 0 ]; then
    printf 'Not a writable whole disk.\n' >&2; exit 1
fi
if [ "$(lsblk -nr -o NAME "$disk" | wc -l)" -ne 1 ]; then
    printf 'Partitions or dependent devices already exist; stop.\n' >&2; exit 1
fi
if lsblk -nr -o MOUNTPOINTS "$disk" | grep -q '[^[:space:]]'; then
    printf 'A mount is present; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$disk")
if [ -n "$signatures" ]; then
    printf 'Existing signatures: %s; stop.\n' "$signatures" >&2; exit 1
fi
lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the verified empty disk path ($disk): " confirmed
if [ "$confirmed" != "$disk" ]; then exit 1; fi
sudo fdisk "$disk"
sudo udevadm settle
mapfile -t partitions < <(lsblk -nrpo NAME,TYPE "$disk" | awk '$2 == "part" {print $1}')
if [ "${#partitions[@]}" -ne 1 ]; then
    printf 'Expected one newly created partition; inspect before formatting.\n' >&2; exit 1
fi
partition=${partitions[0]}
if findmnt -rn --source "$partition" >/dev/null; then
    printf 'The partition is mounted; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$partition")
if [ -n "$signatures" ]; then printf 'Partition already has a signature; stop.\n' >&2; exit 1; fi
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the new partition to format as ext4 ($partition): " confirmed
if [ "$confirmed" != "$partition" ]; then exit 1; fi
sudo mkfs.ext4 -L lab-data "$partition"
sudo blkid "$partition"
lsblk -f "$disk"

Après fdisk, une seule partition nouvelle doit être identifiée avant la seconde confirmation et mkfs.ext4. Le résultat attendu est un système de fichiers ext4 étiqueté lab-data, avec un UUID relevé par blkid et lsblk. Une erreur ou une partition inattendue demande d’arrêter et d’inspecter ; ne relancez pas automatiquement toute l’initialisation.

Le manuel fdisk distingue le disque entier de ses partitions. mkfs.ext4 crée réellement un système de fichiers : restaurer fstab ne récupère pas des données formatées. Dans ce script, wipefs --no-act sert à examiner les signatures sans les effacer ; ne remplacez pas ces options par un effacement forcé.

Choisir la politique de montage et préparer un répertoire vide

Un montage relie un système de fichiers à un chemin. Créer /srv/lab-data ne monte aucun disque ; un montage ultérieur peut masquer les fichiers locaux qui existaient déjà sous ce chemin. Examinez donc le répertoire et ses montages avant de le réutiliser. S’il contient des données, préservez-les et choisissez un emplacement adapté plutôt que de les effacer.

Préparez l’accès console, sauvegardez fstab et créez le répertoire seulement s’il est absent :

(
set -eu
backup=$(sudo mktemp /root/fstab-backup.XXXXXX)
sudo cp -a /etc/fstab "$backup"
printf 'Sauvegarde : %s\n' "$backup"
if [ ! -e /srv/lab-data ]; then
    sudo mkdir /srv/lab-data
fi
sudo ls -la /srv/lab-data
)

Notez le chemin affiché seulement après réussite. Vérifiez que /srv/lab-data est un vrai répertoire prévu pour l’exercice, sans lien symbolique inattendu, fichiers à masquer ni montage déjà utilisé. Si le chemin n’est pas libre et approprié, arrêtez avant d’éditer fstab.

Une politique diffère selon que le disque est indispensable au service ou facultatif au démarrage. nofail peut laisser le système démarrer sans ce support, mais n’empêche pas un programme d’écrire dans le répertoire local sous-jacent. Pour des données de service, cette différence doit être traitée dans les dépendances et dans les contrôles du travail d’écriture.

Ajouter une seule entrée avec le véritable UUID

Ouvrez sudoedit /etc/fstab, gardez les autres lignes et ajoutez une entrée seulement si ce disque et ce point de montage n’y figurent pas déjà. Remplacez le marqueur ci-dessous par l’UUID exact du système de fichiers ext4 identifié :

UUID=REPLACE_WITH_VERIFIED_UUID /srv/lab-data ext4 defaults,nofail,x-systemd.device-timeout=10s 0 2

Les champs sont, dans l’ordre, la source, le point de montage, le type, les options, l’indicateur de sauvegarde dump et l’ordre du contrôle de système de fichiers. Ici, 0 désactive dump pour cette entrée et 2 indique un système non racine à contrôler selon la procédure du démarrage.

defaults utilise les options usuelles ; nofail rend ce disque facultatif pour le démarrage ; x-systemd.device-timeout=10s limite l’attente du périphérique par systemd. Ce délai ne plafonne pas la durée totale de tout le démarrage. Le format fstab impose aussi l’échappement des espaces dans les champs, même entre guillemets.

Ne confondez pas UUID du système de fichiers et PARTUUID de la partition. Des clones peuvent avoir des UUID identiques ; vérifiez que le support voulu est identifiable sans ambiguïté. Un UUID stable ne remplace pas le contrôle de la provenance du disque.

Vérifier fstab puis monter uniquement la cible prévue

(
set -eu
sudo findmnt --verify --verbose
sudo systemctl daemon-reload
sudo mount /srv/lab-data
findmnt --mountpoint /srv/lab-data -o SOURCE,TARGET,FSTYPE,UUID,OPTIONS
)

Une erreur de vérification doit être corrigée avant la suite. findmnt --verify contrôle la table, mais ne garantit pas que le périphérique fonctionnera ni que ses données sont saines. Le manuel findmnt distingue la recherche sur un point de montage exact de la recherche du système de fichiers contenant un chemin.

daemon-reload fait relire les unités générées à partir de fstab ; il ne monte pas à lui seul le disque. mount avec le point de montage cible l’entrée de l’exercice, au lieu de demander à mount -a de traiter aussi toutes les autres entrées. Comparez ensuite SOURCE, FSTYPE et UUID avec les valeurs attendues.

Bloquer le travail si le système de fichiers attendu n’est pas monté

Enregistrez ce contrôle dans un nouveau fichier ~/check-lab-mount.sh. À l’invite, saisissez l’UUID ext4 relevé, sans le préfixe UUID=. Il exige le montage exact et refuse un échec de consultation ou un autre UUID :

set -eu
read -r -p 'UUID ext4 vérifié, sans le préfixe UUID= : ' expected_uuid
if [[ ! "$expected_uuid" =~ ^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}$ ]]; then
    printf 'Format UUID ext4 invalide ; arrêt.\n' >&2; exit 1
fi
if ! actual_uuid=$(findmnt -rn --mountpoint /srv/lab-data -o UUID); then
    printf 'Montage attendu absent ou impossible à lire ; arrêt.\n' >&2; exit 1
fi
if [ "$actual_uuid" != "$expected_uuid" ]; then
    printf 'UUID différent du disque attendu ; arrêt.\n' >&2; exit 1
fi
printf 'Système de fichiers attendu monté.\n'

Exécutez bash ~/check-lab-mount.sh. La forme de l’UUID ne prouve pas son identité : elle évite seulement un marqueur ou une saisie mal formée ; la comparaison porte sur le montage réellement présent. Un code d’échec doit bloquer la tâche suivante, et non simplement être imprimé puis ignoré.

Après un contrôle réussi, vous pouvez créer un petit fichier d’essai distinct sans écraser de nom préexistant. Ce bloc exige d’abord la réussite du script puis écrit un fichier au nom unique avec sudo :

bash "$HOME/check-lab-mount.sh" && sudo sh -c '
set -eu
probe=$(mktemp /srv/lab-data/mount-check.XXXXXX)
printf "Test de persistance du montage.\n" > "$probe"
cat "$probe"
printf "Fichier de contrôle : %s\n" "$probe"
'

Notez le nom affiché et relisez ce fichier après un redémarrage planifié, une fois le montage et son UUID de nouveau vérifiés. Ce contrôle ponctuel n’empêche pas un démontage survenant entre la vérification et l’écriture ; un service durable doit aussi gérer ses dépendances et la perte du support pendant son fonctionnement.

Tester le disque absent et restaurer seulement l’entrée modifiée

Pour le laboratoire facultatif, terminez les activités sur le volume et arrêtez proprement la VM avant de détacher le disque virtuel. Détachez le support de cette VM sans supprimer son fichier VDI. Au démarrage suivant, vérifiez que le système respecte la politique nofail et que le contrôle du montage refuse l’écriture. Ne créez pas un fichier dans le dossier nu pour vérifier l’échec.

Arrêtez ensuite la VM, reconnectez le même support et vérifiez son identité, le montage et le fichier de contrôle. Pour une application qui exige ce volume, RequiresMountsFor=/srv/lab-data dans une unité systemd permet d’exprimer un besoin de montage au démarrage du service. Il faut encore vérifier l’UUID et définir la conduite à tenir si le support disparaît en cours d’exécution.

La documentation systemd.mount explique les options fstab et leurs dépendances. Un volume facultatif au démarrage du système n’est pas forcément facultatif pour le service qui y écrit.

En cas d’erreur, utilisez la console et comparez la seule entrée modifiée avec la sauvegarde. Rétablissez ou retirez cet ajout sans écraser les autres évolutions de fstab, vérifiez à nouveau la table et faites relire systemd. Un démontage éventuel exige d’abord l’arrêt des travaux qui utilisent le volume ; ne forcez pas une déconnexion pendant une écriture.