[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]
Le unità a disco sono componenti meccanici sottoposti a usura e soggetti a deterioramento. Questo fatto si comprende subito per ciò che riguarda i dischi rimovibili (compresi i CD) e di solito ci si organizza con più copie della stessa cosa se si tratta di dati importanti, ma per i dischi fissi il problema è diverso.
In generale è necessario premunirsi dalle perdite di dati dovute alla rottura di un disco fisso con delle copie di sicurezza, da eseguire periodicamente; tuttavia, anche predisponendo una procedura efficace per le copie di sicurezza, l'impegno necessario per il ripristino del funzionamento del proprio elaboratore è sempre rilevante.
Dal momento che la frequenza con cui si verifica una rottura di un disco fisso è maggiore rispetto ad altri eventi che possono procurare la perdita dei dati (per esempio il furto, l'atto vandalico, l'incendio, l'allagamento, il terremoto, ecc.), vale la pena di attenuare l'effetto di questo tipo di problema con la realizzazione di un insieme di dischi ridondante, noto normalmente con la sigla «RAID».
La sigla RAID sta per Redundancy array of inexpensive disks e rappresenta quindi un insieme di tecniche per mettere assieme dei dischi aggiungendo qualche forma di ridondanza. Si distinguono diversi livelli, alcuni dei quali sono descritti brevemente nell'elenco seguente.
| Livello RAID | Descrizione |
| RAID-0 | Il livello zero dei sistemi RAID è privo di ridondanza e si occupa soltanto di unire assieme più dischi, all'interno dei quali i dati vengono suddivisi equamente, in modo da bilanciare anche il carico di operazioni di lettura e scrittura che li riguardano. In pratica, il livello zero consente di realizzare un disco virtuale di grandi dimensioni, più efficiente, ma la rottura di uno dei dischi porta alla perdita di tutti i dati. RAID-0 è noto anche con la definizione block striping. |
| RAID-1 | Il livello uno dei sistemi RAID si occupa di unire assieme due o più dischi (ma di solito sono solo due) che si trovano a riprodurre fedelmente tutti la stessa cosa. In questo caso, la rottura di un disco non pregiudica l'utilizzo dei dati che sono disponibili nel disco o nei dischi rimanenti. RAID-1 è noto anche con la definizione disk mirroring. |
| RAID-3 | Il livello tre dei sistemi RAID si occupa di unire assieme più dischi, all'interno dei quali i dati vengono suddivisi equamente, in modo da bilanciare anche il carico di operazioni di lettura e scrittura che li riguardano, dedicando uno di questi dischi al contenimento di un sistema di codici di controllo che permettono di ricostruire i dati nel caso uno degli altri dischi si rompa. In pratica, il livello tre crea una forma di ridondanza, ma meno affidabile del livello uno. Naturalmente, per attuare un livello tre servono almeno tre dischi. |
| RAID-4 | Il livello quattro dei sistemi RAID è simile al livello tre, con la differenza che vengono distribuiti in modo differente (più efficiente) tra i dischi, ma rimane compito di un disco separato il sistema di codici di controllo che permette la ricostruzione dei dati. |
| RAID-5 | Il livello cinque dei sistemi RAID equivale al livello quattro, dove però le informazioni che servono per la ricostruzione dei dati sono distribuite tra i dischi, senza essere così concentrate in uno soltanto. In questo modo si aumenta l'efficienza, in termini di tempi di accesso ai dati. |
I livelli RAID possono essere anche combinati assieme; per esempio è possibile realizzare due insiemi di dischi RAID-0, che si associano a loro volta in un insieme RAID-1, in modo da non perdere i dati nel caso uno dei dischi smetta di funzionare. In questo caso si parla anche di RAID-10
La realizzazione di un insieme di dischi secondo uno dei vari livelli RAID può essere ottenuta attraverso sistemi hardware, oppure software. Nel primo caso si tratta di unità di controllo che gestiscono tutto autonomamente, facendo sì che il sistema operativo veda in pratica un disco normale; nel secondo caso, è il sistema operativo che associa i dischi e li gestisce usando una forma di ridondanza.
Come si può comprendere, le unità di controllo RAID sono più costose di quelle normali; tuttavia, se non si creano altri tipi di problemi, hanno il vantaggio di non creare difficoltà al sistema operativo.
Con i sistemi GNU/Linux, disponendo di un kernel 2.4.* o superiore, è relativamente agevole la creazione di un insieme di dischi RAID senza l'ausilio di unità di controllo specializzate. In questa sezione si descrive brevemente la realizzazione di un sistema composto da due dischi che riproducono esattamente gli stessi dati, ovvero un sistema RAID-1, utilizzando semplicemente dischi ATA (cosa che in generale rappresenta la situazione più semplice da affrontare per chiunque).
Se la propria distribuzione GNU/Linux offre una procedura di installazione che prevede anche la gestione di un sistema RAID-1 software, dovrebbe essere sufficiente disporre dei due dischi perché tutto venga predisposto senza interventi particolari; tuttavia, qui si vuole mostrare un procedimento più brutale, che si affronta normalmente quando si vuole travasare un sistema GNU/Linux preesistente in un insieme di dischi RAID-1. In pratica, si fa affidamento sul fatto che sia disponibile un terzo disco, contenente il sistema GNU/Linux da trasferire, che successivamente si intende rimuovere dall'elaboratore, oppure destinare ad altri scopi. Naturalmente è necessario organizzarsi in modo da poter avviare questo sistema transitorio anche quando lo si sposta in un'altra unità di controllo o comunque in un'altra posizione del bus ATA.
Per poter avviare un sistema GNU/Linux che utilizza un insieme di dischi RAID (gestiti via software), è indispensabile che il kernel includa tutte le funzionalità necessarie, senza avvalersi per questo di moduli. Se possibile, è meglio includere tutte le funzionalità associate ai livelli RAID della voce {Multi-device support (RAID and LVM)}. Se non è possibile includere tutte le funzionalità corrispondenti, occorre selezionare almeno {RAID support} e {RAID-1 (mirroring) mode} (dal momento che si vuole realizzare un sistema RAID-1).
Se il kernel che si utilizza è predisposto per la gestione di dischi RAID, appare il file virtuale /proc/mdstat, dal quale, successivamente, si possono ottenere le informazioni sull'attività del sistema RAID. Tanto per cominciare si può vedere quali livelli RAID sarebbero disponibili:
$ cat /proc/mdstat[Invio]
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] ... |
Dall'esempio si comprende che RAID-1 è disponibile (insieme anche ad altri livelli RAID).
Disponendo di due dischi ATA, meglio se identici, è necessario decidere come collegarli all'elaboratore. Dal momento che di solito i bus ATA sono due, è meglio mettere ogni disco su un bus differente, in modo da distribuire meglio il carico di lavoro e per prevenire anche le rotture dovute a uno dei due bus ATA.
Il passo successivo è decidere la suddivisione in partizioni, in modo tale da soddisfare anche le esigenze che potrebbero porsi in un secondo momento. Infatti, se si realizza un sistema RAID, lo si fa presumibilmente per mantenere intatta la situazione nel tempo. Probabilmente, nelle situazioni più semplici è sufficiente predisporre tre partizioni: una per i file necessari all'avvio (kernel incluso), una per la memoria virtuale e la terza per tutto il resto.
|
È possibile inserire i file necessari all'avvio del sistema operativo anche in una partizione gestita attraverso un sistema RAID, ma in generale è una cosa sconsigliabile e comunque non esiste una reale necessità di agire in questo modo, se ci si organizza correttamente. |
Con il sistema GNU/Linux attualmente in funzione (quello che poi deve essere travasato), si procede alla suddivisione in partizioni. Seguendo l'ipotesi che è stata formulata si dividono entrambi i dischi in modo da avere una piccola partizione (da 10 Mibyte in su) di tipo 8316 (Linux-nativa), una partizione di tipo 8216 (Linux-swap) e una partizione di tipo FD16. Il tipo FD16 (autorilevamento RAID) dichiara esplicitamente che si tratta di una partizione usata per la realizzazione di sistemi RAID e permette al kernel di attivarla prima di montare il file system principale.
Teoricamente sarebbe possibile utilizzare in modo speculare anche le partizioni per la memoria virtuale; in pratica questo non conviene e l'intenzione, qui, è solo quella di utilizzarle in modo da sommare la loro capacità.
Una volta predisposte le partizioni, facendo in modo che siano il più possibile uguali, si può procedere a una prima inizializzazione che in pratica attiva la funzionalità RAID-1, ma per questo è necessario predisporre un file di configurazione: /etc/raidtab.
Il file di configurazione /etc/raidtab serve ai programmi che si occupano di attivare la funzionalità RAID; pertanto va creato nel sistema operativo che si utilizza temporaneamente, poi va copiato anche nel sistema che finalmente utilizza la coppia di dischi RAID.
Per rendere l'esempio a cui si fa riferimento più realistico, si suppone di avere collocato un disco nella prima posizione del primo bus ATA e l'altro nella prima posizione del secondo. Pertanto, le partizioni potrebbero essere organizzate così:
La partizione virtuale RAID-1 viene associata a un file di dispositivo differente, secondo il modello /dev/mdn, dove il numero n dipende dalla configurazione del file /etc/raidtab. Si ritiene qui che sia più conveniente utilizzare lo stesso numero che individua la partizione nel disco, in modo da non creare confusione; pertanto si intende creare il partizione RAID /dev/md3:
|
|
Nell'esempio viene mostrata la direttiva chunk-size commentata. In generale non c'è bisogno di questa direttiva per la realizzazione di un RAID-1, ma alcune vecchie versioni di mkraid la pretendono. |
Quello che si vede nell'esempio è il contenuto del file /etc/raidtab necessario per procedere. A questo punto si può attivare la partizione RAID:
# mkraid /dev/md3[Invio]
Il programma mkraid fa parte del pacchetto Raidtools. (1)
Se non ci sono errori nella configurazione la partizione RAID-1 viene attivata quasi subito, ma inizia una scansione che serve ad allineare le due partizioni (in pratica si può vedere che i dischi sono attivi in modo costante per lungo tempo). Durante questa fase, è già possibile procedere a inizializzare la partizione RAID-1 con il tipo di file system che si preferisce; in questo caso si sceglie il tipo Ext3:
# mkfs.ext3 /dev/md3[Invio]
Terminata l'inizializzazione si può montare la partizione e procedere con la copia del sistema attivo (o di un altro se necessario). Si suppone di volere montare la partizione nella directory /mnt/ e di procedere con la copia di conseguenza:
# mount -t ext3 /dev/md3 /mnt[Invio]
# cd /[Invio]
# cp -dpRv /bin /mnt[Invio]
# cp -dpRv /etc /mnt[Invio]
# cp -dpRv /home /mnt[Invio]
# cp -dpRv /lib /mnt[Invio]
# cp -dpRv /root /mnt[Invio]
# cp -dpRv /sbin /mnt[Invio]
# cp -dpRv /usr /mnt[Invio]
# cp -dpRv /var /mnt[Invio]
# mkdir /mnt/boot[Invio]
# mkdir /mnt/dev[Invio]
# mkdir /mnt/mnt[Invio]
# mkdir /mnt/proc[Invio]
# mkdir /mnt/tmp[Invio]
# chmod 1777 /mnt/tmp[Invio]
Questa sequenza di operazioni fa riferimento a un sistema GNU/Linux generico e non tiene conto delle particolarità che ha ogni singola distribuzione; pertanto va adattato alla propria realtà.
Fatta la copia, è necessario modificare immediatamente il file etc/fstab della partizione montata nella directory /mnt/ (pertanto si tratta temporaneamente del file /mnt/etc/fstab), in modo da fare riferimento correttamente al file di dispositivo /dev/md3 per il file system principale; mentre il file /etc/raidtab dovrebbe essere stato copiato correttamente. In base all'esempio a cui si sta facendo riferimento, il file etc/fstab che si va a predisporre dovrebbe contenere le righe seguenti:
|
Come si può osservare, la partizione corrispondente al file di dispositivo /dev/hdc1 viene montata per comodità nella directory /boot-mirror/, in modo da rammentare all'amministratore del sistema operativo che deve occuparsi di mantenere il suo contenuto allineato a quello della partizione montata invece nella directory /boot/.
Il problema di cui ci si deve occupare prima di arrestare il sistema operativo è delle partizioni usate per l'avvio: /dev/hda1 e /dev/hdc1, secondo gli esempi mostrati. La cosa più semplice da fare è copiare il contenuto della directory /boot/ attuale in quella nelle due partizioni (che pertanto vanno montate da qualche parte anche durante la fase di installazione). Quello che segue è un esempio di come potrebbe essere organizzato il file /boot/grub/menu.lst di GRUB nella partizione /dev/hda1:
|
Per converso, nella partizione /dev/hdc1 il file dovrebbe essere così:
|
Si osservi che il kernel appare indicato in (hd0,0)/vmlinuz, oppure (hd2,0)/vmlinuz, ovvero nella prima partizione del primo o del terzo disco fisso con il nome vmlinuz.
Dal momento che in pratica non si può avviare il sistema operativo in mancanza del primo disco fisso, ci si può limitare a copiare il contenuto della partizione /dev/hda1 nella partizione /dev/hdc1, contando sul fatto che in caso di rottura del primo disco fisso si può avviare il sistema utilizzando un dischetto che contiene GRUB. Pertanto, dopo avere smontato queste partizioni, si può procedere a installare il sistema di avvio nel primo disco:
# grub[Invio]
grub> root (hd0,0)[Invio]
grub> setup (hd0)[Invio]
grub> quit[Invio]
Eventualmente si può consultare il capitolo 27 a proposito di GRUB.
Prima di riavviare il sistema operativo per vedere se funziona effettivamente, conviene controllare che l'attività di sincronizzazione delle due partizioni sia stata completata, osservando il file /proc/mdstat:
# cat /proc/mdstat[Invio]
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] read_ahead 1024 sectors md3 : active raid1 ide/host0/bus1/target0/lun0/part3[1] \ |
L'esempio mostra una situazione di riposo.
Quando si verifica l'evento che si teme, ovvero che uno dei due dischi risulti difettoso, teoricamente il sistema RAID dovrebbe continuare a funzionare escludendo quel disco. Una volta appurato questo fatto, occorre provvedere alla sua sostituzione. Se non ci sono altre conseguenze, ovvero se il danno è limitato a questo, la cosa spiacevole che può capitare è che si rompa proprio il disco usato per l'avvio del sistema operativo, cosa che richiede temporaneamente l'utilizzo di un dischetto con GRUB o con un altro sistema di avvio del genere per rimettere in funzione il sistema operativo. È bene comunque non spostare il disco sano in una posizione diversa del bus ATA.
È necessario quindi procurare un altro disco, con una capacità uguale o al massimo maggiore di quello che si deve sostituire, cercando di riprodurre la stessa suddivisione precedente. Probabilmente, trattandosi di dischi di grandi dimensioni, la geometria apparente dovrebbe risultare compatibile (255 testine; 63 settori per traccia e una quantità di tracce uguale o maggiore rispetto al disco precedente). Se le cose stanno così, si possono riprodurre fedelmente le stesse partizioni, pertanto, prima di rimuovere il disco difettoso, si potrebbe salvare la mappa delle partizioni con il comando seguente:
# sfdisk -d /dev/hda > /root/mappa[Invio]
Come si intende, il disco difettoso dovrebbe essere in questo caso quello corrispondente al file di dispositivo /dev/hda. Il file che si ottiene potrebbe avere l'aspetto seguente:
|
Una volta sostituito il disco, si possono riprodurre le stesse partizioni (avanzando probabilmente dello spazio libero alla fine, se il disco ha una capacità maggiore del precedente) con il comando seguente:
# sfdisk < /root/mappa[Invio]
A questo punto, conviene controllare con fdisk e se non ci sono problemi nella suddivisione delle partizioni, errori che si possono manifestare se la geometria del disco non è compatibile con quello precedente, si può procedere all'inizializzazione delle partizioni che sono escluse dal sistema RAID (in questo caso /dev/hda1 usata per il sistema di avvio e /dev/hda2 usata per la memoria virtuale); inoltre, se necessario, occorre ripristinare il sistema di avvio. Quindi si può informare il sistema RAID che si può riappropriare della partizione /dev/hda3 con il comando seguente:
# raidhotadd /dev/md3 /dev/hda3[Invio]
Naturalmente si sta facendo riferimento all'esempio che appare nella sezione precedente; in ogni caso, /dev/md3 deve essere quanto risulta dal file di configurazione /etc/raidtab.
Dopo l'uso di questo comando il sistema RAID si prende possesso della partizione e inizia la ricostruzione della copia speculare al suo interno.
Il sistema RAID-1 attuato via software attraverso un kernel Linux ha il vantaggio di mantenere leggibili le partizioni RAID come se fossero partizioni inizializzate normalmente. In pratica, le informazioni che riguardano l'insieme dei dischi RAID vengono collocate alla fine della partizione, in quello che viene chiamato «superblocco», che tra l'altro consente al kernel di conoscere la struttura dell'insieme di dischi RAID prima di poter accedere al file di configurazione /etc/raidtab. Pertanto, se per qualche ragione non si può fare diversamente, si può accedere a questi dati, avendo cura di farlo soltanto in lettura, ignorando il sistema RAID-1.
In conclusione, se un evento accidentale rendesse inutilizzabile l'insieme di dischi RAID-1, dovrebbe rimanere almeno la possibilità di recuperare i dati da uno dei dischi accedendo alle partizioni nel modo normale, ovvero non attraverso i dispositivi /dev/mdn.
Jakob Østergaard, The Software RAID HOWTO
Appunti di informatica libera 2004.10.10 --- Copyright © 2000-2004 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome gestione_dei_dischi_in_modo_ridondante.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico]