Crear un raid 1 a partir de un disco con datos sin formatear
Hace unos días recibí un email de un lector de este blog, Renato, diciéndome que tiene un NSLU2 con Debian, qué envidía :-P, y con un disco duro muy lleno. Me preguntaba si podía añadir un nuevo disco y crear un raid sin tener que reformatear.
Me picó la curiosidad y el resultado es este tutorial. No voy a extenderme demasiado en las explicaciones puesto que en el tutorial del raid 1 que hice hace tiempo se puede encontrar la información más detallada. Manos a la obra!.
Como preparación he creado una partición /dev/sda1, la he montado en /mnt/datos y he copiado algo de información en ella. Esta sería la partición que ya tenemos casi llena y no queremos tener que formatearla. Vamos a crear un raid 1 con el otro disco (el disco nuevo que todavía no tiene información). Particionamos como tipo fd:
Y ahora viene el paso más importante en la creación del raid. Creamos el raid 1 pero con un único disco/partición. La clave es utilizar sólo la partición del nuevo disco /dev/sdb1 y en el otro poner missing, de tal forma que el raid 1 se crea degradado porque sólo existe un disco.
Si aparece el error mdadm: error opening /dev/md1: No such file or directory deberemos crear el dispositivo mdX primero, según el que necesitemos:
Si miramos el fichero /proc/mdstat nos fijamos en el que raid está disponible pero sólo con un disco.
Lo mismo ocurre si mostramos la información del raid:
Formateamos el raid y lo montamos en /mnt/datos_raid. Así, estaría disponible para ser utilizado, pero con un único disco. Además, copiamos la información del disco antiguo (recordemos que está montado en /mnt/datos) al raid.
En este punto ya tenemos toda la información en el raid. Ahora desmontamos la partición de nuestros datos /dev/sda1, particionamos el disco y creamos la partición de tipo raid (fd).
Y ahora añadimos al raid /dev/md1 la partición que acabamos de crear:
Después de un tiempo el raid estará reconstruido con toda nuestra información a salvo en ambos discos:
El paso final es actualizar el archivo de configuración /etc/mdadm/mdadm.conf con el nuevo raid.
Y añadir al archivo /etc/fstab el montaje automático del raid en el arranque.
Hemos visto cómo pasar de una configuración con un único disco a otra basada en un raid 1 sin tener que salvar toda nuestra información en otro medio independiente y reformatear todo a la vez.
Lamentablemente, lo que quería hacer nuestro compañero Renato era crear un raid JBOD (o lineal), cosa que no entendí yo en un primer momento y me lancé a probarlo con un raid 1. Si intentamos crear el raid lineal con un único disco vemos que no es posible. Aunque el mensaje de mdadm no es muy claro, con dmesg vemos realmente la causa:
La solución a cómo poder hacer esto sin tener que reformatear en el próximo post :-).
Me picó la curiosidad y el resultado es este tutorial. No voy a extenderme demasiado en las explicaciones puesto que en el tutorial del raid 1 que hice hace tiempo se puede encontrar la información más detallada. Manos a la obra!.
shian:~# fdisk /dev/sdb
...
Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 130 1044193+ fd Linux raid autodetect
...
shian:~# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
mdadm: size set to 1044096K
mdadm: array /dev/md1 started.
shian:~# mknod /dev/md0 b 9 0
shian:~# mknod /dev/md1 b 9 1
shian:~# mknod /dev/md2 b 9 2
...
shian:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb1[0]
1044096 blocks [2/1] [U_]
shian:~# mdadm --detail /dev/md1
/dev/md1:
Version : 00.90.03
Creation Time : Fri Sep 28 08:09:16 2007
Raid Level : raid1
Array Size : 1044096 (1019.80 MiB 1069.15 MB)
Device Size : 1044096 (1019.80 MiB 1069.15 MB)
Raid Devices : 2
Total Devices : 1
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Fri Sep 28 08:09:16 2007
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
UUID : b0e5f96e:12266294:54e4f551:119b56e7
Events : 0.1
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 0 0 1 removed
shian:~# mkfs.ext3 /dev/md1
shian:~#
shian:~# mkdir /mnt/datos_raid
shian:~# mount /dev/md1 /mnt/datos_raid
shian:~#
shian:~# cp -a /mnt/datos/* /mnt/datos_raid
shian:~# umount /dev/sda1
shian:~# fdisk /dev/sda
...
Disk /dev/sda: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 130 1044193+ fd Linux raid autodetect
...
shian:~# mdadm --manage /dev/md1 --add /dev/sda1
mdadm: added /dev/sda1
shian:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda1[1] sdb1[0]
1044096 blocks [2/2] [UU]
shian:~# cd /etc/mdadm
shian:/etc/mdadm# cp mdadm.conf mdadm.conf.`date +%y%m%d`
shian:/etc/mdadm# echo "DEVICE partitions" > mdadm.conf
shian:/etc/mdadm# mdadm --detail --scan >> mdadm.conf
shian:~# echo "/dev/md1 /mnt/datos ext3 defaults 0 2" >> /etc/fstab
Hemos visto cómo pasar de una configuración con un único disco a otra basada en un raid 1 sin tener que salvar toda nuestra información en otro medio independiente y reformatear todo a la vez.
Lamentablemente, lo que quería hacer nuestro compañero Renato era crear un raid JBOD (o lineal), cosa que no entendí yo en un primer momento y me lancé a probarlo con un raid 1. Si intentamos crear el raid lineal con un único disco vemos que no es posible. Aunque el mensaje de mdadm no es muy claro, con dmesg vemos realmente la causa:
shian:~# mdadm --create --verbose /dev/md2 --level=linear --raid-devices=2 /dev/sdb1 missing
mdadm: chunk size defaults to 64K
mdadm: RUN_ARRAY failed: Invalid argument
mdadm: stopped /dev/md2
shian:~# dmesg
...
linear: not enough drives present. Aborting!
md: pers->run() failed ...
md: md3 stopped.
md: unbind
md: export_rdev(sdb1)
La solución a cómo poder hacer esto sin tener que reformatear en el próximo post :-).

10 comments:
Yo también tengo un NSLU2 con Debian, y habría que mirar el consumo del mdadm en cuanto a memoria y cpu ya que anda muy muy justito y cualquier cosa que se ponga lo carga y empieza a swapear :)
Estaba yo pensando...
También se podría aprovechar LVM para hacer mirrors etc. Se añaden dos discos a un VG y se indican a los lvoles que utilicen una mirror copy contra el otro disco y así se pueden sacar, meter más discos e incluso la posibilidad de usar lvm para ampliar los lvoles y luego extender los filesystems en caliente.
Algún día escribiré algo sobre esto si estais interesados
Hola rubick,
respecto al consumo de mdadm, no te puedo decir demasiado puesto que en mi servidor actual de backup no tengo problemas con el raid. Ya me gustaría a mi tener un NSLU2 para poder hacer pruebas y cacharrear con él.
Te has adelantado a la solución que iba a proponer. Es con LVM aunque no tan sofisticada como lo que indicas del mirror copy. En un par de días postearé el artículo.
Saludos y gracias por el comentario, Iván.
Me ha parecido muy interesante el tutorial, aunque cuando he leído que quería agregar discos linealmente, yo también he pensado inmediatamente en el LVM.
En cualquier caso, si los discos fueran similares, más que un JBOD, casi mejor hacer un RAID0 para mejorar las prestaciones, ¿no?
Al fin y al cabo las probabilidades de pérdida de datos en un RAID0 son iguales que en un JBOD...
Hola Super coco,
hombre, con raid 0 sí se mejoran las prestaciones, pero si tienes un raid JBOD y se te va un disco, sólo pierdes esos datos, en el raid 0 perderías todos. Aunque, para el caso del NSLU2 utilizado como servidor media center habría que ver si compensa el "riesgo" (al fin y al cabo son pelis o series que de pueden descargar) con la mejora de velocidad.
Gracias por el comentario.
Saludos, Iván.
P.D: Tú también me has chafado la solución del LVM. Menos mal que no he ofrecido un premio al que lo acertara ;-)
Respecto a:
pero si tienes un raid JBOD y se te va un disco, sólo pierdes esos datos, en el raid 0 perderías todos.
Si hablamos de tener un único filesystem que cruce los dos discos, estoy en desacuerdo con lo que dices. El sistema de ficheros pondrá cada fichero en el disco que quiera. En ocasiones incluso fragmentado, con partes en un disco y partes en otro. Por tanto, si pierdes un disco, a efectos prácticos de usuario casero, lo habrás perdido todo, como en el RAID0.
Eso sí, en caso de que quisieras recuperar parte de la información currándotelo en serio, en el JBOD te puede resultar más sencillo encontrar "algo" que en el RAID0. Pero si tienes información que valga tanto ese esfuerzo, mejor no uses JBOD o RAID0 o haz backups muy frecuentes.
¿No te parece?
Yo creo que la mejor solución en cuanto a rendimiento y fiabilidad es realiar mirror con mdadm y esos discos usarlos con lvm en modo stripping.
¿Que opinais?
[Super coco]: Según tengo entendido (aunque puede que me confunda) los datos en un JBOD se utiliza un disco entero y cuando se llena se empieza a utilizar el otro. Aunque ya te digo que puede que esté equivocado. Me lo apunto a ver si puedo hacer alguna pruebecilla. No obstante tienes toda la razón cuando dices que si usas un raid 0 ó JBOD debes utilizar un buen sistema de backup.
[Rubick]: No conozco el modo stripping de LVM, tengo que mirar porque puede ser interesante. Lo que sí está claro es que el raid 1 te proporciona mucha seguridad si pierdes un disco.
Saludos, Iván.
Hola Iván, me tienes "anonadado" con tus post sobre raid y soluciones por el estilo, me quedé pillado con tu solución de monitorización por sms a través de google-calendar. En fin, al final me he montado en casa un Servidor Linux (Ubuntu) con un raid 1 de 500Gb y estoy la mar de contento, todo es gracias a tus aportaciones, te estoy muy agradecido por todo. Pero me ha surgido una duda:
Empezamos con un disco duro, cuando pensamos en el posible error damos con el mirroring (raid 1) pero conforme vamos llenándolo entonces empezamos a pensar en la falta de espacio y pensamos en montar otro raid 1, pero vemos que con el raid 5 podemos obtener más volumen de información y con tolerancia a fallos. Así pues me puse a pensar en como pasar de Raid 1 a Raid 5, entonces busqué en internet y me encontré con esto:
http://scott.wallace.sh/node/1521
En principio me ilusionó pero no se que pensar, lo ves fiable?
Saludos maquina.
Hola Javier,
lo primero darte las gracias por los comentarios que me haces. Me alegra mucho que todo lo que cuento le sirva a alguien y no se quede sólo en "papel".
He leído el artículo que has enlazado y me ha dejado impresionado!. Tanto que he hecho una pequeña prueba con mi servidor debian en vmware que utilizo para cacharrear. Me han funcionado perfectamente todos los pasos que indican en el artículo. Para comprobar que todo ha ido bien, una vez montado el raid1 he creado un par de archivos aleatorios y he calculado su cksum y todo coincide luego.
Por si te animas a hacerlo, te dejo algunas recomendaciones:
- Haz backup de los datos de raid por si acaso, nunca se sabe.
- El paso final de comprobar el filesystem y redimensionarlo, hazlo con éste desmontado. Hay sistemas de archivos que lo permiten hacer "al vuelo", pero ext3 NO es uno de ellos.
Y lo dicho, que muchas gracias por el comentario y por el enlace y si te surge cualquier duda ya sabes donde estoy.
Saludos, Iván.
Publicar un comentario en la entrada