Allo scopo di incrementare l’affidabilità della memoria di massa, che costituisce l’archivio delle informazioni del sistema, possono essere utilizzate varie tecniche che generalmente vanno sotto il nome di RAID (Redundant Array of Independent Disks)41. Le tecniche si basano sull’utilizzo di due o più dischi in modo tale che se uno dei dispositivi si guasta, le informazioni sono comunque reperibili dagli altri. Il sistema operativo “vede” un’unica unità logica composta da più unità fisiche.
Esistono vari livelli di RAID, illustrati di seguito, di cui i più utilizzati sono lo 0, l’1, il 3 ed il 5.
Si tratta della concatenazione delle partizioni dei dischi allo scopo di formare un disco “virtuale” più grande. Tale sistema non aumenta affatto l’affidabilità della memoria di massa, ma la riduce, in quanto se uno dei dischi si guasta, l’intero disco virtuale non sarà utilizzabile.
I blocchi di informazioni vengono suddivisi in parti più piccole (stripe) ed ognuna di esse è scritta (possibilmente) su un disco diverso (v. fig. 4.12). In questo modo le prestazioni di lettura e scrittura delle informazioni vengono notevolmente incrementate rispetto all’utilizzo normale dei dischi, in quanto, se il canale lo permette, è possibile leggere/scrivere le informazioni contemporaneamente dai/sui dischi (le migliori prestazioni si ottengono infatti quando le informazioni sono memorizzate su più dischi, accessibili in parallelo). Analogamente a quanto avviene per il RAID linear, il risultato è quello di avere un disco virtuale composto dall’insieme dei dischi fisici utilizzati.
Per questo tipo di tecnica sono richieste almeno 2 unità a disco.
Può aumentare le prestazioni rispetto ad un singolo disco, ma non garantisce una maggiore affidabilità, poiché il guasto di un disco implica il non funzionamento dell’intero insieme di dischi.
Il duplexing (meno comune rispetto al mirroring) assicura la ridondanza anche del controller, non soltanto dei dischi.
Per questo tipo di tecnica sono richieste almeno 2 unità a disco.
Il guasto di un disco non implica il non funzionamento dell’intero insieme di dischi (fault tolerance). In tal caso, la fase di ripristino dell’insieme di dischi consiste nella copia delle informazioni contenute nel disco di mirror43 (copia speculare) di quello guasto. Con più di due unità a disco, se si guastano più dischi contemporaneamente è probabile che si riesca comunque a non perdere le informazioni memorizzate sull’insieme dei dischi (questo è vero finché non si guastano due dischi in mirror tra loro).
È utile per macchine che necessitano essenzialmente di un sistema fault tolerance ma non di prestazioni elevate.
L’insieme dei dischi è suddiviso in due sottoinsiemi: uno destinato a contenere le informazioni (data disk) e l’altro a contenere i codici di controllo per la correzione degli errori (Hamming code) calcolati a partire dalle informazioni stesse (ECC disk). Tale codice effettua il controllo sugli eventuali errori nella memorizzazione delle informazioni e permette la correzione dell’errore stesso on-the-fly. Le informazioni vengono scomposte a livello di ogni singolo bit e memorizzate su più dischi (dia i dati che gli ECC), come una sorta di striping.
La fase di scrittura ha l’overhead del calcolo del codice di controllo ECC.
Il guasto di un disco non implica il non funzionamento dell’intero insieme di dischi.
Non viene praticamente mai implementato per prolemi di costi e dell’elevata complessità dell’hardware che lo dovrebbe supportare (si parla di un minimo di 10 dischi di dati e 4 di ECC).
L’insieme dei dischi è suddiviso in due sottoinsiemi: uno destinato a contenere le informazioni (data disk) e l’altro a contenere i codici di parità (parity code) per la correzione degli errori calcolati a partire dalle informazioni stesse (parity disk). Tale codice effettua il controllo sugli eventuali errori nella memorizzazione delle informazioni e permette la correzione dell’errore stesso on-the-fly. Le informazioni sono memorizzate nei data disk utilizzando la tecnica dello striping a livello di byte, con stripe di dimensione generalmente inferiore a 1024 byte (v. fig. 4.15).
Per questo tipo di tecnica sono richieste almeno 3 unità a disco.
La fase di scrittura ha l’overhead del calcolo del codice di parità ed il fatto che la scrittura sul parity disk deve avvenire per ogni scrittura su uno degli altri dischi (il parity disk è il collo di bottiglia).
Il guasto di un disco non implica il non funzionamento dell’intero insieme di dischi (nemmeno se si guasta il parity disk).
L’insieme dei dischi è suddiviso in due sottoinsiemi: uno destinato a contenere le informazioni (data disk) e l’altro a contenere i codici di parità (parity code) per la correzione degli errori calcolati a partire dalle informazioni stesse (parity disk). Tale codice effettua il controllo sugli eventuali errori nella memorizzazione delle informazioni e permette la correzione dell’errore stesso on-the-fly. Le informazioni sono memorizzate nei data disk utilizzando la tecnica dello striping a livello di blocco di dati, che produce un incremento delle prestazioni rispetto allo striping a livello di byte (v. fig. 4.16).
Per questo tipo di tecnica sono richieste almeno 3 unità a disco.
Il guasto di un disco non implica il non funzionamento dell’intero insieme di dischi, anche se il ripristino delle informazioni è piuttosto complesso.
Per ogni informazione che deve essere memorizzata sui dischi viene calcolato il relativo codice di parità (parity code) per la correzione degli errori. Le informazioni ed i codici di parità sono memorizzati sui dischi utilizzando la tecnica dello striping a livello di blocco di dati, senza l’ausilio di uno specifico parity disk (v. fig. 4.17).
Per questo tipo di tecnica sono richieste almeno 3 unità a disco.
In questo modo si evita il collo di bottiglia rappresentato dal parity disk (v. RAID 4), in quanto i codici di parità sono distribuiti sui data disk stessi.
Il guasto di un disco non implica il non funzionamento dell’intero insieme di dischi, anche se il ripristino delle informazioni è piuttosto complesso.
Si tratta essenzialmente di un’estensione del RAID 5 al quale viene aggiunto un secondo sistema per la generazione di codici di parità per la correzione degli errori (two-dimensional parity), per migliorare la fault tolerance. Le informazioni vengono memorizzate nello stesso modo del RAID 5 (v. fig. 4.18).
Le prestazioni in scrittura sono leggermente inferiori rispetto al RAID 5 per il calcolo del doppio codice di parità, ma possono risultare leggermente migliori rispetto al RAID 5 per il maggiore sparpagliamento di quest’ultime.
Il guasto di uno o due dischi (contemporaneamente) non implica la perdita delle informazioni memorizzate sull’insieme dei dischi, anche se il ripristino delle informazioni è piuttosto complesso.
È ottimo per applicazioni di tipo mission critical44.
Detto anche RAID 1+0, si tratta di due insiemi di dischi, su uno dei quali viene applicata la tecnica RAID 1. Sui due insiemi di dischi viene invece applicata la tecnica RAID 0 (v. fig. 4.19).
Ha lo stesso tipo di fault tolerance del RAID 1 ed il suo stesso overhead.
Il RAID 0 (striping) fra i gruppi di dischi permette di aumentarne le prestazioni.
In particolari situazioni le informazioni memorizzate non sono perdute anche nel caso di guasti su più dischi contemporaneamente.
Si tratta di due insiemi di dischi, su uno dei quali viene applicata la tecnica RAID 0. Sui due insiemi di dischi viene invece applicata la tecnica RAID 1 (v. fig. 4.20).
Ha lo stesso tipo di fault tolerance del RAID 5 e l’overhead del RAID 1 (mirroring).
Anche detto RAID 0+3, o RAID 53. Si tratta di un insieme di dischi suddivisi in gruppi ad ognuno dei quali viene applicata la tecnica RAID 0. Tra i gruppi viene invece applicata la tecnica RAID 3 (v. fig. 4.21).
Ha caratteristiche simili a quelle del RAID 0+5.
Anche detto RAID 3+0, si tratta di un insieme di dischi suddivisi in gruppi ad ognuno dei quali viene applicata la tecnica RAID 3. Tra i gruppi viene invece applicata la tecnica RAID 0 (v. fig. 4.22).
Ha caratteristiche simili a quelle del RAID 5+0.
Anche detto RAID 0+5, si tratta di un insieme di dischi suddivisi in gruppi ad ognuno dei quali viene applicata la tecnica RAID 0. Tra i gruppi viene invece applicata la tecnica RAID 5 (v. fig. 4.23).
Ha caratteristiche simili a quelle del RAID 03.
Anche detto RAID 5+0, si tratta di un insieme di dischi suddivisi in gruppi ad ognuno dei quali viene applicata la tecnica RAID 5. Tra i gruppi viene invece applicata la tecnica RAID 0 (v. fig. 4.24).
Ha caratteristiche simili a quelle del RAID 30.
Detto anche RAID 15, è analogo al RAID 10 ma con il calcolo di parità (v. fig. 4.25).
È un sistema molto costoso e complesso.
Detto anche RAID 51, è analogo al RAID 01 ma con il fatto che i gruppi di dischi sono in RAID 5 anziché in RAID 0 (v. fig. 4.26).
È un sistema molto costoso e complesso.
È opportuno notare che la gestione RAID è indipendente dal filesystem utilizzato per la memorizzazione delle informazioni sulle partizioni dei dischi fisici che lo compongono.
[da completare ...]
Nei sistemi GNU/Linux, il RAID può essere di tipo hardware o software. Il RAID hardware affida la gestione della tecnica di memorizzazione ad uno specifico controller (hardware), che presenta al sistema operativo un unico disco composto dall’insieme dei dischi in RAID. Il RAID software è la gestione di più unità a dischi secondo la tecnica RAID, effettuata dal sistema operativo, senza la necessità di controller dedicati. Vista l’elevata velocità dei processori attuali, il RAID software è una valida alternativa economica ai sistemi RAID hardware. Il sistema operativo non conosce e non deve conoscere da cosa sia costituito il disco che vede, ma si limita a gestirlo come fosse un’unica unità a dischi, che nel caso di RAID software viene generalmente riferita come md device (md sta per multiple device).
GNU/Linux è in grado di gestire a livello software il RAID 0, il RAID 1, il RAID 4 ed il RAID 5. Inoltre, poiché le unità a disco gestite in RAID sono “viste” dal sistema come un’unità logica a blocchi (come un disco), è possibile utilizzare la tecnica RAID sui dischi già gestiti in RAID per ottenere le varie tecniche combinate come il RAID 10.
Oltre alle modalità RAID sopra elencate, è possibile gestire i dischi in una modalità detta linear mode, per mezzo della quale è possibile far “vedere” al sistema più dischi fisici come una sola unità logica, facendoglieli utilizzare in maniera sequenziale: le informazioni verranno scritte sul secondo disco quando il primo sarà stato riempito, poi sarà la volta del terzo, e così via. L’unico vantaggio è rappresentato dal fatto che se più utenti accedono alle informazioni presenti sui dischi gestiti in questo modo, si può avere un leggero incremento delle prestazioni nel caso in cui le informazioni accedute dagli utenti si trovino fisicamente su dischi diversi.
GNU/Linux introduce anche il concetto di spare disk. Uno spare disk è un disco che viene associato all’unità RAID, ma non è destinato a contenere le informazioni. Questo viene usato soltanto nel caso in cui il sistema rileva che uno degli altri dischi non funziona più e quindi lo spare disk viene utilizzato automaticamente per ricostruire le informazioni presenti sul disco non più funzionante. In questo modo, il RAID software può ripristinare una situazione di rottura di un disco.
Per riconoscere se il sistema è in grado di supportare la gestione del RAID software, è sufficiente controllare se esiste il file /proc/mdstat. Esso contiene le informazioni relative alla gestione dei dischi in RAID, come riportato di seguito.
Personalities : read_ahead not set unused devices: <none>
La gestione dei dispositivi RAID è possibile in GNU/Linux tramite i pacchetti raidtools (mkraid, raidstart, raidstop, lsraid, ...) e mdadm (mdadd, mdrun, mdstop, ...). I comandi del pacchetto raidtools, presuppongono che le impostazioni relative alla gestione RAID siano contenute nel file /etc/raidtab. Ogni riga del file contiene una specifica direttiva, tra quelle possibili, riportate di seguito.
raiddev /dev/md0 raid-level 0 nr-raid-disks 2 persistent-superblock 0 chunk-size 8 device /dev/hda1 raid-disk 0 device /dev/hdb1 raid-disk 1 raiddev /dev/md1 raid-level 5 nr-raid-disks 3 nr-spare-disks 1 persistent-superblock 1 parity-algorithm left-symmetric device /dev/sda1 raid-disk 0 device /dev/sdb1 raid-disk 1 device /dev/sdc1 raid-disk 2 device /dev/sdd1 spare-disk 0
____________________________________________________________________
Comando: mkraid
Path: /sbin/mkraid
SINTASSI
# mkraid [option] [device]
DESCRIZIONE
Ad esempio, il comando
# mkraid /dev/md0
inizializza il dispositivo /dev/md0 ad essere gestito in RAID. L’effettivo riconoscimento del
dispositivo può essere verificato visualizando il contenuto del file /proc/mdstat. A questo
punto tale dispositivo può essere montato, incluso nel file /etc/fstab, utilizzato,
...
Il comando raidstart (man page raidstart(8)) attiva la gestione del RAID software su di una unità.
____________________________________________________________________
Comando: raidstart
Path: /sbin/raidstart
SINTASSI
# raidstart [option] [device]
DESCRIZIONE
Ad esempio, il comando
# raidstart /dev/md1
attiva la gestione per l’unità RAID /dev/md1.
Il comando raidstop (man page raidstop(8)) disattiva la gestione del RAID software su di una unità.
__________________________________________________________________________________________________________
Comando: raidstop
Path: /sbin/raidstop
SINTASSI
# raidstop [option] [device]
DESCRIZIONE
Ad esempio, il comando
# raidstart /dev/md2
disattiva la gestione per l’unità RAID /dev/md2.
Il comando raid0run (man page raid0run(8)) attiva la gestione del RAID 0 e linear mode su di una unità e senza superblock. Questo è un comando obsoleto.
Il comando raidreconf (man page raidreconf(8)) permette di riconfigurare i dischi gestiti in RAID seguendo le direttive contenute in un file di configurazione creato dall’utente con indicazioni analoghe a quelle conetnute in /etc/raidtab.
__________________________________________________________________________________________________________
Comando: raidreconf
Path: /sbin/raidreconf
SINTASSI
# raidreconf [option]
DESCRIZIONE
Ad esempio, il comando
# raidreconf -o /etc/raidtab -n /etc/newraidtab -m /dev/md0
riconfigura il RAID /dev/md0 configurato correntemente come specificato in
/etc/raidtab, secondo quanto specificato in /etc/newraidtab, cercando di mantenere
intatte le informazioni già memorizzate sul RAID.
Il comando lsraid (man page lsraid(8)) può essere utilizzato per ottenere informazioni sui dispositivi RAID attivi o meno.
__________________________________________________________________________________________________________
Comando: lsraid
Path: /sbin/lsraid
SINTASSI
# lsraid [option] [device]
DESCRIZIONE
Ad esempio, il comando
# lsraid -A -a /dev/md0
visualizza l’elenco dei dispositivi fisici relativi al RAID /dev/md0. Il comando
# lsraid -A -d /dev/sda1
visualizza il RAID a cui appartiene il disco fisico /dev/sda1. Il comando
# lsraid -A -f -a /dev/md0
visualizza i dispositivi fisici appartenenti al RAID /dev/md0 sui quali è stato rilevato un
problema. Il comando
# lsraid -D -l -a /dev/md0
visualizza il superblock di ognuno dei dischi fisici che appartengono al RAID
/dev/md0.
Parallelamente al pacchetto raidtools può essere utilizzato il pacchetto mdadm che basa il suo funzionamento sul file di configurazione /etc/mdtab (corrispondente al file /etc/raidtab del pacchetto raidtools) che contiene righe con la seguente sintassi
md_dev mode,[c],[f ],[crc32] dev1 dev2 ...
dove
____________________________________________________________________
Comando: mdadd
Path: /sbin/mdadd
SINTASSI
# mdadd [option] [md_device] [real_device ...]
DESCRIZIONE
... esempio ...
__________________________________________________________________________________________________________
Comando: mdcreate
Path: /sbin/mdcreate
SINTASSI
# mdcreate [option] personality md_device real_device ...
DESCRIZIONE
... esempio ...
Il comando mdrun (man page mdrun(???)) avvia la gestione delle unità RAID.
__________________________________________________________________________________________________________
Comando: mdrun
Path: ???/mdrun
SINTASSI
# mdrun [option] [md_device]
DESCRIZIONE
![]()
|
[da completare ...] (inserire esempio)
Il comando mdstop (man page mdstop(8)) disabilita la gestione delle unità RAID.
__________________________________________________________________________________________________________
Comando: mdstop
Path: ???/mdstop
SINTASSI
# mdstop [option] [md_device]
DESCRIZIONE
[da completare ...] (inserire esempio)
Il comando mdop (man page mdop(8)) abilita o disabilita un disco fisico alla gestione RAID 1.
__________________________________________________________________________________________________________
SINTASSI
# mdop [option] [md_device] [real_device]
DESCRIZIONE
[da completare ...]