Salta al contenuto principale

tune2fs: leggere e modificare i parametri di un file system ext

Inviato da tuxsa il

Dopo aver creato un file system con mkfs.ext4, molte scelte non sono definitive. L'etichetta, lo spazio riservato a root, il comportamento in caso di errori, la presenza del giornale: tutto si può cambiare in seguito, senza riformattare e senza perdere i dati. Lo strumento è tune2fs.

Cos'è

tune2fs fa parte di e2fsprogs, lo stesso pacchetto di mkfs.ext4, e2fsck e resize2fs, e lavora solo sui file system ext2, ext3 ed ext4. Il nome viene da tune, "mettere a punto": è il comando con cui si regolano i parametri del superblocco, cioè l'area in cui il file system conserva le proprie impostazioni.

Cosa fa

Con l'opzione -l mostra tutti i parametri del file system; con le altre opzioni li modifica: etichetta, UUID, blocchi riservati, controlli periodici, comportamento agli errori, funzionalità attive (feature), opzioni di montaggio predefinite. Molte modifiche funzionano anche a file system montato, altre richiedono che sia smontato o controllato prima con e2fsck; negli esempi qui sotto indico quali.

Come si usa

$ sudo tune2fs [opzioni] DISPOSITIVO

Come negli articoli su mkfs, fsck e resize2fs, lavoro su un'immagine di disco (d.img, 128 MB) per provare in sicurezza; sul tuo sistema usa la partizione vera, per esempio /dev/sdb1. Gli output sono quelli della versione 1.47.0, in inglese: con un sistema in italiano qualche riga potrebbe comparire tradotta.

Esempio 1: leggere i parametri

$ sudo tune2fs -l d.img | grep -E "^(Filesystem volume|Filesystem state)"
Filesystem volume name:   dati
Filesystem state:         clean
$ sudo tune2fs -l d.img | grep -E "^(Errors|Block count|Reserved block)"
Errors behavior:          Continue
Block count:              32768
Reserved block count:     1638

-l stampa il superblocco in sola lettura ed è sicuro anche a file system montato. L'elenco completo è lungo (una trentina di righe), per questo qui l'ho filtrato con grep (vedi l'articolo su grep). Un'alternativa quasi identica è dumpe2fs -h. Per le funzionalità attive, la riga features è molto lunga: con fold si legge meglio.

$ sudo tune2fs -l d.img | grep features | fold -s -w 70
Filesystem features:      has_journal ext_attr resize_inode dir_index
filetype extent 64bit flex_bg sparse_super large_file huge_file
dir_nlink extra_isize metadata_csum

Esempio 2: cambiare l'etichetta

$ sudo tune2fs -L archivio d.img
$ e2label d.img
archivio

-L imposta l'etichetta (massimo 16 caratteri), che poi puoi usare in /etc/fstab con LABEL=archivio e vedere con lsblk -f o blkid. e2label senza argomenti la legge. Nel mio test il cambio è riuscito anche con il file system montato.

Esempio 3: ridurre lo spazio riservato a root

$ sudo tune2fs -m 1 d.img
Setting reserved blocks percentage to 1% (327 blocks)
$ sudo tune2fs -r 500 d.img
Setting reserved blocks count to 500

Di default ext4 tiene da parte il 5% dello spazio per root (qui 1638 blocchi su 32768), così il sistema non si blocca se un utente riempie il disco. Su un disco di soli dati, di grandi dimensioni, è uno spreco: -m 1 lo porta all'1%, oppure con -r indichi il numero esatto di blocchi. Il comando funziona a caldo. Sul disco di sistema conviene lasciare il valore predefinito.

Esempio 4: cambiare l'UUID

$ sudo tune2fs -l d.img | grep UUID
Filesystem UUID:          f45f2fbb-c29e-4d26-b1d7-08e416970b2c
$ sudo tune2fs -U random d.img
$ sudo tune2fs -l d.img | grep UUID
Filesystem UUID:          bb757ab7-90b8-4ba5-9094-240a6e3e257c

-U random genera un nuovo UUID: serve, per esempio, dopo aver clonato un disco con dd per evitare che due file system abbiano lo stesso identificatore. Gli UUID mostrati sono solo esempi. Su un file system appena creato e smontato il cambio è riuscito subito; su uno montato (il mio usa metadata_csum) il comando si è rifiutato, chiedendo un file system appena controllato: This operation requires a freshly checked filesystem. Please run e2fsck -f on the filesystem. Dopo il cambio ricordati di aggiornare /etc/fstab se lo usi lì.

Esempio 5: controlli periodici

$ sudo tune2fs -c 30 -i 1m d.img
Setting maximal mount count to 30
Setting interval between checks to 2592000 seconds
$ sudo tune2fs -c 0 -i 0 d.img

-c fissa dopo quanti montaggi forzare un controllo con fsck, -i ogni quanto tempo (d giorni, w settimane, m mesi). Il secondo comando azzera entrambi: è l'impostazione predefinita di ext4. -C NUMERO imposta a mano il contatore dei montaggi.

Esempio 6: cosa fare in caso di errori

$ sudo tune2fs -e remount-ro d.img
Setting error behavior to 2
$ sudo tune2fs -l d.img | grep "Errors behavior"
Errors behavior:          Remount read-only

I valori possibili sono continue (la predefinita, come si vede nell'esempio 1), remount-ro (il file system passa in sola lettura al primo errore) e panic (il kernel si ferma). Su un server remount-ro è spesso una scelta prudente: evita di scrivere su una struttura già danneggiata. Il comando panic non l'ho provato.

Esempio 7: togliere o aggiungere il giornale

$ sudo tune2fs -O ^has_journal d.img
$ sudo tune2fs -j d.img
Creating journal inode: done
$ sudo tune2fs -l d.img | grep -i "journal"
Journal inode:            8
Journal backup:           inode blocks

L'opzione -O attiva (-O nome) o disattiva (-O ^nome) una funzionalità. Qui ho tolto il giornale e poi l'ho ricreato con -j; dopo queste operazioni e2fsck -fn non segnala problemi. Su un file system montato la disattivazione viene rifiutata:

$ sudo tune2fs -O ^has_journal /dev/loop0
The has_journal feature may only be cleared when the filesystem is
unmounted or mounted read-only.

Senza giornale le scritture sono un poco più veloci e c'è meno usura, ma dopo uno spegnimento brusco il controllo con fsck è molto più lungo e il rischio di inconsistenze aumenta. È una scelta da fare solo per dischi particolari, come una chiavetta o un volume temporaneo.

Esempio 8: opzioni di montaggio predefinite

$ sudo tune2fs -o ^acl d.img
$ sudo tune2fs -l d.img | grep "Default mount"
Default mount options:    user_xattr
$ sudo tune2fs -E mount_opts=discard d.img
Setting extended default mount options to 'discard'

Il file system ricorda le opzioni con cui montarlo, e mount le usa quando non gli dici altro. -o modifica quelle standard (come acl o user_xattr), -E mount_opts= aggiunge opzioni libere. Un'opzione scritta nel superblocco vale per qualunque sistema in cui colleghi il disco, quindi usala con parsimonia.

Esempio 9: modifiche che il comando rifiuta

$ sudo tune2fs -O ^metadata_csum d.img
This operation requires a freshly checked filesystem.
$ sudo tune2fs -O ^64bit d.img
After running e2fsck, please run `resize2fs -s d.img' to disable 64-bit mode.
$ sudo tune2fs -I 128 d.img
Shrinking inode size is not supported

Alcune funzionalità non si cambiano con un solo comando: servono prima un e2fsck -f (vedi fsck) e talvolta altri strumenti (resize2fs -s per passare da 64 a 32 bit). Le dimensioni degli inode si possono solo aumentare, non ridurre. Nella seconda riga ho riportato solo la parte finale del messaggio, che nell'originale è più lunga.

Esempio 10: uso negli script

#!/bin/bash
IMG="$1"
info=$(tune2fs -l "$IMG" 2>/dev/null) || { echo "non è un ext: $IMG" >&2; exit 1; }
res=$(echo "$info" | awk '/^Reserved block count/ {print $4}')
tot=$(echo "$info" | awk '/^Block count/ {print $3}')
pct=$(( (res * 100 + tot / 2) / tot ))
echo "$IMG: riservato $pct%"
if [ "$pct" -gt 2 ]; then
    tune2fs -m 1 "$IMG" > /dev/null && echo "portato a 1%"
fi

Lo script legge lo spazio riservato in percentuale e, se supera il 2%, lo porta all'1%. Su un'immagine con il 5% ha stampato d.img: riservato 5% e portato a 1%; al secondo lancio riservato 1% e nessuna modifica. Su un file che non è un ext (un FAT, ad esempio) o che non esiste dice "non è un ext" ed esce con codice 1. Ho usato un arrotondamento nel calcolo perché la divisione intera della shell taglia i decimali.

Opzioni utili

  • -l: mostra i parametri del superblocco (sola lettura).
  • -L ETICHETTA: cambia l'etichetta.
  • -U UUID: cambia l'UUID (random, time, clear o un valore).
  • -m PERCENTUALE e -r BLOCCHI: spazio riservato a root.
  • -u UTENTE e -g GRUPPO: chi può usare lo spazio riservato.
  • -c, -C e -i: controlli periodici e contatore dei montaggi.
  • -e continue|remount-ro|panic: comportamento in caso di errori.
  • -O [^]FUNZIONALITÀ: attiva o disattiva una feature. -j aggiunge il giornale.
  • -o OPZIONE e -E mount_opts=: opzioni di montaggio predefinite.

Attenzione a

  • Solo ext2, ext3 ed ext4: su altri tipi tune2fs risponde Bad magic number in super-block. Per gli altri esistono strumenti propri (xfs_admin, fatlabel, btrfs filesystem label): li cito ma non li ho provati.
  • Smontato o controllato: le modifiche più delicate (togliere il giornale, funzionalità come metadata_csum, UUID su un file system montato) richiedono il file system smontato e un e2fsck -f recente.
  • Fai una copia prima di -O: cambiare le funzionalità è l'unica parte davvero rischiosa. Un'interruzione a metà può lasciare il file system inutilizzabile.
  • UUID ed etichetta in fstab: se cambi uno dei due e /etc/fstab li usa, il montaggio automatico al prossimo avvio fallisce.
  • Il 5% riservato non è inutile: sul disco di sistema aiuta a non bloccare il sistema quando si riempie. Riducilo solo sui dischi di soli dati.
  • Controlli periodici: con i giornali moderni conta soprattutto il controllo dopo spegnimenti anomali; i controlli ogni N montaggi sono disattivati per scelta predefinita e rallentano l'avvio.
  • Non è resize2fs: cambiare dimensione al file system è un altro comando, ne parliamo nell'articolo dedicato.

Riepilogo

ComandoCosa fa
tune2fs -l DEVMostra i parametri del file system
tune2fs -L nome DEVCambia l'etichetta
tune2fs -U random DEVGenera un nuovo UUID
tune2fs -m 1 DEVRiserva a root solo l'1% dello spazio
tune2fs -c 30 -i 1m DEVControllo ogni 30 montaggi o ogni mese
tune2fs -e remount-ro DEVSola lettura al primo errore
tune2fs -O ^has_journal DEVToglie il giornale (smontato)
tune2fs -j DEVAggiunge il giornale
tune2fs -o ^acl DEVCambia le opzioni di montaggio predefinite
e2label DEVLegge l'etichetta