mdadm: não é possível remover componentes no RAID 1

14

Eu tenho minha partição / boot em uma matriz RAID 1 usando mdadm. Essa matriz degradou-se algumas vezes no passado e, toda vez que removo a unidade física, adiciono uma nova, trago a matriz ao normal, ela usa uma nova letra de unidade. Deixando o antigo ainda na matriz e falhou. Não consigo remover todos os componentes que não existem mais.

[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_]

Aqui está o que eu tentei remover as unidades e partições inexistentes. Por exemplo /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:49eu acredito que se refere ao número maior e menor mostrado na --detail, mas eu não tenho certeza para onde ir a partir daqui. Estou tentando evitar uma reinicialização ou reiniciar o 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: A matriz está legitimamente degradada agora e estou recebendo uma nova unidade lá enquanto falamos. No entanto, como você pode ver acima, isso não deve importar. Ainda devo poder remover /dev/sdb1desta matriz.

Sajan Parikh
fonte
Você não precisa de um --force para remover um disco no estado "removido" e isso pode ocultar um problema mais sério. Deixe isso de lado.

Respostas:

16

Isso ocorre porque os nós do dispositivo não existem mais no seu sistema (provavelmente o udev os removeu quando a unidade morreu). Você poderá removê-los usando a palavra-chave failedou detached:

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

Se a sua versão do mdadm for muito antiga para fazer isso, você poderá fazê-lo funcionar, fazendo com que mknodo dispositivo exista novamente. Ou, honestamente, simplesmente ignore - não é realmente um problema e deve desaparecer na próxima vez que você reiniciar.

derobert
fonte
Eu tentei usar as palavras-chave, você pode ver a saída que ele me deu no post original. Vou dar uma olhada mknod. Sim, provavelmente não é um problema, mas eu sou TOC, lol.
Sajan Parikh
Sim, eu usei o mknod para fazer isso e funcionou.
Sajan Parikh
@SajanParikh, de fato, de alguma forma, eu tinha perdido as linhas mostrando que você já tentou falhar e desanexar. Fico feliz que mknod funcionou.
Derbert #
6

O que acabei fazendo foi usar o mknod@derobert sugerido para criar os dispositivos que mdadmestava procurando. Tentei os números maiores / menores que o mdadm estava me dizendo que não conseguia encontrar com as diferentes letras de unidade que eu estava tentando remover até que funcionasse.

mknod /dev/sde1 b 8 17

Então tive que usar a --forceopção para remover o componente.

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

Em seguida, removi o dispositivo de bloco criado.

rm /dev/sde1
Sajan Parikh
fonte
Hmm ... 8:17 é sdb1. (8:65 é sde1) Mas que um estava faltando também, então eu acho que as obras ...
derobert
Isso não funcionou para mim, mdadmcontinuou dizendo: "dispositivo ou recurso ocupado", mas isso me fez tentar alimentá-lo não com um dispositivo de bloco falso, mas com um dispositivo de bloco "verdadeiro", como uma imagem montada em loopback. Nesse ponto, descobri que tinha um histórico /dev/loopque ainda estava usando um arquivo na matriz degradada. Eu o desconectei e finalmente mdadmme deixei parar a matriz. Horay! Para todos que estão lendo isso, sempre há uma explicação lógica para mdadmser tão idiota; portanto, procure um processo antigo / arquivo / ponto de montagem / manipulador nfs / dispositivo de bash / loopback aberto / etc. ainda usando a matriz degradada. :)
Avio 08/02
Consegui usar exatamente as mesmas versões principais e secundárias (8:18 no meu caso) para mknod um dispositivo / dev / sdb2 falso. Depois disso, o mdadm --remove excluiu o registro antigo de / dev / sdb2 de / proc / mdstat. Lembre-se de rm / dev / sdb2 após a ação --remove bem sucedida.
ILIV
3

Você também pode corrigir apenas desengordurando o número de discos na matriz:

No meu caso, tenho uma matriz RAID-1 /dev/md0com /dev/sda1e "removida". Eu simplesmente a reduzi para usar apenas uma unidade:

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

Depois que o removeu foi realmente removido (não há mais linhas removidas mdadm --detail)

Limalski
fonte
Você precisa ter cuidado com essa abordagem, no entanto. Entenda bem com que tipo de RAID você está lidando antes de modificar os dispositivos de medo.
ILIV 29/11/18