Table of Contents
|
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:
- 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.
- 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.
- 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