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.
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.
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
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.
Carga de elementos necesarios para el inicio del sistema
Definición de nombre del equipo
Selección de unidad con el sistema raiz
Selección de ejecución de shell en la unidad con el raiz
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 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 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.