mdadm: impossibile rimuovere i componenti in RAID 1


14

Ho la mia partizione / boot in un array RAID 1 usando mdadm. Questo array si è degradato alcune volte in passato e ogni volta che rimuovo l'unità fisica, ne aggiungo una nuova, riportando l'array alla normalità, utilizza una nuova lettera di unità. Lasciare quello vecchio ancora nell'array e fallire. Non riesco a rimuovere tutti quei componenti che non esistono più.

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

Ecco cosa ho provato a rimuovere le unità e le partizioni inesistenti. Ad esempio /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

Ciò 8:49che credo si riferisce al numero maggiore e minore indicato in --detail, ma non sono sicuro di dove andare da qui. Sto cercando di evitare un riavvio o il riavvio di 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: l'array è legittimamente degradato in questo momento e sto ottenendo una nuova unità mentre parliamo. Tuttavia, come puoi vedere sopra, non dovrebbe importare. Dovrei essere ancora in grado di rimuovere /dev/sdb1da questo array.


Non è necessario un --force per rimuovere un disco nello stato "rimosso" e potrebbe nascondere un problema più grave. Lascialo fuori.

Risposte:


16

È perché i nodi del dispositivo non esistono più sul tuo sistema (probabilmente udev li ha rimossi quando l'unità è morta). Dovresti essere in grado di rimuoverli utilizzando la parola chiave failedo detachedinvece:

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

Se la tua versione di mdadm è troppo vecchia per farlo, potresti essere in grado di farlo funzionare mknodingiungendo di nuovo il dispositivo. O, onestamente, semplicemente ignoralo: non è davvero un problema e dovrebbe andare via al prossimo riavvio.


Ho provato a usare le parole chiave, puoi vedere l'output che mi ha dato nel post originale. Darò un'occhiata mknod. Sì, probabilmente non è un problema, ma sono un DOC, lol.
Sajan Parikh,

Sì, ho usato mknod per farlo e ha funzionato.
Sajan Parikh,

@SajanParikh in effetti, in qualche modo avevo perso le righe che mostravano che avevi già provato a fallire e staccare. Sono contento che mknod abbia funzionato.
derobert,

6

Quello che alla fine ho fatto è stato usare mknodcome @derobert mi ha suggerito di creare i dispositivi che mdadmcercavo. Ho provato i numeri maggiori / minori che mdadm mi stava dicendo che non riuscivo a trovare con le diverse lettere di unità che stavo cercando di rimuovere finché non ha funzionato.

mknod /dev/sde1 b 8 17

Quindi ho dovuto usare l' --forceopzione per farlo rimuovere il componente.

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

Quindi, ho rimosso quel dispositivo a blocchi creato.

rm /dev/sde1

Hmm ... 8:17 è sdb1. (8:65 is sde1) Ma mancava anche quello, quindi immagino che
funzioni

Questo non ha funzionato per me, ha mdadmcontinuato a dire: "dispositivo o risorsa occupata", ma questo mi ha fatto provare a nutrirlo non con un dispositivo a blocchi falso, ma con un dispositivo a blocchi "vero" come un'immagine montata in loopback. A questo punto, ho scoperto che avevo uno stantio /dev/loopche stava ancora utilizzando un file sull'array degradato. L'ho rimosso e infine mdadmmi ha permesso di interrompere l'array. Horay! Per tutti coloro che leggono questo, c'è sempre una spiegazione logica per mdadmessere così jerk, quindi cerca un processo / file / mountpoint / nfs handler / open bash / loopback device / etc. usando ancora l'array degradato. :)
Avio

Sono stato in grado di utilizzare esattamente le stesse versioni principali e secondarie (8:18 nel mio caso) per mknod un dispositivo falso / dev / sdb2. Dopodiché, mdadm --remove ha cancellato il record obsoleto di / dev / sdb2 da / proc / mdstat. Ricordarsi di rm / dev / sdb2 dopo aver eseguito correttamente l'azione --remove.
ILIV,

3

Puoi anche risolvere sgrassando il numero di dischi nell'array:

Nel mio caso ho un array raid-1 /dev/md0con /dev/sda1e "rimosso". L'ho semplicemente ridotto per usare solo un'unità:

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

Dopo che quello rimosso è stato veramente rimosso (nessuna linea rimossa più in mdadm --detail)


Devi stare attento con questo approccio, però. Comprendi bene con che tipo di RAID hai a che fare prima di modificare --raid-devices.
ILIV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.