Un disco nuovo, una chiavetta da riciclare o una partizione appena creata con fdisk non sono ancora utilizzabili: manca la struttura che permette di salvare file e cartelle. Questa struttura si crea con mkfs, il comando che "formatta" un dispositivo. È anche uno dei comandi più pericolosi del terminale, perché cancella tutto ciò che c'era prima.
Cos'è
mkfs (make file system) fa parte del pacchetto util-linux ed è in realtà un semplice "smistatore": non crea nulla da solo, ma chiama il programma specifico per il tipo di file system richiesto. mkfs -t ext4 lancia mkfs.ext4, mkfs -t vfat lancia mkfs.vfat, e così via. Per questo puoi usare indifferentemente mkfs -t ext4 /dev/sdb1 oppure direttamente mkfs.ext4 /dev/sdb1: il risultato è lo stesso.
Cosa fa
Scrive su un dispositivo (o su un file immagine) le strutture di un file system: superblocco, tabelle degli inode, giornale, directory radice e la cartella lost+found. Dopo l'operazione il dispositivo è vuoto, ha un UUID nuovo ed è pronto per essere montato con mount. I vecchi dati non vengono cancellati blocco per blocco, ma diventano di fatto irraggiungibili: considera l'operazione distruttiva e senza ritorno.
Come si usa
$ sudo mkfs -t TIPO [opzioni] DISPOSITIVO
$ sudo mkfs.TIPO [opzioni] DISPOSITIVOPrima di tutto controlla di avere il dispositivo giusto, ad esempio con lsblk o fdisk -l. Negli esempi uso dei file immagine (disco.img) al posto di un dispositivo reale: funzionano allo stesso modo e sono innocui per fare pratica. Sul tuo sistema sostituisci il nome con la partizione vera, per esempio /dev/sdb1.
Esempio 1: creare un file system ext4
$ truncate -s 64M disco.img
$ mkfs.ext4 disco.img
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: 0/16384 done
Creating filesystem with 16384 4k blocks and 16384 inodes
Allocating group tables: 0/1 done
Writing inode tables: 0/1 done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: 0/1 donemkfs.ext4 è in realtà mke2fs con le opzioni di ext4, ed è lui a stampare l'intestazione. Su un dispositivo reale, se il dispositivo contiene già un file system o una tabella delle partizioni, il programma ti chiede conferma (Proceed anyway? (y,N)): questo passaggio non si può provare sulle immagini, quindi lo riporto per come è documentato. I messaggi sono in inglese perché li ho ottenuti con la lingua di sistema predefinita; con un sistema in italiano alcune righe potrebbero comparire tradotte.
Esempio 2: etichetta e spazio riservato
$ mkfs.ext4 -q -F -L dati -m 1 disco.img
$ blkid disco.img
disco.img: LABEL="dati" UUID="30b62ba6-d1a7-4c61-8ac7-231a2d0f963f"
BLOCK_SIZE="4096" TYPE="ext4"-L imposta l'etichetta (comoda per riconoscere il disco e per /etc/fstab), -m 1 riserva solo l'1% dello spazio a root invece del 5% predefinito (su un grosso disco di dati è una bella differenza), -q azzera l'output e -F forza l'operazione senza domande, utile con i file immagine. L'UUID è diverso a ogni creazione; quello mostrato è solo un esempio. Nel testo ho spezzato su due righe l'output di blkid per non allargare la pagina: sul terminale lo vedrai su una riga sola.
Esempio 3: provare senza scrivere (dry run)
$ mkfs.ext4 -n disco.img
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 16384 4k blocks and 16384 inodesCon -n il programma mostra cosa farebbe, ma non scrive nulla sul dispositivo. È un buon modo per controllare dimensioni e numero di inode prima di agire davvero.
Esempio 4: scegliere il tipo di file system
$ mkfs.vfat -F 32 -n CHIAVETTA disco.img
mkfs.fat 4.2 (2021-01-31)
$ mkfs.xfs -f disco.img
$ mkfs.btrfs -f -L bt disco.img
$ mkswap disco.imgPer una chiavetta da usare anche con Windows e macOS il tipo giusto è FAT32 (vfat, con -F 32); per un server Linux di solito si sceglie ext4 o xfs; btrfs offre snapshot e compressione. mkswap non crea un file system ma prepara una partizione o un file come area di swap. Sul pacchetto da installare: mkfs.vfat si trova in dosfstools, mkfs.xfs in xfsprogs, mkfs.btrfs in btrfs-progs (vedi apt). Se il programma manca, mkfs -t lo dice chiaramente:
$ mkfs -t nonesiste disco.img
mkfs: failed to execute mkfs.nonesiste: No such file or directoryEsempio 5: XFS e Btrfs non sovrascrivono senza -f
$ mkfs.xfs disco.img
mkfs.xfs: disco.img appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.XFS e Btrfs si rifiutano di scrivere su un dispositivo che contiene già un file system, e chiedono -f per confermare. Btrfs risponde in modo analogo: ERROR: ... appears to contain an existing filesystem (vfat). Nota che il comando, in questo caso, esce con un errore senza aver toccato nulla: è una protezione, non un malfunzionamento.
Esempio 6: popolare subito il file system con una cartella
$ mkfs.ext4 -q -F -d src -L pop disco.img
$ debugfs -R "ls" disco.img
2 (12) . 2 (12) .. 11 (20) lost+found 12 (4040) file.txtL'opzione -d di mkfs.ext4 copia nel nuovo file system il contenuto di una cartella (qui src) senza bisogno di montarlo. È comodissima per preparare immagini di sistema o dischi per macchine virtuali. debugfs legge il file system direttamente dall'immagine, anche se non è montato.
Esempio 7: montare e usare il file system appena creato
$ sudo mount -o loop disco.img /mnt
$ df -h /mnt | tail -1
/dev/loop1 224M 24K 206M 1% /mnt
$ sudo umount /mntDopo mkfs il dispositivo si monta come qualsiasi altro. Con -o loop puoi montare anche un file immagine; i valori di df qui sopra vengono da un'immagine da 256 MB e sul tuo disco saranno diversi. Per un montaggio permanente aggiungi una riga a /etc/fstab, magari usando UUID= o LABEL= al posto del nome del dispositivo.
Esempio 8: cancellare la firma di un file system con wipefs
$ wipefs disco.img
DEVICE OFFSET TYPE UUID LABEL
disco.img 0x438 ext4 30b62ba6-d1a7-4c61-8ac7-231a2d0f963f dati
$ wipefs -a disco.img
disco.img: 2 bytes were erased at offset 0x00000438 (ext4): 53 efwipefs elenca (senza opzioni) e cancella (-a) le firme dei file system. È il modo pulito per "svuotare" un dispositivo prima di riformattarlo. Dopo la cancellazione blkid disco.img non stampa più nulla e termina con codice 2. Nell'output ho accorciato le intestazioni per tenere le righe corte.
Esempio 9: uso negli script
#!/bin/bash
DEV="$1"
[ -b "$DEV" ] || [ -f "$DEV" ] || { echo "non esiste: $DEV" >&2; exit 1; }
if [ -n "$(blkid -o value -s TYPE "$DEV")" ]; then
echo "$DEV contiene già un file system, mi fermo" >&2
exit 2
fi
mkfs.ext4 -q -L dati "$DEV"Lo script formatta il dispositivo solo se è davvero vuoto: blkid -o value -s TYPE stampa il tipo di file system (o niente) e, se c'è già qualcosa, lo script si ferma con codice 2. Se il dispositivo non esiste esce con codice 1. Al primo lancio su un'immagine vuota crea il file system (codice 0), al secondo si rifiuta di ripetere l'operazione. Su un dispositivo reale ricordati di lanciarlo con sudo e di non togliere mai il controllo.
Opzioni utili
-t TIPO: tipo di file system (ext4, vfat, xfs, btrfs...). Senza-tmkfscrea un ext2, non un ext4.-L ETICHETTA: etichetta (inmkfs.vfatsi usa-n).-m PERCENTUALE: spazio riservato a root (solo ext).-N NUMEROe-b DIMENSIONE: numero di inode e dimensione dei blocchi (ext).-O ^has_journal: crea un ext4 senza giornale.-d CARTELLA: popola il file system con il contenuto di una cartella (ext).-n: simula senza scrivere (ext).-q: output minimo.-F: forza (ext).-f: forza (XFS e Btrfs).-V: mostra la versione dimkfs.
Attenzione a
- Il dispositivo giusto: un errore di lettera (
/dev/sdainvece di/dev/sdb) cancella il disco di sistema. Controlla sempre conlsblkprima di premere Invio. - Partizione, non disco intero: di solito si formatta una partizione (
/dev/sdb1), creata prima confdisk. - Dispositivo montato:
mkfssi rifiuta di agire con il messaggiois mounted; will not make a filesystem here!. Smonta prima conumount. - Il flag
-F: sui file immaginemkfs.ext4chiede-Fper procedere; sui dispositivi reali, se c'è già qualcosa, ti viene chiesta una conferma. In uno script-Fla salta: usalo solo dopo aver controllato. - Dati non recuperabili: dopo la formattazione recuperare i file è difficile e non garantito. Se devi cancellare in modo sicuro,
mkfsnon basta. - Limiti di FAT32: i singoli file non possono superare i 4 GB. Per chiavette con file grandi esiste exFAT.
- Dopo aver cambiato etichetta o UUID: aggiorna
/etc/fstab, altrimenti il montaggio automatico fallisce.
Riepilogo
| Comando | Cosa fa |
|---|---|
mkfs -t ext4 DEV | Crea un file system ext4 |
mkfs.ext4 -L nome DEV | Crea ext4 con etichetta |
mkfs.ext4 -n DEV | Simula senza scrivere |
mkfs.vfat -F 32 DEV | Crea un FAT32 |
mkfs.xfs -f DEV | Crea XFS sovrascrivendo |
mkfs.ext4 -d CARTELLA DEV | Crea ext4 già popolato |
mkswap DEV | Prepara un'area di swap |
wipefs -a DEV | Cancella le firme dei file system |
blkid DEV | Mostra tipo, etichetta e UUID |