viernes, 19 de octubre de 2007

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:
    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
    ...
  • 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.
    shian:~# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
    mdadm: size set to 1044096K
    mdadm: array /dev/md1 started.
  • 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:
    shian:~# mknod /dev/md0 b 9 0
    shian:~# mknod /dev/md1 b 9 1
    shian:~# mknod /dev/md2 b 9 2
    ...
  • Si miramos el fichero /proc/mdstat nos fijamos en el que raid está disponible pero sólo con un disco.
    shian:~# cat /proc/mdstat
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sdb1[0]
    1044096 blocks [2/1] [U_]
  • Lo mismo ocurre si mostramos la información del raid:
    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
  • 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.
    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
  • 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).
    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
    ...
  • Y ahora añadimos al raid /dev/md1 la partición que acabamos de crear:
    shian:~# mdadm --manage /dev/md1 --add /dev/sda1
    mdadm: added /dev/sda1
  • Después de un tiempo el raid estará reconstruido con toda nuestra información a salvo en ambos discos:
    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]
  • El paso final es actualizar el archivo de configuración /etc/mdadm/mdadm.conf con el nuevo raid.
    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
  • Y añadir al archivo /etc/fstab el montaje automático del raid en el arranque.
    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 :-).

    12 comentarios:

    Anónimo dijo...

    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 :)

    Anónimo dijo...

    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

    Iván dijo...

    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.

    Anónimo dijo...

    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...

    Iván dijo...

    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 ;-)

    Anónimo dijo...

    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?

    Anónimo dijo...

    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?

    Iván dijo...

    [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.

    Javier Ros Moreno dijo...

    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.

    Iván dijo...

    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.

    Luis Rodriguez dijo...

    Luis

    hola buen día

    he leído todo lo que esta en tu bloc incluso los comentarios y me ha parecido muy interesante

    solo que tengo 2 dudas

    1-primero como seria lo de implementar el lvm en vez del raid y el lvm en un raid

    2- en el comentario de Javier ros deja este link http://scott.wallace.sh/node/1521
    para consulta el asunto es que cuando uno entra a dicho link sale
    Page not found
    ustedes saben si la pagina cambio si el link esta mal o de pronto si alguien copio el articulo por favor lo pueden compartir

    gracias

    Iván dijo...

    Hola Luis,

    gracias, me alegro de que te guste el blog. Respondiendo a tus preguntas:
    1.- Primero tendrías que crear el LVM y luego el raid sobre ese dispositivo en lugar de sobre sda1 o lo que sea. En este artículo hablo sobre LVM: http://lopezivan.blogspot.com.es/2007/04/linux-y-lvm.html
    2.- Lo siento, no tengo ese link.

    Saludos, Iván.

    Publicar un comentario