Como faço para parar e consertar uma matriz RAID 5 que falhou e tem E / S pendente?

4

A versão curta : Eu tenho um array RAID 5 com falha que tem vários processos pendurados esperando por operações de E / S; como posso me recuperar disso?

A versão longa : Ontem notei que o acesso do Samba estava sendo muito esporádico; Acessar os compartilhamentos do servidor do Windows aleatoriamente bloquearia o explorador completamente depois de clicar em um ou dois diretórios. Eu assumi que era o Windows sendo uma dor e deixei. Hoje o problema é o mesmo, então eu fiz uma pequena escavação; A primeira coisa que notei foi que correr ps aux | grep smbd dá muitas linhas como esta:

ben        969  0.0  0.2  96088  4128 ?        D    18:21   0:00 smbd -F
root      1708  0.0  0.2  93468  4748 ?        Ss   18:44   0:00 smbd -F
root      1711  0.0  0.0  93468  1364 ?        S    18:44   0:00 smbd -F
ben       3148  0.0  0.2  96052  4160 ?        D    Mar07   0:00 smbd -F
...

Existem muitos processos presos no estado "D". A execução de ps aux | grep " D" mostra alguns outros processos, incluindo meu script de backup noturno, e todos precisam acessar o volume montado em minha matriz RAID em algum momento. Depois de algum googling, descobri que pode haver falhas na matriz RAID, então verifiquei /proc/mdstat , que mostra isso:

ben@jack:~$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdb1[3](F) sdc1[1] sdd1[2]
      2930271872 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]

unused devices: <none>

E a execução de mdadm --detail /dev/md0 fornece isso:

ben@jack:~$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90
  Creation Time : Sat Oct 31 20:53:10 2009
     Raid Level : raid5
     Array Size : 2930271872 (2794.53 GiB 3000.60 GB)
  Used Dev Size : 1465135936 (1397.26 GiB 1500.30 GB)
   Raid Devices : 3
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Mon Mar  7 03:06:35 2011
          State : active, degraded
 Active Devices : 2
Working Devices : 2
 Failed Devices : 1
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : f114711a:c770de54:c8276759:b34deaa0
         Events : 0.208245

    Number   Major   Minor   RaidDevice State
       3       8       17        0      faulty spare rebuilding   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1

Acredito que isso diz que o sdb1 falhou e, portanto, o array está executando com dois drives de três 'up'. Alguns conselhos que eu encontrei dizem para verificar / var / log / messages para avisos de falhas, e com certeza existem muitos:

ben@jack:~$ grep sdb /var/log/messages

...

Mar  7 03:06:35 jack kernel: [4525155.384937] md/raid:md0: read error NOT corrected!! (sector 400644912 on sdb1).
Mar  7 03:06:35 jack kernel: [4525155.389686] md/raid:md0: read error not correctable (sector 400644920 on sdb1).
Mar  7 03:06:35 jack kernel: [4525155.389686] md/raid:md0: read error not correctable (sector 400644928 on sdb1).
Mar  7 03:06:35 jack kernel: [4525155.389688] md/raid:md0: read error not correctable (sector 400644936 on sdb1).
Mar  7 03:06:56 jack kernel: [4525176.231603] sd 0:0:1:0: [sdb] Unhandled sense code
Mar  7 03:06:56 jack kernel: [4525176.231605] sd 0:0:1:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Mar  7 03:06:56 jack kernel: [4525176.231608] sd 0:0:1:0: [sdb] Sense Key : Medium Error [current] [descriptor]
Mar  7 03:06:56 jack kernel: [4525176.231623] sd 0:0:1:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
Mar  7 03:06:56 jack kernel: [4525176.231627] sd 0:0:1:0: [sdb] CDB: Read(10): 28 00 17 e1 5f bf 00 01 00 00

Para mim, é claro que o sdb do dispositivo falhou, e eu preciso parar o array, desligar, substituí-lo, reinicializar, reparar o array, trazê-lo de volta e montar o sistema de arquivos. Não consigo fazer hot swap de uma unidade de substituição e não quero deixar a matriz em execução em um estado degradado. Acredito que devo desmontar o sistema de arquivos antes de parar a matriz, mas isso está falhando, e é aí que estou preso agora:

ben@jack:~$ sudo umount /storage
umount: /storage: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

Está de fato ocupado; existem 30 ou 40 processos em espera na E / S.

O que devo fazer? Devo matar todos esses processos e tentar novamente? Isso é uma medida inteligente quando eles são "ininterruptíveis"? O que aconteceria se eu tentasse reiniciar?

Por favor, deixe-me saber o que você acha que devo fazer. E, por favor, pergunte se você precisa de alguma informação extra para diagnosticar o problema ou ajudar!

    
por Ben Hymers 08.03.2011 / 22:00

3 respostas

4

Eu não acho que você precise parar o array. Simplesmente falhe / dev / sdb, remova-o (suponho que seja um disco rígido conectável) e conecte uma nova unidade que você declarará como hot spare.

    
por 08.03.2011 / 22:55
3

Você não pode matar um processo que está tentando fazer o i / o. O que você precisa fazer é usar a opção lazy do comando umount para remover o sistema de arquivos do namespace do sistema de arquivos, mesmo que os arquivos ainda estejam abertos. Para mais informações sobre isso (e outras "peculiaridades" desse aspecto do design do linux), veja Neil Brown .

umount -l /storage
    
por 08.03.2011 / 22:17
1

Você também pode interromper o processo do samba, o que interromperia as gravações no disco e permitiria que as gravações atuais terminassem, em vez de desmontar o sistema de arquivos que está sendo gravado.

    
por 08.03.2011 / 23:01