RAID10 è una buona scelta quando vogliamo combinare ridondanza e prestazioni senza il costo di scrittura della parità tipico di RAID5/6. Prima di costruirlo, però, dobbiamo capire cosa stiamo chiedendo al kernel: più copie degli stessi blocchi distribuite tra più dispositivi secondo un layout preciso.
Questa guida usa il Software RAID Linux gestito dal driver md e da mdadm. Gli esempi iniziano volutamente con dischi virtuali: un comando mdadm --create eseguito sul device sbagliato può distruggere dati reali in pochi secondi.
RAID10 Linux non è soltanto “RAID1 sopra RAID0”
Concettualmente RAID10 viene spesso spiegato come striping tra mirror. È una buona immagine mentale, ma Linux md supporta layout più flessibili. L’opzione --layout può usare copie near, offset o far.
n2: due copie “near”, layout predefinito e scelta normale per un RAID10 generale;f2: copie “far”, che possono migliorare alcuni pattern di lettura sequenziale a costo di caratteristiche diverse in scrittura;o2: copie “offset”, una variante intermedia.
Per la grande maggioranza dei server non serve scegliere manualmente un layout esotico. In questa guida useremo n2 proprio perché è semplice da comprendere e corrisponde al comportamento atteso di due copie.
Chunk size: non esiste un valore magico
Il chunk definisce l’unità con cui i blocchi vengono distribuiti. Valori piccoli o grandi possono favorire workload differenti, ma scegliere 64K, 128K o 512K senza misurare il carico reale è tuning per superstizione. Le versioni moderne di mdadm hanno default sensati; iniziamo da quelli e interveniamo soltanto se un benchmark rappresentativo mostra un problema.
Laboratorio sicuro con loop device
Creiamo quattro file sparsi da 1 GiB e associamoli a loop device liberi. Non occupano immediatamente 4 GiB fisici perché truncate crea file sparse.
mkdir -p /var/tmp/raid10-lab
for i in 1 2 3 4; do
truncate -s 1G "/var/tmp/raid10-lab/disk$i.img"
done
LOOPS=()
for i in 1 2 3 4; do
LOOPS+=("$(losetup --find --show "/var/tmp/raid10-lab/disk$i.img")")
done
printf '%s\n' "${LOOPS[@]}"
Prima di continuare controlliamo che i device siano davvero quelli appena creati:
losetup -a
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
Creare il RAID10
Il comando seguente inizializza l’array. In un sistema reale sostituiremmo i loop con partizioni dedicate, dopo aver identificato i dischi tramite modello, seriale e WWN.
mdadm --create /dev/md0 --level=10 --raid-devices=4 --layout=n2 "${LOOPS[@]}"
Se mdadm segnala firme o metadata preesistenti fermiamoci e capiamo perché. --force non è un pulsante “continua comunque”: aggira controlli messi lì proprio per evitare distruzioni accidentali.
Monitorare la sincronizzazione
watch -n 2 cat /proc/mdstat
mdadm --detail /dev/md0
mdadm --detail --scan
L’array può spesso essere usato mentre la sincronizzazione iniziale procede, ma le prestazioni possono essere inferiori e in produzione preferiamo attendere la stabilizzazione prima di caricarlo.
Creare il filesystem
mkfs.ext4 -L raid10-data /dev/md0
mkdir -p /mnt/raid10
mount /dev/md0 /mnt/raid10
df -h /mnt/raid10
lsblk -f /dev/md0
Per il mount permanente preferiamo l’UUID del filesystem anziché il nome /dev/md0:
blkid /dev/md0
Quindi in /etc/fstab:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /srv/data ext4 defaults,nofail 0 2
Persistenza della configurazione mdadm
Su Debian/Ubuntu possiamo verificare la definizione rilevata:
mdadm --detail --scan
Prima di aggiungerla a /etc/mdadm/mdadm.conf controlliamo che non esista già. Una volta aggiornata la configurazione:
update-initramfs -u
Questo è particolarmente importante se l’array contiene filesystem necessari molto presto durante il boot.
Simulare un guasto nel laboratorio
Possiamo marcare uno dei componenti come guasto senza staccare hardware reale:
mdadm /dev/md0 --fail "${LOOPS[0]}"
mdadm --detail /dev/md0
cat /proc/mdstat
L’array deve passare in stato degradato ma rimanere operativo. Questo test rende immediatamente evidente la differenza tra ridondanza e backup: il filesystem continua a funzionare, ma i dati cancellati dall’utente resterebbero cancellati su tutte le copie sane.
Rimuovere e riaggiungere il componente
mdadm /dev/md0 --remove "${LOOPS[0]}"
mdadm /dev/md0 --add "${LOOPS[0]}"
watch -n 2 cat /proc/mdstat
Nel laboratorio il loop è “sano” e lo riutilizziamo. Su un server reale un disco che ha prodotto errori va prima diagnosticato e normalmente sostituito, non semplicemente rimesso nell’array sperando che il problema sparisca.
Pulire il laboratorio
umount /mnt/raid10
mdadm --stop /dev/md0
for dev in "${LOOPS[@]}"; do
mdadm --zero-superblock "$dev"
losetup -d "$dev"
done
rm -rf /var/tmp/raid10-lab
Su dischi reali: prima identificare, poi agire
lsblk -o NAME,SIZE,MODEL,SERIAL,WWN,FSTYPE,MOUNTPOINTS
mdadm --detail /dev/md0
smartctl -a /dev/sdb
smartctl -a /dev/sdc
Evitiamo di basare una procedura distruttiva soltanto sul nome /dev/sdb: dopo un reboot l’ordine dei device può cambiare. Modello, seriale, WWN e symlink in /dev/disk/by-id/ sono riferimenti molto più affidabili per capire quale componente stiamo davvero sostituendo.
RAID10 non sostituisce il backup
Il RAID10 migliora disponibilità e prestazioni durante determinati guasti hardware. Per recuperare file cancellati, versioni precedenti, database corrotti o l’intero server serve ancora una strategia di backup. La guida concettuale è Backup: come e perché progettarlo.
La procedura successiva da conoscere è Sostituire un disco RAID con mdadm.

