Salta al contenuto principale

resize2fs: ridimensionare un file system ext4

Inviato da tuxsa il

Hai ingrandito un disco virtuale, esteso un volume o recuperato spazio dopo aver eliminato una partizione, ma df continua a mostrare la dimensione vecchia? Oppure devi fare spazio a una nuova partizione e ti serve rimpicciolire quella esistente? In entrambi i casi il lavoro sul file system lo fa resize2fs.

Cos'è

resize2fs fa parte di e2fsprogs, lo stesso pacchetto di mkfs.ext4 e e2fsck, e funziona solo sui file system della famiglia ext (ext2, ext3, ext4). Per gli altri tipi esistono strumenti propri: xfs_growfs per XFS (che si può solo ingrandire) e btrfs filesystem resize per Btrfs. Un punto da non confondere: resize2fs cambia la dimensione del file system, non quella della partizione che lo contiene. La partizione si modifica a parte, con fdisk o simili.

Cosa fa

Aggiorna le strutture interne del file system (tabelle degli inode, mappe dei blocchi, descrittori di gruppo) in modo che occupi esattamente la dimensione richiesta. Se non indichi una dimensione, il file system viene portato a occupare tutto lo spazio disponibile sul dispositivo. Ingrandire è un'operazione sicura anche a file system montato; rimpicciolire richiede invece il file system smontato e controllato con e2fsck poco prima.

Come si usa

$ sudo resize2fs [opzioni] DISPOSITIVO [DIMENSIONE]

La dimensione si può scrivere con un suffisso: s (settori da 512 byte), K, M, G, T. Senza suffisso il numero indica i blocchi del file system (di solito da 4 KiB). Come per mkfs e fsck, negli esempi lavoro su immagini di dischi (d.img) per poter provare tutto senza rischi; sul tuo sistema usa la partizione vera, ad esempio /dev/sdb1. Gli output arrivano da una versione 1.47.0 in inglese: con la lingua italiana qualche riga potrebbe essere tradotta.

Esempio 1: ingrandire fino a riempire lo spazio disponibile

$ truncate -s 128M d.img
$ sudo resize2fs d.img
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on d.img to 32768 (4k) blocks.
The filesystem on d.img is now 32768 (4k) blocks long.

Il file system era stato creato su 64 MB. Dopo aver portato l'immagine a 128 MB, resize2fs senza dimensione lo estende a tutto lo spazio. Sul tuo sistema il passaggio equivalente è allargare prima la partizione (o il volume LVM, o il disco virtuale) e poi lanciare resize2fs sul dispositivo. Se il file system ha già la dimensione giusta il comando lo dice e non fa niente:

$ sudo resize2fs d.img
The filesystem is already 16384 (4k) blocks long.  Nothing to do!

Esempio 2: scoprire quanto si può rimpicciolire

$ sudo resize2fs -P d.img
resize2fs 1.47.0 (5-Feb-2023)
Estimated minimum size of the filesystem: 2076

-P stima la dimensione minima possibile, in blocchi, e non modifica nulla. Qui 2076 blocchi da 4 KiB sono circa 8 MiB. È una stima: il valore reale può essere leggermente diverso e un tentativo più piccolo viene rifiutato con resize2fs: New size smaller than minimum (2065).

Esempio 3: rimpicciolire (prima il controllo)

$ sudo resize2fs d.img 32M
resize2fs 1.47.0 (5-Feb-2023)
Please run 'e2fsck -f d.img' first.

$ sudo e2fsck -fp d.img
$ sudo resize2fs d.img 32M
Resizing the filesystem on d.img to 8192 (4k) blocks.
The filesystem on d.img is now 8192 (4k) blocks long.

Il messaggio "Please run 'e2fsck -f' first" compare quando il file system non è stato controllato di recente (ad esempio dopo un uso recente senza controllo). Nel mio banco di prova non si presentava da solo: l'ho provocato alterando a mano la data dell'ultimo montaggio con debugfs. La procedura corretta è comunque sempre quella: smonta, controlla con e2fsck -fp (vedi l'articolo su fsck), poi riduci. Con -f puoi saltare il controllo, ma è una scelta da fare solo se sai cosa stai facendo.

Esempio 4: ridurre al minimo possibile

$ sudo resize2fs -M d.img
Resizing the filesystem on d.img to 2076 (4k) blocks.
The filesystem on d.img is now 2076 (4k) blocks long.
$ sudo e2fsck -fn d.img | tail -1
dati: 11/16384 files (9.1% non-contiguous), 2065/2076 blocks

-M riduce il file system alla dimensione minima. Come si vede dall'ultima riga, restano liberi solo 11 blocchi su 2076: un file system così pieno non è utilizzabile. Di solito conviene indicare una dimensione precisa con un po' di margine, come nell'esempio 3.

Esempio 5: lavorare con un file di annullamento

$ sudo resize2fs -z u.undo e.img 32M
resize2fs 1.47.0 (5-Feb-2023)
Overwriting existing filesystem; this can be undone using the command:
    e2undo u.undo e.img
$ sudo e2undo u.undo e.img

Con -z resize2fs salva in un file i blocchi che sta per sovrascrivere. Se qualcosa va storto o cambi idea, e2undo ripristina la situazione precedente: nel mio test dopo e2undo il file system è tornato a 16384 blocchi, la dimensione originale. È una rete di sicurezza utile, ma non sostituisce il backup.

Esempio 6: le unità di misura

$ sudo resize2fs d.img 8192
$ sudo resize2fs d.img 40000s
$ sudo resize2fs d.img 40M

Il primo comando porta il file system a 8192 blocchi (32 MiB con blocchi da 4 KiB), il secondo a 40000 settori da 512 byte (5000 blocchi, circa 20 MiB), il terzo a 40 MiB. Valori con la virgola come 0.05G non sono accettati: Invalid new size. Un dettaglio che vale solo per le immagini: se il file immagine è più piccolo o più grande della dimensione richiesta, resize2fs lo estende o lo tronca. Su un dispositivo vero questo non accade e non puoi superare la dimensione del dispositivo.

Esempio 7: ingrandire un file system montato (non verificato qui)

$ lsblk -f /dev/sdb
$ sudo growpart /dev/sdb 1
$ sudo resize2fs /dev/sdb1
$ df -h /dati

Questa sequenza è quella tipica per un disco di una macchina virtuale a cui è stato aggiunto spazio: si controlla con lsblk, si allarga la partizione (growpart è nel pacchetto cloud-guest-utils) e poi si lancia resize2fs anche a file system montato, perché l'ingrandimento "a caldo" è supportato da ext4. Nel mio sandbox non ho potuto provarla: il kernel ha risposto Permission denied to resize filesystem a un ridimensionamento online. Per questo i comandi qui sopra sono illustrativi e il nome /dev/sdb è un esempio. Il rimpicciolimento a caldo invece non è supportato da ext4: serve sempre smontare.

Esempio 8: uso negli script

#!/bin/bash
IMG="$1"
e2fsck -fp "$IMG" > /dev/null 2>&1 || {
    echo "controllo fallito, mi fermo" >&2
    exit 1
}
min=$(resize2fs -P "$IMG" 2>/dev/null | awk '{print $NF}')
bs=$(dumpe2fs -h "$IMG" 2>/dev/null | awk '/^Block size/ {print $3}')
echo "$IMG: minimo $min blocchi da $bs byte = $((min * bs / 1048576)) MiB"

Lo script non modifica nulla: controlla il file system e stampa la dimensione minima in MiB. Se il controllo fallisce (o il file non esiste) si ferma con codice 1; sull'immagine di prova ha stampato s.img: minimo 2076 blocchi da 4096 byte = 8 MiB. Il controllo con e2fsck -fp funziona anche senza terminale grazie a -p. Prima di usarlo su un dispositivo reale, ricordati di smontarlo.

Opzioni utili

  • -P: stima la dimensione minima, senza modificare niente.
  • -M: riduce il file system alla dimensione minima.
  • -f: forza l'operazione anche se i controlli di sicurezza avrebbero fermato il comando.
  • -p: mostra una barra di avanzamento (in un terminale interattivo).
  • -z FILE: salva un file di annullamento da usare con e2undo.
  • -d NUMERO: abilita messaggi di debug (per chi sviluppa o fa diagnosi).
  • -b e -s: convertono il file system da 32 a 64 bit e viceversa. Non li ho provati e non vanno usati alla leggera.

Attenzione a

  • L'ordine delle operazioni: per ingrandire si allarga prima la partizione (o il volume) e poi il file system; per rimpicciolire si riduce prima il file system e poi la partizione. Se sbagli ordine tagli via dati.
  • La partizione non cambia: resize2fs non tocca la tabella delle partizioni. Dopo aver ridotto il file system, lo spazio liberato resta assegnato alla partizione finché non la modifichi con fdisk o parted, facendo molta attenzione a non scendere sotto la dimensione del file system.
  • Backup prima di ridurre: ridurre sposta dati e inode, e un'interruzione a metà può lasciare il file system inutilizzabile. Fai una copia, oppure usa -z.
  • Non solo ext: su XFS, Btrfs, FAT e altri resize2fs non funziona; usa lo strumento specifico. Controlla il tipo con lsblk -f o blkid.
  • Dimensione minima: -P è una stima e un file system quasi pieno si riduce male: lascia sempre un margine di spazio libero.
  • Unità senza suffisso: un numero senza lettera indica i blocchi, non i megabyte. resize2fs d.img 512 non significa 512 MB.
  • Dopo l'operazione: controlla con df -h (se montato) o dumpe2fs -h che la nuova dimensione sia quella attesa.

Riepilogo

ComandoCosa fa
resize2fs DEVEstende il file system a tutto lo spazio disponibile
resize2fs DEV 32GPorta il file system a una dimensione precisa
resize2fs -P DEVStima la dimensione minima, senza modificare
resize2fs -M DEVRiduce al minimo possibile
resize2fs -z FILE DEV 32GRidimensiona con file di annullamento
e2undo FILE DEVAnnulla un ridimensionamento
e2fsck -fp DEVControllo da fare prima di ridurre
dumpe2fs -h DEVMostra dimensione e parametri del file system