Avevo bisogno di spazio di archiviazione, ma allo stesso tempo anche mantenere una certa soglia di sicurezza dei dati. Ho configurato un raid 5 e ti spiego come ho fatto.

Configurare un RAID software con mdadm su Linux

31-10-2024

Lo spazio in cloud non è mai abbastanza, più ne hai e più te ne occorre!

Dropbox, Google Drive o OneDrive per archiviare i tuoi documenti ed averli sempre a portata di mano. Google Photo, Amazon Photo per archiviare foto e video scattate con il tuo smartphone, così da tenere al sicuro i tuoi ricordi.

E se fai un lavoro nel campo digital o sei un content creator? È finita! Conservare copie di backup di vecchi progetti che a volte pesano gigabite e gigabite di spazio potrebbe diventare un vero incubo.

Ed è proprio quello che è successo a me.

Trovandomi un po' stretto ho deciso di non frammentare i miei dati. Utilizzo principalmente l’account Google e non mi piaceva l’idea di spostare files su altri drive solo per restare nel piano gratuito dei vari servizi.

Ma cos’è veramente il cloud? Se ci pensi il cloud è semplicemente il PC di quanlcun altro, che stai pagando per conservare i tuoi file.

Qui si potrebbe aprire una lunga parentesi sul fatto che se diventi il cloud provider di te stesso devi pensare da solo a tenere il più possibile “al sicuro” il tuo server ed i tuoi dati (un UPS per sbalzi di corrente, manutenzione ordinaria regolare, fare almeno un backup in un’altra sede o presso altro cloud provider, etc. etc.) ma non è argomento di questo articolo. Se sei interessato scrivimi e potrei approfondire anche questo aspetto.

Dato che in ufficio ho già un server che uso un po' come NAS, che è sempre acceso per hostare qualche servizio e poche altre cosette, ho deciso di comprare qualche disco extra e aumentare significativamente lo spazio a mia disposizione.

In questo articolo ti dirò quali dischi ho comprato e come li ho configurati per ottenere una configurazione RAID 5.

Cosa è un RAID

Il RAID (Redundant Array of Independent Disks) è un sistema di storage che combina più hard disk per migliorare le prestazioni e la ridondanza dei dati. Esistono diversi livelli RAID (0, 1, 5, 10, ecc.) con caratteristiche differenti: alcuni massimizzano la velocità, altri offrono una maggiore protezione dai guasti.

Di seguito una piccola galleria che riassume la composizione dei vari tipi di RAID possibili.

Un RAID può essere sia hardware che software

Il RAID hardware utilizza un controller dedicato per gestire i dischi, offrendo generalmente prestazioni superiori e una maggiore affidabilità grazie all’offload delle operazioni dal processore. In sostanza c’è qualcuno (un chip dedicato) che fa' le operazioni al posto della CPU, sgravando il carico da quest’ultima.

Il RAID software, invece, viene configurato direttamente dal sistema operativo, risultando più economico ma potenzialmente meno performante, soprattutto in caso di carichi di lavoro intensi.

Ho scelto di utilizzare un RAID 5

Nella mia situazione attuale un RAID 5 implementato via software è un buono compromesso tra costo e sicurezza dei dati. Attualmente infatti non ho bisogno di performance elevatissime ma soltanto di spazio di archiviazione.

Per questa configurazione ho scelto di utilizzare 4 dischi da 10TB dei Seagate Exos X10 10 TB, per un totale di circa 30TB a mia disposizione.

Questo è il link sponsorizzato Amazon al prodotto: https://amzn.to/4ej9xMy

Qualche link non funziona più? Scrivimi nei commenti o nel canale Telegram te ne fornirò altri.

Disclaimer

ATTENZIONE: un RAID non è un backup ma vuol dire configurare un sistema di storage che consente di avere più spazio di archiviazione e di mantenere una certa soglia di sicurezza dei dati.

Mi spiego meglio: l’implementazione di un RAID aumenta la tolleranza ai guasti, ma non elimina completamente il rischio di perdita dei dati. Un singolo disco guasto può essere sostituito senza interrompere il servizio, grazie al meccanismo di ricostruzione automatica. Tuttavia, guasti multipli o eventi catastrofici possono causare la perdita completa dei dati, rendendo indispensabile un piano di disaster recovery.

Non mi assumo responsabilità in caso tu voglia riprodurre questo mio esperimento. Questo articolo è solo la descrizione di come ho affrontato questo problema. Se ci vuoi provare anche tu, hai tutta la mia stima, ma lo fai a tuo rischio e pericolo.

Ultimo avviso, ma non per importanza: di seguito descrivo la procedura che ho seguito, dove ti evidenzio anche cosa ho sbagliato. Se vuoi riprodurre questo esperimento quindi non lanciare i comandi in sequenza ma leggi prima tutto l’articolo e poi utilizza solo i comandi necessari per la tua configurazione. Se hai dubbi scrivimi, contatta un esperto, leggi guide su internet, insomma… Informati bene prima!

Situazione iniziale

Sul server è installato un Ubuntu 24.04 LTS. Arrivati i dischi e installati nel case del mio server la situazione iniziale era la seguente:

progressify@progressify-server:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0     4K  1 loop /snap/bare/5
loop1    7:1    0  74,3M  1 loop /snap/core22/1564
loop2    7:2    0  10,7M  1 loop /snap/firmware-updater/127
loop3    7:3    0  10,5M  1 loop /snap/snap-store/1173
loop4    7:4    0 269,8M  1 loop /snap/firefox/4793
loop5    7:5    0  91,7M  1 loop /snap/gtk-common-themes/1535
loop6    7:6    0 505,1M  1 loop /snap/gnome-42-2204/176
loop7    7:7    0  38,8M  1 loop /snap/snapd/21759
loop8    7:8    0   500K  1 loop /snap/snapd-desktop-integration/178
loop9    7:9    0  74,3M  1 loop /snap/core22/1612
loop10   7:10   0 271,2M  1 loop /snap/firefox/4848
sda      8:0    0   9,1T  0 disk 
└─sda1   8:1    0   9,1T  0 part 
sdb      8:16   0   9,1T  0 disk 
└─sdb1   8:17   0   9,1T  0 part 
sdc      8:32   0   9,1T  0 disk 
└─sdc1   8:33   0   9,1T  0 part 
sdd      8:48   0   9,1T  0 disk 
└─sdd1   8:49   0   9,1T  0 part 
sde      8:64   0 111,8G  0 disk 
├─sde1   8:65   0 110,7G  0 part /
└─sde2   8:66   0     1G  0 part /boot/efi

Come puoi vedere i dischi sono stati tutti rilevati dal sistema operativo e sono indicati come: sda, sdb, sdc e sdd.

Per poter configurare il RAID software ho utilizzato mdadm. Puoi installarlo lanciando i seguenti comandi:

apt update
apt upgrade -y
apt install mdadm -y

Installato il tutto, lancio subito il comando per creare il mio RAID:

root@progressify-server:/home/progressify# mdadm --create --verbose /dev/md0 --level=5 --raid-device=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: partition table exists on /dev/sda
mdadm: partition table exists on /dev/sda but will be lost or
       meaningless after creating array
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
       meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
       meaningless after creating array
mdadm: partition table exists on /dev/sdd
mdadm: partition table exists on /dev/sdd but will be lost or
       meaningless after creating array
mdadm: size set to 9775212032K
mdadm: automatically enabling write-intent bitmap on large array
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Spiegazione del comando:

  • --create questo flag serve per la creazione di un nuovo RAID
  • --verbose fornisce un output più dettagliato durante l’esecuzione del comando, mostrando informazioni utili per il debugging e la comprensione di ciò che sta accadendo
  • /dev/md0 nome che verrà assegnato al nuovo dispositivo, si può scegliere qualsiasi nome, ma /dev/md0 è una convenzione
  • --level=5 specifica il livello del RAID, in questo caso 5
  • --raid-device=4 numero di dispositivi fisici che verranno utilizzati per creare il RAID
  • /dev/sda /dev/sdb /dev/sdc /dev/sdd i nomi dei dischi che verranno utilizzati per creare il RAID

Il comando è stato abbastanza veloce nella sua esecuzione. Difatti scrive dei file di configurazione, fa dei check ed avvia la procedura di creazione del disco di parità rilasciando subito la console.

Per capire meglio cosa sta succedendo consulto i dettagli del RAID:

root@progressify-server:/home/progressify# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Sep 10 21:58:39 2024
        Raid Level : raid5
        Array Size : 29325636096 (27.31 TiB 30.03 TB)
     Used Dev Size : 9775212032 (9.10 TiB 10.01 TB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Tue Sep 10 21:59:41 2024
             State : clean, degraded, recovering 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

    Rebuild Status : 0% complete

              Name : progressify-server:0  (local to host progressify-server)
              UUID : 1d613529:70e979c0:daccb12a:e320cefa
            Events : 13

    Number   Major   Minor   RaidDevice State
       0       8        0        0      active sync   /dev/sda
       1       8       16        1      active sync   /dev/sdb
       2       8       32        2      active sync   /dev/sdc
       4       8       48        3      spare rebuilding   /dev/sdd

Questo è molto semplice da spiegare: con il flag --detail sto chiedendo ad mdadm i dettagli sul RAID creato al passo precedente con nome /dev/md0.

Dall’output del detail capisco che il quarto disco è in fase di ricostruzione spare rebuilding. A questo punto potrei già utilizzare il disco ma finirei per rallentare il processo in corso. Decido di attendere che finisca.

Ma quanto devo attendere?

Bhè questo dipende dalla capienza dei dischi che hai scelto. Più sono grandi i dischi e più tempo ci vorrà. Ovviamente in relazione anche alla velocità dei dischi, se si tratta di SSD il processo sarà più veloce, nel mio caso sono dischi meccanici, abbastanza veloci ma per niente paragonabili alle SSD.

Per avere le statistiche di mdadm devi consultare il file /proc/mdstat.

root@progressify-server:/home/progressify# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd[4] sdc[2] sdb[1] sda[0]
      29325636096 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
      [>....................]  recovery =  1.1% (115897384/9775212032) finish=859.7min speed=187251K/sec
      bitmap: 0/73 pages [0KB], 65536KB chunk

unused devices: <none>

Avrei dovuto attendere circa 860 minuti. Era sera tardi quando ho iniziato a trafficarci, decido di andare a dormire e di riprendere il giorno successivo.

Passano circa 16 ore e questo è il risultato:

root@progressify-server:/home/progressify# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd[4] sdc[2] sdb[1] sda[0]
      29325636096 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 0/73 pages [0KB], 65536KB chunk

unused devices: <none>

Tutti i dischi sono up: [4/4] [UUUU]

Il RAID è pronto. Creo il filesystem, scelgo di utilizzare ext4:

root@progressify-server:/home/progressify# mkfs -t ext4 /dev/md0
mke2fs 1.47.0 (5-Feb-2023)
Creazione del file system con 7331409024 4k blocchi e 458213376 inode
Etichetta del file system=8334074e-7416-4d2d-bb37-9ef6ae72ea4a
Backup del superblocco salvati nei blocchi: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 
        2560000000, 3855122432, 5804752896

Allocazione delle tabelle di gruppo: fatto                            
Scrittura delle tavole degli inode: fatto                            
Creazione diario (262144 blocchi): fatto
Scrittura delle informazioni dei super-blocchi e dell'accounting del file system: fatto

A questo punto, un po' ingenuamente ho riavviato il sistema, sicuro di poter riprendere da dove avevo lasciato. Dopo il riavvio però la situazione è questa:

root@progressify-server:/home/progressify# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
unused devices: <none>

Il RAID non è più utilizzabile. PANICO!

Provo a recuperare la situazione con questo comando:

root@progressify-server:/home/progressify# mdadm --assemble --scan
mdadm: No arrays found in config file or automatically

Faccio qualche ricerca su google e da quel che leggo dovevo completare alcune operazioni prima di riavviare il sistema e “rompere” il RAID. Probabilmente la situazione era recuperabile, ma avevo intenzione di partire dal caso più pulito possibile.

Ho deciso di ricreare il RAID con il comando iniziale ed ho atteso altre (circa) 16 ore per fargli ricostruire il disco di parità.

Appena ha finito il tutto ho lanciato questo comando:

root@progressify-server:/home/progressify# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
root@progressify-server:/home/progressify# cat /etc/mdadm/mdadm.conf
# mdadm.conf
#
# !NB! Run update-initramfs -u after updating this file.
# !NB! This will ensure that initramfs has an uptodate copy.
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays

# This configuration was auto-generated on Tue, 10 Sep 2024 21:55:03 +0200 by mkconf
ARRAY /dev/md0 metadata=1.2 UUID=0b4b6f76:3003b5d8:16db163e:c6f51bd4

Serve a ricordare a mdadm che c’è un RAID che deve ricaricare.

Ho ricreato il filesystem ed ho modificato in questo modo il file /etc/fstab

nano /etc/fstab
UUID=0b4b6f76:3003b5d8:16db163e:c6f51bd4       /mnt/raid       ext4       defaults,noatime,nofail       0       0

Dopo l'aggiornamento di qualsiasi cosa in fstab devi lanciare questi comandi:

root@progressify-server:/home/progressify# systemctl daemon-reload
root@progressify-server:/home/progressify# mount -av
root@progressify-server:/home/progressify# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0-44-generic

Dovrebbe essere tutto pronto! Copio qualcosa sul disco e provo a riavviare il sistema.

Indovina? Si è rotto di nuovo tutto, sono nella stessa situazione precedente. Il RAID non viene riconosciuto dal sistema dopo il riavvio.

Ho effettuato tante altre ricerche prima di iniziare da capo. Non è possibile che abbia sbagliato qualcosa 2 volte su 2.

Finchè su Stack Overflow leggo che alcuni sistemi non supportano l'UUID in /etc/fstab ma bisogna indicare il nome del RAID.

Aimè ho dovuto ricominciare da capo!

Ricreo il RAID, attendo altre 16 ore circa, aggiorno il file mdadm.conf (qui),
prestando attenzione però a rimuovere la riga che avevo aggiunto in precedenza.

Torno nel file /etc/fstab e modifico la riga che avevo inserito in precedenza in questo modo:

nano /etc/fstab
/dev/md0        /mnt/raid       ext4    defaults,noatime,nofail 0       0

Infine reload, mount, update initramfs (qui).

Per stare ancora più tranquillo ho aggiornato il file mdadm.conf in questo modo:

DEVICE /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

Ho decommentato la riga DEVICE ed ho aggiunto manualmente i dischi che fanno parte del RAID, così non deve cercarli lui.

Momento della verità: copio qualche file sul mio disco e provo a riavviare il sistema.

Stavolta tutto ha funzionato!

Il disco viene rilevato correttamente dal sistema operativo dopo il riavvio.

root@progressify-server:/home/progressify# df -lh
File system     Dim. Usati Dispon. Uso% Montato su
tmpfs           1,6G  1,9M    1,6G   1% /run
efivarfs        128K   57K     67K  47% /sys/firmware/efi/efivars
/dev/sde1       109G   11G     92G  11% /
tmpfs           7,8G     0    7,8G   0% /dev/shm
tmpfs           5,0M   12K    5,0M   1% /run/lock
/dev/sde2       1,1G  6,2M    1,1G   1% /boot/efi
tmpfs           1,6G  116K    1,6G   1% /run/user/1000
/dev/md0         28T   24K     26T   1% /mnt/raid

Perchè ci sono solo 26 TB utilizzabili su 28?

Perchè il sistema operativo quando crea un nuovo file system riserva una parte dello spazio sul disco e fa' in modo che solo l’utente root ed alcuni servizi di sistema possano scrivere in quello spazio. Se non vado errato riserva il 5% del disco.

Ma io voglio che tutto lo spazio sia a mia disposizione! Con il seguente comando vado a dirgli di impostare a 0 lo spazio riservato.

root@progressify-server:/home/progressify# tune2fs -r 0 /dev/md0
tune2fs 1.47.0 (5-Feb-2023)
Impostazione del conteggio dei blocchi riservati a 0

Controllo che l’operazione abbia avuto successo:

root@progressify-server:/home/progressify# df -lh
File system     Dim. Usati Dispon. Uso% Montato su
tmpfs           1,6G  1,9M    1,6G   1% /run
efivarfs        128K   57K     67K  47% /sys/firmware/efi/efivars
/dev/sde1       109G   11G     92G  11% /
tmpfs           7,8G     0    7,8G   0% /dev/shm
tmpfs           5,0M   12K    5,0M   1% /run/lock
/dev/sde2       1,1G  6,2M    1,1G   1% /boot/efi
tmpfs           1,6G  116K    1,6G   1% /run/user/1000
/dev/md0         28T   24K     28T   1% /mnt/raid

Ora posso godermi i miei 30 TB di archiviazione.

PS: l’immagine di copertina l’ho creata con Microsoft Designer 😉

AP

 

Antonio Porcelli @progressify

Antonio Porcelli

@progressify

Commenta l'articolo

Se non visualizzi il blocco dei commenti è perchè non hai accettato i cookies.
Cancella le preferenze del tuo browser per questo sito, aggiorna la pagina ed accetta i cookies.