mdadm: no se pueden eliminar componentes en RAID 1

14

Tengo mi partición / boot en una matriz RAID 1 usando mdadm. Esta matriz se ha degradado varias veces en el pasado, y cada vez que quito la unidad física, agrego una nueva, llevo la matriz a la normalidad, utiliza una nueva letra de unidad. Dejando el viejo todavía en la matriz y falló. Parece que no puedo eliminar todos los componentes que ya no existen.

[root@xxx ~]# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdg1[10] sde1[8](F) sdb1[7](F) sdd1[6](F) sda1[4] sdc1[5]
      358336 blocks super 1.0 [4/3] [UUU_]

Esto es lo que he intentado eliminar las unidades y particiones inexistentes. Por ejemplo, /dev/sdb1.

[root@xxx ~]# mdadm /dev/md0 -r /dev/sdb1
mdadm: Cannot find /dev/sdb1: No such file or directory
[root@xxx ~]# mdadm /dev/md0 -r faulty
mdadm: Cannot find 8:49: No such file or directory
[root@xxx ~]# mdadm /dev/md0 -r detached
mdadm: Cannot find 8:49: No such file or directory

Que 8:49creo se refiere al número mayor y menor se muestra en --detail, pero no estoy muy seguro de dónde ir desde aquí. Estoy tratando de evitar reiniciar o reiniciar mdadm.

[root@xxx ~]# mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.0
  Creation Time : Thu Aug  8 18:07:35 2013
     Raid Level : raid1
     Array Size : 358336 (350.00 MiB 366.94 MB)
  Used Dev Size : 358336 (350.00 MiB 366.94 MB)
   Raid Devices : 4
  Total Devices : 6
    Persistence : Superblock is persistent

    Update Time : Sat Apr 18 16:44:20 2015
          State : clean, degraded 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 3
  Spare Devices : 0

           Name : xxx.xxxxx.xxx:0  (local to host xxx.xxxxx.xxx)
           UUID : 991eecd2:5662b800:34ba96a4:2039d40a
         Events : 694

    Number   Major   Minor   RaidDevice State
       4       8        1        0      active sync   /dev/sda1
      10       8       97        1      active sync   /dev/sdg1
       5       8       33        2      active sync   /dev/sdc1
       6       0        0        6      removed

       6       8       49        -      faulty
       7       8       17        -      faulty
       8       8       65        -      faulty

Nota: La matriz está legítimamente degradada en este momento y estoy recibiendo una nueva unidad mientras hablamos. Sin embargo, como puede ver arriba, eso no debería importar. Todavía debería poder eliminar /dev/sdb1de esta matriz.

Sajan Parikh
fuente
No necesita una --force para eliminar un disco en el estado "eliminado", y podría ocultar un problema más grave. Déjalo apagado.

Respuestas:

16

Esto se debe a que los nodos del dispositivo ya no existen en su sistema (probablemente udev los eliminó cuando la unidad murió). Debería poder eliminarlos utilizando la palabra clave failedo en su detachedlugar:

mdadm -r /dev/md0 failed     # all failed devices
mdadm -r /dev/md0 detached   # failed ones that aren't in /dev anymore

Si su versión de mdadm es demasiado antigua para hacerlo, es posible que pueda hacer que funcione si mknodel dispositivo vuelve a existir. O, honestamente, simplemente ignórelo, no es realmente un problema, y ​​debería desaparecer la próxima vez que reinicie.

derobert
fuente
He intentado usar las palabras clave, puedes ver el resultado que me dio en la publicación original. Voy a echar un vistazo a mknod. Sí, probablemente no sea un problema, pero soy TOC, jajaja.
Sajan Parikh
Sí, usé mknod para hacer esto y funcionó.
Sajan Parikh
@SajanParikh, de hecho, de alguna manera me perdí las líneas que mostraban que ya había intentado fallar y desconectarse. Me alegro de que mknod funcionó.
derobert
6

Lo que terminé haciendo fue usar mknodcomo @derobert sugirió crear los dispositivos que mdadmestaba buscando. Probé los números mayores / menores que mdadm me decía que no podía encontrar con las diferentes letras de unidad que estaba tratando de eliminar hasta que funcionó.

mknod /dev/sde1 b 8 17

Luego tuve que usar la --forceopción para que eliminara el componente.

mdadm /dev/md0 --remove --force /dev/sde1

Luego, eliminé ese dispositivo de bloque creado.

rm /dev/sde1
Sajan Parikh
fuente
Hmm ... 8:17 es sdb1. (8:65 es sde1) Pero ese también faltaba, así que supongo que eso funciona ...
derobert
Esto no funcionó para mí, mdadmcontinuó diciendo: "dispositivo o recurso ocupado", pero esto me hizo tratar de alimentarlo no con un dispositivo de bloqueo falso, sino con un dispositivo de bloque "verdadero" como una imagen montada en bucle invertido. En este punto, descubrí que tenía un problema /dev/loopque todavía usaba un archivo en la matriz degradada. Lo separé y finalmente mdadmme dejó detener la matriz. Horay! Para todos los que lean esto, siempre hay una explicación lógica para mdadmser tan imbécil, así que busque un proceso obsoleto / archivo / punto de montaje / controlador nfs / bash abierto / dispositivo loopback / etc. Todavía usando la matriz degradada. :)
Avio
Pude usar exactamente las mismas versiones mayores y menores (8:18 en mi caso) para crear un dispositivo falso / dev / sdb2. Después de eso, mdadm --remove el registro obsoleto eliminado de / dev / sdb2 de / proc / mdstat. Recuerde rm / dev / sdb2 después de la acción --remove exitosa.
ILIV
3

También puede solucionarlo simplemente desengrasando el número de discos en la matriz:

En mi caso tengo una matriz raid-1 /dev/md0con /dev/sda1y "eliminado". Simplemente lo reduje para usar solo una unidad:

mdadm -G /dev/md0 --raid-devices=1 --force

Después de eso, se eliminó realmente (ya no se eliminaron líneas mdadm --detail)

Limalski
fuente
Sin embargo, debes tener cuidado con este enfoque. Comprenda bien con qué tipo de RAID está lidiando antes de modificar los dispositivos de miedo.
ILIV