Migrar a RAID 1 sin pérdida de datos

Introducción

Este es un expermiento que voy a intentar a hacer en mi Ubuntu Server casero en producción, a ver si soy capaz sin cargarme la instalación que ya tengo y todo lo que conlleva (nagios, dns, dhcp, webmin, fail-over tarjeta de red, servidor proxy, etc…). Así que iré apuntando los pasos que voy dando por si tengo que hacer un flash-back :-)
Ni que decir tiene, que hago copia periódica diaria de los directorios de configuración, así como del home (/etc, /var/log, /home, etc…) en un disco duro externo.

Configuración nuevo disco espejo

  • Instalamos el disco duro secundario del mismo tipo que el que ya tenemos en nuestro equipo (no tienen por qué ser exactamente iguales aunque sí deben serlo las particiones que creemos en raid 1). En mi caso, los dos discos duros están en el único IDE que trae la placa (el resto son SATA).
  • Arrancamos y verificamos que ya tenemos los dos discos duros detectados por la BIOS y por el servidor Ubuntu.

A partir de ahora las órdenes son como root, por lo que podemos hacer:

su -

para trabajar todo el rato como root. Vemos como están distribuídas las particiones en los dos discos ahora mismo:

$ fdisk -l
  • Y nos deben aparecer los dos discos duros y sus respectivas particiones.
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xbb01bb01

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9698    77899153+  8e  Linux LVM
/dev/sda2            9699        9729      249007+   5  Extended
/dev/sda5            9699        9729      248976   83  Linux

Disk /dev/sdb: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x949e949e

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1        9963    80027766    7  HPFS/NTFS

Como vemos, el primer disco tiene 3 particiones:

  • Una primaria de tipo LVM que almacena el /
  • Una extendida que consta de una lógica de tipo Linux que almacena el /boot, el cual se monta via fstab en el /.

Esto me ha originado numerosos problemas al no ser los discos del mismo tamaño, y no poder crear el mismo tamaño para las particiones. Para evitar estos problemas, lo mejor es hacer lo siguiente:

  1. Crear en el disco nuevo, una partición del mismo tamaño que la que tenemos para el /, es decir de igual tamaño que /dev/sda1.
  2. Copiar el contenido de /boot a un directorio auxiliar, desmontar /dev/sda5 y copiar el contenido a /boot. Una vez hecho esto, ya podemos eliminar las particiones /dev/sda2 y /dev/sda5 ya que el directorio /boot ha sido copiado conveniente al directorio raíz.
  3. Asimismo, habrá que cambiar la entrada en el fichero menu.lst para que apunte a (hd0,0) ya que estaria apuntando a (hd0,4) que era el /boot inicial.
  • A continuación, creamos las particiones para el disco /dev/sdb de está forma:
fdisk /dev/sdb

Y nos debe quedar la partición con el mismo tamaño que la de /dev/sda1, pero cambiando el tipo a Linux raid autodetect. Los comandos utilizados y el orden seguido (dentro de fdisk /dev/sdb), han sido:

p: imprimir el menú de ayuda de fdisk
d: borrar la partición original  (sdb1)
n: crear una nueva partición primaria (sdb1) (con inicio en cilindro 1 y final en 9698).
t: cambiar el tipo de partición a "fd" (Linux raid autodetect)
w: escribir los cambios en la tabla de particiones
q: salir

Si ahora vemos las particiones en el 2º disco con el comando:

$ fdisk /dev/sdb

nos debe quedar así:

Disk /dev/sdb: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x949e949e

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        9698    77899153+  fd  Linux raid autodetect
  • Reiniciamos el equipo
$ shutdown -r now

Instalación paquetes de administración del RAID

  • Instalamos los paquetes necesarios para utilizar el raid
sudo apt-get install mdadm initramfs-tools

Creación del dispositivo RAID

  • Intentamos crear el raid:
$  mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 missing /dev/sdb1

Si nos da el error siguiente:

mdadm: error opening /dev/md0: No such device or address

Carga del módulo md en el arranque

Es porque no está cargado el módulo md, así que hacemos lo siguiente:

$ modprobe md

Y volvemos a repetir la orden anterior:

$  mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 missing /dev/sdb1

Ahora sí nos debe decir algo así:

mdadm: size set to 77899072K
mdadm: array /dev/md0 started.

Verificamos que todo está correcto (el raid creado en estado degradado) con la siguiente orden:

$ cat /proc/mdstat

Personalities : [raid1] 
md0 : active raid1 sdb1[1]
      77899072 blocks [2/1] [_U]
  • Para que no haya que cargar a mano el módulo md y lo haga automáticamente en el arranque, lo añadimos al fichero /etc/modules:
$ echo md>>/etc/modules

Actualización fichero /etc/mdadm/mdadm.conf

El fichero /etc/mdadm/mdadm.conf necesita ser actualizado para que el array creado se conozca en el arranque. Esto también es necesario para el fichero de imagen del grub. Esta línea se obtiene con el siguiente comando:

$ mdadm --examine --brief --scan --config=partitions

Y el resultado (en mi caso) es este:

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=539509fd:eefaa068:095b3551:8fa3a5e9

Esta línea la añadimos en el fichero /etc/mdadm/mdadm.conf al final, después de las líneas de comentarios:

$ mdadm --examine --brief --scan --config=partitions >>/etc/mdadm/mdadm.conf

Y a continuación actualizamos la RAM drive image, para que detecte y cargue el nuevo raid en el arranque:

$ update-initramfs -k `uname -r` -c -t

Ahora ya podemos reiniciar y SIEMPRE la orden:

$ cat /proc/mdstat

Nos debe devolver el raid creado (esté o no en estado degradado):

Personalities : [raid1] 
md0 : active raid1 sdb1[1]
      77899072 blocks [2/1] [_U]

Asignación de un dispositivo a un RAID ya creado

Si este comando no devuelve los raids creados, es porque o no está correctamente actualizado el fichero /etc/mdadm/mdadm.conf o no está actualizada la RAM drive image. Para volverlos a asignar (porque ya están creados pero no asignados y la orden mdadm —create volvería a crear nuevos UUID para cada array), ejecutamos los siguientes comandos:

$ mdadm --assemble /dev/md0 /dev/sdb1

Y volvemos a verificar que el raid está correctamente asignado con el comando cat /proc/mdstat. Posteriormente, se verifica nuevamente el fichero etc/mdadm/mdadm.conf y se actualiza la RAM drive image.

Asignación de un nuevo sistema de ficheros

  • Ahora necesitamos poner un sistema de ficheros en la partición raíz del nuevo RAID 1. Yo utilizo ext3 así que el comando es:
$ mkfs.ext3 -L root_raid1 /dev/md0

Copia de datos del origen al raid 1

  • Ahora ya podemos transferir los datos del disco inicial al de raid1 "degradado". Para ello, nos vamos a modo monousuario:
$ telinit 1
  • Montamos el nuevo sistema de ficheros recién creado:
$ mkdir /mnt/new-raid
$ mount /dev/md0 /mnt/new-raid
  • Copiamos los datos del disco original al raid 1 "degradado" con rsync
$ rsync -avH --delete --progress -x / /mnt/new-raid

Actualizar el fstab

  • Ahora editamos el fichero fstab pero del raid 1!!!:
$ vi /mnt/new-raid/etc/fstab
  • Y comentamos las líneas antiguas (de /dev/sda1 y /dev/sda5) y ponemos la nueva para /dev/md0:
/dev/md0        /    ext3        notail, relatime    0 2

Actualizar GRUB

  • También tenemos que modificar el menu.lst, pero del raid 1!!!!:
$ vi /mnt/new-raid/boot/grub/menu.lst
  • Y añadir las entradas nuevas:
title Ubuntu 8.10, kernel 2.6.27-11-server RAID1
root    (hd1,0)
kernel /boot/vmlinuz-2.6.27-11-server root=/dev/md0 ro quiet splash
initrd /boot/initrd.img-2.6.27-11-server
quiet

title Ubuntu 8.10, kernel 2.6.27-11-server RAID! (primer disco)
root    (hd0,0)
kernel /boot/vmlinuz-2.6.27-11-server root=/dev/md0 ro quiet splash
initrd /boot/initrd.img-2.6.27-11-server
quiet
  • Ahora ya podemos decirle a grub que arranque del segundo disco:
grub
root(hd1,0)
setup(hd0)
setup(hd1)
  • Para saber en qué sistema estamos arrancado, creamos un par de ficheros, uno en cada sistema:
$ touch /mnt/new-raid/estamos_en_raid_degradado
$ touch estamos_en_sda1

Arrancar desde el nuevo raid

  • Arrancamos el sistema y con la opción seleccionada de RAID1, vemos si el fichero que tenemos creado en el raíz es estamos_en_raid_degradado, comprobando que el servidor funciona adecuadamente como antes de utilizar raid.

Añadir el disco original al raid

  • Ahora es el momento de borrar las particiones de /dev/sda y añadir el disco original al array.

Borrar y particionar el disco original

$ fdisk /dev/sda

Y en el menú, elegimos:

d: borramos la partición 2
t: cambiamos el tipo de la primera a "fd"=>Linux raid autodetect
w: escribimos los cambios en el sistema

Reiniciamos el equipo de nuevo:

$ shutdown -r now

Añadir el disco al raid

Y ahora añadimos el disco que faltaba al raid:

$ mdadm --add /dev/md0 /dev/sda1

Y para ver el progreso de la reconstrucción del raid, ejecutamos:

$ watch -n 7 cat /proc/mdstat

Y vemos el progreso de la reconstrucción:

Every 7,0s: cat /proc/mdstat                            Sat Aug 29 11:05:58 2009

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [ra
id10]
md0 : active raid1 sdb1[2] sda1[0]
      77899072 blocks [2/1] [U_]
      [==================>..]  recovery = 91.3% (71158272/77899072) finish=4.1mi
n speed=26940K/sec

unused devices: <none>

Actualización del grub

  • Ahora que ya tenemos trabajando el raid 1, actualizamos el grub para que podamos arrancar de un disco o de otro:
grub
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
  • Y ya se pueden hacer las pruebas que queramos para comprobar que el raid está funcionando. En mi caso, desenchufé la corriente de uno de los discos, y en ese caso, tengo que arrancar con la segunda opción del raid en el menú del grub (la que tira de hd0), y me da un aviso de que si quiero arrancar con raid degradado. Si no le decimos que sí, nos sacará una BusyBox…. Para evitar que nos pregunte cada vez que algún disco tenga un problema y tenga que arrancar en modo degradado, él mismo nos sugiere la opción de añadir en los parámetros de arranque del kernel la opción:
bootdegraded=true
  • IMPORTANTE: En el caso de que arranquemos en modo degradado, cuando conectemos de nuevo el disco, deberá ser reconstruido el raid y deberemos añadir el disco que se quitó. Para saber cuál es ejecutamos la siguiente orden:
$mdadm --detail /dev/md0

Y el que acabamos de conectar, nos dirá que está en modo:

$ faulty removed

Por tanto, debemos añadirlo de nuevo y él se encargará de reconstruirlo. Para añadirlo (en mi caso fue /dev/sdb1):

$ mdadm --add /dev/md0 /dev/sdb1

Y para ver la reconstrucción, como hemos dicho antes: watch -n 7 cat /proc/mdstat.

  • Y ya tenemos nuestro servidor Ubuntu en raid 1 sin haber perdido ni datos, ni servicios ni configuraciones!!!!

Particiones finales y ficheros de configuración

  • Disco /dev/sda
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0009e559

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        9698    77899153+  fd  Linux raid autodetect
  • Disco /dev/sdb
Disk /dev/sdb: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x949e949e

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        9698    77899153+  fd  Linux raid autodetect
  • Fichero /boot/grub/menu.lst
......
title           Ubuntu 8.10, kernel 2.6.27-7-server RAID1
root            (hd1,0)
kernel          /boot/vmlinuz-2.6.27-7-server root=/dev/md0 ro quiet splash
initrd          /boot/initrd.img-2.6.27-7-server
quiet

title           Ubuntu 8.10, kernel 2.6.27-7-server RAID1 (primer disco)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.27-7-server root=/dev/md0 ro quiet splash
initrd          /boot/initrd.img-2.6.27-7-server
quiet
.........
  • Fichero /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/md0
/dev/md0 / ext3 relatime,errors=remount-ro 0 1

/dev/sr0   /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
/dev/sdc1       /media/hd500GB  ntfs-3g,user,auto,exec,utf8 0 0

Referencias

http://ubuntuforums.org/showthread.php?t=1027240

http://wiki.archlinux.org/index.php/Convert_a_single_drive_system_to_RAID

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License