Howto build a RAID1 with Debian and mdadm

mirroringSempre più spesso ci si trova con dischi rigidi di dimensioni enormi, visto che tutto questo spazio a disposizione rende l’utente pigro effettuare un backup dei dati su dvd è fuori discussione. D’altra parte perchè sbattersi ad effettuare dei backup su dvd quando il costo al GB degli hard disk è così basso?

In questo contesto può essere una buona idea acquistare due dischi, oppure un disco uguale a quello già in nostro possesso, per creare un mirror.

Una cosa che mi è capitato di fare n volte è stato passare da una configurazione single-disk ad una configurazione con mirror, il tutto è relativamente facile da realizzare utilizzando mdadm ed il modulo raid per il kernel di linux.

Quanto segue è stato scritto utilizzando una Debian lenny, l’attuale testing, ed è stato ripetuto n volte su delle Debian 4.0 etch. Ciò non toglie che, essendo i tool da utilizzare sostanzialmente gli stessi, quanto segue possa essere utile a tutti gli utenti del pinguino che vogliono passare ad una configurazione con mirror sulla loro macchina.

Passaggio da una configurazione single-disk ad una RAID1

Innanzitutto bisogna installare mdadm, facendo ciò apt installa anche il modulo raid per il kernel ed esegue il rebuild dell’initrd, ciò è stato fatto previo aggiornamento della lista dei pacchetti e del sistema.

lennybox:~# apt-get update
lennybox:~# apt-get upgrade
lennybox:~# apt-get install mdadm

Successivamente bisogna copiare la tabella delle partizione dell’attuale disco (/dev/hda) sul disco aggiuntivo (/dev/hdb). Ciò viene fatto col comando sfdisk eseguendo prima un dump della tabella delle partizioni il cui risultato viene re-direzionato sempre ad sfdisk ma stavolta per scrivere la tabella delle partizioni del disco attuale sul disco aggiuntivo.

WARNING: fate estrema attenzione a non invertire l’ordine dei dischi altrimenti distruggerete la tabella delle partizioni del disco buono!!!

lennybox:~# sfdisk -d /dev/hda | sfdisk /dev/hdb

Dopodichè è necessario cambiare l’attributo “type” delle partizioni appena copiate sul disco aggiuntivo a “Linux raid autodetect”, per farlo si è utilizzato il programma cfdisk (utility grafico-testuale il cui utilizzo è auto-esplicativo), segue il risultato che si dovrebbe ottenere:

lennybox:~# cfdisk /dev/hdb
lennybox:~# fdisk -l /dev/hdb
Disk /dev/hdb: 3221 MB, 3221225472 bytes
 255 heads, 63 sectors/track, 391 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/hdb1   *           1         367     2947896   fd  Linux raid autodetect
/dev/hdb2             368         391      192780   fd  Linux raid autodetect

Quando si partizionano i dischi, bisogna fare attenzione che le partizioni usino ”fd (Linux raid autodetect)” come Partition Type invece di ”84 (Linux native)”. È possibile modificare il tipo di partizione premendo t in fdisk (il tutto funziona comunque anche con Partition Type Linux o Swap).
Bisogna anche rendere bootabile la prima partizione. Con fdisk è l’opzione “a”.
Ora è giunto il momento per procedere alla creazione dei metadevice, i parametri passati a mdadm sono autoesplicativi.

lennybox:~# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 missing /dev/hdb1

E’ giunto il momento di creare la partizione di swap, si inizia disabilitando la partizione di swap correntemente montata (se si vuole si può verificare l’esito dell’operazione con free), si modifica l’attributo “type” SOLO della partizione suddetta col comando cfdisk già visto in precedenza, dopodichè si crea il metadevice per lo swap, si formatta il metadevice appena creato e lo si attiva, ora si può fare free per verificare il successo dell’operazione, infine si edita /etc/fstab per utilizzare il metadevice appena creato al posto della vecchia partizione.

lennybox:~# swapoff /dev/hda2
lennybox:~# free
lennybox:~# cfdisk /dev/hda
lennybox:~# mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/hda2 /dev/hdb2
lennybox:~# mkswap -c /dev/md2
lennybox:~# swapon /dev/md2
lennybox:~# free
lennybox:~# vim /etc/fstab

Ora è giunto il momento di riavviare in single user mode. Una volta completato il reboot bisogna montare il metadevice in un’apposito mountpoint e copiare i file dalla nostra partizione al metadevice in modo da ricostruire l’albero delle directory, successivamente editare menu.lst in modo da bootare anche dal metadevice, editare l’mbr del disco aggiuntivo (quello col metadevice) in modo da poter bootare, modificare anche fstab e riavviare.

lennybox:~# reboot
lennybox:~# mkfs.ext3 /dev/md1
lennybox:~# mount /dev/md1 /mnt
lennybox:~# cp -aux / /mnt/
lennybox:~# vim /mnt/boot/grub/menu.lst
lennybox:~# vim /mnt/etc/fstab
lennybox:~# grub

Seguono i comandi da dare al prompt di grub (ovviamente bisogna cambiare disco e partizione ove necessario):

grub> root (hd0,x)
grub> setup (hd0)
grub> quit

Infine riavviare. Ora si è appena bootato dal disco aggiuntivo, sempre con cfdisk si edita il “type” della vecchia partizione primaria e si aggiunge la vecchia partizione al metadevice. E’ possibile monitorare la sincronizzazione eseguendo un cat del file /proc/mdstat

lennybox:~# cfdisk /dev/hda
lennybox:~# mdadm --add /dev/md1 /dev/hda1
lennybox:~# cat /proc/mdstat

Ora bisogna creare i file di configurazione di mdadm in /etc (/etc/mdadm.conf /etc/mdadm/mdadm.conf) e riavviare il servizio.

lennybox:~# mdadm --detail --scan > /etc/mdadm.conf
lennybox:~# cat /etc/mdadm.conf >> /etc/mdadm/mdadm.conf
lennybox:~# /etc/init.d/mdadm-raid restart

Ora si ha un raid1 perfettamente funzionante!!!

Disaster recovery

Le seguenti informazioni sono utili nel caso in cui un disco sia passato all’altro mondo e sia necessaria riallineare l’array…

Disco vuoto

E’ necessario nuovamente copiare la tabella delle partizioni sul disco nuovo, al termine verificare con fdisk che tutto sia corretto, dopodiché aggiungere la corretta partizione al metadevice di interesse, infine reinstallare grub (alla console di grub eseguire i comandi citati nella sezione precedente) sul secondo disco, prima di riavviare o spegnere monitorare per mezzo di /proc/mdstat che l’operazione sia terminata.

lennybox:~# sfdisk -d /dev/hda | sfdisk /dev/hdb
lennybox:~# fdisk -l
lennybox:~# mdadm --add /dev/md1 /dev/hdb1
lennybox:~# mdadm --add /dev/md2 /dev/hdb2
lennybox:~# grub
lennybox:~# cat /proc/mdstat

Disco usato con partizioni fuori sincronia

Se si è reinserito il vecchio disco od un disco usato le partizioni (quelle dati, la swap non centra niente) sono andate fuori sincronia, è necessario re-sincronizzare in tutto con mdadm e riaggiungere la partizione coinvolta nel metadevice di interesse, prima di riavviare o spegnere monitorare per mezzo di /proc/mdstat che l’operazione sia terminata.

lennybox:~# cat /proc/mdstat
lennybox:~# mdadm --zero-superbplock /dev/hdb
lennybox:~# mdadm --add /dev/md1 /dev/hdb1
lennybox:~# cat /proc/mdstat

Normale diagnostica

Informazioni sull’array:

lennybox:~# mdadm --detail --scan
lennybox:~# mdadm --examine --scan

Informazioni sull’array comprese le partizioni fisiche che formano il metadevice:

lennybox:~# mdadm --brief --detail --verbose /dev/md1
lennybox:~# mdadm --brief --detail --verbose /dev/md2

File di diagnostica in proc, mostra i metadevice, le informazioni di re-sincronizzazione e quando manca un disco:

lennybox:~# cat /proc/mdstat

Messaggi del kernel riguardanti i moduli coinvolti:

lennybox:~# dmesg | grep md
lennybox:~# dmesg | grep  raid1
Be Sociable, Share!

    Related post:

    15 Comments

    1. Noko says:

      Speriamo che la gente decida di usare quest’ultimo howto al posto delle decine di altri in giro per la rete. Quantomeno è quello col timestamp più recente 😉

    2. Sukkorola says:

      Ho qualche perplessità sul mirroring anche dello swap, che mi sembra una cosa assolutamente inutile. Solitamente quel che faccio io è lasciare le partizioni di swap non mirrorate, addandole entrambe separatamente a fstab, ma con la stessa priorità. In questo modo Linux dovrebbe usare entrambe le partizioni in una specie di striping, cosa che di fatto raddoppia le performance della memoria virtuale.

      Per il resto tutto buono. Aggiungerei solo un warning al momento di copiare la tabella delle partizioni, dato che se si invertono i drive… Ciao ciao dati :D.

    3. MRG says:

      La swap va in RAID altrimenti si rischia corruzione di dati nella memoria del sistema se si rimuove/danneggia uno dei due dischi.
      Se poi esegui il boot con un disco mancante hai problemi a montare una partizione non più presente.
      Warning aggiunto!!!

    4. SukkoPera says:

      Mah, no… Credo che Linux sia abbastanza sveglio da smettere di usare una partiziona swap se dà problemi. Per il boot tutto ok, ti dirà semplicemente che non la monta. Boh, diciamo che è un’alternativa da considerare.

    5. MRG says:

      Bè Sukko permettimi di dissentire, a mio parere il RAID oltre a garantire la ridondanza dei dati serve anche a garantire l’high availability.
      Se mi muore un disco ed in quel momento sto utilizzando la partizione di swap su di esso contenuto e non l’ho mirrorata mi si pianta il sistema, ci fosse anche solo una remota possibilità che ciò possa accadere (e secondo me è tutt’altro che remota) dubito che una persona che è disposta a perdere il 50% dello spazio a disposizione in favore di ridondanza dei dati ed high availability sia disposta a correre un rischio del genere.
      Sono parecchi quelli che la pensano come me ed altrettanti quelli che la pensano come te, a sostegno della mia tesi ti posso linkare questo articolo tratto da Linux Jurnal che parla dell’argomento, e un pò datato ma del resto tutta la documentazione sul RAID software su linux lo è, per i più pigri che stanno seguendo questa discussione copio/incollo uno stralcio dell’articolo:
      If you are using RAID-1 to help to ensure that your system stays up in the event of a hard disk partition failure, you should consider raiding your swap partition(s).
      If the disk or partition you are using for swap goes bad, your machine may crash.
      Using a RAID-1 device for a swap partition can help prevent that crash.
      If one of the mirrored swap partitions goes bad, the kernel automatically will fail over to the other, and your system should keep running until you can fix the disk problem.

    6. Sukkorola says:

      Temo che non ci siamo ben capiti :). Il tuo metodo è sicuramente impeccabile, quello che suggerisco io dà forse qualche vantaggio prestazionale su workstation o macchine non mission-critical. Tutto ciò però va rivalutato dopo aver appurato come si comporta esattamente Linux in caso di errori nello swap, cosa che (fortunatamente) non mi è mai successa!

    7. mat_jack1 says:

      innanzi tutto grazie della guida MRG! Googlando l’ho trovata e mi sono quasi emozionato! (quasi)

      ho un dettaglio che forse è sbagliato. Quando dici di creare il famigerato swap, il type “swap” è da impostare su hdb2, giusto?
      tu nei comandi scrivi:
      lennybox:~# cfdisk /dev/hda
      non dovrebbe essere:
      lennybox:~# cfdisk /dev/hdb ?

      sei stato comunque illuminante! è l’unica guida per lenny in circolazione, super!

    8. MRG says:

      Ciao mat_jack!!! Benvenuto!!!
      Quando crei il metadevice che andrai ad usare per la swap devi usare il partition type “Linux raid autodetect” su entrambe le partizioni su entrambi i dischi, su hdb avevamo già provveduto a replicare le partizioni e a modificare il partition type a “Linux raid autodetect”, resta da fare la stessa cosa su hda.
      Infatti si disattiva la swap, si modifica il partition type (in questa fase SOLO dello swap visto che la root per ora è ancora su hda) e poi si crea il metadevice che andremo ad utilizzare per lo swap (sul metadevice solita combinazione mkswap e swapon).
      Spero di essere stato chiaro, stamattina non sono molto lucido…

    9. mat_jack1 says:

      grazie 🙂

      devo fare ancora alcune prove con il boot ma pare funzionare tutto!

    10. Mando says:

      Ciao a tutti e complimenti x la guida.
      Volevo sottoporre un problema che mi si presenta a casa con il mio server Debian.
      Ho creato il RAID1 in fase d’installazione con 2 HD da 80 gb e tutto funziona.
      Il problema è che i 2 HD mi cominciano andar stretti e vorrei travasare il tutto (RAID1 dati e sistema) in 2 HD da 250 gb.

      Qual’è la via più indolore???

      Grazie, Ciao

      • MRG says:

        Bella domanda.
        Credo dipenda da cosa vuoi ottenere e da qual è la tua attuale configurazione…

        Potresti ad esempio fare più o meno come nella guida (soltanto che partiresti da un RAID), in questo caso potresti fare il lavoro almeno in un paio di modi diversi, oppure potresti eseguire un dd da uno dei tuoi attuali dischi verso il disco nuovo e creare un’ulteriore metadevice per sfruttare lo spazio rimasto libero sui due dischi…

        Direi che la cosa va abbastanza a fantasia e dipende abbastanza da che risultato vuoi ottenere.

    11. clark says:

      Una cosa non ho capito completamente, e cioe’:
      quando si crea il dev/md1 questo comprende tutte le partizioni?
      tipicamente su disco si ha: boot / – usr – var – tmp home piu’ la swap e questa struttura viene copiata sul disco aggiunto quando si fa sfdisk -d /dev/hda | sfdisk /dev/hdb pero’ poi creiamo un dev/md2 per la swap quindi la domanda mi sorge spontanea non bisogna creare un /dev/md* per ogni partizione?

      • MRG says:

        No, non comprende tutte le partizioni. E’ necessario creare un metadevice per ogni partizione fisica che si vuole mirrorare.
        Nel caso preso in esame le partizioni erano due (come indicato dall’fdisk -l presente ad inizio post):
        1) hda1 per /
        2) hda2 per swap

    12. fax says:

      Bella guida. L’unico intoppo è nel boot…

      non capisco cosa fai al grub quando sei in single user mode.
      modifichi le conf del grub dalle metapartizioni.

      poi reinstalli il grub sul disco.

      Ma al riavvio il boot viene fatto sempre con quello vecchio, quello nuovo non viene preso in considerazione.

      devo modificare il grub di hda per avviare con hdb?

      • MRG says:

        In single user mode modifico la configurazione di grub in modo da poter avviare dal metadevice (su hdb) al riavvio e non da hda. Se tu al riavvio non carichi il sistema dal metadevice (configurato al momento solo su hdb) non potresti aggiungere hda all’array.

        In effetti grub va installato sull’altro disco o al limite su quel disco ma con l’indicazione della partizione di root cambiata, non a caso dico che bisogna cambiare disco e partizione ove necessario.

        Il mio consiglio è di configurare grub in modo da poter avviare il sistema sia col solo hdb che col solo hda, allo stesso modo grub deve essere installato su entrambi i dischi altrimenti in caso di guasto del disco su cui è installato il boot loader sarà impossibile avviare (in tempi ragionevoli) dall’altro disco.