Introducción

Buenas, en esta práctica vamos a hacer varios ejercicios para crear un RAID 1 en una máquina Debian y gestionarlo.

Un RAID 1 nos va a permitir tener dos discos con los mismos datos y si uno de ellos falla, el sistema seguirá funcionando correctamente y podremos sustituir el disco dañado.

RAID 1

Creacción de máquina Debian con Vagrant

Para crear la máquina vamos a usar Vagrant, una herramienta la cuál podemos aprender un poco en este post, para crear usamos el siguiente VagrantFile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
 disco1 = '.vagrant/disco1.vdi'
 disco2 = '.vagrant/disco2.vdi'
	  config.vm.define :nodo1 do |nodo1|
	    nodo1.vm.box = "debian/buster64" 
	    nodo1.vm.hostname = "nodo1" 
	    nodo1.vm.network :public_network,:bridge=>"wlp5s0" 
	    nodo1.vm.network :private_network, ip: "10.1.1.10" 
	    nodo1.vm.provider :virtualbox do |v|
	        if not File.exist?(disco1)
	                v.customize ["createhd", "--filename", disco1, "--size", 1024]
	                v.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", 1, "--device", 0, "--type", "hdd", "--medium", disco1]
	        end
	        if not File.exist?(disco2)
	                v.customize ["createhd", "--filename", disco2, "--size", 1024]
	                v.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", 2, "--device", 0, "--type", "hdd", "--medium", disco2]
	        end
	    nodo1.vm.provision "shell",
	      run: "always",
	      inline: "apt install mdadm -y" 
	    end
	  end
end

El anterior VagrantFile nos creará una máquina con dos discos de 1GB y al iniciar la máquina, nos instalará el software mdadm que es el encargado de administrar RAIDS.

Creación de RAID 1

Para crear el RAID ejecutamos:

# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

Comprobar estado de RAID

Para comprobar los discos:

root@nodo1:/home/vagrant# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda      8:0    0 19.8G  0 disk  
├─sda1   8:1    0 18.8G  0 part  /
├─sda2   8:2    0    1K  0 part  
└─sda5   8:5    0 1021M  0 part  [SWAP]
sdb      8:16   0    1G  0 disk  
└─md1    9:1    0 1022M  0 raid1 
sdc      8:32   0    1G  0 disk  
└─md1    9:1    0 1022M  0 raid1

Y para comprobar el estado del RAID:

root@nodo1:/home/vagrant# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Mon Sep 30 10:33:46 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Mon Sep 30 10:33:51 2019
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : fcb60778:1b3ca292:626ee47b:d8445cb9
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Crear vólumen en RAID

Para crear vólumenes, vamos a usar la herramienta fdisk:

root@nodo1:/home/vagrant# fdisk /dev/md1

Y creamos una partición de 500MB:

root@nodo1:/home/vagrant# lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda         8:0    0 19.8G  0 disk  
├─sda1      8:1    0 18.8G  0 part  /
├─sda2      8:2    0    1K  0 part  
└─sda5      8:5    0 1021M  0 part  [SWAP]
sdb         8:16   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part  
sdc         8:32   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part

Dar un formato a la partición

Para ello ejecutamos la siguiente instrucción:

root@nodo1:/home/vagrant# mkfs.ext3 /dev/md1p1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 512000 1k blocks and 128016 inodes
Filesystem UUID: bf5ca2b2-42c9-4dbe-b914-b2448620621f
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Montar partición y hacerla permanente

Para poder trabajar con esa partición, tendremos que montarla:

root@nodo1:/home/vagrant# mkdir /mnt/raid1
root@nodo1:/home/vagrant# mount -t ext3 /dev/md1p1 /mnt/raid1
root@nodo1:/home/vagrant# lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda         8:0    0 19.8G  0 disk  
├─sda1      8:1    0 18.8G  0 part  /
├─sda2      8:2    0    1K  0 part  
└─sda5      8:5    0 1021M  0 part  [SWAP]
sdb         8:16   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part  /mnt/raid1
sdc         8:32   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part  /mnt/raid1

Probamos que podemos crear un fichero:

root@nodo1:/mnt/raid1# touch prueba_raid1

Para que sea permanente debemos de editar el fichero /etc/fstab añadiendo la siguiente información:

UUID=bf5ca2b2-42c9-4dbe-b914-b2448620621f    /mnt/raid1    ext3    defaults 0 2

Donde UUID lo prodríamos obtener haciendo un simple comando:

root@nodo1:/home/vagrant# lsblk -f
NAME      FSTYPE            LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                     
├─sda1    ext4                      b9ffc3d1-86b2-4a2c-a8be-f2b2f4aa4cb5   16.4G     6% /
├─sda2                                                                                  
└─sda5    swap                      f8f6d279-1b63-4310-a668-cb468c9091d8                [SWAP]
sdb       linux_raid_member nodo1:1 ffb909e3-2fe4-b865-6b53-ff820e7b0aa8                
└─md1                                                                                   
  └─md1p1 ext3                      bf5ca2b2-42c9-4dbe-b914-b2448620621f  448.9M     0% /mnt/raid1
sdc       linux_raid_member nodo1:1 ffb909e3-2fe4-b865-6b53-ff820e7b0aa8                
└─md1                                                                                   
  └─md1p1 ext3                      bf5ca2b2-42c9-4dbe-b914-b2448620621f  448.9M     0% /mnt/raid1

Forzar fallo de disco

Comprobamos que todo está funcionando correctamente:

root@nodo1:/mnt/raid1# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Sun Oct 13 10:07:12 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Oct 13 10:17:54 2019
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : ffb909e3:2fe4b865:6b53ff82:0e7b0aa8
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Forzamos el fallo de un disco:

root@nodo1:/mnt/raid1# mdadm /dev/md1 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md1

Y volvemos a comprobar el estado del raid:

root@nodo1:/mnt/raid1# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Sun Oct 13 10:07:12 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Oct 13 10:31:49 2019
             State : clean, degraded 
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 1
     Spare Devices : 0

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : ffb909e3:2fe4b865:6b53ff82:0e7b0aa8
            Events : 19

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc

       0       8       16        -      faulty   /dev/sdb

Como hemos podido observar, nos dice que uno de los elementos del raid está fallando y el otro está activo. Y aún así podemos seguir accediendo al fichero, pero nos dice que esta “degraded”, es decir, que no está funcionando correctamente al ser un raid 1 con un sólo disco.

root@nodo1:/mnt/raid1# cat prueba_raid1 
funcionando

Recuperar estado de RAID

Para recuperar el estado del raid, primero debemos eliminar el disco en mal estado:

root@nodo1:/mnt/raid1# mdadm /dev/md1 -r /dev/sdb

Volvemos a añadir el disco:

root@nodo1:/mnt/raid1# mdadm /dev/md1 -a /dev/sdb

Y comprobamos el estado:

root@nodo1:/mnt/raid1# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Sun Oct 13 10:07:12 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Oct 13 10:44:05 2019
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : ffb909e3:2fe4b865:6b53ff82:0e7b0aa8
            Events : 47

    Number   Major   Minor   RaidDevice State
       2       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Y comprobamos si accedemos al fichero:

root@nodo1:/mnt/raid1# cat prueba_raid1 
funcionando

Añadir otro disco al RAID 1

Para ello, hemos editado el fichero VagrantFile. Añadimos tercer disco:

root@nodo1:/home/vagrant# mdadm /dev/md1 -a /dev/sdd 
mdadm: added /dev/sdd

Y comprobamos:

root@nodo1:/home/vagrant# lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda         8:0    0 19.8G  0 disk  
├─sda1      8:1    0 18.8G  0 part  /
├─sda2      8:2    0    1K  0 part  
└─sda5      8:5    0 1021M  0 part  [SWAP]
sdb         8:16   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part  
sdc         8:32   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part  
sdd         8:48   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0  500M  0 part 
root@nodo1:/home/vagrant# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Sun Oct 13 11:23:44 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Sun Oct 13 11:26:00 2019
             State : clean 
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : 7caaa67c:40e4bfcc:2f1c7bbb:c2d791b6
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

       2       8       48        -      spare   /dev/sdd

Este disco se mantendrá como un disco de repuesto y en caso de que fallen alguno de los otros dos, empezará a funcionar. Podemos sustituir un disco por uno de la ráiz de la siguiente forma:

	root@nodo1:/home/vagrant# mdadm --manage /dev/md1 --replace /dev/sdb --with /dev/sdd
mdadm: Marked /dev/sdb (device 0 in /dev/md1) for replacement
mdadm: Marked /dev/sdd in /dev/md1 as replacement for device 0
root@nodo1:/home/vagrant# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Sun Oct 13 11:23:44 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Sun Oct 13 11:53:45 2019
             State : clean, recovering 
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

Consistency Policy : resync

    Rebuild Status : 57% complete

              Name : nodo1:1  (local to host nodo1)
              UUID : 7caaa67c:40e4bfcc:2f1c7bbb:c2d791b6
            Events : 24

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       48        0      spare rebuilding   /dev/sdd
       1       8       32        1      active sync   /dev/sdc

O también podemos añadir otro disco al array ejecutando lo siguiente:

root@nodo1:/home/vagrant# mdadm --grow /dev/md1 --raid-devices=3

Y comprobamos:

	root@nodo1:/home/vagrant# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Mon Oct 14 19:48:58 2019
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Mon Oct 14 19:50:37 2019
             State : clean 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : nodo1:1  (local to host nodo1)
              UUID : 1e09b2dd:22728281:4161e36f:543bd901
            Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd

Redimensionar a RAID completo

Para poder redimensionar a el RAID completo, basta con ejecutar lo siguiente:

root@nodo1:/home/vagrant# growpart /dev/md1 1
CHANGED: partition=1 start=2048 old: size=1024000 end=1026048 new: size=2090975,end=2093023

Y comprobamos:

root@nodo1:/home/vagrant# lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda         8:0    0 19.8G  0 disk  
├─sda1      8:1    0 18.8G  0 part  /
├─sda2      8:2    0    1K  0 part  
└─sda5      8:5    0 1021M  0 part  [SWAP]
sdb         8:16   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0 1021M  0 part  /mnt/raid1
sdc         8:32   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0 1021M  0 part  /mnt/raid1
sdd         8:48   0    1G  0 disk  
└─md1       9:1    0 1022M  0 raid1 
  └─md1p1 259:1    0 1021M  0 part  /mnt/raid1
sde         8:64   0    1G  0 disk  

Y ejecutamos lo siguiente para redimensionar el sistema de archivos:

	root@nodo1:/home/vagrant# resize2fs /dev/md1p1 
resize2fs 1.44.5 (15-Dec-2018)
Filesystem at /dev/md1p1 is mounted on /mnt/raid1; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/md1p1 is now 1045484 (1k) blocks long.

root@nodo1:/home/vagrant# df -h /mnt/raid1/
Filesystem      Size  Used Avail Use% Mounted on
/dev/md1p1      981M  2.8M  933M   1% /mnt/raid1