Esta guía muestra cómo eliminar un disco duro defectuoso de una matriz RAID1 de Linux (RAID de software) y cómo agregar un nuevo disco duro a la matriz RAID1 sin perder datos. Usaré gdisk para copiar el esquema de partición, por lo que también funcionará con discos duros grandes con GPT (tabla de particiones GUID).
1 nota preliminar
En este ejemplo, tengo dos discos duros, /dev/sda y /dev/sdb, con las particiones /dev/sda1 y /dev/sda2, así como /dev/sdb1 y /dev/sdb2.
/dev/sda1 y /dev/sdb1 conforman la matriz RAID1 /dev/md0.
/dev/sda2 y /dev/sdb2 conforman la matriz RAID1 /dev/md1.
/dev/sda1 + /dev/sdb1 = /dev/md0
/dev/sda2 + /dev/sdb2 = /dev/md1
/dev/sdb ha fallado y queremos reemplazarlo.
2 ¿Cómo puedo saber si un disco duro ha fallado?
Si un disco ha fallado, probablemente encontrará muchos mensajes de error en los archivos de registro, p. /var/log/messages o /var/log/syslog.
También puedes ejecutar
cat /proc/mdstat
y en lugar de la cadena [UU], verá [U_] si tiene una matriz RAID1 degradada.
3 Extracción del disco fallido
Para eliminar /dev/sdb, marcaremos /dev/sdb1 y /dev/sdb2 como fallidos y los eliminaremos de sus respectivas matrices RAID (/dev/md0 y /dev/md1).
Primero marcamos /dev/sdb1 como fallido:
mdadm --manage /dev/md0 --fail /dev/sdb1
La salida de
cat /proc/mdstat
debería verse así:
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[2](F)
24418688 blocks [2/1] [U_]
md1 : active raid1 sda2[0] sdb2[1]
24418688 blocks [2/2] [UU]
unused devices: <none>
Luego eliminamos /dev/sdb1 de /dev/md0:
mdadm --manage /dev/md0 --remove /dev/sdb1
La salida debería ser así:
server1:~# mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1
Y
cat /proc/mdstat
debería mostrar esto:
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
24418688 blocks [2/1] [U_]
md1 : active raid1 sda2[0] sdb2[1]
24418688 blocks [2/2] [UU]
unused devices: <none>
Ahora hacemos los mismos pasos nuevamente para /dev/sdb2 (que es parte de /dev/md1):
mdadm --manage /dev/md1 --fail /dev/sdb2
cat /proc/mdstat
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
24418688 blocks [2/1] [U_]
md1 : active raid1 sda2[0] sdb2[2](F)
24418688 blocks [2/1] [U_]
unused devices: <none>
mdadm --manage /dev/md1 --remove /dev/sdb2
server1:~# mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm: hot removed /dev/sdb2
cat /proc/mdstat
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
24418688 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
24418688 blocks [2/1] [U_]
unused devices: <none>
Luego apague el sistema:
shutdown -h now
y reemplace el disco duro antiguo /dev/sdb por uno nuevo (debe tener al menos el mismo tamaño que el anterior; si solo tiene unos pocos MB menos que el anterior, la reconstrucción de las matrices fallará).
4 Agregar el nuevo disco duro
Después de haber cambiado el disco duro /dev/sdb, inicie el sistema.
Lo primero que debemos hacer ahora es crear exactamente la misma partición que en /dev/sda. Podemos hacer esto con el comando sgdisk del paquete gdisk. Si aún no ha instalado gdisk, ejecute este comando para instalarlo en Debian y Ubuntu:
apt-get install gdisk
Para distribuciones de Linux basadas en RedHat como CentOS use:
yum install gdisk
y para uso de OpenSuSE:
yast install gdisk
El siguiente paso es opcional pero recomendado. Para asegurarse de tener una copia de seguridad del esquema de partición, puede usar sgdisk para escribir los esquemas de partición de ambos discos en un archivo. Guardaré la copia de seguridad en la carpeta /root.
sgdisk --backup=/root/sda.partitiontable /dev/sda
sgdisk --backup=/root/sdb.partitiontable /dev/sdb
En caso de falla, puede restaurar las tablas de partición con la opción --load-backup del comando sgdisk.
Ahora copie el esquema de partición de /dev/sda a /dev/sdb y ejecute:
sgdisk -R /dev/sdb /dev/sda
luego, debe aleatorizar el GUID en el nuevo disco duro para asegurarse de que sean únicos
sgdisk -G /dev/sdb
Puedes correr
sgdisk -p /dev/sda
sgdisk -p /dev/sdb
para verificar si ambos discos duros tienen la misma partición ahora.
A continuación, agregamos /dev/sdb1 a /dev/md0 y /dev/sdb2 a /dev/md1:
mdadm --manage /dev/md0 --add /dev/sdb1
server1:~# mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: re-added /dev/sdb1
mdadm --manage /dev/md1 --add /dev/sdb2
server1:~# mdadm --manage /dev/md1 --add /dev/sdb2
mdadm: re-added /dev/sdb2
Ahora ambos arreglos (/dev/md0 y /dev/md1) estarán sincronizados. Ejecutar
cat /proc/mdstat
para ver cuando haya terminado.
Durante la sincronización, la salida se verá así:
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
24418688 blocks [2/1] [U_]
[=>...................] recovery = 9.9% (2423168/24418688) finish=2.8min speed=127535K/sec
md1 : active raid1 sda2[0] sdb2[1]
24418688 blocks [2/1] [U_]
[=>...................] recovery = 6.4% (1572096/24418688) finish=1.9min speed=196512K/sec
unused devices: <none>
Cuando finalice la sincronización, la salida se verá así:
server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
24418688 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
24418688 blocks [2/2] [UU]
unused devices: <none>
Eso es todo, ¡has reemplazado con éxito /dev/sdb!