Montar un raid5 por software

Un sistema raid consiste en un conjunto de discos duros entre los que se distribuyen y/o replican los datos. Lo cual aumenta la tolerancia a fallos, el rendimiento y la integridad de los datos. En este tutorial se barajarán las opciones de raid software y hardware, los niveles raid más comunes y se le guiará en la creación de un raid5 por software.

Tabla de contenidos

1.- Tipos de raid
  • Raid hardware Utiliza controladoras especializadas que administran el raid de forma transparente. Es la mejor opción, sin embargo precisan de un desembolso importante. Si usted quiere montar un raid hardware, HighPoint tiene algunas soluciones de bajo coste (unos 150€ aproximadamente), como por ejemplo la RacketRAID 2640x4. Puede leer un análisis de esta controladora en Tom's Hardware.
  • Fake raid Es una versión económica del raid hardware. Muchos fabricantes agregan funcionalidades raid a sus placas bases a través de un chip, el cual ofrece un rendimiento bajo. El uso de fake raid no es recomendable, ya que los fabricantes de controladoras raid usan distintos formatos de metadatos, lo que significa que un raid creado en una controladora concreta no podrá ser leído por otra controladora. En caso de avería, podría suceder que no pudiese acceder a sus datos hasta encontrar una controladora que use el mismo formato de metadatos, y si no la encontrase no podría acceder a sus datos.
  • Software raid Este sistema se denomina md (multiples discos) y se hace vía software haciendo uso del kernel y el software mdadm. La principal ventaja del software raid es que puede ser facilmente transferido entre hosts, por lo siempre podrá tener acceso a sus datos.

Este tutorial se centra en explicar como montar un software raid.

2.- Niveles de raid
Existen varios niveles de raid, cada uno de los cuales proporciona distintas combinaciones de velocidad, redundancia y espacio disponible, los más comunes son:
  • raid0 Conocido como volumen dividido (striping), hace que Linux vea los discos como un único disco combinado con el doble de tamaño. Aumenta la velocidad de lectura y escritura. La capacidad de almacenamiento viene dada por N * tamaño. Se precisan al menos dos discos. 
  • raid1 Conocido como como discos en espejo, crea una copia exacta del conjunto de datos en dos o más discos. Aumenta la velocidad de lectura pero no de escritura, y aporta redundancia. La capacidad de almacenamiento viene dada por  N * tamaño / 2. Se precisan al menos dos discos.
  • raid5 Los datos se distribuyen entre varios discos, y se calcula una suma de control, denominado bloque de paridad, que será almacenada en otro disco. Proporciona mayor velocidad de lectura y escritura, un uso eficaz del espacio de almacenamiento y redundancia. La capacidad de almacenamiento viene dada por  (N - 1) * tamaño. Se precisan al menos tres discos.
  • raid6 Igual que el raid5, pero añadiendo otro bloque de paridad. La capacidad de almacenamiento viene dada por  (N - 2) * tamaño. Se precisan al menos cuatro discos.

Se usará un ejemplo para ver que ocurriría, en cada caso, al configurar cuatro discos de 1.5TB en raid.
  • raid0 El sistema vería un solo disco de 6TB (4 x 1.5TB). Aumento de velocidad. Sin redundancia.
  • raid1 El sistema vería un solo disco de 3TB (4 x 1.5TB / 2). Aumento de velocidad y redundancia.
  • raid5 El sistema vería un solo disco de 4.5TB ((4 - 1) x 1.5TB). Aumento de rendimiento y redundancia.
  • raid6 El sistema vería un solo disco de 3TB ((4 - 2) x 1.5TB). Aumento de rendimiento y redundancia.

Si el presupuesto es bajo, la mejor opción es un raid5. En el ejemplo se opta por un raid5 formado por tres discos de 1.5TB. Antes de continuar debe recordar que un raid puede proporcionar redundancia de los datos pero nunca le protegerá de pérdidas provocadas por un borrado accidental, corrupción, crackeo...

3.- Preparando los discos
No es buena idea crear un raid con todo el espacio disponible del disco. ¿Por qué? Porque los discos duros, incluso siendo el mismo modelo del mismo fabricante, pueden variar en el número de bloques. Es decir, los discos pueden tener ligeras diferencias de tamaño, lo cual puede provocar auténticos quebraderos de cabeza al reemplazar un disco dañado (como me ocurrió una vez) o ampliar el raid.

Tal vez crea que es imposible, o al menos improbable, sin embargo tengo la suerte desgracia de poder contarlo de primera mano. En mi caso se trata de tres discos Segeate de 1.5TB; los tres son el mismo modelo (ST31500341AS) y con la misma versión del firmware (CC1H); sin embargo tienen distinto número de bloques.

agd-desktop # sfdisk -s /dev/sd[cde]
1465137527
1465138584
1465138584
agd-desktop # fdisk /dev/sdc

Orden (m para obtener ayuda): p

Disco /dev/sdc: 1500.3 GB, 1500300828160 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004337f

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1               1      182388  1465031578+  fd  Linux raid autodetect

Orden (m para obtener ayuda): q

agd-desktop # fdisk /dev/sde

Orden (m para obtener ayuda): p

Disco /dev/sde: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sde1               1      182388  1465031578+  fd  Linux raid autodetect

Orden (m para obtener ayuda): q

agd-desktop # fdisk /dev/sde

Orden (m para obtener ayuda): p

Disco /dev/sde: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sde1               1      182388  1465031578+  fd  Linux raid autodetect

Orden (m para obtener ayuda): q

Como podrá observar, el segundo y tercer disco tienen 1057 bloques más que el primero. Al crear el raid, si usa todo el disco, se crearía un raid con un número de bloques igual al disco menor (lo cual no generaría problemas). Pero imaginé que debe reemplazar un disco, y que el nuevo tiene un bloque menos: le dará un error indicando que no puede agregar un disco de menor tamaño al raid.

Para evitar estos problemas, antes de crear el raid usted puede crear una partición con un tamaño ligeramente inferior al tamaño total del disco. De esta forma al agregar un nuevo disco usted podrá jugar con este espacio. Puede crear, por ejemplo, una partición cuyo tamaño sea el equivalente al tamaño total menos 10MB.

Para ello usaremos el comando fdisk /dev/sdX, pasaremos a visualizar de unidades a sectores pulsando la tecla u, y crearemos la partición pulsando la tecla n. En caso de existir particiones previas, puede eliminarlas pulsando la tecla d. Cada sector equivale a 512 bytes, por tanto si queremos crear una partición equivalente al tamaño total del disco menos 10MB deberemos de restar 20480 sectores al total de sectores del disco (10MB * 1M/1024KB * 1KB/1024B / 512B). A continuación deberá cambiar el identificador de sistema de la partición a da (Non-FS data) pulsando la tecla t. Por último tan solo debe pulsar la tecla w para grabar los cambios al disco.

A continuación puede ver un ejemplo de uso de fdisk donde primero se cambian las unidades a sectores (tecla u), se crea una nueva partición (tecla n), se cambia el identificador de la partición a da (tecla t), se verifica la tabla de particiones del disco (tecla p) y por último se escriben los cambios en el disco (tecla w):

agd-desktop # fdisk /dev/sde

Orden (m para obtener ayuda): u
Se cambian las unidades de visualización/entrada a sectores

Orden (m para obtener ayuda): n
Acción de la orden
e   Partición extendida
   p   Partición primaria (1-4)
p
Número de partición (1-4): 1
Primer sector (63-2930277167, valor predeterminado 63):
Se está utilizando el valor predeterminado 63
Last sector, +sectores or +size{K,M,G} (63-2930277167, valor predeterminado 2930277167): 2930256687

Orden (m para obtener ayuda): t
Se ha seleccionado la partición 1
Código hexadecimal (escriba L para ver los códigos): da

Orden (m para obtener ayuda): p

Disco /dev/sde: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders, 2930277168 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sde1              63  2930256687  1465128312+  fd  Linux raid autodetect

Orden (m para obtener ayuda): w

Una vez tenga particionado el primer disco, clonaremos las particiones a los sucesivos discos usando el comando sfdisk, pasandole el comando dump (-d). Con esta opción, sfdisk imprime la tabla de particiones del disco indicado, de forma que pueda ser utilizado por él mismo a través de una tubería, sfdisk -d /dev/sdc | sfdisk /dev/sd[ed]. Con este comando, se recrean las particiones existentes en el dispositivo /dev/sdc en los dipositivos /dev/sdd y /dev/sde. Posteriormente puede verificar si todo ha ido bien con el comando sfdisk -d /dev/sd[cde], el cual debe generar una salida similar a la siguiente:

agd-desktop # sfdisk -d /dev/sd[cde]
# partition table of /dev/sdc
unit: sectors

/dev/sdc1 : start=       63, size=2930063157, Id=fd
/dev/sdc2 : start=        0, size=        0, Id= 0
/dev/sdc3 : start=        0, size=        0, Id= 0
/dev/sdc4 : start=        0, size=        0, Id= 0
# partition table of /dev/sdd
unit: sectors

/dev/sdd1 : start=       63, size=2930063157, Id=fd
/dev/sdd2 : start=        0, size=        0, Id= 0
/dev/sdd3 : start=        0, size=        0, Id= 0
/dev/sdd4 : start=        0, size=        0, Id= 0
# partition table of /dev/sde
unit: sectors

/dev/sde1 : start=       63, size=2930063157, Id=fd
/dev/sde2 : start=        0, size=        0, Id= 0
/dev/sde3 : start=        0, size=        0, Id= 0
/dev/sde4 : start=        0, size=        0, Id= 0

4.- Linux Software RAID (mdadm)
Llegados a este punto repasaremos, en primer lugar como crear un raid, y posteriormente las opciones más comunes que necesitará para administrar su raid. Para más información siempre puede consultar la página man de mdadm.

     4.1.- Crear un raid
Para ello debe pasarle la opción --create, --verbose si queremos recibir información sobre el proceso, a mdadm.  El punto de montaje del raid, suele usarse una nomenclatura del tipo /dev/mdX. El tipo de raid con --level=X. El número de unidades que formarán parte del raid con --raid-devices=X. En caso de querer añadir un disco auxiliar, puede indicarselo con --spare-devices=X. Y por último, las unidades que forman parte del raid.

En este caso se creará un raid montado en /dev/md0, de nivel 5 (--level=5), con tres unidades (--raid-devices=3), sin unidad auxiliar (--spare-devices=0) y formado por /dev/sdc1, /dev/sdd1 y /dev/sde1. Es decir, mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[cde]1

agd-desktop # mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

En este punto su raid ha sido creado, sin embargo recuerde que aun no ha sido particionado. Por ello antes de comenzar a usarlo deberá particionar el raid con mkfs.fstype, por ejemplo, mkfs.ext4 -m 0 -L RAID5-Series /dev/md0. Con -m 0 fijamos a cero el número de bloques reservados a root, y con -L indicamos la etiqueta que tendrá el volumen.

     4.2.- Obtener información sobre el estado de un raid
Puede usar las opciones --query y --detail sobre la unidad raid (/dev/mdX). La opción --query aporta poca información, limitándose a indicar el espacio total, el tipo de raid, el número de dispositivos que forman el raid así como el número de discos de reserva (spares). La opción --detail es mucho más detallada. Puede ver un ejemplo de ambas salidas a continuación.

agd-desktop # mdadm --query /dev/md0
/dev/md0: 2794.32GiB raid5 3 devices, 0 spares. Use mdadm --detail for more detail.
agd-desktop # mdadm --detail /dev/md0
/dev/md0:
               Version : 1.2
     Creation Time : Wed Sep 22 17:02:27 2010
          Raid Level : raid5
          Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
    Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
      Raid Devices : 3
     Total Devices : 3
         Persistence : Superblock is persistent

      Update Time : Tue Feb 15 19:13:57 2011
                  State : clean
   Active Devices : 3
Working Devices : 3
    Failed Devices : 0
    Spare Devices : 0

               Layout : left-symmetric
         Chunk Size : 512K

                 Name : agd-desktop:0  (local to host agd-desktop)
                 UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
                Events : 165

    Number   Major   Minor   RaidDevice State
       4       8       65        0      active sync   /dev/sde1
       1       8       49        1      active sync   /dev/sdd1
       3       8       33        2      active sync   /dev/sdc1

Además puede consultar el estado de las unidades físicas que componen el raid haciendo uso de la opción --query. En este caso, si usted decidió particionar el disco, deberá indicar la partición (/dev/sdXy) que forma parte del raid. Puede ver un ejemplo a continuación.

agd-desktop # mdadm --examine /dev/sdc1
/dev/sdc1:
               Magic : a92b4efc
             Version : 1.2
     Feature Map : 0x0
      Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
                Name : agd-desktop:0  (local to host agd-desktop)
    Creation Time : Wed Sep 22 17:02:27 2010
         Raid Level : raid5
     Raid Devices : 3

   Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
         Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
   Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
        Data Offset : 2048 sectors
      Super Offset : 8 sectors
                 State : clean
    Device UUID : 29f6b0d9:7a970ca6:3508db7b:f4b1af2b

     Update Time : Tue Feb 15 19:13:57 2011
         Checksum : 14f9bd67 - correct
               Events : 165

              Layout : left-symmetric
       Chunk Size : 512K

      Device Role : Active device 2
       Array State : AAA ('A' == active, '.' == missing)

     4.3.- Generar un fichero mdadm.conf
En este caso utilizaremos las opciones --detail y --scann. De esta forma obtendremos la configuración del raid para añadirlo al fichero mdadm.conf redirigiendo la salida a través de una tubería.

agd-desktop # mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=agd-desktop:0 UUID=2b33bce9:f30571d8:efe03c61:898a4e57
agd-desktop # mdadm --detail --scan >> /etc/mdadm.conf

     4.4.- Marcar un disco como erróneo
Si usted ha recibido un aviso del sistema S.M.A.R.T. indicando que un disco ha comenzado a fallar, puede indicarle a mdadm el disco que está fallando con la opción --fail; y en caso de que tenga discos de reserva asignados al raid, mdadm se encargará de comenzar a reconstruir el raid en el disco de reserva.

agd-desktop # mdadm --fail /dev/md0 /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0

     4.5.- Eliminar un disco del raid. Limpiar el superbloque de un disco eliminado.
La opción --remove eliminará el disco del raid, y en caso de que exista definido un disco de reserva, mdadm comenzará a reconstruir el raid en él. La diferencia entre --fail --remove, es que --remove elimina el disco de la configuración del raid mientras que --fail lo marca para no ser usado pero sigue estando en la configuración del raid.

agd-desktop # mdadm --remove /dev/md0 /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md0

En caso de que usted elimine un disco del raid, el disco aun tiene información valida del superbloque lo cual puede originar problemas en caso de que quiera reutilizar el disco en otro raid. En estos cosas es recomendable que elimine esta información, para lo cual puede usar la opción --zero-superblock de mdadm. De esta forma el contenido será sobrescrito con ceros. Usted puede forzar la sobrescritura del bloque, aun cuando este no parezca ser válido, con la opción --force --zero-superblock.

     4.6.- Añadir un disco nuevo al raid
Puede añadir un disco nuevo a un raid ya existente usando la opción --add. En el ejemplo de a continuación, vamos a volver a añadir el disco que eliminamos anteriormente /dev/sdc1, al cual no se le eliminó la información del superbloque por lo que se ha integrado en el raid sin problemas, y puesto que no fue formateado, la información continua en él; por lo que no es necesario reconstruir el raid.

agd-desktop # mdadm --manage /dev/md0 --add /dev/sdc1
mdadm: re-added /dev/sdc1

     4.7.- Incrementar el tamaño del raid
Para incrementar el tamaño del raid, primero debemos añadir un disco nuevo, posteriormente indicarle al raid que active el disco nuevo y por último redimensionar la partición raid existente. Para indicarle al raid que active el disco, debe usar la opción --raid-devices=X del modo --grow, es decir, si quisiera pasar de un raid de tres discos a un raid de cuatro discos debería escribir: mdadm --grow /dev/md0 --raid-devices=4.

A continuación deberá redimensionar la partición raid, siguiendo el ejemplo se pasaría de 3TB a 4.5TB. Para ello deberá desmontar el raid con umount /dev/md0 y redimensionar la partición con resize2fs -p /dev/md0. La opción -p de resize2fs tan solo sirve para mostrar una barra de progreso, y por tanto opcional.

agd-desktop # mdadm --manage /dev/md0 --add /dev/sdf1
mdadm: added /dev/sdf1
root@agd-desktop # mdadm --grow /dev/md0 --raid-devices=4

agd-desktop # resize2fs -p /dev/md0
resize2fs 1.41.12 (17-May-2010)

Resizing the filesystem on /dev/md0 to 1943857 (4k) blocks.
Se comienza el paso 1 (máx = 36)
Extendiendo la tabla de nodos-iXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
El sistema de ficheros en /dev/sdl1 tiene ahora 1943857 bloques.
* Nota: En el ejemplo de arriba, el comando resize2fs se está aplicando sobre un pendrive de 8GB. No dispongo de ningún disco que agregar al raid para copiar la salida. En cualquier caso la salida es exactamente igual, tan solo cambia el número de bloques.

A continuación puede comprobar, mediante mdadm --detail /dev/md0, como el tamaño del raid (Array Size) ha aumentado de 3TB a 4.5TB.

0 comentarios:

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.