>_ Sistemi operativi e Linux

Disco pieno su Linux: trovare cosa occupa spazio con df e du

Liberare spazio su Linux con metodo: leggere df, trovare le cartelle pesanti con du e ncdu, pulire log, cache e kernel vecchi, capire inode e file aperti.

«No space left on device» è uno dei messaggi più temuti da chi gestisce un server: il database smette di scrivere, gli aggiornamenti falliscono, a volte non si riesce nemmeno ad accedere. Sul desktop il problema è meno drammatico ma altrettanto fastidioso. La reazione istintiva è cancellare qualcosa a caso; quella giusta è un metodo in tre passaggi: capire quale filesystem è pieno, trovare dove si concentra lo spazio, decidere cosa si può eliminare in sicurezza.

Passo 1: quale filesystem è pieno

Il comando è df:

df -h

Mostra ogni filesystem montato con dimensione, spazio usato, disponibile, percentuale e punto di montaggio. Su Linux possono esistere più partizioni: la radice /, a volte /home o /var separate, la partizione di avvio /boot. Sapere quale è piena cambia completamente la ricerca. Le righe con tipo tmpfs sono filesystem in memoria e di solito si possono ignorare; con df -h -x tmpfs -x devtmpfs spariscono.

Un caso particolare: df -h mostra spazio libero ma il sistema dice comunque che il disco è pieno. Allora si controllano gli inode:

df -i

Ogni file occupa un inode, e il loro numero su ext4 è fissato alla creazione del filesystem. Milioni di file minuscoli, come sessioni o file temporanei di un'applicazione web, possono esaurirli prima dello spazio.

Passo 2: dove si concentra lo spazio

du misura lo spazio occupato da cartelle e file. Il modo più utile per usarlo è guardare un livello alla volta, ordinando i risultati:

sudo du -h --max-depth=1 / 2>/dev/null | sort -h

L'ultima riga è la cartella più pesante. Si entra in quella e si ripete:

sudo du -h --max-depth=1 /var 2>/dev/null | sort -h

Due opzioni aiutano: -x impedisce a du di attraversare altri filesystem montati, così misuri solo la partizione che ti interessa; 2>/dev/null nasconde gli errori sulle cartelle virtuali come /proc.

Per un'esplorazione più comoda c'è ncdu, disponibile nei repository di quasi tutte le distribuzioni. Analizza la cartella indicata e mostra un elenco navigabile con le frecce, ordinato per dimensione; con d si elimina l'elemento selezionato, dopo conferma.

sudo ncdu -x /

Sui desktop esistono equivalenti grafici, come Analizzatore di utilizzo del disco in GNOME o Filelight in KDE.

Passo 3: i soliti sospetti

Nella mia esperienza lo spazio scompare quasi sempre negli stessi posti:

Posizione Cosa contiene Come intervenire
/var/log registri di sistema e applicazioni journalctl --vacuum-size=, verificare logrotate
/var/cache/apt o la cache di dnf pacchetti scaricati sudo apt clean o sudo dnf clean all
/var/lib/docker immagini, container e volumi docker system df, poi docker system prune
/var/lib/snapd o Flatpak versioni precedenti dei pacchetti ridurre le revisioni conservate, flatpak uninstall --unused
/boot kernel vecchi sudo apt autoremove
~/.cache cache di browser e programmi si può svuotare con i programmi chiusi
cestino in ~/.local/share/Trash file eliminati dal desktop svuotare il cestino

Con Docker, attenzione: docker system prune rimuove container fermi, reti inutilizzate e immagini senza nome; aggiungere --volumes elimina anche i volumi non collegati, che possono contenere dati di database. Meglio leggere prima cosa verrebbe eliminato.

Su una partizione /boot piccola, l'accumulo di kernel vecchi è una causa frequente di aggiornamenti falliti. autoremove li elimina tenendo quello in uso e il precedente.

Il caso dei file cancellati ma ancora aperti

A volte si elimina un file di log enorme, ma df continua a mostrare il disco pieno. Il motivo: un processo ha ancora il file aperto. Su Linux il file sparisce dalla cartella, ma lo spazio viene liberato solo quando l'ultimo processo lo chiude. Per trovarli:

sudo lsof +L1

L'elenco mostra i file eliminati e ancora in uso, con il processo che li tiene. La soluzione è riavviare quel servizio. Per svuotare un log senza questo problema, invece di cancellarlo si tronca:

sudo truncate -s 0 /var/log/applicazione/grande.log

Lo spazio riservato di ext4

Su ext4 una piccola percentuale del disco è riservata a root, il 5% per impostazione predefinita, per permettere al sistema di funzionare anche quando gli utenti hanno riempito tutto. Per questo df può mostrare la partizione al 100% mentre root riesce ancora a scrivere. Su un disco dedicato ai soli dati, la riserva si può ridurre con sudo tune2fs -m 1 /dev/sdb1; sulla partizione di sistema conviene lasciarla.

Prevenire

  • Impostare limiti ai registri, con SystemMaxUse per journald e regole di logrotate per i file di testo.
  • Ripulire periodicamente cache dei pacchetti e immagini di container non usate.
  • Monitorare lo spazio libero con un avviso sotto una soglia, per esempio il 15%, invece di accorgersene quando è finito.

In sintesi

  • df -h dice quale filesystem è pieno; df -i controlla gli inode.
  • du --max-depth=1 | sort -h o ncdu -x trovano la cartella responsabile, un livello alla volta.
  • Log, cache dei pacchetti, Docker e kernel vecchi sono le cause più frequenti.
  • Un file cancellato ma aperto occupa spazio finché il processo non lo chiude: lsof +L1.
  • I log si troncano con truncate, non si cancellano mentre sono in uso.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche