Corso Linux / Montare file system e diagnosticare lo spazio occupato
Il montaggio rende un file system accessibile attraverso una directory nello spazio dei nomi Linux. Verifica prima il bersaglio e il punto di mount, poi controlla sorgente, percorso e opzioni con findmnt; per diagnosticare lo spazio esaurito distingui l’uso dei byte da quello degli inode.
Prima di scegliere un bersaglio da formattare, consulta la lezione su dischi, partizioni e file system. L’esercizio seguente usa soltanto un nuovo file immagine temporaneo.
L’ambiente di riferimento è una macchina virtuale con un’installazione ordinaria di Ubuntu 26.04 LTS o Rocky Linux 9. Container, Windows Subsystem for Linux (WSL) e altri rilasci possono differire per servizi e pacchetti. Prepara una console di recupero e annota le versioni seguendo la lezione sull’ambiente di prova in macchina virtuale (in inglese).
Capire che cosa nasconde un punto di mount
Montare un file system sopra una directory non vuota nasconde temporaneamente le voci originarie senza cancellarle. Dopo lo smontaggio tornano visibili. Usa una directory di prova vuota e interroga il percorso esatto con findmnt -T per identificare lo spazio di archiviazione che lo contiene in quel momento.
findmnt -T "$HOME"
df -hT "$HOME"
df -i "$HOME"
I comandi mostrano il mount che contiene la home, lo spazio usato e l’uso degli inode. Gli inode rappresentano oggetti del file system e i relativi metadati; molti file piccoli possono esaurirli anche quando rimangono byte liberi. Modalità di conteggio e limiti dipendono dal file system.
Montare, scrivere e smontare un’immagine nuova
Esegui questo esempio indipendente in una VM di laboratorio con accesso sudo e strumenti ext4. Un container con privilegi limitati può impedire il montaggio. L’esempio non dipende dalle variabili di una lezione precedente e formatta soltanto un’immagine appena creata, mai un disco operativo.
Salva tutto il codice seguente in mount-lab.sh con terminatori di riga LF ed esegui bash mount-lab.sh. Servono Bash, gli strumenti di base GNU, util-linux, e2fsprogs e sudo. Su Ubuntu puoi preparare util-linux ed e2fsprogs con sudo apt install util-linux e2fsprogs, su Rocky Linux con sudo dnf install util-linux e2fsprogs; l’installazione modifica i pacchetti del sistema. Controlla prima le versioni nella VM.
Lo script assegna esplicitamente un dispositivo loop, che presenta il file immagine come dispositivo a blocchi. Scrive solo quando il punto di mount esatto indica quel dispositivo come sorgente. Un errore di preparazione interrompe la procedura prima della scrittura.
#!/usr/bin/env bash
set -u
set -o pipefail
for tool in mktemp truncate mkfs.ext4 losetup mount umount findmnt sudo tee mkdir cat; 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=''
mounted=0
loop_is_mounted() {
local sources item
sources=$(findmnt -rn -o SOURCE) || return 2
while IFS= read -r item; do
[[ "$item" == "$loop" || "$item" == "$loop["* ]] && return 0
done <<< "$sources"
return 1
}
cleanup() {
result=$?
trap - EXIT
if [[ -n "$loop" ]]; then
if (( mounted )); then
source=$(findmnt -rn --mountpoint "$mnt" -o SOURCE)
if [[ $? == 0 && "$source" == "$loop" ]]; then
sudo umount -- "$mnt" || result=1
else
printf 'Inspect mount before cleanup: %s\n' "$mnt" >&2
result=1
fi
fi
loop_is_mounted
lookup=$?
if (( lookup == 1 && result == 0 )); then
sudo losetup --detach "$loop" || result=1
else
printf 'Loop retained for inspection: %s\n' "$loop" >&2
result=1
fi
fi
printf 'Lab retained for inspection: %s\n' "$lab"
exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
truncate -s 128M "$img" || exit 1
mkfs.ext4 -F "$img" || exit 1
mkdir "$mnt" || exit 1
loop=$(sudo losetup --find --show "$img") || exit 1
[[ "$loop" == /dev/loop* ]] || { printf 'Unexpected loop device\n' >&2; exit 1; }
sudo mount -t ext4 -o nodev,nosuid "$loop" "$mnt" || exit 1
mounted=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
sudo umount -- "$mnt" || exit 1
mounted=0
loop_is_mounted
lookup=$?
(( lookup == 1 )) || { printf 'Mount remains or lookup failed\n' >&2; exit 1; }
printf 'Unmount verified\n'
In caso di successo compaiono mounted storage e Unmount verified. Durante l’uscita, lo script smonta soltanto la sorgente verificata nel proprio punto di mount. Il dispositivo loop viene separato automaticamente soltanto se non ci sono errori e una lettura riuscita dell’elenco completo delle sorgenti montate non ne rileva l’uso, compresi i riferimenti a sottodirectory. La directory e l’immagine vengono conservate e il percorso viene stampato; una nuova esecuzione crea una nuova directory.
La distinzione è necessaria perché findmnt può restituire 1 sia quando non trova una corrispondenza sia in caso di errore. La funzione loop_is_mounted usa 0 per un utilizzo rilevato, 1 per assenza dopo una lettura completa riuscita e 2 per un errore della lettura. Un errore o un’uscita anomala conserva il loop per l’ispezione, anche se lo smontaggio di recupero è riuscito. Non interpretare un errore di consultazione come prova che il dispositivo sia libero.
Questa è una prova personale senza altri amministratori che cambino i mount contemporaneamente; non elimina le condizioni di competizione fra verifica e scrittura. Dopo un errore controlla il percorso con findmnt --mountpoint PERCORSO_REALE e i loop con sudo losetup --list. Non rimuovere file ancora montati. Se il loop è rimasto assegnato, dopo aver verificato che non sia più in uso separa soltanto quello dell’esercizio con sudo losetup --detach /dev/loopN, sostituendo il segnaposto con il dispositivo effettivamente registrato. Non usare la separazione di tutti i loop.
Gestire un mount occupato senza forzare la rimozione
Una shell con la directory corrente dentro il mount, un file aperto o un servizio attivo possono impedire lo smontaggio. Sposta i terminali fuori dal mount e chiudi normalmente il programma interessato. Se disponibili, fuser -vm PERCORSO_MOUNT e lsof aiutano a individuare gli utilizzatori; sostituisci il segnaposto con il percorso reale. Non usare come prima risposta la terminazione forzata o uno smontaggio differito con umount -l: quest’ultimo rimuove subito il collegamento dall’albero, ma rimanda la pulizia finché restano riferimenti.
Trattare i mount persistenti come modifiche da verificare
/etc/fstab registra sorgente, punto di mount, tipo, opzioni, indicazione per dump e ordine dei controlli fsck. I nomi dei dispositivi possono cambiare; dove appropriato usa un UUID (Universally Unique Identifier), cioè l’identificatore del file system. La riga seguente è soltanto un modello per un file system ext4 secondario: sostituisci UUID e directory con quelli effettivi. Non registrare in fstab l’immagine temporanea di questa prova.
UUID=REPLACE_WITH_ACTUAL_UUID /srv/data ext4 defaults,nodev,nosuid 0 2
Prima salva una copia di fstab, poi usa sudo findmnt --verify --verbose per controllare sintassi e bersagli accessibili. Negli ambienti systemd, sudo systemctl daemon-reload ricarica la configurazione delle unità generate; prova poi intenzionalmente solo il mount interessato. La verifica non garantisce ogni condizione del prossimo avvio: mantieni una console di recupero e conserva la copia da ripristinare in caso di errore.
nofail permette di continuare l’avvio senza attendere il successo del mount facoltativo, ma non impedisce a un’applicazione di scrivere nella directory sottostante quando il dispositivo manca. Per uno spazio indispensabile progetta dipendenze del mount e condizioni di avvio del servizio. ro rende il mount di sola lettura, nodev impedisce di interpretare file speciali come dispositivi, nosuid limita i privilegi set-user-ID/set-group-ID e le capacità dei file, mentre noexec impedisce l’esecuzione diretta dei binari da quel mount. Scegli le opzioni in base al carico di lavoro: non sono protezioni universali contro ogni forma di esecuzione.
Spiegare le differenze tra df e du prima di cancellare dati
df -hT
df -i
du -xhd1 "$HOME" 2>/dev/null | sort -h
df mostra l’allocazione a livello di file system, mentre du percorre i file accessibili. File cancellati ma ancora aperti, directory non leggibili, blocchi riservati e metadati possono spiegare risultati diversi. du -x evita di attraversare directory di altri file system, -d1 limita la profondità dei risultati visualizzati e -h usa dimensioni leggibili; sort -h le ordina. Il limite di profondità non evita la scansione necessaria per calcolare i totali: alberi grandi generano comunque attività di ingresso e uscita.
2>/dev/null nasconde gli errori di du, quindi il totale può essere incompleto. Se devi investigare una differenza, ripeti la consultazione senza questa redirezione e leggi gli errori; il solo stato della pipeline non prova che tutte le directory siano state lette. Non liberare spazio cancellando subito un file grande: identifica il servizio proprietario e i requisiti di conservazione.
Gestisci i log tramite rotazione e le cache con le procedure previste dall’applicazione. Rimuovi le immagini di laboratorio solo dopo aver verificato lo smontaggio e l’eventuale separazione del loop. Se hai cambiato fstab durante una prova, ripristina e verifica anche la configurazione originale.




