[tecnica] realizzare un RAID Software con Linux

Nota: non so a quanta gente possa interessare o servire un post come questo, ma se posso aiutare anche solo una persona… beh! meglio!

Premessa:
hard diskil fatto di realizzare un RAID software con Linux nasce da un’esigenza pratica in azienda, dove c’e’ un PC con installato Ubuntu Linux Server 6.06 che funge da Backup Server per i dati aziendali, i databases, i dati utente, la posta elettronica, etc… ovviamente, oltre al Backup Server, c’e’ anche un salvataggio delle cose essenziali su dispositivo a nastro. Il vantaggio sta nel fatto di avere un secondo backup, di backuppare cose “meno essenziali” su un supporto alternativo (il disco fisso del PC, appunto) e di poter effettuare un ripristino sicuramente più immediato in caso di problemi.

Recentemente abbiamo attivato un sistema di archiviazione elettronica dei documenti (sia ciclo attivo che ciclo passivo) in formato PDF. Questo ha aumentato notevolmente la quantità di dati giornalieri da backuppare e mi sono ritrovato con una partizione da 50GB che è passata da un 30% in uso ad un 57% in uso in pochissimi giorni.

Le soluzioni, a questo punto, potevano essere due:

  1. sostituire il disco fisso del PC (da 80GB) con uno più grande.
  2. “appendere” all’attuale partizione un secondo disco da 80GB (che avevo già in giro a far nulla) ottenendo un’unica partizione da 130GB.

C’é una buona probabilità che non applicherò l’”append” della partizione e che cambierò/aggiungerò dei dischi più grandi ma, comunque, dopo qualche ricerca su Internet (sapendo che il Pinguino consente di fare RAID software) ecco quello che ne è uscito:

Per iniziare ho “creato” un PC di prova sul quale poter ricreare la situazione reale e testare le varie configurazioni senza paura di disintegrare dei dati importanti…

La mia configurazione è la seguente:

  • PC Pentium 4 3GHz e 512MB RAM.
  • il 1° hard disk da 80GB (primary master) di cui 2BG si partizione swap, 20GB di partizione per il sistema (dove monto la root) e 58GB di partizione per i dati (dove monto la home e che nel mio caso viene usata per il backup).
  • il 2° hard disk da 80GB (secondary slave) vuoto, non montato e non partizionato.
  • sistema operativo Linux Ubuntu Server 6.06 LTS con kernel 2.6.15-26-server con installazione server di base (quindi niente server X, niente Gnome o KDE, …niente di niente! solo una fantastica e flessibilissima console!!!) e in aggiunta OpenSSH per l’eventuale controllo remoto.

Innanzi tutto ho abilitato root come utente:

sudo passwd root

quindi ho disconnesso l’utente normale (nel mio caso mauro) e mi sono ri-loggato come root e ho smontato la partizione home (che dovrebbe contenere solo la directory dell’utente mauro e la lost+found, in caso contrario munitevi di salvataggio!!!):

umount /home

a questo punto vediamo per benino quali partizioni ha trovato il sistema con il comando

fdisk -l

l’output che otterrete potrebbe essere simile a questo:

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System

/dev/hda1 1 243 1951866 82 Linux swap / Solaris
/dev/hda2 * 244 2675 19535040 83 Linux
/dev/hda3 2676 9729 56661255 83 Linux

Disk /dev/hdc: 80.0 GB, 80026361856 bytes
16 heads, 63 sectors/track, 155061 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot Start End Blocks Id System

ovviamente non vengono mostrate partizioni per il secondo disco in quanto non ce ne sono… Quindi creiamone una usando il comando fdisk:

fdisk /dev/hdc

dalla richiesta comandi di fdisk, premere “m” [Invio] per visualizzare la lista dei comandi disponibili…
Per creare una nuova partizione è sufficiente digitare “n” [Invio], fdisk vi chiederà il tipo di partizione da creare tra “e” (estended) e “p” (primary partition).
Io ho creato una primary partition, quindi “p” [Invio].

Verrà richiesto il numero della partizione da 1 a 4… nel nostro caso “1″ [Invio] andava benissimo.

Le richieste successive sono il cilindro di partenza e di fine della partizione… questo determina la dimensione della partizione ed il punto fisico di inizio della partizione stessa: se si vuole creare una partizione che sfrutti tutto lo spazio disponibile del disco, lasciare i parametri di default (nel mio caso 1 come primo cilindro e 155061 come ultimo cilindro) premendo [Invio] ad entrambe le richieste.

La partizione è creata… o meglio… fdisk non esegue nessuna operazione finché non gli viene detto di farlo!… infatti uscendo senza salvare le modifiche (“q” [Invio]) equivale a non aver fatto assolutamente nulla!!!.

Per confermare e generare la partizione (attenzione che questa operazione distruggerà qualsiasi dato fosse presente sul disco!!!) è sufficiente premere “w” [Invio].

Infatti eseguendo ancora fdisk -l, una volta completata l’operazione, la situazione per /dev/hdc sarà qualcosa tipo

Disk /dev/hdc: 80.0 GB, 80026361856 bytes
16 heads, 63 sectors/track, 155061 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot Start End Blocks Id System
/dev/hdc1 1 155061 78150712+ 83 Linux

Questo significa che la partizione è stata correttamente creata.
A questo punto, se non è già stata installata in precedenza, installiamo la tool per amministrare il RAID software: si chiama mdadm e con la ns Ubuntu è sufficiente un rapido

apt-get install mdadm

una volta installata siamo pronti per creare l’array di dischi che comporrà il nostro RAID.
Prima, però, vorrei fare un paio di precisazioni sui vari tipi di RAID:

  • RAID-linear: è una semplice concatenazione di partizioni che creano una più ampia partizione virtuale. È utile se si ha un certo numero di piccoli dischi e si vuole creare una unica, grande partizione. Questa concatenazione non offre ridondanza ed in effetti diminuisce l’affidabilità globale; la partizione così creata smetterà di funzionare non appena un solo disco si rovina.
  • RAID-0: è molto simile a RAID-linear, tranne per il fatto che le partizioni che lo compongono vengono divise in strisce e quindi suddivise. Come nel caso del RAID-linear il risultato è una singola partizione virtuale. Ancora come RAID-linear, RAID-0 non offre ridondanza diminuendo quindi l’affidabilità globale: il malfunzionamento di un solo disco mette fuori uso tutto. Spesso si crede che RAID-0 abbia prestazioni migliori rispetto a RAID-linear. Questo può essere o non essere vero, dipendendo dalle caratteristiche del file system, dalla grandezza più frequente dei file comparata con la dimensione delle strisce e dal tipo di carico a cui è sottoposto. Il file system ext2fs dispone i file in una partizione in modo da diminuire la frammentazione. Così, per semplicità, ogni dato accesso può essere indirizzato ad uno o più dischi e quindi la suddivisione delle strisce su più dischi non offre un vantaggio apparente. Comunque sia vi sono delle differenze nelle prestazioni, dipendenti dai dati, dal carico di lavoro e dalla dimensione delle strisce.
  • RAID-1RAID-1: è chiamato anche “mirroring”. Due (o più) partizioni, tutte della stessa grandezza, contengono ciascuna una copia degli stessi dati che risultano disposti nella stessa maniera sulle due partizioni (in inglese “disk-block by disk-block”. ndt). Il mirroring offre una forte protezione contro i malfunzionamenti dei dischi: se un disco si rompe se ne ha un altro con gli stessi dati. Il mirroring può anche migliorare le prestazioni in sistemi “I/O laden” (con grossi carichi di input-output. ndt) poiché le richieste di lettura possono essere divise su più dischi. Sfortunatamente il mirroring è il meno efficiente in materia di capacità di immagazzinamento: due partizioni in mirroring posso immagazzinare gli stessi dati di una.
  • RAID-2 e RAID-3: sono usati raramente, e sono stati in qualche maniera resi obsoleti dalla moderna tecnologia dei dischi. RAID-2 è simile a RAID-4, ma memorizza informazioni ECC al posto della parità. Poiché tutti i dischi moderni incorporano sotto sotto un controllo ECC, il vantaggio è minimo. RAID-2 può dare una maggiore coerenza ai dati se viene a mancare la corrente mentre è in corso un’operazione di scrittura; però un gruppo di continuità e uno shutdown pulito danno gli stessi vantaggi. RAID-3 è simile a RAID-4 tranne per il fatto che usa la minore grandezza possibile per le strisce. Il risultato è che ogni operazione di lettura interessa tutti i dischi, facendo diventare difficile/impossibile soddisfare richieste di I/O contemporanee. Per evitare il ritardo dovuto alla latenza rotazionale RAID-3 richiede che la rotazione di tutti i dischi possa essere sincronizzata. Molto hardware moderno non dispone della capacità di sincronizzazione o, se ne dispone, mancano i connettori necessari, i cavi e la documentazione di chi lo ha prodotto. Né RAID-2 né RAID-3 sono livelli RAID supportati dai driver di Software RAID per Linux.
  • RAID-4: suddivide in strisce come RAID-0, ma richiede una partizione aggiuntiva per memorizzare le informazioni sulla parità. La parità è usata per offrire ridondanza sui dati: se un disco si rovina i dati sui dischi rimanenti possono essere usati per ricostruire quelli che erano sul disco rotto. Dati N dischi di dati e un disco di parità, la striscia di parità è computata prendendo una striscia da ognuno dei dischi di dati ed effettuando un XOR tra di esse. Quindi la capacità di memorizzazione di una serie di (N+1) dischi RAID-4 è N, molto meglio del mirroring di (N+1) dischi e buona come un setup RAID-0, per N grande. Da notare che per N=1 vi è un disco di dati e un disco di parità e RAID-4 somiglia molto al mirroring, nel quale ognuno dei due dischi è la copia dell’altro. RAID-4 NON offre le prestazioni in lettura/scrittura del mirroring ed anzi la sua performance in scrittura è considerevolmente peggiore. In breve questo accade a causa del fatto che l’aggiornamento della parità richiede la lettura della vecchia parità prima che la nuova parità venga calcolata e scritta. In ambienti con un grosso carico di scrittura il disco di parità può diventare un collo di bottiglia poiché ogni processo di scrittura deve accedere al disco di parità.
  • RAID-5RAID-5: evita il collo di bottiglia in scrittura di RAID-4 memorizzando la striscia di parità su ognuno dei dischi. Ovviamente la prestazione in scrittura non è ancora buona come quella del mirroring, visto che la striscia di parità deve anche qui essere letta e deve esservi effettuato lo XOR prima che sia scritta. Anche la prestazione in lettura non è buona come quella del mirroring poiché, dopo tutto, vi è una sola copia dei dati e non due o più. Il vantaggio principale di RAID-5 sul mirroring è che offre ridondanza e protezione nel caso di malfunzionamento di un solo disco, e allo stesso tempo ha una capacità di memorizzazione molto più alta quando è usato con tre o più drive.

Fonte: http://www.pluto.it/

Per creare il RAID (nel nostro caso RAID-linear) è sufficiente lanciare il comando

mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/hda3 /dev/hdc1

Tradotto: crea un raid di livello “linear” (–level=linear) che verrà assegnato alla device virtuale /dev/md0, sarà composto da 2 devices (–raid-devices=2) che nel dettaglio sono /dev/hda3 (la terza partizione del primo disco) e /dev/hdc1 (la prima partizione, nonché l’unica, del secondo disco).

Nota: per devices non si intendono solo device fisiche come dischi o unità esterne, ma anche singole partizioni come nel caso della nostra /dev/hda3.

Confermate la creazione dell’array con un bel “yes” [Invio] e la conferma dovrebbe essere un messaggio simile a

mdadm: array /dev/md0 started.

Ecco che eseguendo

fdisk -l

l’output si arricchisce di queste nuove voci:

Disk /dev/md0: 138.0 GB, 138047258624 bytes
2 heads, 4 sectors/track, 33702944 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

Disk /dev/md0 doesn't contain a valid partition table

L’ultima riga ha ragione di esistere in quanto, in effetti, abbiamo “appeso” una partizione Linux Ext3 ad una partizione definita ma mai formattata. A questo punto eseguiamo la formattazione del disco da 138GB risultato dell’unione RAID-linear:

mkfs.ext3 /dev/md0

Ovviamente il contenuto delle due partizione verrà cancellato… quindi occhio sempre a ciò che fate!!!

Una volta completata la formattazione sufficiente un

mount /dev/md0 /home

per far si che la device virtuale fruto del RAID-linear venga usata per la /home. In questo sarà necessario anche rigenerare gli utenti per la definizione delle directory personali… ma non è questo l’argomento… anche perché potevamo montare la partizione come /media/partizione_raid che sarebbe stata la stessa cosa…

Se in più vogliamo che la partizione RAID venga montata in automatico all’avvio del PC, basta editare il file fstab

vim /etc/fstab

e modificare la riga che monta la partizione /dev/hda3 su /home sostituendo /dev/hda3 con /dev/md0, salvate e riavviate e il gioco è fatto!!!

Se volete “eliminare il RAID appena creato (premesso che non devono esistere dati in “comune” alle due partizioni, è sufficiente smontare la device con

umount /home

ed eliminare l’array con

mdadm -S /dev/md0

e le 2 partizioni tornano ad essere “usabili” singolarmente.

Gli inconvenienti:
Innanzi tutto mettiamo in chiaro che i RAID-linear e RAID-0 non hanno nessun livello di sicurezza… se uno dei due dischi si danneggia tutti i dati del RAID vengono persi (mentre i RAID dall’1 in su sono strutturati non per “appendere” dischi e quindi aumentare le capacità di storage, ma proprio per assicurare e mantenere i dati!)

Secondariamente, per come sono strutturato ora, usare il RAID-linear per gestire la /home è un problema: significa backuppare tutti i dati, ripristinare tutti gli utenti, reimpostare directory e files… Mi converrà probabilmente rivedere le politiche dei backup, create una specifica partizione esclusivamente dedicata al backup senza andare ad intaccare la /home e prevedere l’uso di un RAID-1 (quindi acquistando 2 dischi identici e mettendoli in mirroring).

Resta il fatto che, con pochi passaggi, è possibile creare strutture RAID software sia base (linear e RAID-0) che complesse e in tutta sicurezza. Per quanto riguarda le prestazioni, questo dipende sempre dai tipi di dischi in uso, la quantità di dati, il controller, etc… con i dischi IDE è facile/probabile avere qualche calo di prestazione, l’ideale sono sempre i dischi SCSI… ma per piccole realtà o per un RAID “casalingo” un RAID software con unità IDE va più che bene!

Approfondimenti ed altre tecniche per il RAID software con Linux:

Buon RAID a tutti!
:D

—————-
Now playing on Last.fm: Genesis – Turn It on Again

2 Risposte

  1. Mi sembrava giusto lasciare un commento, visto che questo articolo mi tornerà senz’altro utile, prima o poi!

    Premettendo che conosco già a livello teorico il funzionamento di una catena RAID nelle diverse configurazioni, mi chiedevo: se voglio creare un RAID-1 con mdadm, avendo già il sistema installato su una prima unità, basta aggiungere una seconda unità e creare l’array? mdadm dovrebbe pensare a tutto, creando il mirror sull’unità aggiunta…o no?

    Probabilmente ci sarà scritto tutto sulla documentazione che andrò a leggermi, comunque…

    Grazie, intanto!

  2. Ciao Fabrizio,

    per ora ho fatto prove reali solo con il livello “Linear”, non ho ancora avuto il tempo di allestire una macchinetta per testare le altre modalità.

    Nelle prove che ho fatto io, però, non mi è stato sufficiente creare l’array, ho dovuto sempre e comunque riformattare la partizione virtuale.

    Se/quando avrò il tempo di testare anche altri tipi di RAID, ti farò sapere.

    ;)

Lascia un commento