Pasar de un linux corriendo en un disco a dos discos en RAID 1

El procedimiento se desarrollo para ser implementado en un servidor en producción instalado con un solo disco se desea obtener un arreglo RAID 1 por software para tener redundancia en los datos.  Debido a la escasa ventana de mantenimiento, volumen de información contenida en el mismo y el tiempo que llevo configurar todos los servicios, reinstalar no es la mejor de las opciones.

Requerimientos:

Un equipo corriendo linux.  Un disco libre de igual o mayor capacidad al que se encuentra en uso en el sistema, instalado en el equipo.

Conocimientos intermedios de linux.  Particionado de discos y configuración de Grub.

Procedimiento:

Como para llevar adelante esta actividad se deben ejecutar actividades como ROOT casi en forma continua lo más práctico es invocar el comando "su -" para evitar estar escribiendo sudo todo el tiempo.

< sudo su -

Se debe actualizar el sistema para trabajar con la última versión de las utilidades para el manejo de discos y kernel.

< apt-get update
< apt-get upgrade

Finalizada la actualización se debe instalar "mdadm"

< apt-get install -y mdadm

A continuación se procederá a ver el estado del disco que se encuentra en uso por el sistema (sda).

< fdisk -l /dev/sda
> Disk /dev/sda: 10.7 GB, 10737418240 bytes
> 255 heads, 63 sectors/track, 1305 cylinders
> Units = cylinders of 16065 * 512 = 8225280 bytes
> Disk identifier: 0x0009b6c1
>
> Device Boot      Start         End      Blocks   Id  System
> /dev/sda1               1         122      979933+  82  Linux swap / Solaris
> /dev/sda2   *         123         184      498015   83  Linux
> /dev/sda3             185         549     2931862+  83  Linux
> /dev/sda4             550        1305     6072570   83  Linux

Se copia la tabla de particiones y el sector de arranque de un disco al otro.  Se puede hacer con sfdisk, pero con dd también se pasa el arranque del Grub que se aloja en el MBS

< dd if=/dev/sda of=/dev/sdb bs=512 count=1

Se verifica el estado de las particiones del disco nuevo (sdb).  Donde se observa la correcta transferencia de las particones.

< fdisk -l /dev/sdb
> Disk /dev/sdb: 10.7 GB, 10737418240 bytes
> 255 heads, 63 sectors/track, 1305 cylinders
> Units = cylinders of 16065 * 512 = 8225280 bytes
> Disk identifier: 0x00000000
>
>   Device Boot      Start         End      Blocks   Id  System
> /dev/sdb1               1         122      979933+  82  Linux swap / Solaris
> /dev/sdb2   *         123         184      498015   83  Linux
> /dev/sdb3             185         549     2931862+  83  Linux
> /dev/sdb4             550        1305     6072570   83  Linux

Se deben modificar el tipo de las particiones del disco sdb para que puedan formar parte del raid.   Esto se hace con el comando "fdisk".

< fdisk /dev/sdb
> The number of cylinders for this disk is set to 1305.
> There is nothing wrong with that, but this is larger than 1024,
> and could in certain setups cause problems with:
> 1) software that runs at boot time (e.g., old versions of LILO)
> 2) booting and partitioning software from other OSs
> (e.g., DOS FDISK, OS/2 FDISK)

Para cambiar el tipo de la particion se debe ejecutar el comando t dentro del prompt que brinda el fdisk.  En este caso se selecciona la particion "2" y se asigna el tipo de particion "fd".

> Command (m for help): 
< t
> Partition number (1-4):
< 2
> Hex code (type L to list codes):
< fd
> Changed system type of partition 2 to fd (Linux raid autodetect)

Lo mismo para la partición 3 del disco.

> Command (m for help): 
< t
> Partition number (1-4):
< 3
> Hex code (type L to list codes):
< fd
> Changed system type of partition 3 to fd (Linux raid autodetect

Y por último para la partición 4 del disco.

> Command (m for help): 
< t
> Partition number (1-4):
< 4
> Hex code (type L to list codes):
< fd
> Changed system type of partition 4 to fd (Linux raid autodetect)

Se verifica el estado del particionado del disco.  Donde se observa la primer particion de "Linux swap / Solaris", y las 3 siguientes del tipo "Linux raid autodetect"

> Command (m for help): 
< p
> Disk /dev/sdb: 10.7 GB, 10737418240 bytes
> 255 heads, 63 sectors/track, 1305 cylinders
> Units = cylinders of 16065 * 512 = 8225280 bytes
> Disk identifier: 0x00000000
>   Device Boot      Start         End      Blocks   Id  System
> /dev/sdb1               1         122      979933+  82  Linux swap / Solaris
> /dev/sdb2   *         123         184      498015   fd  Linux raid autodetect
> /dev/sdb3             185         549     2931862+  fd  Linux raid autodetect
> /dev/sdb4             550        1305     6072570   fd  Linux raid autodetect

Verificado los datos, se procede a salvar los mismos.

> Command (m for help):
< w
> The partition table has been altered!
> Calling ioctl() to re-read partition table.
> Syncing disks.

Se procede a crear las unidades raid.  Las mismas se van a crear en estado degradado (con un solo componente en el RAID 1), esto nos va a permitir copiar las cosas del disco de origen al disco destino en las unidades raid.

< mdadm --create /dev/md0 --level=1 --raid-devices=2 missing --force /dev/sdb2
< mdadm --create /dev/md1 --level=1 --raid-devices=2 missing --force /dev/sdb3
< mdadm --create /dev/md2 --level=1 --raid-devices=2 missing --force /dev/sdb4

Se formatean las unidades para que puedan ser utilizadas por el sistema.  La primer unidad sera utilizada para swap (sdb1).  Las restantes (md0, md1, md2) para sistemas de archivos ext3.

< mkswap /dev/sdb1
< mkfs.ext3 /dev/md0
< mkfs.ext3 /dev/md1
< mkfs.ext3 /dev/md2

Se utilizarán las unidades mdx con el mismo criterio con el que se habían asignado originalmente

  • md0 → boot
  • md1 → root
  • md2 → var

Se procede a la carga de la información de las unidades RAID al mdadm.conf

< mdadm -Es >>/etc/mdadm/mdadm.conf

Se deben obtener los UUID de las unidades nuevas para configurar correctamente el fstab.

< blkid /dev/sdb1
> /dev/sdb1: UUID="ba7af7de-7583-4358-b8f9-5dae91c486f0" TYPE="swap"
< blkid /dev/md0
> /dev/md0: UUID="f25cd7e6-7025-4133-b3c5-cb81f028b6a3" TYPE="ext3"
< blkid /dev/md1
> /dev/md1: UUID="5f2a9304-cccb-4269-ae1a-216835f184f7" TYPE="ext3"
< blkid /dev/md2
> /dev/md2: UUID="d1bf472b-1a6c-4a8b-95b3-ea289f8ba525" TYPE="ext3"

Se verifica el archivo "fstab" actual.

< cat /etc/fstab 
> # /etc/fstab: static file system information.
> #
> # <file system> <mount point>   <type>  <options>       <dump>  <pass>
> proc            /proc           proc    defaults        0       0
> # /dev/sda3
> UUID=c9501df9-3201-412f-84a8-52c58676c674 /               ext3    relatime,errors=remount-ro 0       1
> # /dev/sda2
> UUID=752bdea4-b2f1-4329-aacf-d76404032c79 /boot           ext3    relatime        0       2
> # /dev/sda4
> UUID=a201a497-ab5c-4b68-8ef4-777853f01bfb /var            ext3    relatime        0       2
> # /dev/sda1
> UUID=b18e9c65-3d74-47aa-8239-5c996c0ad34b none            swap    sw              0       0

Se debe editar el fstab para que se monten las unidades de los dispositivos raid (y no desde las particiones del disco).  Se mantiene el swap del disco "sda" y se debe agregar la partición swap "sdb".

< vi /etc/fstab

Para que quede la siguiente forma.  Se debe utilizar el UUID de los dispositivos generados en el equipo (este valor es unico en cada partición, si copian los del tutorial seguro no va a funcionar).

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/md1
UUID=5f2a9304-cccb-4269-ae1a-216835f184f7       /               ext3    relatime,errors=remount-ro 0       1
# /dev/md0
UUID=f25cd7e6-7025-4133-b3c5-cb81f028b6a3       /boot           ext3    relatime        0       2
# /dev/md2
UUID=d1bf472b-1a6c-4a8b-95b3-ea289f8ba525       /var            ext3    relatime        0       2
# /dev/sda1
UUID=b18e9c65-3d74-47aa-8239-5c996c0ad34b       none            swap    sw              0       0
# /dev/sdb1
UUID=ba7af7de-7583-4358-b8f9-5dae91c486f0       none            swap    sw              0       0

Se debe editar el Grub para que utilice de punto de montaje el dispositivo "md1"

< vi /boot/grub/menu.lst

Los  valores a cabiar son la línea donde se define la partición root del sistema.

# kopt=root=UUID=c9501df9-3201-412f-84a8-52c58676c674 ro

Para que utilice el "/dev/md1"

# kopt=root=/dev/md1 ro

Y las entradas para el inicio de los disintos kernels, para que queden de la siguiente forma (el valor en negrita es el modificado).

## ## End Default Options ##

title           Ubuntu 8.04.3 LTS, kernel 2.6.24-24-server
root            (hd0,1)
kernel          /vmlinuz-2.6.24-24-server root=/dev/md1 ro quiet splash
initrd          /initrd.img-2.6.24-24-server
quiet

title           Ubuntu 8.04.3 LTS, kernel 2.6.24-24-server (recovery mode)
root            (hd0,1)
kernel          /vmlinuz-2.6.24-24-server root=/dev/md1 ro single
initrd          /initrd.img-2.6.24-24-server

title           Ubuntu 8.04.3 LTS, memtest86+
root            (hd0,1)
kernel          /memtest86+.bin
quiet

### END DEBIAN AUTOMAGIC KERNELS LIST

Se procede a editar el archivo "/etc/udev/rules.d/85-mdadm.rules" para permitir que el sistema pueda inciar con el raid degradado (en caso de que falle un disco).

< vi /etc/udev/rules.d/85-mdadm.rules

Se debe modificar la línea

SUBSYSTEM=="block", ACTION=="add|change", ENV{IDFSTYPE}=="linux_raid*", \
       RUN+="watershed /sbin/mdadm --assemble --scan --no-degraded"

Para que quede de la siguiente forma.

SUBSYSTEM=="block", ACTION=="add|change", ENV{IDFSTYPE}=="linux_raid*", \
       RUN+="watershed /sbin/mdadm --assemble --scan --run"

Para actualizar la imagen de incicio del kenrel y que el grub pueda ver los dispositivos creados se debe ejecutar el siguiente comando:

< update-initramfs -u -k all

Finalizado este procedimiento se debe reinicar el equipo con el disco de instalación y la opción rescate.

Selección de modo rescateSelección de modo rescate

Selección de idiomaSelección de idioma

Selección de paisSelección de pais

Selección de tecladoSelección de teclado

Carga de elementos necesarios para el inicio del sistemaCarga de elementos necesarios para el inicio del sistema

Definición de nombre del equipoDefinición de nombre del equipo

Selección de unidad con el sistema raizSelección de unidad con el sistema raiz

Selección de ejecución de shell en la unidad con el raizSelección de ejecución de shell en la unidad con el raiz

Aviso para montar sistemas adicionales al raiz (root)Aviso para montar sistemas adicionales al raiz (root)

Se debe proceder a seleccionar idioma, pais y teclado; el sistema cargara los componentes necesarios del cdrom; se debe definir el nombre del sistema.

Finalizado el proceso de carga de componentes, el sistema preguntara que unidad se desea delacionar para monstarse como root.  En este caso se debe selecionar "/dev/sda3".

A continuación se debe selecionar la opción "ejecutar shell en /dev/sda3"

el primer comando a ejecutar es el shell de bash para tener un entorno lo más parecido posible al que se utiliza normalmente.

< /bin/bash

A continuación se deben montar los sistemas de archivos en las particiones del disco original para hacer la copias de las mismas en el raid.

< mount /dev/sda2 /boot
< mount /dev/sda4 /var

Se debe crear los puntos de montaje para los dispositivos md y proceder al montaje de los mismos.

< mkdir -p /media/md0
< mkdir -p /media/md1
< mkdir -p /media/md2
< mount /dev/md0 /media/md0
< mount /dev/md1 /media/md1
< mount /dev/md2 /media/md2

Se procede a replicar la información de las distinas particiones a los dispositivos raid.

< rsync -aHv /boot/ /media/md0
< rsync -aHv / /media/md1
--exclude=/var/* \
--exclude=/boot/* \
--exclude=/proc/* \
--exclude=/sys/* \
--exclude=/media/*
< rsync -aHv /var/ /media/md2  --exclude=tmp/*

Finalizado este procedimiento, se debe salir al asistente de rescate (el comando exit dos  veces) y reiniciar el equipo. 

Se debe selecionar esta opción para reiniciar el equipoSe debe selecionar esta opción para reiniciar el equipo

Se debe volver a iniciar el sistema con el disco de rescate, pero cuado el sistema pregunte que unidad se desea delacionar para monstarse como root.  En este caso se debe selecionar "/dev/md1".

A continuación se debe selecionar la opción "ejecutar shell en /dev/md1"

Selección de unidad md1 con el sistema raiz para la ejecución del shellSelección de unidad md1 con el sistema raiz para la ejecución del shell

el primer comando a ejecutar es el shell de bash para tener un entorno lo más parecido posible al que se utiliza normalmente.

< /bin/bash

Se deben modificar el tipo de las particiones del disco sda para que puedan formar parte del raid.   Esto se hace con el comando "fdisk".

< fdisk /dev/sda
> The number of cylinders for this disk is set to 1305.
> There is nothing wrong with that, but this is larger than 1024,
> and could in certain setups cause problems with:
> 1) software that runs at boot time (e.g., old versions of LILO)
> 2) booting and partitioning software from other OSs
> (e.g., DOS FDISK, OS/2 FDISK)

Para cambiar el tipo de la particion se debe ejecutar el comando t dentro del prompt que brinda el fdisk.  En este caso se selecciona la particion "2" y se asigna el tipo de particion "fd".

> Command (m for help):
< t
> Partition number (1-4):
< 2
> Hex code (type L to list codes):
< fd
> Changed system type of partition 2 to fd (Linux raid autodetect)

Y por último para la partición 3 del disco.

> Command (m for help):
< t
> Partition number (1-4):
< 3
> Hex code (type L to list codes):
< fd
> Changed system type of partition 3 to fd (Linux raid autodetect)

Y por último para la partición 4 del disco.

> Command (m for help):
< t
> Partition number (1-4):
< 4
> Hex code (type L to list codes):
< fd
> Changed system type of partition 4 to fd (Linux raid autodetect

Se verifica el estado del particionado del disco.  Donde se observa la primer particion de "Linux swap / Solaris", y las 3 siguientes del tipo "Linux raid autodetect"

> Command (m for help): 
< p
> Disk /dev/sdb: 10.7 GB, 10737418240 bytes
> 255 heads, 63 sectors/track, 1305 cylinders
> Units = cylinders of 16065 * 512 = 8225280 bytes
> Disk identifier: 0x00000000
>    Device Boot      Start         End      Blocks   Id  System
> /dev/sda1               1         122      979933+  82  Linux swap / Solaris
> /dev/sda2   *         123         184      498015   fd  Linux raid autodetect
> /dev/sda3             185         549     2931862+  fd  Linux raid autodetect
> /dev/sda4             550        1305     6072570   fd  Linux raid autodetect

Verificados los datos, se procesede a salvar los mismos.

> Command (m for help): 
< w
> The partition table has been altered!
> Calling ioctl() to re-read partition table.
> Syncing disks.

Se agregan las particiones del disco sda a los dispositivos raid creados anteriormente.  Esto les brindará redundancia a los datos contenidos en las unidades raid (que recuperarán la integridad).

< mdadm -a /dev/md0 /dev/sda2
< mdadm -a /dev/md1 /dev/sda3
< mdadm -a /dev/md2 /dev/sda4

Se debe esperar a que se sincronicen las unidades del raid.  Se puede ver el avance ejecutando el comando

< cat /proc/mdstat

Mostra el estado de la sincronización.

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md2 : active raid1 sda4[2] sdb4[1]
      4602496 blocks [2/1] [_U]
          resync=DELAYED
     
md1 : active raid1 sda3[2] sdb3[1]
      4883648 blocks [2/1] [_U]
      [======>..............]  recovery = 30.0% (1467200/4883648) finish=5.7min speed=9854K/sec

md0 : active raid1 sda2[0] sdb2[1]
      497920 blocks [2/2] [UU]

unused devices: <none>

Cuando finalice la sincronización se debe ver así.

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md2 : active raid1 sda4[0] sdb4[1]
      4602496 blocks [2/2] [UU]
     
md1 : active raid1 sda3[0] sdb3[1]
      4883648 blocks [2/2] [UU]
     
md0 : active raid1 sda2[0] sdb2[1]
      497920 blocks [2/2] [UU]

unused devices: <none>

Para interrumpir la ejecución del watch debe ingresarl "ctrl+c".

Finalizada la sincronización se debe salir del shell (con el comando "exit" 2 veces) y reinicar el equipo.

El equipo iniciará normalmente con las unidades raid funconando.