ext4, ext3 ed ext2, spiegati.
Cosa sono i file system di Linux, come dispongono i file su un disco, cosa protegge il journal, quali funzioni e limiti contano oggi e come aprire un disco ext4 su un Mac o su un PC Windows.
Ultima verifica
Cosa sono ext2, ext3 ed ext4
ext2, ext3 ed ext4 sono il secondo, il terzo e il quarto file system esteso (extended file system): i formati che Linux usa per i propri dischi da più di trent’anni. Un file system decide come file, cartelle, nomi, permessi e date sono disposti su un disco, perché ogni computer che conosce il formato li possa ritrovare.
Oggi incontri soprattutto ext4. Debian, Ubuntu e Raspberry Pi OS formattano i dischi con questo formato, è la scelta abituale per il disco dati di un server Linux e Google ci ha portato i telefoni Android nel 2010. Una chiavetta USB o una scheda SD preparata su Linux è quasi sempre ext4.
I tre sono una famiglia, non tre formati diversi. Ogni generazione ha mantenuto la struttura della precedente ampliandola; per questo i kernel Linux attuali leggono e scrivono tutti e tre con un unico driver ext4.
Una breve storia
- 1992
ext, il file system esteso
Rémy Card lo scrive per Linux 0.96c per sostituire il file system Minix con cui Linux era nato, i cui limiti su dimensione del disco e nomi dei file erano già troppo stretti.
- 1993
ext2
Una riprogettazione del gennaio 1993 per Linux 0.99, con idee dal Fast File System di BSD: il disco diviso in gruppi di blocchi e date separate di accesso, cambio e modifica. Resta lo standard di Linux per il resto del decennio.
- 2001
ext3 aggiunge un journal
L’ext3 di Stephen Tweedie entra nel kernel principale con Linux 2.4.15 nel novembre 2001. La struttura è quella di ext2, quindi un disco ext2 diventa ext3 aggiungendo un journal, ma un crash non significa più un lungo controllo dell’intero disco.
- 2006
Iniziano i lavori su ext4
Theodore Ts’o annuncia il piano il 28 giugno 2006, partendo da estensioni sviluppate per il file system in cluster Lustre. Una versione di sviluppo, ext4dev, compare in Linux 2.6.19.
- 2008
ext4 è dichiarato stabile
Linux 2.6.28, rilasciato il 25 dicembre 2008, porta gli extent, numeri di blocco a 64 bit, l’allocazione ritardata e date al nanosecondo.
- 2013–2021
Checksum, cifratura, maiuscole
I kernel successivi aggiungono i dati inline (3.8), i checksum dei metadati (3.18), la cifratura (4.1), le cartelle che ignorano le maiuscole (5.2), verity (5.4), i fast commit (5.10) e l’orphan file (5.15).
Come ext4 organizza un disco
Blocchi. ext4 assegna lo spazio a blocchi, di solito da 4 KiB; la dimensione si sceglie alla formattazione e può andare da 1 KiB a 64 KiB. Anche un file di un byte occupa un blocco intero, a meno che il disco non usi i dati inline.
Gruppi di blocchi. Il disco è diviso in gruppi di blocchi: con blocchi da 4 KiB, 32.768 blocchi ovvero 128 MiB ciascuno. Ogni gruppo ha due bitmap, una per i blocchi occupati e una per i suoi inode, più la sua parte della tabella degli inode. Tenere i dati di un file vicino al suo inode evita alla testina del disco di viaggiare. La funzione flex_bg raccoglie bitmap e tabelle degli inode di più gruppi, così i file grandi possono attraversare i confini tra gruppi in un unico pezzo.
Il superblocco. La prima cosa sul disco dopo 1 KiB di margine: quanto è grande il file system, la dimensione dei blocchi, quali funzioni usa e se è stato smontato correttamente. Delle copie si trovano in diversi gruppi di blocchi, così un superblocco danneggiato si può ripristinare da una copia.
Inode. Ogni file e ogni cartella ha un inode, di 256 byte per impostazione predefinita. Contiene il proprietario, i permessi, le date, la dimensione e dove si trovano i dati: tutto tranne il nome. Il numero di inode è fissato alla formattazione, quindi un disco pieno di file minuscoli può esaurire gli inode pur avendo ancora spazio libero.
Cartelle. Una cartella è un file speciale che associa nomi a numeri di inode. I nomi possono arrivare a 255 byte. Le cartelle piccole sono un semplice elenco; quelle grandi ricevono un indice, un albero con hash (dir_index, «htree»), così trovare un nome tra centomila richiede poche letture di blocchi e non una scansione completa.
Extent invece di mappe di blocchi. ext2 ed ext3 annotano ogni blocco di un file uno per uno: dodici puntatori diretti nell’inode, poi blocchi pieni di puntatori, puntatori a quelli e ancora puntatori a quelli. ext4 annota intervalli. Un extent dice «tanti blocchi, a partire da qui», fino a 32.768 blocchi (128 MiB con blocchi da 4 KiB) in una sola voce. Quattro extent stanno nell’inode stesso; un file più lungo e più frammentato riceve un albero di extent fino a cinque livelli. Un file grande e contiguo si descrive così con una manciata di voci invece che con migliaia.
I file piccoli possono stare dentro il loro inode. Con la funzione inline_data, fino a 60 byte di un file vengono salvati nell’inode stesso e qualcosa in più nel suo spazio per gli attributi estesi, senza usare alcun blocco.
Il journal e cosa protegge
Modificare un file system non è mai una sola scrittura. Creare un file tocca una bitmap, un inode, una cartella e un contatore nel descrittore del gruppo. Se la corrente salta tra due di queste scritture, il disco resta modificato a metà, ed ext2 poteva accorgersene solo controllando l’intero disco con e2fsck, cosa che su un disco grande richiedeva molto tempo.
ext3 ed ext4 tengono un journal: un’area riservata del disco, di solito l’inode 8, dove le modifiche vengono scritte prima di avvenire. Una modifica procede in tre passi. Prima i nuovi blocchi vanno nel journal. Poi un record di commit segna la transazione come completa. Solo dopo i blocchi vengono scritti al loro vero posto: il checkpoint. Se la corrente salta in qualsiasi momento, il montaggio successivo riapplica il journal: le transazioni arrivate al commit vengono applicate di nuovo, e ciò che non ha un commit viene scartato. Il file system torna coerente in pochi secondi.
| Modalità | Cosa passa dal journal | Dopo un crash |
|---|---|---|
data=ordered (predefinita) | Solo i metadati, ma i dati di un file vengono scritti prima che siano confermati i metadati che puntano a essi. | La struttura è coerente; un file in scrittura in quel momento può contenere dati precedenti. |
data=journal | Metadati e dati dei file. | La più sicura e la più lenta: i dati arrivati a un commit ci sono. |
data=writeback | Solo i metadati, senza ordine per i dati. | La struttura è coerente, ma un file modificato di recente può mostrare contenuti vecchi. |
Il journal non è un backup. Mantiene intatta la struttura del file system e garantisce ciò che è stato confermato; non recupera una modifica che era in viaggio e non protegge da un disco che si guasta. ext4 può anche scrivere fast commit (Linux 5.10): piccoli record con i soli metadati cambiati tra due commit completi, per rendere meno costose le chiamate frequenti a fsync.
Una scheda tolta da un Raspberry Pi acceso è proprio questo caso. Il suo journal contiene ancora transazioni confermate che non hanno mai raggiunto il loro posto, e il superblocco segnala «needs recovery». Linux lo riapplica al montaggio successivo; un software che legge la scheda altrove deve riapplicarlo anch’esso, altrimenti mostra i file com’erano prima di quelle transazioni.
ext2 vs ext3 vs ext4
| ext2 | ext3 | ext4 | |
|---|---|---|---|
| In Linux dal | 1993 (0.99) | 2001 (2.4.15) | 2008 (2.6.28) |
| Journal | No | Sì | Sì, con fast commit da Linux 5.10 |
| Come si annotano i blocchi di un file | Mappe di blocchi | Mappe di blocchi | Extent |
| File più grande | 2 TiB | 2 TiB | 16 TiB |
| File system più grande | 16 TiB | 16 TiB | 1 EiB in pratica (64 bit) |
| Date | Secondi, fino al 2038 (inode da 128 byte) | Secondi, fino al 2038 (inode da 128 byte) | Nanosecondi, fino al 2446 |
| Cartelle grandi indicizzate | No | Sì (dir_index) | Sì, tre livelli con large_dir |
| Checksum dei metadati | No | No | Sì (metadata_csum) |
In pratica: ext4 per tutto ciò che è nuovo. ext3 non ha più ragione di esistere su un disco nuovo, ed ext2 sopravvive dove un journal non serve: una piccola partizione di avvio o una memoria flash da scrivere il meno possibile. Un disco ext3 si può convertire in ext4 sul posto, ma i file già presenti mantengono le loro mappe di blocchi finché non vengono riscritti.
Le funzioni che incontri sui dischi veri
Invece dei numeri di versione, un disco ext porta dei flag di funzione nel superblocco, e ognuno appartiene a uno di tre tipi. Una funzione compatibile può essere ignorata dal software che non la conosce. Una funzione compatibile in sola lettura significa che quel software può leggere il disco ma non scriverci. Una funzione incompatibile significa che non deve toccarlo affatto. Grazie a questa regola, uno strumento più vecchio rifiuta un disco più nuovo invece di danneggiarlo.
| Funzione | Cosa fa | In Linux dal |
|---|---|---|
extent | File descritti da extent invece che da mappe di blocchi. | 2.6.28 |
64bit | Numeri di blocco oltre i 32 bit, per file system oltre i 16 TiB. | 2.6.28 |
flex_bg | Metadati di più gruppi di blocchi tenuti insieme. | 2.6.28 |
metadata_csum | Un checksum CRC32C su tutti i metadati, per rilevare i danni. | 3.18 |
metadata_csum_seed | Il seme dei checksum salvato nel superblocco, per poter cambiare l’UUID. | 4.4 |
inline_data | File minuscoli salvati nel loro inode. | 3.8 |
encrypt | Cifratura per cartella di contenuti e nomi dei file. | 4.1 |
casefold | Cartelle che nei nomi non distinguono maiuscole e minuscole. | 5.2 |
verity | File di sola lettura il cui contenuto è verificato con un albero di hash. | 5.4 |
fast_commit | Piccoli record del journal tra commit completi. | 5.10 |
orphan_file | Gestione più veloce dei file eliminati mentre erano ancora aperti. | 5.15 |
Dove si trovano: il mke2fs attuale attiva metadata_csum e 64bit per impostazione predefinita, ed e2fsprogs 1.47 ha aggiunto orphan_file e metadata_csum_seed, che alcune distribuzioni disattivano di nuovo perché i vecchi bootloader possano ancora leggere il disco. L’immagine di Raspberry Pi OS è creata senza 64bit. Una Steam Deck formatta le sue schede microSD con casefold, e Android usa encrypt.
Per vedere quali funzioni usa un disco, leggi il suo superblocco su Linux con sudo dumpe2fs -h /dev/sdX1 e guarda la riga «Filesystem features».
Limiti
| Dimensione blocco | Gruppo di blocchi | File più grande | File system più grande (32 bit) | File system più grande (64 bit) |
|---|---|---|---|---|
| 1 KiB | 8 MiB | 4 TiB | 4 TiB | 16 ZiB |
| 2 KiB | 32 MiB | 8 TiB | 8 TiB | 32 ZiB |
| 4 KiB (abituale) | 128 MiB | 16 TiB | 16 TiB | 64 ZiB |
| 64 KiB | 32 GiB | 256 TiB | 256 TiB | 1 YiB |
I valori a 64 bit sono ciò che il formato può indirizzare; il formato degli extent e gli strumenti limitano i file system reali a circa 1 EiB. Altri limiti che contano più spesso:
- Un nome di file o cartella: 255 byte, meno caratteri nelle scritture che richiedono più di un byte per carattere.
- Collegamenti fisici a uno stesso file: 65.000, quindi al massimo 64.998 sottocartelle in una cartella.
- Date: precisione al nanosecondo, valide fino a maggio 2446 con inode da 256 byte; gli inode da 128 byte si fermano a gennaio 2038.
- Inode: fissati alla formattazione, uno per file o cartella, al massimo circa quattro miliardi.
Controllare e riparare un disco ext4
Controllare e riparare i file system ext è il compito di e2fsck, parte di e2fsprogs, su Linux. Lavora su un disco non montato; eseguirlo su un file system montato può danneggiarlo.
sudo dumpe2fs -h /dev/sdX1 # superblocco: funzioni, stato, ultimo controllo sudo e2fsck -fn /dev/sdX1 # controllo completo in sola lettura: segnala, non cambia nulla sudo e2fsck -f /dev/sdX1 # controllo completo con riparazioni, chiede prima di ognuna sudo tune2fs -l /dev/sdX1 # lo stesso riepilogo del superblocco sudo mkfs.ext4 -L DATA /dev/sdX1 # un nuovo file system ext4 (cancella la partizione)
Sostituisci /dev/sdX1 con la partizione in questione; lsblk le elenca. Dopo uno spegnimento brusco di solito non c’è nulla da fare: il montaggio successivo riapplica il journal. Un controllo completo vale la pena quando Linux ha registrato un errore nel superblocco, quando i checksum non tornano o quando il disco era in un dispositivo che si è bloccato più volte.
ext4 e altri file system
| File system | Protezione dai crash | Di casa su | macOS | Windows |
|---|---|---|---|---|
| ext4 | Journal | Linux, Android | No | No |
| Btrfs | Copy-on-write, checksum anche sui dati | Linux (predefinito in Fedora) | No | No |
| XFS | Journal | Server Linux | No | No |
| APFS | Copy-on-write | Mac, iPhone | Sì | No |
| NTFS | Journal | Windows | Sola lettura | Sì |
| exFAT | Nessuna | Chiavette USB, schede SD, fotocamere | Sì | Sì |
Per un disco che passa tra Linux, Mac e Windows senza installare nulla, exFAT è il terreno comune, a costo dei permessi di Linux, dei proprietari, dei collegamenti simbolici e di qualsiasi protezione se il cavo si stacca durante una scrittura. ext4 conserva tutto questo e richiede software aggiuntivo su Mac e su Windows.
Leggere ext4 su un Mac o su Windows
macOS non legge nessuno dei file system ext. Collega un disco Linux e macOS dirà che non riesce a leggerlo, proponendo Inizializza, Ignora ed Espelli. Inizializza cancella il disco; scegli Ignora o Espelli.
Da macOS 15.4, FSKit di Apple permette a un file system di funzionare come una normale estensione di app, fuori dal kernel, come i file system più recenti di Apple stessa. È la strada che non richiede estensioni del kernel né impostazioni di sicurezza ridotte. Le altre strade sono un’estensione del kernel, uno strato nello spazio utente come FUSE o una macchina virtuale Linux a cui si affida il disco.
Su Windows 11, WSL 2 può montare un disco Linux: wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 in un terminale da amministratore, dopo di che i file compaiono in Esplora file sotto \\wsl$\ e nella cartella /mnt/wsl della distribuzione. Funziona solo con dischi collegati direttamente al PC, non con dischi USB né con lettori di schede SD; questi vanno prima passati a WSL tramite USB/IP.
Extent è il nostro file system FSKit per ext2, ext3 ed ext4 su macOS 27. Un disco Linux compare nel Finder come qualsiasi altro; la lettura è gratuita e la scrittura su ext4 passa dal journal del disco, come su Linux. Una scheda tolta da un Pi senza spegnerlo viene letta con il journal riapplicato in memoria.
Domande frequenti
ext4 è meglio di ext3?
Per un disco nuovo, sì. Descrive i file con extent invece che con mappe di blocchi, gestisce file fino a 16 TiB e file system molto più grandi, conserva date al nanosecondo oltre il 2038, protegge i metadati con checksum e assegna lo spazio in intervalli più lunghi e meno frammentati. Linux legge comunque i dischi ext3 con il driver ext4.
Un Mac può leggere ext4?
Non da solo: macOS non legge nessun file system ext e propone di inizializzare, cioè cancellare, un disco Linux. Serve un’estensione di file system; su macOS 27, Extent monta ext2, ext3 ed ext4 nel Finder tramite FSKit di Apple.
Windows può leggere ext4?
Esplora file da solo no. Su Windows 11, WSL 2 monta un disco Linux collegato direttamente con wsl --mount, e i suoi file si aprono poi in Esplora file sotto \\wsl$\. Dischi USB e lettori di schede SD vanno prima passati a WSL tramite USB/IP.
Una chiavetta USB deve essere ext4 o exFAT?
exFAT se deve funzionare su qualsiasi computer senza software aggiuntivo. ext4 se si usa soprattutto con Linux o con un Raspberry Pi, o se contano permessi, collegamenti simbolici e un journal: il journal mantiene coerente il file system quando la chiavetta viene staccata durante una scrittura.
Cosa succede se stacco un disco ext4 senza espellerlo?
Il journal mantiene coerente il file system. Le modifiche arrivate a un commit vengono riapplicate al montaggio successivo; quelle ancora in viaggio vanno perse. Fino ad allora il superblocco segnala che serve un ripristino.
Come scopro quali funzioni usa il mio disco ext4?
Su Linux, sudo dumpe2fs -h /dev/sdX1 o sudo tune2fs -l /dev/sdX1, alla riga «Filesystem features». Su Mac, Extent indica le principali (journal, extent, 64 bit, checksum) nei dettagli di un disco.
Si può convertire ext3 in ext4?
Sì, sul posto con tune2fs e un controllo con e2fsck, senza riformattare. I file già presenti sul disco mantengono le mappe di blocchi; solo i file scritti dopo usano gli extent. Fai prima un backup del disco.
Quanto può essere grande un file su ext4?
16 TiB con i consueti blocchi da 4 KiB, fino a 256 TiB con blocchi da 64 KiB. Il file system più grande arriva a circa 1 EiB con la funzione 64bit.
Dischi Linux sul Mac, letti e scritti.
Extent monta ext2, ext3 ed ext4 nel Finder su macOS 27. La lettura è gratuita; la scrittura su ext4 è un acquisto una tantum.
Fonti
I fatti di questa pagina sono stati verificati su questi documenti (in inglese).