RAID y LVM en Linux

De Wiki de BandaAncha.eu
Saltar a: navegación, buscar
Sobre este documento
Tipo Manual (How To)
Categoria Linux
Plataforma All GNU/Linux
Dificultad TuxTuxTuxTux

En esta guía vamos a explicar como configurar un RAID y un LVM para un sistema GNU/Linux. Partiendo de dos discos duros montaremos el siguiente sistema:

  • RAID tipo 1 que nos permitirá mantener los datos mas críticos en dos particiones en espejo, en el caso de fallar uno de los discos no perderíamos datos.
  • LVM que nos permite unir varios discos en un volumen lógico, si nos quedamos sin espacio podemos añadir otro disco duro y unir este espacio al LVM en caliente.

Instalar las herramientas necesarias

sudo apt-get install mdadm
sudo apt-get install lvm2

Tabla de particiones inicial

/dev/sda1 /               jfs    10GB  ---> Sistema Operativo
/dev/sda2 none            swap   1GB   ---> Swap
/dev/sda3 /media/hda3     jfs    15GB  ---> RAID
/dev/sda4 /media/hda4     jfs    125GB ---> LVM
/dev/sdb1 /media/hdc1     jfs    15GB  ---> RAID
/dev/sdb2 /media/hdc2     jfs    45GB  ---> LVM

El primer disco (sda) lo tenemos dividido en 4 particiones: raiz, swap, una para el RAID (/media/hda3) y el espacio restante para añadir al LVM (/media/hda4) EL segundo disco (sdb) esta dividido en dos particiones, la primera (media/hdc1) sera el otro disco del RAID y el espacio restante (/media/hdc2) lo uniremos al LVM


RAID

Antes de empezar debemos colocar a las particiones que van a formar parte del RAID el flag fd (linux raid auto). Esto se puede hacer desde fdisk o desde gparted. Las 2 particiones que van a formar nuestro RAID deben ser del mismo tamaño. Para crear el RAID las particiones tienen que estar desmontadas:

umount /dev/sda3
umount /dev/sdb1

Luego creamos el RAID en /dev/md0

sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb1

--create /dev/md0 sera el nombre del RAID que estamos creando

--level=1 le indicamos que tipo de RAID estamos creando, en este caso RAID1

--raid-devices=2 el numero de dispositivos que forman el RAID

/dev/sda3 /dev/sdb1... la lista de dispositivos que forma parte del RAID


Formateamos el RAID y lo montamos (En mi caso el sistema de archivos sera jfs)

sudo mkfs.jfs /dev/md0
sudo mkdir /media/Personal
sudo mount /dev/md0 /media/Personal

Con esto ya tendríamos el RAID funcionando, solo queda modificar el fichero /etc/fstab para que no monte las particiones /media/hda3 y /media/hdc1 y nos monte la partición /media/Personal


LVM

Las particiones que formaran el LVM tienen que tener el flag 8e (Linux VM). Las particiones que van a formar el LVM también deben estar desmontadas:

umount /dev/sda4
umount /dev/sdb2

Con el comando pvcreate marcamos los volúmenes para meterlos en el LVM:

sudo pvcreate /dev/sda4
sudo pvcreate /dev/sdb2

Y después creamos el VG (Grupo de Volúmenes) al que hemos llamado lvm

sudo vgcreate lvm /dev/sda4 /dev/sdb2

Ahora añadimos los volúmenes lógicos (LV) dentro del LVM... es como si hiciéramos particiones del Grupo de volúmenes. En este caso solo creare una partición a la que asignare todo el espacio.

Si queremos crear mas particiones para saber de cuanto espacio disponemos podemos ejecutar el comando vg display que nos devuelve información acerca del lvm

sudo vgdisplay lvm

Antes de crear el LV debemos cargar el modulo Device mapper driver:

sudo modprobe dm-mod 

Ahora creamos el LV:

sudo lvcreate -n Datos -l 100%VG  lvm

-n Datos sera el nombre del LV

-l Puedes especificar el tamaño en porcentaje del VG, en este caso he dejado para el LV el 100% del VG, ya que quiero que todo aparezca como un unico disco.

-L Esta opción nos permitiría especificar el tamaño en Kb, Mb, Gb del LV, por ejemplo -L250G (crea un LV de 250GB)

Por ultimo formateamos, montamos y listo (el LV lo crea en la ruta /dev/lvm):

sudo mkfs.jfs /dev/lvm/Datos
sudo mkdir /media/Datos
sudo mount /dev/lvm/Datos /media/Datos

También seria necesario modificar el fichero /etc/fstab para que no monte las particiones /media/hda4 y /media/hdc2 y nos monte la partición /media/Datos

Aumentar el LVM

Si añadimos mas discos al LVM podemos extender de tamaño todos los volúmenes lógicos que tengamos creados, primero creamos el nuevo dispositivo que va a añadirse al LVM (recuerda que debe tener el flag 8e):

sudo pvcreate /dev/dispositivo_a_añadir

Ahora añadimos este disco al VG, con lo que ya disponemos de mas espacio para repartir entre los volúmenes lógicos (/dev/lvm/Datos)

vgextend lvm /dev/dispositivo_a_añadir

Por (pen)último repartimos este espacio según nuestras necesidades, por ejemplo aumentamos el tamaño de /media/Datos en 20GB procedentes del dispositivo que acabamos de añadir

lvextend -L+20G /dev/lvm/Datos /dev/dispositivo_a_añadir

Finalmente, después de haber extendido el volumen lógico es necesario aumentar el tamaño del sistema de ficheros, para que todo encaje. Este procedimiento será distinto en funcion del sistema de ficheros que usemos. En el ejemplo siguiente, se hace lo necesario para JFS:

mount -o remount,resize /media/datos

RAID1 en un sistema ya instalado

Este apartado te servirá para convertir un sistema instalado en un solo disco en un RAID1. Tendra tanto el directorio / como la swap en espejo, por lo que si falla uno de los discos el sistema seguira funcionando sin problemas.

Esta realizado a partir de este manual (en inglés)

Tenemos un sistema ya instalado con /dev/sda1 para / y /dev/sda2 para swap. En el otro disco creamos dos particiones, /dev/sdb1 del mismo tamaño que /dev/sda1 y /dev/sdb2 para swap del mismo tamaño que /dev/sda2 y marcamos las dos particiones creadas con el flag de RAID (fd)

Creamos dos dispositivos de RAID para el sistema de archivos y para la swap. Estos RAID los crearemos en modo degradado, de momento solo añadiremos al RAID los discos que hemos formateado, por lo que las entradas que corresponden al disco /dev/sda las dejamos en missing

sudo mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
sudo mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2

Ahora formateamos los RAID que acabamos de crear

sudo mkfs.jfs /dev/md0
sudo mkswap /dev/md1

Tenemos que modificar el fichero /etc/mdadm/mdadm.conf para lo que ejecutamos

mdadm --examine --scan

Que nos devuelve informacion de nuestro RAID, estas lineas las deberemos añadir al final del fichero mdadm.conf

sudo gedit /etc/mdadm/mdadm.conf
...
ARRAY /dev/md0 level=raid1 num-devices=2 UUI...
ARRAY /dev/md1 level=raid1 num-devices=2 UUI...

Y los montamos, primero creamos el punto de montaje:

sudo mkdir /mnt/md0
sudo mkdir /mnt/md1
sudo mount /dev/md0 /mnt/md0
sudo mount /dev/md1 /mnt/md1

Ahora modificamos el archivo /etc/fstab para que nos monte estas particiones como RAIZ y SWAP Modificamos estas lineas:

/dev/sda1    /               jfs         defaults,errors=remount-ro    	0       1
/dev/sda2    none            swap        sw                      	0       0

Por estas:

/dev/md0    /               jfs         defaults,errors=remount-ro    	0       1
/dev/md1    none            swap        sw                      	0       0


Tambien tenemos que modificar el fichero /etc/mtab, hacemos lo mismo, sustituimos dentro del fichero /dev/sda1 por /dev/md0

Editamos el menu del grub para que arraque el sistema desde la particion RAID:

sudo gedit /boot/grub/menu.lst

Tenemos que duplicar las lineas que nos indica de donde arrancar

title        Ubuntu 8.04, kernel 2.6.24-17-generic
root        (hd0,0)
kernel        /boot/vmlinuz-2.6.24-17-generic root=/dev/sda1 ro quiet splash
initrd        /boot/initrd.img-2.6.24-17-generic
quiet

Y modificamos el primero para que apunte a /dev/md0 en el disco (hd1,0). El segundo lo dejamos apuntando a nuestra particion raiz actual por si no arranca correctamente desde /dev/md0

title        Ubuntu 8.04, kernel 2.6.24-17-generic
root        (hd1,0)
kernel        /boot/vmlinuz-2.6.24-17-generic root=/dev/md0 ro quiet splash
initrd        /boot/initrd.img-2.6.24-17-generic
quiet

title        Ubuntu 8.04, kernel 2.6.24-17-generic
root        (hd0,0)
kernel        /boot/vmlinuz-2.6.24-17-generic root=/dev/sda1 ro quiet splash
initrd        /boot/initrd.img-2.6.24-17-generic
quiet

Ahora actualizamos el ramdisk:

sudo update-initramfs -u

Ya solo nos quedaria copiar todos los datos de / a la nueva particion desde la que va a arrancar ahora:

sudo cp -dpRx / /mnt/md0

Tenemos que configurar correctamente grub en los dos discos:

sudo grub
grub> root (hd1,0)
grub> setup (hd1)

grub> root (hd0,0)
grub> setup (hd0)

Ahora reiniciamos la maquina y arrancara desde el RAID, que esta funcionando en modo degradado ya que solo dispone de un disco. Lo podemos ver con el siguiente comando, la particion /dev/md0 debe estar montada en /

df -h

Ahora que hemos conseguido arrancar el sistema desde el segundo disco es hora de preparar las particiones del primer disco para añadirlo al RAID. Ponemos el flag de RAID (fd) a las particiones /dev/sda1 y /dev/sda2 y podemos añadir /dev/sda1 y /dev/sda2 a su RAID correspondiente

sudo mdadm --add /dev/md0 /dev/sda1
sudo mdadm --add /dev/md1 /dev/sda2

Si compruebas ahora el fichero /proc/mdstat veras que se esta sincronizando el RAID, hay que esperar hasta que finalice:

more /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda1[2] sdb1[1]
      8702093 blocks [2/1] [_U]
      [=====>...............]  recovery = 37.3% (3245881/8702093) finish=2.4min speed=67433K/sec

md1 : active raid1 sda2[0] sdb2[1]
      197920 blocks [2/2] [UU]

Ahora ya lo tenemos correctamente sincronizado:

Personalities : [raid1]
md2 : active raid1 sda1[0] sdb1[1]
     8702093 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      197920 blocks [2/2] [UU]


Volvemos a modificar el fichero /etc/mdadm/mdadm.conf, tenemos que eliminar las lineas que habiamos añadido antes y sustituirlas por las que nos devuelve ahora la ejecucion del comando:

sudo mdadm --examine --scan
...
ARRAY /dev/md0 level=raid1 num-devices=2 UUI...
ARRAY /dev/md1 level=raid1 num-devices=2 UUI...

Debemos modificar de nuevo el grub para que la entrada que apunta todavia a /dev/sda1 apunte a /dev/md0 en el disco (hd0,0)

sudo gedit /boot/grub/menu.lst
title        Ubuntu 8.04, kernel 2.6.24-17-generic
root        (hd1,0)
kernel        /boot/vmlinuz-2.6.24-17-generic root=/dev/md0 ro quiet splash
initrd        /boot/initrd.img-2.6.24-17-generic
quiet

title        Ubuntu 8.04, kernel 2.6.24-17-generic
root        (hd0,0)
kernel        /boot/vmlinuz-2.6.24-17-generic root=/dev/md0 ro quiet splash
initrd        /boot/initrd.img-2.6.24-17-generic
quiet

Con esto el sistema arrancara por defecto desde el disco hd1 y en el caso de que este disco falle deberemos indicarle manuelmente que arranque desde la otra particion. Para que el sistema arranque automaticamente desde el segundo disco si falla el primero debemos añadir fallback justo debajo de default en el fichero /boot/grub/menu.lst

...
default         0
fallback        1
...

O sea, que arranque por defecto de la entrada 0 (la primera del listado) y en caso de error que arranque de la entrada 1 (la segunda del listado).

Tambien hay que modificar la linea que aparece como kopt:

# kopt=root=/dev/md0 ro

Esta linea aparece comentada, no hay que descomentarla, al cargar grub la ignora, pero es necesaria para generar la configuracion de grub. NOTA: En esta misma linea podrias pasar parametros adicionales al kernel, por ejemplo: (# kopt=root=/dev/md0 ro noapic)

Volvemos a actualizar el ramdisk:

sudo update-initramfs -u

Y finalmente reiniciamos:

sudo reboot

Comprobación Final

Ahora el sistema debe ser capaz de arrancar desde cualquiera de los dos discos aunque falle uno de ellos, puedes hacer pruebas desconectando uno de los discos para ver si todo sigue funcionando correctamente. Si no quieres abrir el ordenador puedes simular un fallo de discos:

sudo mdadm --manage /dev/md0 --fail /dev/sdb1
sudo mdadm --manage /dev/md0 --remove /dev/sdb1

Reinicias y ahora el equipo debera arrancar con el RAID en modo degradado.