Nella gestione dei dati una delle tecniche migliori da utilizzare è sicuramente il RAID, in particolare tra tutti i livelli disponibili per questa tecnologia, quello che offre il miglior rapporto tra prestazioni, uso disco e ridondanza è sicuramente il livello 5. Esistono 3 tipologie di RAID a livello implementativo
- RAID hardware: disponibile sui server di fascia alta, è quello che offre forse le migliori performance in quanto le operazioni vengono eseguite tutte dal controller in maniera completamente trasparente, ma ha sicuramente i costi più elevati. Inoltre utilizzando questa tipologia di raid i dati sono legati al controller utilizzato e non possono essere utilizzati ad esempio in un’altra macchina senza che si utilizzi lo stesso controlloer
- FAKERAID: ovvero RAID hardware a basso costo. Questa è la tecnologia che viene usata sui controller di fascia bassa oppure implementata nelle motherboard dei computer desktop. Questa tecnologia viene chiamata fakeraid in quanto non è un RAID vero e proprio ma una parte dell’implementazione e della computazione viene lasciata alla CPU e l’interfacciamento con i dati avviene tramite un driver. Qui le performance sono decisamente più basse e rimane il problema del trasporto dei dati da un sistema all’altro. Inoltre non è detto che il driver di questi controller sia disponibile per tutti i sistemi operativi.
- RAID software: quello di cui discuteremo qui. Il maggiore vantaggio di questa tecnologia è il controllo assoluto sui propri dati, si possono aggiungere e rimuovere dispositivi a piacere e soprattutto si possono trasferire da una macchina all’altra. Inoltre è possibile eseguire le operazioni di manutenzione a sistema attivo, cosa che non è possibile negli altri due casi in cui è richiesto un reboot.
Per questo tutorial utilizzerò una macchina virtuale in modo da poter aggiungere dischi a piacimento e simulare la rottura di un disco rimuovendolo dalla macchina virtuale. Il sistema operativo di questa macchina virtuale è Ubuntu 9.10, ma i comandi ed i pacchetti utilizzati sono gli stessi che si utilizzerebbero su Debian. L’unico pacchetto che va installato per poter creare e manipolare array di dischi è il pacchetto mdadm che mette a disposizione l’omonimo comando.
Per creare un array di dischi a utilizzando il RAID5 sono necessari almeno 3 dischi/partizioni della stessa dimensione. Degli N dischi utilizzati uno di essi è utilizzato come codice di controllo in maniera circolare, per cui lo spazio effettivo a disposizione nell’array risultante sarà pari ad (n-1) * disksize. Il livello di fault tolerance offerto da questa soluzione è di un disco, ovvero il sistema rimane in funzione ed i dati rimangono integri se si danneggia fino ad un disco, in caso di rottura di più di un disco contemporaneamente i dati sono irrimediabilmente persi. Se si hanno più dischi a disposizione si può configurare uno di essi come spare disk, ovvero come disco di emergenza. Nel caso di rottura di un disco esso verrà rimpiazzato automaticamente dal disco di riserva ottenendo quindi una fault tolerance pari a 2 dischi.
Nella macchina virtuale di esempio verranno utilizzati 3 dischi da 3GB per la configurazione iniziale che porteranno quindi ad un array di dimensione 6GB.
Creazione delle partizioni
Una volta aggiunti i dischi alla macchina virtuale essi appaiono come dispositivi vuoti, quindi come prima cosa vanno partizionati per poter essere utilizzati come membri di array. Il tipo di partizione per il RAID è fd, per cui utilizzando fdisk la sequenza di comandi da utilizzare per ognuno dei 3 dischi è la seguente:
root@fabio-laptop-ubuntu:/# fdisk /dev/sdb
Il dispositivo non contiene né una tabella delle partizioni DOS valida, né una disklabel Sun, SGI od OSF
Building a new DOS disklabel with disk identifier 0xd90f450c.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Attenzione: il flag 0x0000 non valido della tabella delle partizioni 4 verrà corretto con w(rite)
Comando (m per richiamare la guida): n
Azione comando
e estesa
p partizione primaria (1-4)
p
Numero della partizione (1-4): 1
Primo cilindro (1-391, predefinito 1):
Utilizzo del valore predefinito 1
Last cilindro, +cilindri or +size{K,M,G} (1-391, predefinito 391):
Utilizzo del valore predefinito 391
Comando (m per richiamare la guida): t
Partizione selezionata 1
Codice esadecimale (digitare L per elencare i codici): fd
Modificato il tipo di sistema della partizione 1 in fd (Autorilevamento raid di Linux)
Comando (m per richiamare la guida): w
La tabella delle partizioni è stata alterata!
Chiamata di ioctl() per rileggere la tabella delle partizioni.
Sincronizzazione dei dischi in corso.
Il procedimento va ripetuto per tutti e tre i dischi in modo da prepararli per la costruzione dell’array. Una volta create le partizioni dopo aver creato le partizioni per tutti i dischi interessati si dovrebbe avere questo output digitando il comando fdisk -l
Disco /dev/sdb: 3221 MB, 3221225472 byte 255 testine, 63 settori/tracce, 391 cilindri Unità = cilindri di 16065 * 512 = 8225280 byte Identificativo disco: 0x00000000 Dispositivo Boot Start End Blocks Id System /dev/sdb1 1 391 3140676 fd Autorilevamento raid di Linux Disco /dev/sdc: 3221 MB, 3221225472 byte 255 testine, 63 settori/tracce, 391 cilindri Unità = cilindri di 16065 * 512 = 8225280 byte Identificativo disco: 0xd90f450c Dispositivo Boot Start End Blocks Id System /dev/sdc1 1 391 3140676 fd Autorilevamento raid di Linux Disco /dev/sdd: 3221 MB, 3221225472 byte 255 testine, 63 settori/tracce, 391 cilindri Unità = cilindri di 16065 * 512 = 8225280 byte Identificativo disco: 0x171338f5 Dispositivo Boot Start End Blocks Id System /dev/sdd1 1 391 3140676 fd Autorilevamento raid di Linux
Creazione dell’array
Come accennato in precedenza tutte le operazioni vengono eseguite con il comando mdadm. Per vedere le opzioni a disposizione vedere la relativa pagina di manuale, in ogni caso per creare il volume è sufficiente eseguire il comando
root@fabio-laptop-ubuntu:/# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 64K mdadm: size set to 3140608K mdadm: array /dev/md0 started.
In questo modo si è creato ed avviato il device /dev/md0 che può essere utilizzato come una normale partizione in modo del tutto trasparente. Per controllare che il device sia stato utilizzato correttamente basta eseguire
root@fabio-laptop-ubuntu:/# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
6281216 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Se l’array è stato creato correttamente siamo a posto, ma dobbiamo fare in modo che esso venga avviato all’avvio del sistema operativo. Per fare ciò dobbiamo editare (o creare) il file mdadm.conf che normalmente dovrebbe trovarsi in /etc, ma in Ubuntu si trova in /etc/mdadm/mdadm.conf. Per i dettagli relativi a tale file consultare la pagina di manuale relativa (ovvero mdadm.conf). In ogni caso l’opzione che va inserita per caricare all’avvio l’array appena creato è ARRAY. Per ottenere automaticamente il contenuto di tale opzione è sufficiente eseguire il comando
root@fabio-laptop-ubuntu:/# mdadm --examine --scan ARRAY /dev/md0 level=raid5 num-devices=3 UUID=c5a20602:9985ece9:11a1047a:ce03a3ef
L’output generato da tale comando è la linea che dobbiamo inserire nel file di configurazione. Un’altra opzione utile da considerare in tale file è MAILADDR ovvero l’indirizzo di posta a cui il demone mdadm invierà le email per segnalare eventuali anomalie nel sistema. Su Ubuntu/Debian il programma mdadm viene avviato automaticamente all’avvio del sistema, su altre distribuzioni potrebbe essere necessario aggiungere uno script in init.d a tale scopo. Infine un’ultima opzione che consiglio di lasciare al valore di default è DEVICE. Questa opzione indica a mdadm in quali device deve ricercare partizioni di tipo fd. Il valore di default è partitions, ovvero tutte le partizioni elencate in /proc/partitions. Utilizzando questo valore invece che la lista esplicita delle partizioni di tipo RAID non si rischia di dimenticare nessuna partizione che potrebbe contenere una parte di array.
Finito di editare il file mdadm.conf riavviamo il sistema e controlliamo al riavvio attraverso il file /proc/mdstat che l’array sia stato inizializzato correttamente (ovvero che si abbia lo stesso output avuto in precedenza).
Se tutto è andato a buon fine si può cominciare ad utilizzare il device creando un filesystem su di esso. Ad esempio per creare un filesystem di tipo ext3 con il seguente comando
root@fabio-laptop-ubuntu:/home/fabio# mkfs.ext3 /dev/md0 mke2fs 1.41.9 (22-Aug-2009) Etichetta del filesystem= Tipo SO: Linux Dimensione blocco=4096 (log=2) Dimensione frammento=4096 (log=2) 393216 inode, 1570304 blocchi 78515 blocchi (5.00%) riservati per l'utente root Primo blocco dati=0 Maximum filesystem blocks=1610612736 48 gruppi di blocchi 32768 blocchi per gruppo, 32768 frammenti per gruppo 8192 inode per gruppo Backup del superblocco salvati nei blocchi: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Scrittura delle tavole degli inode: fatto Creating journal (32768 blocks): fatto Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto Questo filesystem verrà automaticamente controllato ogni 25 mount, o 180 giorni, a seconda di quale venga prima. Usare tune2fs -c o -i per cambiare.
Fault tolerance in RAID5
Vediamo ora cosa succede disconnettendo un disco dalla macchina virtuale, simulando così la rottura di un disco. Per verificare l’integrità dei dati nella partizione costruita sul RAID ho creato alcuni files dal contenuto casuale (con il comando dd if=/dev/urandom of=testfile bs=1MB count=100) e ne ho salvato l’md5 in un file di testo.
Spegnendo la macchina virtuale ed eliminando un disco al successivo riavvio l’array non verra’ montato e, se configurata la variabile MAILADDR in mdadm.conf ci arriverà un messaggio di posta che ci avvisa che l’array è degradato. Sarà comunque possibile avviare l’array utilizzando il seguente comando ed i verificare che i dati sono integri e disponibili
root@fabio-laptop-ubuntu:/mnt/raid# mdadm -As mdadm: /dev/md0 has been started with 2 drives (out of 3). root@fabio-laptop-ubuntu:/mnt/raid# mount /mnt/raid root@fabio-laptop-ubuntu:/mnt/raid# md5sum -c md5 testfile: OK testfile1: OK testfile2: OK testfile3: OK
Chiaramente questo è molto pericoloso in quanto se si dovesse rovinare un altro disco sarebbe tutto irrimediabilmente perso (ed inoltre le performance sono ridotte all’osso in quanto i dati del disco mancante sono calcolati a partire dagli altri 2). Per cui il passo successivo è quello di rimpiazzare al più presto il disco mancante e ricostruire l’array. Inserendo un nuovo disco per sostituire il precedente e partizionandolo come in precedenza (quindi sempre come /dev/sdd1), sarà sufficiente eseguire il seguente comando per ricostruire l’array e tornare operativi e coperti da eventuali ulteriori guasti:
root@fabio-laptop-ubuntu:/mnt/raid# mdadm /dev/md0 --add /dev/sdd1 mdadm: added /dev/sdd1
A questo punto l’array verrà ricostruito automaticamente come si può verificare con il comando
root@fabio-laptop-ubuntu:/mnt/raid# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdb1[0] sdc1[1]
6281216 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 4.9% (154624/3140608) finish=2.2min speed=22089K/sec
unused devices: <none>
Aggiunta di un nuovo disco all’array
Nello stesso modo in cui si sostituisce un disco/partizione che ha fallito è possibile aggiungere un nuovo device all’array nel caso in cui fossimo a corto di spazio. Per cui una volta inserito il nuovo disco nella macchina si può aggiungere all’array con il comando
root@fabio-laptop-ubuntu:/mnt/raid# mdadm /dev/md0 --add /dev/sde1 mdadm: added /dev/sde1
In questo modo si è aggiunto il disco all’array ma allo stato attuale delle cose il nuovo disco viene considerato come disco di spare, ovvero come disco di emergenza da usare in caso di fallimento di un altro disco. Per aggiungere questo dispositivo allo spazio effettivamente disponibile bisogna utilizzare un altro comando con il quale si ingrandisce l’array.
root@fabio-laptop-ubuntu:/mnt/raid# mdadm --grow /dev/md0 --raid-devices=4 mdadm: Need to backup 384K of critical section.. mdadm: ... critical section passed.
Anche qui si può controllare lo stato della ricostruzione dell’array con il comando
root@fabio-laptop-ubuntu:/mnt/raid# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid5 sde1[3] sdb1[0] sdd1[2] sdc1[1]
6281216 blocks super 0.91 level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
[>....................] reshape = 2.5% (79680/3140608) finish=3.8min speed=13280K/sec
unused devices: <none>
Dopo che si è aggiunto il disco però è necessario un altro passo, ovvero l’estensione del filesystem, altrimenti non otterremmo nessun beneficio nell’aver aggiunto ulteriore spazio. Nel caso di ext3 questa operazione può essere eseguita al volo con il comando
root@fabio-laptop-ubuntu:/mnt/raid# resize2fs /dev/md0 resize2fs 1.41.9 (22-Aug-2009) Filesystem at /dev/md0 is mounted on /mnt/raid; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/md0 to 2355456 (4k) blocks. The filesystem on /dev/md0 is now 2355456 blocks long.




















Grande ! Questo articolo mi è stato d’aiuto perchè ho visto che in rete si trova poco quando si parla di raid in linux.
In particolar modo ero riuscito a impostare il tutto, però al riavvio il sistema mi dava errori, come se non esistesse più /dev/md0.
E nell’articolo ho trovato la risposta: bisogna editare /etc/mdadm/mdadm.conf per far avviare l’array all’avvio del sistema operativo
Sono contento che ti sia stato di aiuto
Ho un’altra domanda: se in fase d’installazione non aggiungo la riga in /etc/mdadm.conf con i dati dell’array appena creato, e riavvio il computer, al riavvio non riconosce oppure non avvia l’array (dice che /dev/md0 non esiste).
A questo punto come si può fare per evitare di reinstallare tutto?
Se non lo editi in fase di installazione, puoi sempre editarlo dopo con un qualsiasi editor di testo agendo come root, senza la necessità di reinstallare tutto. Ad esempio da terminale con
sudo vi /etc/mdadm.confA quel punto basta inserire
ARRAY /dev/md0 level=raid5 num-devices=3
saltando la seconda parte della riga oppure è necessaria anche quella:
UUID=c5a20602:9985ece9:11a1047a:ce03a3ef
(ho fatto riferimento all’esempio pubblicato nell’articolo)
Si, l’uuid è richiesto. La lista completa delle opzioni che puoi utilizzare la puoi trovare ad esempio qui, in ogni caso ti consiglio di utilizzare l’output del comando
mdadm --examine --scanper editare il file mdadm.conf. In tal modo non rischi di commettere errori.