Esto es lo que necesita para cualquiera de los niveles RAID:
2.0.36
o un núcleo 2.2.x
reciente.
raidtools
).Todo este software se puede encontrar en
;. Las
herramientas RAID y los parches están en el subdirectorio
ftp://ftp.fi.kernel.org/pub/linux
daemons/raid/alpha
. Los núcleos se encuentran en el subdirectorio
kernel
.
Parchee el núcleo, configúrelo para incluir el soporte del nivel RAID que quiera usar. Compílelo e instálelo.
A continuación desempaquete, configure, compile e instale las herramientas RAID.
Hasta ahora todo va bien. Si rearranca ahora, debería tener el
fichero /proc/mdstat
. Recuérdelo, ese fichero es su amigo. Vea lo
que contiene haciendo cat /proc/mdstat
. Le debe decir que tiene
registrada la personalidad RAID (es decir, el modo RAID) correcta y que
actualmente no hay dispositivos RAID activos.
Cree las particiones que quiere incluir en su grupo RAID.
Ahora, vayamos a un modo específico.
De acuerdo, así que tiene dos o más particiones que no son necesariamente del mismo tamaño (pero que, naturalmente, pueden serlo) que quiere adjuntar unas con otras.
Prepare el fichero /etc/raidtab
para describir su configuración. He preparado
un /etc/raidtab
para dos discos en modo lineal y el fichero se parece a esto:
raiddev /dev/md0
raid-level linear
nr-raid-disks 2
persistent-superblock 1
device /dev/sdb6
raid-disk 0
device /dev/sdc5
raid-disk 1
Aquí no se soportan discos de reserva. Si un disco muere, el array muere con él. No hay información que poner en un disco de reserva.
Creemos el array. Ejecute la orden:
mkraid /dev/md0
Esto inicializará su array, escribirá superbloques persistentes y arrancará el array.
Échele un vistazo a /proc/mdstat
. Debe ver que el array está funcionando.
Ahora, puede crear un sistema de ficheros, justo como haría con cualquier
otro dispositivo, montarlo, incluirlo en su /etc/fstab
, etc.
Tiene dos o más dispositivos, de aproximadamente el mismo tamaño, y quiere combinar sus capacidades de almacenamiento y rendimiento accediéndolos en paralelo.
Prepare el fichero /etc/raidtab
para describir su configuración. Un
raidtab
de ejemplo se parece a esto:
raiddev /dev/md0
raid-level 0
nr-raid-disks 2
persistent-superblock 1
chunk-size 4
device /dev/sdb6
raid-disk 0
device /dev/sdc5
raid-disk 1
Como en el modo lineal, los discos de reserva tampoco se soportan aquí. Un RAID-0 no tiene redundancia, por lo que cuando un disco muere, el array le acompaña.
Una vez más, ejecute simplemente
mkraid /dev/md0
para inicializar el array. Esto debe inicializar los superbloques y poner
en funcionamiento el dispositivo RAID. Éche un vistazo a /proc/mdstat
para ver
qué sucede. Debería ver que su dispositivo ahora está en funcionamiento.
/dev/md0
está listo para ser formateado, montado, usado y maltratado.
Tiene dos dispositivos de aproximadamente el mismo tamaño y quiere que cada uno de los dos sea un duplicado del otro. Finalmente, tiene más dispositivos que quiere guardar como discos de reserva preparados, que automáticamente formarán parte del duplicado si uno de los dispositivos activos se rompe.
Configure así el fichero /etc/raidtab
:
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/sdb6
raid-disk 0
device /dev/sdc5
raid-disk 1
Si tiene discos de reserva, puede añadirlos al final de la especificación de dispositivos como
device /dev/sdd5
spare-disk 0
Recuerde configurar la entrada nr-spare-disks
adecuadamente.
De acuerdo, ahora estamos listos para comenzar la inicialización del RAID. Se debe construir el duplicado, es decir, los contenidos (de todos modos, sin importancia ahora, ya que el dispositivo todavía está sin formatear) de los dos dispositivos se deben sincronizar.
Dé la orden
mkraid /dev/md0
para comenzar la inicialización del duplicado.
Compruebe el fichero /proc/mdstat
. Debe decirle que se ha puesto en
funcionamiento el dispositivo /dev/md0
, que está siendo
reconstruido el duplicado y una cuenta del tiempo estimado para la
terminación de la reconstrucción.
La reconstrucción se realiza usando el ancho de banda libre de E/S. De esta manera, su sistema debe ser capaz todavía de responder en gran medida, aunque los LEDs de sus discos deben parpadear lozanamente.
El proceso de reconstrucción es transparente, por lo que realmente puede usar el dispositivo aunque la duplicación esté actualmente en curso.
Intente formatear el dispositivo mientras la reconstrucción se esté realizando. Funcionará. También puede montarlo y usarlo mientras la reconstrucción se esté realizando. Naturalmente, si el disco equivocado se rompe mientras se está realizando la reconstrucción, no hay solución.
¡Nota! No he comprobado esta configuración por mí mismo. La configuración de más abajo es mi mejor suposición, no algo que realmente haya tenido funcionando.
Tiene tres o más dispositivos de aproximadamente el mismo tamaño, un dispositivo es significativamente más rápido que los otros dispositivos y quiere combinarlos todos en un único dispositivo más grande, conservando todavía alguna información de redundancia. Finalmente, tiene varios dispositivos que desea usar como discos de reserva.
Configure el fichero /etc/raidtab
así:
raiddev /dev/md0
raid-level 4
nr-raid-disks 4
nr-spare-disks 0
persistent-superblock 1
chunk-size 32
device /dev/sdb1
raid-disk 0
device /dev/sdc1
raid-disk 1
device /dev/sdd1
raid-disk 2
device /dev/sde1
raid-disk 3
Si tuviéramos discos de reserva, se insertarían de forma parecida, siguiendo las especificaciones de discos RAID;
device /dev/sdf1
spare-disk 0
como de costumbre.
Su array se puede inicializar con la orden
mkraid /dev/md0
como es habitual.
Debería ver la sección
mke2fs
de opciones especiales de
mke2fs
antes de formatear el dispositivo.
Tiene tres o más dispositivos de aproximadamente el mismo tamaño, quiere combinarlos en un dispositivo mayor, pero conservando todavía cierto grado de redundancia para la seguridad de datos. Finalmente, tiene varios dispositivos para usar como discos de reserva, que no tomarán parte en el array antes de que otro dispositivo falle.
Si usa N dispositivos donde el tamaño del más pequeño es S, el tamaño de todo el array será (N-1)*S. El espacio que falta se usa para información de paridad (redundancia). De esta manera, si cualquier disco falla, todos los datos permanecerán intactos. Pero si dos discos fallan, todos los datos se perderán.
Configure el fichero /etc/raidtab
así:
raiddev /dev/md0
raid-level 5
nr-raid-disks 7
nr-spare-disks 0
persistent-superblock 1
parity-algorithm left-symmetric
chunk-size 32
device /dev/sda3
raid-disk 0
device /dev/sdb1
raid-disk 1
device /dev/sdc1
raid-disk 2
device /dev/sdd1
raid-disk 3
device /dev/sde1
raid-disk 4
device /dev/sdf1
raid-disk 5
device /dev/sdg1
raid-disk 6
Si tuviéramos discos de reserva, se insertarían de forma parecida, siguiendo las especificaciones de discos RAID;
device /dev/sdh1
spare-disk 0
Y así sucesivamente.
Un tamaño de segmento de 32KB es un buen valor por defecto para muchos sistemas de ficheros de propósito general de estas proporciones. El array sobre el que se utiliza el raidtab anterior es un dispositivo de 7 por 6 GB = 36 GB (recuerde que (N-1)*S = (7-1)*6 = 36). Contiene un sistema de ficheros ext2 con un tamaño de bloque de 4KB. Podría incrementar tanto el tamaño del segmento unitario del array como el tamaño de bloque del sistema de ficheros si su sistema de ficheros fuera o bien mucho mayor o bien si simplemente contuviera ficheros muy grandes.
Vale, ya hemos hablado bastante. Configure el fichero /etc/raidtab
y veamos
si funciona. Ejecute la orden
mkraid /dev/md0
y observe qué ocurre. Es de esperar que sus discos comiencen a trabajar
como locos debido a que empiezan la reconstrucción de su array. Échele un
vistazo a /proc/mdstat
para ver qué está sucediendo.
Si el dispositivo se ha creado correctamente, el proceso de reconstrucción comenzará ahora. Su array no será consistente hasta que esta fase de reconstrucción haya terminado. No obstante, el array es totalmente funcional (excepto, por supuesto, para el manejo de fallos de dispositivos) y puede formatearlo y usarlo incluso mientras se esté reconstruyendo.
Consulte la sección
mke2fs
de opciones especiales de
mke2fs
antes de formatear el array.
Bueno, ahora que ya tiene su dispositivo RAID funcionando, siempre puede pararlo o rearrancarlo usando las órdenes
raidstop /dev/md0
y
raidstart /dev/md0,
respectivamente.
En lugar de colocar éstos en ficheros de inicio y rearrancar un número astronómico de veces hasta hacer que funcione, siga leyendo y haga funcionar la autodetección.
Si volviéramos a aquellos maravillosos días (The Good Old Days (TM)),
las herramientas RAID (raidtools
) leerían su fichero /etc/raidtab
y a
continuación inicializarían el array. Sin embargo, esto requeriría que el
sistema de ficheros sobre el que reside /etc/raidtab
estuviera montado. Esto
es imposible si quiere arrancar a partir de un RAID.
También, la anterior aproximación producía complicaciones al montar
sistemas de ficheros sobre dispositivos RAID. Éstos no se podían colocar
en el fichero /etc/fstab
como era usual, sino que tenían que ser montados en
los guiones (scripts) de inicio.
Los superbloques persistentes solucionan estos problemas. Cuando un array
se inicializa con la opción persistent-superblock
en el fichero
/etc/raidtab
, se escribe un superbloque especial al principio de todos los
discos participantes en el array. Esto permite al núcleo leer la
configuración de los dispositivos RAID directamente de los discos
involucrados, en lugar de leerla de algún fichero de configuración que
puede no estar disponible en todo momento.
Sin embargo, todavía debería mantener un fichero /etc/raidtab
consistente, ya
que puede necesitar este fichero para una reconstrucción posterior del
array.
Los superbloques persistentes son obligatorios si desea la autodetección de sus dispositivos RAID durante el arranque del sistema. Esto se describe en la sección Autodetección .
El tamaño de segmento unitario merece una explicación. Nunca puede escribir de forma totalmente paralela a un grupo de discos. Si tuviera dos discos y quisiera escribir un byte, tendría que escribir cuatro bits en cada disco; realmente, todos los segundos bits irían al disco 0 y los otros al disco 1. Sencillamente, el hardware no soporta eso. En su lugar, elegimos algún tamaño de de segmento unitario que definimos como la masa atómica más pequeña de datos que puede ser escrita en los dispositivos. Una escritura de 16 KB con un tamaño de segmento unitario de 4 KB provocaría que el primer y tercer segmento unitario de 4KB se escriban en el primer disco, y el segundo y el cuarto en el segundo, en el caso de un RAID-0 de dos discos. De esta manera, para grandes escrituras, podría observar menor sobrecarga teniendo segmentos lo suficientemente grandes, mientras que los arrays que contuvieran principalmente ficheros pequeños se podrían beneficiar más de un tamaño de segmento unitario más pequeño.
Los tamaños de segmento unitario se pueden especificar para todos los niveles de RAID excepto para el modo lineal.
Para un rendimiento óptimo, debería experimentar con el valor, así como con el tamaño de bloque del sistema de ficheros que pusiera en el array.
El argumento de la opción chunk-size
en /etc/raidtab
especifica el
tamaño de segmento unitario en kilobytes. Por tanto, 4
significa
4 KB.
Los datos se escriben casi en paralelo en todos los discos del array.
Realmente, se escriben chunk-size
bytes en cada disco, de forma
consecutiva.
Si especifica un tamaño de segmento unitario de 4 KB y escribe 16 KB a un array de 3 discos, el sistema RAID escribirá 4 KB a los discos 0, 1 y 2, en paralelo, y a continuación los 4 KB restantes al disco 0.
Un tamaño de segmento unitario de 32 KB es un punto de partida razonable para la mayoría de los arrays. Pero el valor óptimo depende muchísimo del número de discos implicados, del contenido del sistema de ficheros que aloja y de muchos otros factores. Experimente con él para obtener el mejor rendimiento.
Para las escrituras, el tamaño de segmento unitario no afecta al array, ya que se deben escribir todos los datos a todos los discos sin importar qué. Para las lecturas, sin embargo, el tamaño de segmento unitario indica cuántos datos leer consecutivamente de los discos participantes. Ya que todos los discos activos del array contienen la misma información, las lecturas se pueden hacer en paralelo al estilo de un RAID-0.
Cuando se realiza una escritura en un array RAID-4, también se debe
actualizar la información de paridad en el disco de paridad. El tamaño de
segmento unitario es el tamaño de los bloques de paridad. Si se escribe un
byte a un array RAID-4, entonces se leerán chunk-size
bytes de
los N-1 discos, se calculará la información de paridad y se
escribirán chunk-size
bytes al disco de paridad.
El tamaño de segmento unitario afecta al rendimiento de las lecturas de la misma manera que en un RAID-0, ya que las lecturas de un RAID-4 se realizan de la misma forma.
En RAID-5 el tamaño de segmento unitario tiene exactamente el mismo significado que en un RAID-4.
Un tamaño de segmento unitario razonable para un RAID-5 es 128 KB pero, como siempre, puede desear experimentar con éste.
También consulte la sección mke2fs de opciones especiales de mke2fs. Esto afecta al rendimiento de un RAID-5.
mke2fs
Hay disponible una opción especial cuando se formatean dispositivos RAID-4
y RAID-5 con mke2fs
. La opción -R stride=nn
permitirá a
mke2fs
situar mejor diferentes estructuras de datos específicas de
ext2 en un dispositivo RAID de forma inteligente.
Si el tamaño de segmento unitario es 32 KB significa que 32 KB de datos consecutivos residirán en un único disco. Si queremos construir un sistema de ficheros ext2 con un tamaño de bloque de 4KB, nos damos cuenta de que habrá 8 bloques del sistema de ficheros en una segmento unitario del array. Podemos pasar esta información a la utilidad mke2fs cuando se cree el sistema de ficheros:
mke2fs -b 4096 -R stride=8 /dev/md0
El rendimiento de un RAID-{4,5} se ve fuertemente influido por esta
opción. No estoy seguro de cómo la opción stride
afectará a otros
niveles RAID. Si alguien tiene información sobre esto, por favor, que la
envíe a mi dirección email.
La autodetección permite a los dispositivos RAID ser automáticamente reconocidos por el núcleo durante el arranque, justo después de que se realice la detección ordinaria de particiones.
Esto requiere varias cosas:
initrd
, lo cual de todos modos es absurdo, dado lo improbable de que
descargue dicho soporte en un sistema activo.
Compruebe esto.
0xFD
(use fdisk
y establezca el tipo a fd
)
NOTA: asegúrese de que su RAID NO ESTÁ FUNCIONANDO antes de
cambiar los tipos de las particiones. Use raidstop /dev/md0
para
parar el dispositivo.
Si sigue los pasos 1, 2 y 3 de arriba, la autodetección debería activarse.
Pruebe rearrancar. Cuando el sistema se levante, vea el contenido de
/proc/mdstat
; debería decirle que su RAID está funcionando.
Durante el arranque, podría ver mensajes similares a éstos:
Oct 22 00:51:59 malthe kernel: SCSI device sdg: hdwr sector= 512
bytes. Sectors= 12657717 [6180 MB] [6.2 GB]
Oct 22 00:51:59 malthe kernel: Partition check:
Oct 22 00:51:59 malthe kernel: sda: sda1 sda2 sda3 sda4
Oct 22 00:51:59 malthe kernel: sdb: sdb1 sdb2
Oct 22 00:51:59 malthe kernel: sdc: sdc1 sdc2
Oct 22 00:51:59 malthe kernel: sdd: sdd1 sdd2
Oct 22 00:51:59 malthe kernel: sde: sde1 sde2
Oct 22 00:51:59 malthe kernel: sdf: sdf1 sdf2
Oct 22 00:51:59 malthe kernel: sdg: sdg1 sdg2
Oct 22 00:51:59 malthe kernel: autodetecting RAID arrays
Oct 22 00:51:59 malthe kernel: (read) sdb1's sb offset: 6199872
Oct 22 00:51:59 malthe kernel: bind<sdb1,1>
Oct 22 00:51:59 malthe kernel: (read) sdc1's sb offset: 6199872
Oct 22 00:51:59 malthe kernel: bind<sdc1,2>
Oct 22 00:51:59 malthe kernel: (read) sdd1's sb offset: 6199872
Oct 22 00:51:59 malthe kernel: bind<sdd1,3>
Oct 22 00:51:59 malthe kernel: (read) sde1's sb offset: 6199872
Oct 22 00:51:59 malthe kernel: bind<sde1,4>
Oct 22 00:51:59 malthe kernel: (read) sdf1's sb offset: 6205376
Oct 22 00:51:59 malthe kernel: bind<sdf1,5>
Oct 22 00:51:59 malthe kernel: (read) sdg1's sb offset: 6205376
Oct 22 00:51:59 malthe kernel: bind<sdg1,6>
Oct 22 00:51:59 malthe kernel: autorunning md0
Oct 22 00:51:59 malthe kernel: running: <sdg1><sdf1><sde1><sdd1><sdc1><sdb1>
Oct 22 00:51:59 malthe kernel: now!
Oct 22 00:51:59 malthe kernel: md: md0: raid array is not clean --
starting background reconstruction
Esta es la salida de la autodetección de un array RAID-5 que no fue limpiamente desactivado (es decir, la máquina se cayó). La reconstrucción se inicia automáticamente. Montar este dispositivo es perfectamente seguro, ya que la reconstrucción es transparente y todos los datos son consistentes (sólo es la información de paridad la que es inconsistente - aunque la misma no se necesita hasta que un dispositivo falle).
Los dispositivos autoarrancados también son automáticamente parados
durante el cierre del sistema. No se preocupe de los guiones de inicio.
Simplemente, use los dispositivos /dev/md
como cualquier otro
dispositivo /dev/sdX
o /dev/hdX
.
Sí, verdaderamente es así de fácil.
Quizás desee buscar cualquier orden raidstart/raidstop
en sus
guiones de inicio/parada /etc/rc.d/rc.sysinit
y
/etc/rc.d/init.d/halt
(guiones de
inicio estándares de RedHat). Se usan para el antiguo estilo de RAID y no
tienen utilidad en el nuevo estilo de RAID con autodetección.
Elimine las líneas y todo irá perfectamente bien.
Existen varias formas de configurar un sistema que monta su sistema de ficheros raíz sobre un dispositivo RAID. Desafortunadamente, ninguna de las distribuciones de Linux con las que yo he probado (RedHat y Debian) soportan un dispositivo RAID como dispositivo del sistema de ficheros raíz durante el proceso de instalación. Por tanto, le va a doler un poco si quiere esto pero, de hecho, es posible.
Actualmente, LILO no maneja dispositivos RAID y por ello, no se puede
cargar el núcleo desde un dispositivo RAID en el instante del arranque. Su
sistema de ficheros /boot
tendrá que residir en un dispositivo
que no sea RAID. Un modo de asegurar que su sistema arranca, pase lo que
pase, es crear particiones /boot
similares en todas las unidades
de su RAID, de esa forma la BIOS siempre puede cargar datos desde, por
ejemplo, la primera unidad disponible. Esto necesita que no arranque con
un disco defectuoso en su sistema.
Otra forma de asegurar que su sistema siempre arranca es crear un disquete
de arranque cuando toda la configuración se haya terminado. Si muere el
disco en el que reside el sistema de ficheros /boot
, siempre
puede arrancar desde el disquete.
Este método asume que posee un disco de reserva en el que puede instalar el sistema y que no es parte del RAID que configurará más adelante.
mke2fs
), y móntelo en /mnt/newroot
.
cd /
find . -xdev | cpio -pm /mnt/newroot
/mnt/newroot/etc/fstab
para usar
el dispositivo correcto (el dispositivo raíz /dev/md?
) para el
sistema de ficheros raíz./boot
actual y
móntelo en su lugar en /mnt/newroot/boot
. Esto es necesario para
que LILO funcione correctamente en el siguiente paso.
/mnt/newroot/etc/lilo.conf
para que apunte a los
dispositivos correctos. El dispositivo de arranque debe ser todavía un
disco normal (no un dispositivo RAID) pero el dispositivo raíz debe
apuntar a su nuevo RAID. Cuando esté hecho, ejecute lilo -r
/mnt/newroot
Esta ejecución de LILO debería terminar sin errores.
Si está haciendo esto con discos IDE, asegúrese de indicarle a su BIOS que todos los discos son del tipo «auto-detect», así la BIOS permitirá a su máquina arrancar incluso cuando un disco haya fallado.
Este método necesita que parchee su paquete raidtools
para poder incluir
la directiva failed-disk
en /etc/raidtab
. Busque en los archivos de
la lista de correo Linux-raid los mensajes enviados por Martin Bene,
alrededor del 23 de abril de 1999, donde se envió el parche
failed-disk
. Se espera que esta funcionalidad esté pronto en el
paquete raidtools
(para cuando esté leyendo esto puede que incluso no
necesite parchear las raidtools
).
Sólo puede utilizar este método en RAIDs de niveles 1 o
superiores. La idea es instalar un sistema sobre un disco que es adrede
marcado como estropeado en el RAID, copiar a continuación el sistema en el
RAID que estará funcionando en modo degrado y finalmente hacer que el RAID
use el ya no necesario disco de instalación
, aniquilando la anterior
instalación pero haciendo que el RAID funcione en modo no degradado.
failed-disk
(disco estropeado) en el fichero raidtab
. No
coloque el failed-disk
como el primer disco en el fichero
raidtab
, eso le dará problemas para poner en marcha el RAID. Cree
el RAID y coloque un sistema de ficheros en él.
raidtab
para incluir el failed-disk
anterior
como un disco raid-disk
normal. Ahora, ejecute
raidhotadd
para añadir el disco a su sistema RAID.
Nunca NUNCA nunca reparticione discos que son parte de un RAID que está funcionando. Si debe alterar la tabla de particiones de un disco que es parte de un RAID, pare primero el array y reparticione después.
Es fácil poner demasiados discos en un bus. Un bus Fast-Wide SCSI normal puede sostener 10 MB/s que es menos de lo que muchos discos pueden obtener por sí solos hoy en día. Por supuesto, colocar seis de tales discos en un bus no le proporcionará el aumento de rendimiento esperado.
La mayoría de los controladores SCSI sólo le proporcionarán un rendimiento extra si los buses SCSI son llevados prácticamente al máximo por los discos conectados a ellos. No observará una mejora de rendimiento por usar dos controladoras 2940 con dos discos SCSI viejos en lugar de simplemente hacer funcionar los dos discos sobre una sola tarjeta.
Si olvida la opción persistent-superblock
puede que su array no
arranque por las buenas después de que haya sido parado. Simplemente,
recree el array con la opción colocada correctamente en el fichero
/etc/raidtab
.
Si un RAID-5 no logra reconstruirse después de que un disco haya sido
eliminado y reinsertado, puede deberse al orden de los dispositivos en el
fichero /etc/raidtab
. Intente mover el primer par device -- raid-disk
al final de la descripción del array en el fichero raidtab.