Muntar un RAID per software (en un sistema en funcionament)

  • warning: tempnam(): open_basedir restriction in effect. File() is not within the allowed path(s): (/srv/www/gilug.org/www/site.tree/) in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 802.
  • warning: fopen(): Filename cannot be empty in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 803.
  • El fitxer no s'ha pogut crear.

PROBLEMA:
Tinc un petit servidor a casa i malgrat faig copies de les dades en cinta, m'he adonat que en cas de error físic del disc dur, haurà d'estar x temps sense funcionament, el temps que trigui a muntar un nou disc i recuperar el sistema. Nesecitaba un sistema barat per sol·lucionar aquest problema i he muntat un Raid 1 per software amb discs IDE, que no implica la compra de dispositius cars. (Evidentment no tindrà el mateix rendiment que altres solucions, però servirà)

UN XIC D'INFORMACIÓ:
RAID significa (Redundant Array of Inexpensive Discs) Matriu Redundant de discs barats, podem elegir entre molts tipus de RAID, jo en aquest cas he elegit el RAID 1 (mirall) permet en cas de error mecànic d'un dels discs recuperar les dades ja que tenim una copia idèntica de les mateixes. Els inconvenients que te es que perdem el 50% de la capacitat de dades i que es més lent a l'hora d'escriure i de llegir. El fet de que el raid sigui per software significarà que no necessitem comprar cap tipus de hardware adicional per el muntatge, com a molt només un altre disc dur.

PREPARACIÓ:
El primer que hem de fer, evidentment, es parar el servidor i posar el nou disc dur, jo els he posat en canals separats, de tal forma que un cop iniciat el GNU/Linux, seran /dev/hda (el disc vell) i /dev/hdc (el disc nou) Els meus discs son del mateix tamany, però no es necessari que sigui així.

Necessitarem re-compilar el kernel per donar suport al raid, jo he donat suport directe en el kernel a:

Multiple devices driver support

RAID-0 (striping mode)

RAID-1 (mirroring mode)

També necessitarem algunes utilitats extres, son les raidtools o raidtools2:

#apt-get install raidtools2 raidutils

Per més comoditat he instal·lat el Midnight comander, per fer la copia de dades:

#apt-get install mc

Utilitzem l'fdisk per particionar el disc dur nou, jo he fet les particions exactament igual que el primer disc, amb la swap inclosa ja que ens interessara botar d'aquest disc si algun dia peta l'altre. Jo tinc 3 particions

hda1 ( swap )

hda2 ( l'arrel del sistema )

hda3 ( /home manies meves que m''agrada separar els directoris de usuari )

Al crear-les, canvio l'identificador de /dev/hdc1, /dev/hdc2 i /dev/hdc3 com (fd - Raid Automount) i faig el mateix amb /dev/hda1, /dev/hda2 i /dev/hda3 ja que sinó no reconeixeria les unitats de raid. (en principi no passa res per canviar els identificadors mentre el sistema està en funcionament). Cal posar a /dev/hda2 i /dev/hdc2 el flag de bootable.

Seguidament formatarem les noves particions, jo utilitzo ext3 normalment:

#mkfs.ext3 /dev/hdc2

#mkfs.ext3 /dev/hdc3

#mkswap /dev/hdc1

COMENÇEM:

La instal·lació la farem amb un sistema en funcionament, tot i això no ens podrem estalviar un parell de re-inicis de la màquina. Els dispositius de raid son /dev/md[n] per lo que heurem d'escriure el lilo en aquest dispositiu perquè boti el sistema amb el raid, aquest per tant es el nostre primer problema ja que treballem amb un sistema de fitxers muntat /dev/hda i no ens deixa crear el raid. Per solucionar-ho definim una taula de raid com si hagués fallat el primer disk (el que està muntat) passarem el sistema al segon disc i botarem del segon disc, això permetrà botar de un disc amb el raid creat i finalment restaurarem el raid.

# vi /etc/raidtab

# raid per /

raiddev /dev/md0

raid-level 1

nr-raid-disks 2

chunk-size 64k

persistent-superblock 1

nr-spare-disks 0

device /dev/hda2

failed-disk 0

device /dev/hdc2

raid-disk 1


# raid per /home
raiddev /dev/md1

raid-level 1

nr-raid-disks 2

chunk-size 64k

persistent-superblock 1

nr-spare-disks 0

device /dev/hda3

failed-disk 0

device /dev/hdc3

raid-disk 1


# raid per swap
raiddev /dev/md2

raid-level 1

nr-raid-disks 2

chunk-size 64k

persistent-superblock 1

nr-spare-disks 0

device /dev/hda1

failed-disk 0

device /dev/hdc1

raid-disk 1


Tenim varies opcions per el cas de les particions de la swap:

  • He vist que hi ha molta gent que quan munta un raid 1 de l'arrel del sistema també munta un raid 1 de la swap, comenten que en cas de que peti un disc pots descarregar una de les particions sense que es produeixi cap error greu. No se si això funciona, però el cas es que amb el raid es perd un 50% de capacitat de swap.

  • Per no perdre aquesta capacitat i tenir més rendiment l'alternativa es no crear l'entrada a (/etc/raidtab) per la swap, en el seu lloc posarem l'identificador 82 (swap) a les particions destinades a fer de memòria swap i les muntarem totes 2 particions a /etc/fstab així:

    /dev/hda1 none swap sw 0 0

    /dev/hdc1 none swap sw 0 0



Ara crearem les noves unitats de raid:

#mkraid /dev/md0

#mkraid /dev/md1

#mkraid /dev/md2


un cop fet, muntem les particions /dev/hda2 i /dev/hda3 i copiem el contingut pertinent des de /dev/hda2 i /dev/hda3

#mkdir /mnt/hdc2; mkdir /mnt/hdc3

#mount /dev/hdc2 /mnt/hdc2; mount /dev/hdc3 /mnt/hdc3

#cp -paxv /home/* /mnt/hdc3

#umount /dev/hdc3


La partició que contenia /home l'hem copiat a sac ja que no hi ha cap arxiu que ens pugui donar problemes, però la partició que conte l'arrel ja es més problemàtica, crearem els directoris amb informació volàtil com /proc /sys /tmp i els punts de muntatge com /home o /mnt i la resta de arxius i carpetes les copiarem a sac amb el midnight comander ja que ens permetrà anar seleccionant el que vulguem copiar.

#cd /mnt/hdc2

# mkdir proc; mkdir sys; mkdir mnt; mkdir tmp; mkdir home
(crearem els directoris que no copiarem)

#mc (executa el midnight comander)

Ara haurem de modificar alguns arxius per tal de aconseguir botar del raid

#vi /etc/lilo.conf

boot=/dev/md0

root=/dev/md0

lilo -v (dona un parell de errors però bota)

cp lilo.conf /mnt/hdc2 /etc/

A mi no m'ha funcionat molt be per el que faig es posar boot=/dev/hdc, escric el lilo, torno a editar l'arxiu amb boot=/dev/hda i torno a escriure el lilo. No ho he provat però crec que amb la opció raid-extra-boot=mbr funcionaria correctament.

També hem de canviar les linines següents:

#vi /etc/fstab

/dev/md0 / ext3 errors=remount-ro 0 1

/dev/md2 none swap sw 0 0

/dev/md1 /home ext3 errors=remount-ro 0 0

# cp /etc/fstab /mnt/hdc2/etc

# cd .. && umount /dev/hdc2

# reboot


¡¡¡ Atenció: arribat en aquest punt en que he re-iniciat el pc, entro a la bios i poso que boti només del disc secundari /dev/hdc (cada bios es un mon, consulteu-ne el manual per saber com fer-ho correctament) !!!

Si tot ha nat be ara ja tenim l'arrel del sistema format només per /dev/hdc muntat com a /dev/md0, procedirem a afegir les noves unitats i a sincronitzar el raid:

#vi /etc/raidtab ( canviem failed-disk per raid-disk )

Ara afagim les particions del disc que en teoria havia fallat als raids corresponents perquè se sincronitzin.

#raidhotadd /dev/md0 /dev/hda2

#raidhotadd /dev/md2 /dev/hda1

#raidhotadd /dev/md1 /dev/hda3


Podem veure el procés de sincronització i l'estat dels raids fent:

#cat /proc/mdstat

Per ultim podem instal·lar mdadm que permet motoritzar el raid i ens informarà per exemple per correu electrònic si hi han errors en el raidm, per exemple si peta un disc dur.

apt-get install mdadm

Ja està tot funcionant. Cal tenir present també que a la bios ara hem de posar que boti primer del 1 disc i després de l'altre perquè si algun dia l'ordinador no arranques d'una unitat ho faria de l'altre.

ANEX 1:

També podríem haver elegit la opció de compilar el suport en el kernel com a modul, llavors hauríem de posar a /etc/lilo.conf la línia per l'initrd: append=”initrd=/boot/initrd.img ...” a l'entrada del kernel pertinent. I seguidament crear l'initrd amb els mòduls del kernel perquè ens carregui el raid a l'inici. No ho he provat, però crec que no es necessari amb kernels 2.4 i posteriors.

#vi /etc/mkinitrd/mkinitrd.conf

ROOT=/dev/md0

# kernelversion=`uname -r`

# mkinitrd -o /boot/initrd.img-$kernelversion /lib/modules/$kernelversion

# cp /boot/initrd.img-$kernelversion /mnt/hdc2/boot/


BIBLIOGRAFIA:

Aquest article no és més que una traducció amb 4 canvis fets per mi, resultatnts de la meva aplicació d'aquest article aqui citat.

http://alufis35.uv.es/spip/article82.html

http://www.schwarzvogel.de/od2md.shtml

http://bulma.net/body.phtml?nIdNoticia=1863

Molt bon article!

Quan hagi acabat exàmens ho faig al servidor de casa meva! ;-)

Salut!

Velocitat d'escriptura

Bones.

Primer de tot m'agradaria felicitar a l'autor de l'article. Quan tingui temps em dedicaré a jugar una mica amb aquestes coses. Encara que sigui amb un sos disc dur.

Et voldria fer una pregunta. Les escriptures són més lentes? fins a quin punt? Entenc que si tens dos discs durs, les escriptures poden anar en paral·lel sense necessitat de penalitzar amb el doble de temps.

Podries fer una prova per veure la velocitat normal amb la nova configuració. Podries executar:

[root@chaos xevi]# hdparm -t /dev/hda5

/dev/hda5:
Timing buffered disk reads: 72 MB in 3.00 seconds = 23.98 MB/sec

Tinc curiositat per veure la diferència amb la nova configuració i la normal.

Re: Velocitat d'escriptura

Merci, però recomano a tothom llegir la font de l'article, està en la bibliografia de l'article, aquell si que està elaborat.

Jo no he notat cap diferencia apreciable en les escriptures, no ho se tampoc he fet la prova de l'hdparm amb els discs sense raid, potser també millora alguna cosa que en el meu cas ho he fet amb busos separats.

Passo de desfer el raid i rebotar la màquina llavors s'hauria de tornar a sincronitzar el raid i... De moment pastejo la velocitat d'escriptura amb el raid (no serà molt gran perquè la màquina es molt vella i no te ni UDMA). i el dia que desfaci el raid per alguna cosa pastejare la velocitat sense raid. (a veure si hi penso, però crec que serà que no eh)

#hdparm -i /dev/hda

/dev/hda:

Model=ST340014A, FwRev=8.01, SerialNo=4JX06MXH
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
CurCHS=65535/1/63, CurSects=4128705, LBA=yes, LBAsects=66055248
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 *mdma2
UDMA modes: udma0 udma1 udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 2:

* signifies the current active mode

hdparm -tT /dev/md1
/dev/md1:
Timing cached reads: 280 MB in 2.01 seconds = 139.30 MB/sec
Timing buffered disk reads: 14 MB in 3.40 seconds = 4.12 MB/sec

Salut!