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à.
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.
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.
La gestione storage su Linux è una cipolla: ogni strato sta sopra al precedente e ne è indipendente. Puoi mescolarli quasi come vuoi.
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).
/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./dev/sda1, sda2 — numero attaccato alla lettera./dev/nvme0n1p1 — serve la p prima del numero.mmcblk0p1 e loop0p1.p; se finisce con una lettera, no.# 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 -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ù.
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).
Settori, allineamento, e la scelta tra il vecchio schema MBR (1983) e il moderno GPT. Spoiler: nel 2026 usi GPT, sempre, salvo motivi archeologici.
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.
| Aspetto | MBR (msdos) | GPT (GUID) |
|---|---|---|
| Anno / origine | 1983, BIOS PC | 2010+, standard UEFI |
| Disco max | 2 TiB (e poi basta) | ~9.4 ZB (non lo riempi) |
| Partizioni primarie | 4 (poi servono le "estese") | 128 (di default), tutte uguali |
| Ridondanza tabella | Nessuna. Se si corrompe, panico. | Copia primaria + backup a fine disco |
| Checksum (CRC32) | No | Sì, su header e tabella |
| Boot | BIOS legacy | UEFI (con partizione ESP) o BIOS+bios_grub |
| Quando usarlo | Hardware antico, chiavette <2TB per compat | Tutto il resto. Default 2026. |
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".
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) | Tipo | A cosa serve |
|---|---|---|
8300 | Linux filesystem | Il default per ext4/XFS/Btrfs |
8E00 | Linux LVM | Partizione che diventa un PV LVM |
FD00 | Linux RAID | Membro di un array mdadm |
8200 | Linux swap | Area di swap |
EF00 | EFI System (ESP) | Boot UEFI, FAT32 |
EF02 | BIOS boot | GRUB su GPT in modalità BIOS |
EF00) e l'autodetect di certi tool. Nel dubbio metti 8300 e vai avanti.
Quattro strumenti per lo stesso lavoro. Imparane uno bene e gli altri ti verranno gratis. La regola: misura due volte, scrivi una.
Interattivo, a menu. Oggi gestisce sia MBR che GPT. Il più diffuso.
Specializzato GPT. sgdisk è la versione scriptabile, oro per gli automatismi.
Potente, gestisce MBR/GPT e fa anche resize. Sintassi un po' ostica.
Interfaccia a "finestra" testuale con le frecce. Il più amichevole per iniziare.
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.
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)
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".
# 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
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.
# 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
sudo partprobe /dev/sdb oppure sudo partx -u /dev/sdb. Se proprio non molla, l'unica certezza è un reboot — ma di solito partprobe basta.
ext4, XFS, Btrfs, ZFS, vfat, exFAT... La domanda non è "qual è il migliore" ma "qual è giusto per QUESTO uso". Ecco come non sbagliare.
| Filesystem | Punto di forza | Usalo per | Evitalo se |
|---|---|---|---|
| ext4 | Stabile, collaudato, universale. La scelta "non sbagli mai". | Root, server generici, qualsiasi cosa "normale" | Ti servono snapshot o volumi enormi con tante feature |
| XFS | Eccelle su file grandi e tanta concorrenza. Default di RHEL. | Storage, database, media, partizioni molto grandi | Devi ridurre un fs (XFS cresce ma non si rimpicciolisce) |
| Btrfs | Snapshot, checksum, compressione, subvolume. Integrato nel kernel. | Root con snapshot (openSUSE/Fedora), workstation | RAID5/6 in produzione (storicamente fragile) |
| ZFS | Il re dell'integrità: checksum, RAIDZ, snapshot, send/recv. | NAS, storage serio, dataset critici | Vuoi qualcosa di leggero o nel kernel mainline (è un modulo) |
| vfat / FAT32 | Lo capiscono tutti i sistemi del pianeta. | ESP di boot, chiavette di scambio, schede SD | File > 4 GiB (limite duro) o ti servono i permessi Unix |
| exFAT | Come FAT ma senza il limite dei 4 GiB. | Dischi esterni grandi condivisi con Windows/Mac | È un filesystem di sistema Linux (niente permessi, niente journal) |
| F2FS | Ottimizzato per memorie flash. | SD/eMMC, dispositivi embedded e mobile | Server tradizionali con dischi rotanti |
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.
# 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
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.
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.
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.
# 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
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.
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.
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
/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.
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.
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
# <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).
| Opzione | Cosa fa |
|---|---|
defaults | rw, suid, dev, exec, auto, nouser, async — il pacchetto normale |
noatime | Non aggiorna il timestamp di accesso → meno scritture, più veloce (consigliato su SSD) |
nofail | Se il disco manca, non blocca il boot. Vitale per dischi esterni/iSCSI |
ro / rw | Sola lettura / lettura-scrittura |
noexec,nosuid,nodev | Hardening: niente eseguibili/suid/device su partizioni dati come /tmp |
_netdev | È un filesystem di rete (iSCSI, NFS): aspetta la rete prima di montare |
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.
Partizioni rigide? Mai più. LVM mette uno strato di astrazione che ti lascia ingrandire, ridurre, spostare e fotografare i volumi a caldo, senza riavviare.
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.
Un disco o una partizione "donata" a LVM. Il mattoncino di base.
L'insieme dei PV: un pool unico di spazio da cui pescare.
Il "disco virtuale" che formatti e monti. Ridimensionabile a piacere.
# 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 VG sta finendo? Aggiungi un disco. Il volume è pieno? Allargalo mentre è montato e in uso. Questo è il motivo per cui LVM esiste.
# 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
umount → e2fsck -f → resize2fs alla nuova dimensione → lvreduce. Misura abbondante e mai vai short.
Una "foto" istantanea di un LV per fare un backup coerente o provare un upgrade rischioso con la possibilità di tornare indietro.
# 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
Crei volumi che "promettono" più spazio di quello reale, e lo spazio viene consumato solo quando ci scrivi davvero. Comodo, ma...
vgs/lvs). Non è "spazio gratis", è "spazio in prestito".
Più dischi che lavorano come uno: per velocità, per ridondanza, o entrambe. Senza controller hardware costosi e proprietari. mdadm è lo standard Linux.
| Livello | Cosa fa | Tollera | Spazio utile | Quando |
|---|---|---|---|---|
| RAID 0 | Stripe: divide i dati su N dischi | 0 guasti | 100% | Velocità pura, dati sacrificabili (scratch, cache) |
| RAID 1 | Mirror: copia identica su 2 dischi | 1 guasto | 50% | Boot, dati critici, semplicità |
| RAID 5 | Stripe + parità distribuita (min 3) | 1 guasto | (N-1)/N | Buon compromesso spazio/sicurezza |
| RAID 6 | Doppia parità (min 4) | 2 guasti | (N-2)/N | Dischi grandi: sopravvivi a un guasto durante il rebuild |
| RAID 10 | Mirror + stripe (min 4) | 1+ per coppia | 50% | Database, performance + ridondanza |
# 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
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.
# 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
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 è 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.
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.
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.
# 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
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.
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
Per montare un volume cifrato all'avvio serve la coppia /etc/crypttab (apre) + /etc/fstab (monta il /dev/mapper).
# 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)
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.
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.
| Target | Il server che offre lo storage (chi ha i dischi) |
| Initiator | Il client che si collega e usa il disco (il tuo Linux) |
| LUN | Il singolo "disco" esposto dal target (Logical Unit Number) |
| IQN | Il nome univoco di target/initiator, formato iqn.2026-06.org.esempio:nome |
| Portal | IP:porta dove il target ascolta (porta TCP 3260) |
Questo è il caso più comune: hai un NAS/SAN che espone un LUN e vuoi montarlo. Pacchetto open-iscsi.
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
_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).
Vuoi tu offrire un disco via iSCSI? Su Linux moderno il target è LIO, in-kernel, configurato 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
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.
sudo apt install multipath-tools
sudo systemctl enable --now multipathd
sudo multipath -ll # mostra i path raggruppati
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.
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
| Attributo | Cosa significa | Allarme se |
|---|---|---|
Reallocated_Sector_Ct | Settori difettosi rimappati | > 0 e in crescita → il disco si sta sgretolando |
Current_Pending_Sector | Settori instabili in attesa di rimappatura | > 0 → sorvegliato speciale |
Reallocated_Event_Count | Quante volte ha rimappato | In aumento |
Offline_Uncorrectable | Settori illeggibili e irreparabili | > 0 → backup SUBITO |
Power_On_Hours | Ore di accensione | Solo contesto (età del disco) |
Wear_Leveling / Percentage_Used | Usura celle SSD/NVMe | Vicino al 100% → fine vita |
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.
Non vuoi controllare a mano: abilita smartd, che fa i test in automatico e ti avvisa via mail quando un attributo peggiora.
# /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
# 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
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.
Disco pieno che non è pieno, filesystem in read-only, "device busy", partizione sparita. I classici, con la cura.
df dice che c'è spazioDue colpevoli tipici, entrambi sneaky:
# 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
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.
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
fsck da lì, e prima copia via i dati se SMART è sospetto — un fsck su disco morente può dare il colpo di grazia.
Non riesci a smontare/modificare un disco perché qualcosa lo usa.
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
Tabella partizioni corrotta o cancellata per sbaglio.
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
# 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)
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.
Tutto quello che serve, su una pagina. Bookmark questa sezione e dimentica il resto.
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
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
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
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
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
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
lsblk -f prima di ogni operazione distruttiva./dev/sdX.nofail + _netdev su dischi esterni/iSCSI.sudo mount -a per testare fstab prima del reboot.mkfs / dd sul device sbagliato (controlla 3 volte).if= e of= in dd.fsck su un filesystem montato in rw.mdadm.conf + initramfs → array che "sparisce".Reallocated_Sector_Ct che cresce.man fstab, man cryptsetup, man lvmlsblk -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.