Salta al contenuto principale

mkfs: creare un file system

Inviato da tuxsa il

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] DISPOSITIVO

Prima 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   done

mkfs.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 inodes

Con -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.img

Per 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 directory

Esempio 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.txt

L'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 /mnt

Dopo 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 ef

wipefs 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 -t mkfs crea un ext2, non un ext4.
  • -L ETICHETTA: etichetta (in mkfs.vfat si usa -n).
  • -m PERCENTUALE: spazio riservato a root (solo ext).
  • -N NUMERO e -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 di mkfs.

Attenzione a

  • Il dispositivo giusto: un errore di lettera (/dev/sda invece di /dev/sdb) cancella il disco di sistema. Controlla sempre con lsblk prima di premere Invio.
  • Partizione, non disco intero: di solito si formatta una partizione (/dev/sdb1), creata prima con fdisk.
  • Dispositivo montato: mkfs si rifiuta di agire con il messaggio is mounted; will not make a filesystem here!. Smonta prima con umount.
  • Il flag -F: sui file immagine mkfs.ext4 chiede -F per procedere; sui dispositivi reali, se c'è già qualcosa, ti viene chiesta una conferma. In uno script -F la 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, mkfs non 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

ComandoCosa fa
mkfs -t ext4 DEVCrea un file system ext4
mkfs.ext4 -L nome DEVCrea ext4 con etichetta
mkfs.ext4 -n DEVSimula senza scrivere
mkfs.vfat -F 32 DEVCrea un FAT32
mkfs.xfs -f DEVCrea XFS sovrascrivendo
mkfs.ext4 -d CARTELLA DEVCrea ext4 già popolato
mkswap DEVPrepara un'area di swap
wipefs -a DEVCancella le firme dei file system
blkid DEVMostra tipo, etichetta e UUID