🍺 Buy me a beer
💾

Gestione Dischi su Linux

Da iSCSI a LVM, passando per fdisk, parted, i filesystem, RAID software, LUKS e SMART. Tutto lo stack a blocchi, spiegato a chi voleva solo "aggiungere un disco".

"Ho fatto mkfs sul disco sbagliato" — la frase che separa i sistemisti in due categorie: quelli a cui è già successo e quelli a cui succederà.

01 / 12

Come Linux vede i dischi

Prima di partizionare, formattare e montare devi capire una cosa: per Linux tutto è un file, e un disco è un block device. Niente magie, solo /dev.

💡 L'analogia del magazzino

Un disco grezzo è un capannone vuoto: tanto spazio, zero scaffali. La tabella delle partizioni è il progetto che divide il capannone in stanze. Il filesystem sono gli scaffali, le etichette e il registro di carico/scarico dentro ogni stanza. Il mount è aprire una porta dal corridoio di casa tua (la directory) verso quella stanza. Puoi avere il capannone più grande del mondo, ma finché non monti non ci entra nessuno.

🔗 Lo stack a strati (tienilo a mente per tutta la guida)

La gestione storage su Linux è una cipolla: ogni strato sta sopra al precedente e ne è indipendente. Puoi mescolarli quasi come vuoi.

MOUNT POINT
/srv/dati · /home · /var
dove i tuoi file vivono davvero
FILESYSTEM
ext4 / XFS / Btrfs / ZFS / vfat
organizza i blocchi in file e directory
LVMopzionale
PV → VG → LV
spazio elastico, snapshot, ridimensiona a caldo
LUKSopzionale
/dev/mapper/cifrato
cifratura a blocchi trasparente
PARTIZIONE
/dev/sda1  (MBR o GPT)
divide il disco in pezzi
BLOCK DEVICE
/dev/sda · /dev/nvme0n1
il disco fisico (o iSCSI, o RAID, o virtuale)

Ogni strato è facoltativo tranne i due estremi. Disco minimal: block device → partizione → filesystem → mount. Disco "serio": ci infili LVM e/o LUKS in mezzo. ZFS e Btrfs sono dei furbi che fanno da soli volume manager + filesystem (vedi cap. 4).

💾 Come si chiamano i dischi

  • /dev/sda, sdb... — dischi SATA/SAS/USB e iSCSI. La lettera è l'ordine di rilevamento, non è stabile fra reboot.
  • /dev/nvme0n1 — SSD NVMe. nvme0 = controller, n1 = namespace.
  • /dev/vda, /dev/xvda — dischi virtuali (KVM/virtio, Xen).
  • /dev/mmcblk0 — schede SD / eMMC (Raspberry & co.).
  • /dev/mapper/* — device "virtuali" creati da LVM, LUKS, multipath.

🔍 Come si chiamano le partizioni

  • SATA: /dev/sda1, sda2 — numero attaccato alla lettera.
  • NVMe: /dev/nvme0n1p1 — serve la p prima del numero.
  • Stessa regola per mmcblk0p1 e loop0p1.
  • Regola pratica: se il nome del device finisce con un numero, la partizione ha la p; se finisce con una lettera, no.

🔎 I 4 comandi che usi 100 volte al giorno

ispezione di base
# Vista ad albero: dischi, partizioni, mount, dimensioni. IL comando.
lsblk
lsblk -f                 # aggiunge FSTYPE, LABEL, UUID, mountpoint
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL

# Tabella partizioni di un disco (e tipo MBR/GPT)
sudo fdisk -l /dev/sda
sudo parted /dev/sda print

# Tutti i block device con UUID, tipo, etichetta
sudo blkid

# Spazio LIBERO/usato sui filesystem montati (-h = leggibile dagli umani)
df -hT

# Dettagli hardware del disco (rotante? SSD? modello? seriale?)
sudo hdparm -I /dev/sda
cat /sys/block/sda/queue/rotational   # 1 = HDD, 0 = SSD/NVMe
💡 lsblk è il tuo migliore amico Prima di toccare QUALSIASI cosa, lancia lsblk -f e guarda cosa c'è già, cosa è montato e dove. Il 90% dei disastri da "disco sbagliato" si evita con 3 secondi di lsblk in più.
🚨 /dev/sdb oggi può essere /dev/sdc domani Le lettere sda/sdb/sdc dipendono dall'ordine in cui il kernel trova i dischi all'avvio. Aggiungi un disco USB, riavvii, e all'improvviso lo script che faceva mkfs /dev/sdb formatta il disco sbagliato. Mai identificare un disco "importante" per lettera negli automatismi: usa UUID o i path stabili in /dev/disk/by-id/ (vedi cap. 5).
02 / 12

Anatomia di un disco: MBR vs GPT

Settori, allineamento, e la scelta tra il vecchio schema MBR (1983) e il moderno GPT. Spoiler: nel 2026 usi GPT, sempre, salvo motivi archeologici.

🧩 Settori e blocchi

Il disco è diviso in settori. Storicamente 512 byte; i dischi moderni usano settori fisici da 4096 byte (formato "Advanced Format" / 4Kn o 512e). Il filesystem ci lavora sopra a blocchi (di solito 4 KiB). Perché ti interessa? Per l'allineamento: se una partizione non inizia su un multiplo di 4K (o 1 MiB, scelta moderna), ogni scrittura tocca due settori fisici e le performance crollano. Buona notizia: tutti gli strumenti moderni (parted, fdisk recenti, sgdisk) allineano a 1 MiB automaticamente. Non devi più fare i conti a mano come nel 2010.

AspettoMBR (msdos)GPT (GUID)
Anno / origine1983, BIOS PC2010+, standard UEFI
Disco max2 TiB (e poi basta)~9.4 ZB (non lo riempi)
Partizioni primarie4 (poi servono le "estese")128 (di default), tutte uguali
Ridondanza tabellaNessuna. Se si corrompe, panico.Copia primaria + backup a fine disco
Checksum (CRC32)NoSì, su header e tabella
BootBIOS legacyUEFI (con partizione ESP) o BIOS+bios_grub
Quando usarloHardware antico, chiavette <2TB per compatTutto il resto. Default 2026.
⚠️ UEFI vuole GPT + una partizione ESP Se installi un sistema che fa boot in UEFI, ti serve una EFI System Partition (ESP): ~512 MiB, tipo EF00, formattata in FAT32, montata su /boot/efi. Su disco GPT che deve fare boot in BIOS legacy serve invece una minuscola partizione bios_grub (~1 MiB, tipo EF02) dove GRUB infila il suo codice. Dimenticarle è il classico "ho installato ma non parte".

🏷️ Tipi di partizione (i codici che vedi in gdisk)

Ogni partizione GPT ha un "tipo" che dice a cosa serve. Non è il filesystem (quello sta dentro), è un'etichetta di intento. I più comuni:

Codice (gdisk)TipoA cosa serve
8300Linux filesystemIl default per ext4/XFS/Btrfs
8E00Linux LVMPartizione che diventa un PV LVM
FD00Linux RAIDMembro di un array mdadm
8200Linux swapArea di swap
EF00EFI System (ESP)Boot UEFI, FAT32
EF02BIOS bootGRUB su GPT in modalità BIOS
💡 Il tipo è quasi sempre cosmetico su Linux: il kernel monta in base al filesystem reale, non al codice. Le eccezioni che contano davvero: l'ESP (l'UEFI cerca proprio il tipo EF00) e l'autodetect di certi tool. Nel dubbio metti 8300 e vai avanti.
03 / 12

Partizionare: fdisk, gdisk, parted, cfdisk

Quattro strumenti per lo stesso lavoro. Imparane uno bene e gli altri ti verranno gratis. La regola: misura due volte, scrivi una.

⌨️

fdisk

Interattivo, a menu. Oggi gestisce sia MBR che GPT. Il più diffuso.

🔧

gdisk / sgdisk

Specializzato GPT. sgdisk è la versione scriptabile, oro per gli automatismi.

📏

parted

Potente, gestisce MBR/GPT e fa anche resize. Sintassi un po' ostica.

🖥️

cfdisk

Interfaccia a "finestra" testuale con le frecce. Il più amichevole per iniziare.

💥 Partizionare è distruttivo. Le modifiche di fdisk/parted vanno COMMITTATE. In fdisk/gdisk nulla viene scritto finché non premi w: se sbagli premi q ed esci senza danni. In parted invece ogni comando è immediato, non c'è rete di salvataggio. E in ogni caso: ridisegnare la tabella di un disco con dati sopra = dati a rischio. Backup prima.

⌨️ fdisk: creare una partizione GPT da zero

fdisk /dev/sdb
sudo fdisk /dev/sdb       # apri il disco (NON una partizione: sdb, non sdb1)

# dentro al prompt "Command (m for help):"
g        # crea una nuova tabella GPT vuota (g=GPT, o=MBR/dos)
n        # nuova partizione
         # numero partizione: Invio (default 1)
         # primo settore: Invio (default, già allineato a 1 MiB)
+100G    # ultimo settore: +100G = 100 GiB. Invio secco = tutto il disco
p        # print: controlla quello che hai disegnato
t        # cambia tipo (es. 8e per LVM); default Linux fs va benissimo
w        # WRITE: scrivi su disco ed esci. Da qui non si torna indietro.
         # (q invece esce SENZA salvare se hai cambiato idea)
📝 Le dimensioni accettano K/M/G/T (es. +512M, +2T). Il + significa "grande tot a partire da qui". Lasciare vuoto l'ultimo settore = "fino alla fine del disco".

📏 parted: lo stesso lavoro, scriptabile

parted non-interattivo
# Crea tabella GPT e una partizione che prende tutto il disco
sudo parted -s /dev/sdb mklabel gpt
sudo parted -s /dev/sdb mkpart primary ext4 1MiB 100%

# Una ESP da 512 MiB + il resto per il sistema
sudo parted -s /dev/sdb mklabel gpt \
  mkpart ESP fat32 1MiB 513MiB \
  set 1 esp on \
  mkpart root ext4 513MiB 100%

# Verifica l'allineamento (deve dire "aligned")
sudo parted /dev/sdb align-check optimal 1
sudo parted /dev/sdb print
⚠️ In parted il filesystem indicato in mkpart (es. ext4) è solo un'etichetta di tipo: non formatta nulla. La formattazione vera la fai dopo con mkfs (cap. 4). Usa sempre 1MiB come inizio e % per le percentuali: così resti allineato.

🔧 sgdisk: l'arma scriptabile per GPT

sgdisk per automatismi
# Azzera e ricrea: ESP 512M (EF00) + LVM sul resto (8E00)
sudo sgdisk --zap-all /dev/sdb                      # cancella MBR e GPT
sudo sgdisk -n1:0:+512M -t1:EF00 -c1:"EFI" /dev/sdb
sudo sgdisk -n2:0:0     -t2:8E00 -c2:"LVM" /dev/sdb

# Copia lo schema di partizione da un disco a un altro (utile per RAID)
sudo sgdisk /dev/sda -R /dev/sdb    # replica sda → sdb
sudo sgdisk -G /dev/sdb             # rigenera i GUID (altrimenti duplicati!)

# Fai rileggere al kernel la nuova tabella senza riavviare
sudo partprobe /dev/sdb
🔄 "Device or resource busy" / il kernel non vede la nuova partizione Dopo aver modificato la tabella, il kernel a volte tiene la vecchia in cache (specie se una partizione è montata o in uso da LVM). Forza la rilettura con sudo partprobe /dev/sdb oppure sudo partx -u /dev/sdb. Se proprio non molla, l'unica certezza è un reboot — ma di solito partprobe basta.
04 / 12

I filesystem: quale scegliere e perché

ext4, XFS, Btrfs, ZFS, vfat, exFAT... La domanda non è "qual è il migliore" ma "qual è giusto per QUESTO uso". Ecco come non sbagliare.

FilesystemPunto di forzaUsalo perEvitalo se
ext4Stabile, collaudato, universale. La scelta "non sbagli mai".Root, server generici, qualsiasi cosa "normale"Ti servono snapshot o volumi enormi con tante feature
XFSEccelle su file grandi e tanta concorrenza. Default di RHEL.Storage, database, media, partizioni molto grandiDevi ridurre un fs (XFS cresce ma non si rimpicciolisce)
BtrfsSnapshot, checksum, compressione, subvolume. Integrato nel kernel.Root con snapshot (openSUSE/Fedora), workstationRAID5/6 in produzione (storicamente fragile)
ZFSIl re dell'integrità: checksum, RAIDZ, snapshot, send/recv.NAS, storage serio, dataset criticiVuoi qualcosa di leggero o nel kernel mainline (è un modulo)
vfat / FAT32Lo capiscono tutti i sistemi del pianeta.ESP di boot, chiavette di scambio, schede SDFile > 4 GiB (limite duro) o ti servono i permessi Unix
exFATCome FAT ma senza il limite dei 4 GiB.Dischi esterni grandi condivisi con Windows/MacÈ un filesystem di sistema Linux (niente permessi, niente journal)
F2FSOttimizzato per memorie flash.SD/eMMC, dispositivi embedded e mobileServer tradizionali con dischi rotanti
💡 La regola dello svogliato in una riga

Non sai cosa scegliere? ext4. Hai file enormi o un sacco di scritture parallele? XFS. Vuoi snapshot "tipo macchina del tempo" gratis sul portatile? Btrfs. Stai costruendo un NAS dove i dati NON devono morire mai? ZFS (e c'è una guida intera). Devi solo fare il boot UEFI o scambiare file con Windows? FAT32/exFAT. Fine. Smetti di overpensare.

🔨 Creare il filesystem: mkfs

formattare una partizione
# ext4 con una etichetta (la label aiuta a riconoscere il disco)
sudo mkfs.ext4 -L dati /dev/sdb1

# XFS (idem)
sudo mkfs.xfs -L dati /dev/sdb1

# Btrfs
sudo mkfs.btrfs -L dati /dev/sdb1

# FAT32 per una ESP / chiavetta
sudo mkfs.vfat -F32 -n BOOT /dev/sdb1

# exFAT per un disco esterno grande
sudo mkfs.exfat -n SCAMBIO /dev/sdb1

# Area di swap (poi si attiva con swapon)
sudo mkswap -L swap /dev/sdb2 && sudo swapon /dev/sdb2
💥 mkfs è il punto di non ritorno Formattare CANCELLA tutto, immediatamente, senza chiedere conferma e senza "cestino". Controlla il device tre volte con lsblk -f prima di premere Invio. La differenza tra /dev/sdb1 (la partizione vuota nuova) e /dev/sda1 (il tuo sistema) è un carattere e una carriera.

📋 Journaling: cos'è e perché ti salva

ext4, XFS e Btrfs hanno un journal: prima di scrivere davvero, annotano "sto per fare X". Se salta la corrente a metà, al riavvio il fs rilegge il journal e o completa o annulla l'operazione — niente filesystem a metà. È il motivo per cui un crash oggi raramente distrugge i dati come negli anni '90. FAT ed exFAT non ce l'hanno: per questo si corrompono se stacchi la chiavetta a metà copia.

🧸 CoW: copy-on-write (Btrfs, ZFS)

Btrfs e ZFS non sovrascrivono mai un blocco: ne scrivono uno nuovo e spostano il puntatore. Vantaggi: snapshot istantanei, checksum su tutto, niente "write hole". Costo: più frammentazione e overhead su carichi tipo database (per quelli si disattiva il CoW sui file specifici con chattr +C). ext4/XFS sono "in-place": più semplici, niente snapshot nativi.

🔧 Manutenzione e controllo

tune, label, check
# Info e parametri di un ext4
sudo tune2fs -l /dev/sdb1
sudo e2label /dev/sdb1 nuovaetichetta   # cambia label ext
sudo xfs_admin -L nuovaetichetta /dev/sdb1 # label XFS

# Controllo coerenza (SOLO su filesystem NON montato!)
sudo fsck -f /dev/sdb1        # ext: -f forza anche se "pulito"
sudo xfs_repair /dev/sdb1     # XFS NON usa fsck, ha il suo tool
sudo btrfs check /dev/sdb1    # Btrfs
⚠️ Mai lanciare fsck su un filesystem montato in lettura/scrittura: lo distruggi. Smonta prima (umount), oppure fallo da live USB / single-user mode. XFS è volutamente diverso: si controlla e ripara con xfs_repair, non con fsck.
05 / 12

Montare: mount, UUID e /etc/fstab

Un filesystem formattato ma non montato è come un magazzino senza porta. Qui impari a montarlo a mano, a renderlo permanente e a non rompere il boot.

📂 Mount al volo

mount / umount
sudo mkdir -p /mnt/dati
sudo mount /dev/sdb1 /mnt/dati          # monta
sudo mount -o ro /dev/sdb1 /mnt/dati    # sola lettura (ispezione sicura)
df -hT /mnt/dati                        # conferma: tipo e spazio

sudo umount /mnt/dati                    # smonta

# "target is busy" allo smontaggio: chi lo tiene aperto?
sudo lsof +f -- /mnt/dati
sudo fuser -vm /mnt/dati
sudo umount -l /mnt/dati                 # lazy: smonta appena si libera
💡 Il mount "a mano" sparisce al reboot. Per renderlo permanente devi aggiungerlo a /etc/fstab (o creare una systemd mount unit). Per cancellare i dati in modo sicuro prima di smontare, ricordati: il filesystem deve essere libero, nessun processo (nemmeno la tua shell con cd dentro) ci deve stare dentro.

🔑 Perché UUID e non /dev/sdb1

Come visto nel cap. 1, le lettere dei dischi ballano. In fstab identificare per /dev/sdb1 è una bomba a orologeria. Usa invece l'UUID: un identificatore unico scritto dentro il filesystem alla formattazione, che lo segue ovunque.

trovare gli identificatori stabili
lsblk -f                          # mostra UUID e LABEL accanto a ogni device
sudo blkid /dev/sdb1               # UUID + TYPE di una partizione
ls -l /dev/disk/by-id/             # nomi stabili per-modello+seriale
ls -l /dev/disk/by-uuid/           # symlink UUID → /dev/sdXN
📚 Gerarchia di stabilità: UUID (segue il filesystem, ideale per fstab) > /dev/disk/by-id/ (segue il disco fisico per seriale, ideale per LVM/RAID/ZFS) > LABEL (comodo ma puoi avere doppioni) > /dev/sdX (instabile, solo per uso interattivo "qui e ora").

📝 /etc/fstab riga per riga

/etc/fstab
# <device>              <mountpoint>  <tipo> <opzioni>            <dump> <pass>
UUID=1a2b-...   /            ext4   defaults              0      1
UUID=9f8e-...   /home        xfs    defaults,noatime      0      2
UUID=AB12-CD34  /boot/efi    vfat   umask=0077            0      1
UUID=4c5d-...   none         swap   sw                    0      0
# Disco dati esterno: monta solo se presente, non bloccare il boot
UUID=7e8f-...   /mnt/backup  ext4   defaults,nofail,x-systemd.device-timeout=10  0  2

I sei campi: device (usa UUID=), mount point, tipo fs, opzioni, dump (lascia 0), pass (ordine fsck al boot: 1 per la root, 2 per gli altri, 0 = mai).

OpzioneCosa fa
defaultsrw, suid, dev, exec, auto, nouser, async — il pacchetto normale
noatimeNon aggiorna il timestamp di accesso → meno scritture, più veloce (consigliato su SSD)
nofailSe il disco manca, non blocca il boot. Vitale per dischi esterni/iSCSI
ro / rwSola lettura / lettura-scrittura
noexec,nosuid,nodevHardening: niente eseguibili/suid/device su partizioni dati come /tmp
_netdevÈ un filesystem di rete (iSCSI, NFS): aspetta la rete prima di montare
🚨 Una riga sbagliata in fstab può impedire il boot Se metti un UUID inesistente o un'opzione errata senza nofail, al riavvio il sistema resta appeso in emergency mode. Testa SEMPRE prima di riavviare: sudo mount -a prova a montare tutto il fstab; se non dà errori sei a posto. Aggiungi nofail su tutto ciò che non è essenziale al boot. sudo findmnt --verify controlla la sintassi del fstab.
06 / 12

LVM: lo spazio disco che si piega ai tuoi voleri

Partizioni rigide? Mai più. LVM mette uno strato di astrazione che ti lascia ingrandire, ridurre, spostare e fotografare i volumi a caldo, senza riavviare.

💡 L'analogia dei mattoncini

Con le partizioni classiche tagli il disco in blocchi di cemento: cambiare misura significa demolire. LVM è come avere tanti mattoncini LEGO (i Physical Volume), buttati tutti in un grande secchio (il Volume Group). Da quel secchio costruisci le "stanze" (i Logical Volume) della dimensione che vuoi, e quando una stanza sta stretta prendi altri mattoncini dal secchio e la allarghi — mentre la gente ci abita dentro.

💾

PV — Physical Volume

Un disco o una partizione "donata" a LVM. Il mattoncino di base.

🥫

VG — Volume Group

L'insieme dei PV: un pool unico di spazio da cui pescare.

📦

LV — Logical Volume

Il "disco virtuale" che formatti e monti. Ridimensionabile a piacere.

🚀 Da zero a volume montato in 6 comandi

creare lo stack LVM
# 1. Trasforma due dischi in Physical Volume
sudo pvcreate /dev/sdb /dev/sdc

# 2. Raggruppali in un Volume Group chiamato "dati"
sudo vgcreate dati /dev/sdb /dev/sdc

# 3. Crea un Logical Volume da 200G dentro al VG
sudo lvcreate -L 200G -n archivio dati
#   ...oppure prenditi tutto lo spazio libero:
sudo lvcreate -l 100%FREE -n archivio dati

# 4. Formatta il LV (compare come /dev/dati/archivio)
sudo mkfs.ext4 /dev/dati/archivio

# 5. Monta
sudo mount /dev/dati/archivio /mnt/archivio

# 6. Guarda cosa hai costruito
sudo pvs ; sudo vgs ; sudo lvs     # riepiloghi rapidi
sudo lvdisplay dati/archivio        # dettagli completi

📈 Il superpotere: ingrandire a caldo

Il VG sta finendo? Aggiungi un disco. Il volume è pieno? Allargalo mentre è montato e in uso. Questo è il motivo per cui LVM esiste.

estendere VG e LV online
# Aggiungi un nuovo disco al pool esistente
sudo pvcreate /dev/sdd
sudo vgextend dati /dev/sdd

# Allarga il volume di 50G E il filesystem dentro, in un colpo solo
sudo lvextend -L +50G -r /dev/dati/archivio
#   -r = ridimensiona anche il filesystem (resize2fs/xfs_growfs auto)
#   -l +100%FREE per prendersi tutto lo spazio rimasto nel VG

# A mano, se preferisci il controllo (ext4):
sudo lvextend -L +50G /dev/dati/archivio
sudo resize2fs /dev/dati/archivio   # XFS: xfs_growfs /mnt/archivio
⚠️ Ingrandire è sicuro e online. Ridurre no. Ridurre un LV richiede di rimpicciolire prima il filesystem e poi il volume, in quest'ordine esatto, di solito da smontato — e XFS non si riduce affatto. Sbagliare l'ordine = dati persi. Se devi ridurre ext4: umounte2fsck -fresize2fs alla nuova dimensione → lvreduce. Misura abbondante e mai vai short.

📷 Snapshot LVM

Una "foto" istantanea di un LV per fare un backup coerente o provare un upgrade rischioso con la possibilità di tornare indietro.

snapshot
# Crea snapshot da 10G (spazio per le modifiche)
sudo lvcreate -s -L 10G -n snap \
   /dev/dati/archivio

# ...fai il backup da /dev/dati/snap...
# Ripristina tutto allo stato della foto:
sudo lvconvert --merge /dev/dati/snap

# Oppure butta la foto e basta:
sudo lvremove /dev/dati/snap

🔮 Thin provisioning

Crei volumi che "promettono" più spazio di quello reale, e lo spazio viene consumato solo quando ci scrivi davvero. Comodo, ma...

🚨 Se il thin pool si riempie davvero, tutti i volumi sopra si bloccano o si corrompono. Il thin provisioning vuole monitoraggio serio dello spazio (allarmi su vgs/lvs). Non è "spazio gratis", è "spazio in prestito".
💡 LVM o ZFS/Btrfs? Se ti servono solo volumi elastici e snapshot semplici sopra ext4/XFS, LVM è leggero e collaudato. Se vuoi anche checksum, integrità dei dati e RAID integrato, allora ZFS o Btrfs fanno tutto in un pezzo solo. Si possono anche combinare (es. LVM sotto, ext4 sopra; oppure LUKS sotto LVM, vedi prossimo capitolo).
07 / 12

RAID software con mdadm

Più dischi che lavorano come uno: per velocità, per ridondanza, o entrambe. Senza controller hardware costosi e proprietari. mdadm è lo standard Linux.

LivelloCosa faTolleraSpazio utileQuando
RAID 0Stripe: divide i dati su N dischi0 guasti100%Velocità pura, dati sacrificabili (scratch, cache)
RAID 1Mirror: copia identica su 2 dischi1 guasto50%Boot, dati critici, semplicità
RAID 5Stripe + parità distribuita (min 3)1 guasto(N-1)/NBuon compromesso spazio/sicurezza
RAID 6Doppia parità (min 4)2 guasti(N-2)/NDischi grandi: sopravvivi a un guasto durante il rebuild
RAID 10Mirror + stripe (min 4)1+ per coppia50%Database, performance + ridondanza

🔨 Creare e gestire un array

mdadm
# Crea un RAID 1 (mirror) con due dischi
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 \
   /dev/sdb /dev/sdc

# RAID 5 con tre dischi
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 \
   /dev/sd{b,c,d}

# Guarda la sincronizzazione iniziale (ci mette ore su dischi grandi)
cat /proc/mdstat
sudo mdadm --detail /dev/md0

# Ora trattalo come un disco normale: formatta e monta
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /mnt/raid

# RENDI PERSISTENTE l'array (altrimenti sparisce al reboot!)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u      # Debian/Ubuntu
⚠️ Dimenticare di salvare la config in mdadm.conf e rigenerare l'initramfs è l'errore numero uno: l'array funziona, riavvii, e magicamente "non esiste più" (o riappare come /dev/md127). Non è rotto, è solo che il sistema non sa più come assemblarlo.

🔫 Sostituire un disco morto

guasto e rebuild
# Marca il disco come guasto e rimuovilo dall'array
sudo mdadm /dev/md0 --fail /dev/sdc --remove /dev/sdc

# Spegni, sostituisci fisicamente il disco, riaccendi.
# Copia lo schema partizioni dal disco buono (se partizionato), poi:
sudo mdadm /dev/md0 --add /dev/sdc

# Il rebuild parte da solo. Monitora:
watch cat /proc/mdstat
🚨 RAID non è un backup. Protegge dal guasto hardware di un disco. Non protegge da: rm -rf sbagliato, ransomware, corruzione del filesystem, fulmine che frigge tutti i dischi insieme, furto del server. Ti serve comunque un backup offsite. Sempre. Lo ripetiamo perché ogni anno qualcuno lo scopre nel modo peggiore.
💭 mdadm, LVM RAID o ZFS? mdadm è maturo, veloce e indipendente dal filesystem. LVM sa fare RAID da solo (lvcreate --type raid1) se vuoi tutto nello stack LVM. ZFS con RAIDZ aggiunge i checksum e il self-healing che mdadm non ha (mdadm si fida dei dischi; ZFS verifica ogni blocco). Per un NAS di dati preziosi: ZFS. Per un mirror di boot semplice: mdadm.
08 / 12

Cifratura a blocchi con LUKS

Il portatile rubato, il disco dismesso, il backup smarrito. Senza cifratura sono tutti i tuoi dati in chiaro. Con LUKS sono rumore casuale. È lo standard Linux per la cifratura del disco.

💡 Cosa significa "a blocchi"

LUKS cifra il disco sotto il filesystem: il filesystem, LVM e le applicazioni non sanno nemmeno che esiste. Tu apri il "lucchetto" una volta (con passphrase o chiave) e da quel momento appare un device decifrato in /dev/mapper/ che usi normalmente. Chiudi (o spegni il PC) e torna tutto illeggibile. È cifratura at-rest: protegge il disco fermo/rubato, non i dati mentre il sistema è acceso e sbloccato.

🔒 Cifrare un disco da zero

cryptsetup / LUKS2
# Formatta la partizione come volume LUKS2 (CANCELLA tutto)
sudo cryptsetup luksFormat --type luks2 /dev/sdb1
#   chiede di scrivere YES e una passphrase robusta

# Apri il volume: appare come /dev/mapper/cassaforte
sudo cryptsetup open /dev/sdb1 cassaforte

# Ora è un device normale: formattalo e montalo
sudo mkfs.ext4 /dev/mapper/cassaforte
sudo mount /dev/mapper/cassaforte /mnt/cassaforte

# Chiudi (smonta prima!)
sudo umount /mnt/cassaforte
sudo cryptsetup close cassaforte

🔑 Gestione chiavi (slot multipli)

LUKS ha 8+ "slot": più passphrase/chiavi che aprono lo stesso volume. Così puoi avere la tua passphrase + una keyfile di emergenza, e revocarne una senza ri-cifrare tutto.

chiavi
sudo cryptsetup luksAddKey /dev/sdb1
sudo cryptsetup luksRemoveKey /dev/sdb1
sudo cryptsetup luksDump /dev/sdb1
# Backup degli header (SE LI PERDI, ADDIO DATI):
sudo cryptsetup luksHeaderBackup /dev/sdb1 \
   --header-backup-file luks.img

🔌 Sblocco automatico al boot

Per montare un volume cifrato all'avvio serve la coppia /etc/crypttab (apre) + /etc/fstab (monta il /dev/mapper).

/etc/crypttab
# nome      device-cifrato   chiave    opzioni
cassaforte  UUID=...sdb1...  none      luks
# "none" = chiede la passphrase a mano al boot.
# Un file al posto di none = sblocco automatico (chiave su /root, 0400)
🚨 Persa la passphrase E l'header = dati persi per sempre Non esiste backdoor, recupero o "password dimenticata". È il punto della cifratura. Due conseguenze pratiche: (1) fai un backup dell'header LUKS in posto sicuro — un header danneggiato rende il disco illeggibile anche con la passphrase giusta; (2) per dismettere un disco cifrato basta distruggere l'header (i dati restano ma sono cifrati e inutilizzabili) — "cripto-cancellazione" istantanea.
🔐 Ordine dello stack: per "cifrare tutto", lo schema classico è LUKS sotto, LVM sopra: partizione → LUKS → PV/VG/LV → filesystem. Così sblocchi un volume e dentro hai tutti i logical volume che vuoi. Per la cifratura dell'intero sistema operativo con dischi gestiti, vedi anche la guida Privacy (LUKS, Tails & co.).
09 / 12

iSCSI: dischi "remoti" che sembrano locali

Un disco che fisicamente sta su un altro server, ma il tuo Linux lo vede come un normale /dev/sdX e ci fa partizioni, LVM, filesystem. È SCSI incapsulato in TCP/IP. Magia di rete, niente fibra costosa.

💡 Block storage vs file storage

NFS e Samba ti danno una cartella condivisa sulla rete: tu vedi file e directory, il filesystem è gestito dall'altra parte. iSCSI invece ti dà un disco grezzo sulla rete: blocchi, non file. Sei tu a partizionarlo, formattarlo e montarlo, come fosse infilato nel tuo case. Per questo un solo LUN iSCSI lo deve usare un solo client alla volta (o ti serve un filesystem cluster come GFS2/OCFS2), mentre NFS lo condividono in tanti.

📚 Il vocabolario iSCSI (4 parole e hai capito)

TargetIl server che offre lo storage (chi ha i dischi)
InitiatorIl client che si collega e usa il disco (il tuo Linux)
LUNIl singolo "disco" esposto dal target (Logical Unit Number)
IQNIl nome univoco di target/initiator, formato iqn.2026-06.org.esempio:nome
PortalIP:porta dove il target ascolta (porta TCP 3260)

📡 Lato CLIENT: collegarsi a un target (open-iscsi)

Questo è il caso più comune: hai un NAS/SAN che espone un LUN e vuoi montarlo. Pacchetto open-iscsi.

initiator
sudo apt install open-iscsi          # Debian/Ubuntu

# 1. Scopri quali target offre il portale (l'IP del NAS)
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.50

# 2. Collegati (login) al target trovato
sudo iscsiadm -m node \
   -T iqn.2026-06.org.esempio:storage1 \
   -p 192.168.1.50 --login

# 3. Ora è un disco locale! Trovalo:
lsblk                                  # comparirà un nuovo /dev/sdX
dmesg | tail                           # dice quale lettera ha preso

# 4. Da qui è storage normale: partizioni, mkfs, mount.
#    Rendi il login automatico al boot:
sudo iscsiadm -m node -T iqn.2026-06...:storage1 \
   -p 192.168.1.50 --op update -n node.startup -v automatic

# Disconnessione
sudo iscsiadm -m node -T iqn.2026-06...:storage1 --logout
⚠️ iSCSI è un disco di rete: in fstab serve _netdev e nofail. Senza _netdev il sistema prova a montarlo prima che la rete sia su → boot appeso. Con nofail non si pianta se il target è irraggiungibile. Identifica il LUN per UUID (la lettera /dev/sdX degli iSCSI cambia ancora più facilmente).

🔌 Lato SERVER: esporre un LUN (targetcli / LIO)

Vuoi tu offrire un disco via iSCSI? Su Linux moderno il target è LIO, in-kernel, configurato con targetcli.

target con targetcli
sudo apt install targetcli-fb && sudo targetcli

# dentro la shell targetcli (รจ ad albero, tipo filesystem):
# 1. Crea un backstore: un disco vero o un file-immagine
/backstores/block create disco1 /dev/sdc
#   oppure un file: /backstores/fileio create disco1 /srv/lun1.img 100G

# 2. Crea il target (genera un IQN)
/iscsi create iqn.2026-06.org.esempio:storage1

# 3. Esponi il backstore come LUN
/iscsi/iqn.2026-06.org.esempio:storage1/tpg1/luns create /backstores/block/disco1

# 4. Autorizza l'initiator (l'IQN del client, in /etc/iscsi/initiatorname.iscsi)
/iscsi/iqn.2026-06.org.esempio:storage1/tpg1/acls create iqn.2026-06.org.client:pc1

exit                                # salva automaticamente la config
sudo systemctl enable --now target   # ripristina al boot
🔐 In produzione aggiungi l'autenticazione CHAP (utente/password sul TPG): senza, chiunque sulla rete con l'IQN giusto monta il tuo disco. E metti iSCSI su una VLAN/rete storage dedicata — il traffico è in chiaro salvo IPsec. Vedi la guida VLAN.

🔗 Multipath: due strade verso lo stesso disco

Negli ambienti seri il client raggiunge il LUN via due percorsi di rete (due schede, due switch). Se uno cade, l'altro regge. multipathd li fonde in un unico device /dev/mapper/mpathX che usi al posto delle due /dev/sdX separate — altrimenti vedresti lo stesso disco "doppio" e sarebbe un disastro.

device-mapper-multipath
sudo apt install multipath-tools
sudo systemctl enable --now multipathd
sudo multipath -ll                  # mostra i path raggruppati
10 / 12

SMART e salute dei dischi

I dischi non muoiono a sorpresa: lo annunciano. Imparare a leggere SMART significa sostituire un disco prima che ti pianti in faccia il sabato sera.

🩺 smartctl: l'esame del sangue del disco

smartmontools
sudo apt install smartmontools

# Verdetto rapido: PASSED o FAILING
sudo smartctl -H /dev/sda

# Report completo: attributi, ore di vita, settori riallocati...
sudo smartctl -a /dev/sda
sudo smartctl -a /dev/nvme0           # NVMe: usa /dev/nvme0, non p1

# Lancia un test (in background, il disco resta usabile)
sudo smartctl -t short /dev/sda      # ~2 minuti
sudo smartctl -t long  /dev/sda      # ore, scansiona tutta la superficie
sudo smartctl -l selftest /dev/sda   # risultati dei test

📉 Gli attributi che contano (HDD)

AttributoCosa significaAllarme se
Reallocated_Sector_CtSettori difettosi rimappati> 0 e in crescita → il disco si sta sgretolando
Current_Pending_SectorSettori instabili in attesa di rimappatura> 0 → sorvegliato speciale
Reallocated_Event_CountQuante volte ha rimappatoIn aumento
Offline_UncorrectableSettori illeggibili e irreparabili> 0 → backup SUBITO
Power_On_HoursOre di accensioneSolo contesto (età del disco)
Wear_Leveling / Percentage_UsedUsura celle SSD/NVMeVicino al 100% → fine vita
🚨 I tre attributi della morte: Reallocated_Sector_Ct, Current_Pending_Sector, Offline_Uncorrectable. Se uno di questi è > 0 e cresce nel tempo, il disco va sostituito. Non è "se", è "quando" — e di solito prima di quanto pensi.

🔔 Monitoraggio automatico

Non vuoi controllare a mano: abilita smartd, che fa i test in automatico e ti avvisa via mail quando un attributo peggiora.

smartd
# /etc/smartd.conf
DEVICESCAN -a -o on -S on \
  -s (S/../.././02|L/../../6/03) \
  -m root -M exec /usr/share/...

sudo systemctl enable --now smartd

🔎 Altri controlli utili

badblocks, nvme, iostat
# Scansione superficie (NON distruttiva in -n, lenta)
sudo badblocks -sv /dev/sdb

# Salute NVMe nativa (tool dedicato)
sudo nvme smart-log /dev/nvme0

# Chi sta martellando i dischi adesso?
iostat -xz 2
sudo iotop -o
La regola d'oro della prevenzione Test SMART long settimanale via smartd + alert via mail + scrub periodico (se usi ZFS/Btrfs/mdadm) = scopri i problemi mentre puoi ancora fare qualcosa, non quando il disco è già morto. Un disco con Reallocated_Sector_Ct in crescita ti dà di solito settimane di preavviso. Usale.
11 / 12

Troubleshooting: quando le cose vanno male

Disco pieno che non è pieno, filesystem in read-only, "device busy", partizione sparita. I classici, con la cura.

💥 "No space left on device" ma df dice che c'è spazio

Due colpevoli tipici, entrambi sneaky:

inode esauriti o file fantasma
# 1) Hai finito gli INODE, non i byte (milioni di file minuscoli)
df -i                                 # guarda la colonna IUse%: se è 100%, ecco il problema

# 2) Un file cancellato ma ancora APERTO da un processo
#    (il log che hai "rm"-ato ma il servizio lo tiene aperto)
sudo lsof | grep deleted             # trova i file fantasma
#    Soluzione: riavvia/ricarica il processo che li tiene

# Trova chi occupa spazio davvero
sudo du -xh / | sort -rh | head -20
ncdu /                               # navigatore interattivo, comodissimo

🔐 Filesystem passato in sola lettura (read-only)

Quando il kernel rileva errori I/O gravi, rimonta il filesystem in read-only per proteggere i dati. È un sintomo, non la malattia: spesso significa disco che sta morendo.

diagnosi read-only
dmesg -T | grep -iE "error|i/o|remount|ext4|xfs"   # cosa è successo
sudo smartctl -a /dev/sda            # il disco sta morendo?

# Se il disco è sano (raro): smonta e ripara, poi rimonta
sudo umount /dev/sda1
sudo fsck -f /dev/sda1              # ext;  XFS: xfs_repair
sudo mount /dev/sda1 /mnt/punto
⚠️ Se è la root ad andare read-only, di solito non riesci nemmeno a smontarla da sistema acceso: vai da live USB o single-user mode, fai fsck da lì, e prima copia via i dati se SMART è sospetto — un fsck su disco morente può dare il colpo di grazia.

🔄 "Device or resource busy"

Non riesci a smontare/modificare un disco perché qualcosa lo usa.

chi lo tiene
sudo fuser -vm /mnt/x      # processi
sudo lsof +D /mnt/x         # file aperti
# Spesso: una shell con cd dentro,
# un container, NFS, o swap attivo.
sudo umount -l /mnt/x       # lazy umount

🔎 Partizione "sparita" / recovery

Tabella partizioni corrotta o cancellata per sbaglio.

testdisk & co.
sudo testdisk /dev/sdb     # ricostruisce tabelle
sudo photorec /dev/sdb     # recupera file per firma
# GPT ha una COPIA di backup a fine disco:
sudo gdisk /dev/sdb         # opzione 'r' → recovery

📋 Clonare, azzerare, copiare a basso livello

dd e alternative
# Clona un disco intero su un altro (status=progress mostra l'avanzamento)
sudo dd if=/dev/sda of=/dev/sdb bs=64M status=progress conv=fsync

# Meglio di dd per dischi con settori danneggiati (continua oltre gli errori)
sudo ddrescue /dev/sda /dev/sdb rescue.log

# Azzerare l'inizio di un disco (firma partizioni) per "ripartire pulito"
sudo wipefs -a /dev/sdb              # rimuove le firme fs/partizioni (pulito)
💥 dd = "disk destroyer" Invertire if= (input) e of= (output) clona il disco vuoto su quello pieno: dati spariti, all'istante, senza conferma. Rileggi il comando tre volte. if = sorgente, of = destinazione. Quando in dubbio, wipefs è più chirurgico e meno letale di dd if=/dev/zero.
12 / 12

Cheat Sheet

Tutto quello che serve, su una pagina. Bookmark questa sezione e dimentica il resto.

🔍 Ispezione

guardare
lsblk -f                 # albero + fs/uuid
sudo blkid               # uuid e tipi
df -hT                    # spazio usato
df -i                     # inode
sudo fdisk -l            # tabelle
sudo parted -l          # idem (gpt)
findmnt                   # cosa è montato

🏷️ Partizioni & filesystem

creare
sudo fdisk /dev/sdb      # g,n,w
sudo parted -s /dev/sdb mklabel gpt
sudo mkfs.ext4 -L x /dev/sdb1
sudo mkfs.xfs  -L x /dev/sdb1
sudo mkfs.vfat -F32 /dev/sdb1
sudo wipefs -a /dev/sdb   # azzera firme
sudo partprobe /dev/sdb  # rileggi

🔮 LVM

pv / vg / lv
sudo pvcreate /dev/sdb
sudo vgcreate vg0 /dev/sdb
sudo lvcreate -L 50G -n lv0 vg0
sudo mkfs.ext4 /dev/vg0/lv0
# crescere (online):
sudo vgextend vg0 /dev/sdc
sudo lvextend -r -l +100%FREE /dev/vg0/lv0
sudo pvs; vgs; lvs     # stato

🔒 LUKS & RAID

cifra / specchia
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 x
sudo cryptsetup close x

sudo mdadm --create /dev/md0 \
  --level=1 --raid-devices=2 /dev/sd{b,c}
cat /proc/mdstat          # sync

📡 iSCSI (client)

initiator
sudo iscsiadm -m discovery \
   -t st -p 192.168.1.50
sudo iscsiadm -m node -T iqn... \
   -p 192.168.1.50 --login
lsblk                      # nuovo /dev/sdX
sudo iscsiadm -m node -T iqn... \
   --logout

🩺 Salute & mount

smart / mount
sudo smartctl -H /dev/sda
sudo smartctl -t long /dev/sda
sudo mount /dev/sdb1 /mnt/x
sudo umount /mnt/x
sudo mount -a            # testa fstab
findmnt --verify        # valida fstab

✓ Regole d'oro

  • lsblk -f prima di ogni operazione distruttiva.
  • In fstab usa UUID, mai /dev/sdX.
  • nofail + _netdev su dischi esterni/iSCSI.
  • sudo mount -a per testare fstab prima del reboot.
  • GPT di default. MBR solo per hardware antico.
  • Backup dell'header LUKS in posto sicuro.
  • SMART long settimanale + alert via mail.
  • Backup offsite: RAID e snapshot non bastano.

✗ Errori classici

  • mkfs / dd sul device sbagliato (controlla 3 volte).
  • Invertire if= e of= in dd.
  • fsck su un filesystem montato in rw.
  • Ridurre un LV senza ridurre prima il filesystem.
  • Dimenticare mdadm.conf + initramfs → array che "sparisce".
  • Riempire un thin pool senza monitoraggio.
  • iSCSI in chiaro sulla LAN di produzione, senza CHAP.
  • Ignorare Reallocated_Sector_Ct che cresce.

📚 Risorse

  • Arch Wiki — wiki.archlinux.org (LVM, dm-crypt, fstab: la bibbia)
  • man pagesman fstab, man cryptsetup, man lvm
  • smartmontools — smartmontools.org
  • open-iscsi — open-iscsi.com
  • RedHat Storage Admin Guide — access.redhat.com/documentation

🔗 Guide collegate

  • ZFS — filesystem + volume manager + RAID, tutto in uno
  • macOS — APFS, il copy-on-write "cugino" di Btrfs/ZFS
  • Linux Admin — systemd, mount unit, il resto del mestiere
  • Proxmox VE — storage per VM, Ceph, ZFS in cluster
  • Privacy — LUKS full-disk, Tails, cifratura seria
  • VLAN — isolare la rete storage iSCSI
🔧
Regola finale dello svogliato — la gestione dischi è una di quelle cose dove la fretta si paga in dati persi. Tre secondi di lsblk -f in più, l'UUID al posto della lettera, e un mount -a di prova prima del reboot ti risparmiano il 95% delle nottate. Il restante 5% è il motivo per cui esiste il backup offsite.