Software RAID 10 su Linux con mdadm: creazione, layout, filesystem e test

Guida pratica a RAID10 software Linux con mdadm: near/far/offset, laboratorio con loop device, creazione sicura, monitoraggio, filesystem, mdadm.conf e test senza rischiare dischi reali.

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.

Riferimento

mdadm(8).