Por que não consigo recuperar um disco RAID1 que aparentemente não possui erros?

2

Já há vários anos rodamos um software RAID1 em uma velha caixa do Gentoo com um Linux 2.6.31 customizado. O RAID consiste em 2 discos rígidos com 4 partições cada. Nos últimos anos, aconteceu cerca de 3-4 vezes que um disco foi jogado fora do array. Mas cada vez que badblocks não reportou um erro e eu consegui reativar o disco assim

mdadm /dev/md3 -r /dev/sda3
mdadm /dev/md3 -a /dev/sda3

Desta vez, a situação é diferente: mdadm relatou 2 partições defeituosas nas últimas 24 h, ambas no mesmo disco sda . Mais uma vez eu corri badblocks sem sucesso: ele relatou 0 blocos ruins. Se eu tentar adicionar o disco defeituoso de volta ao array, ele quebra o mesmo erro toda vez:

Mar 25 23:09:10 xen0 kernel: ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
Mar 25 23:09:10 xen0 kernel: ata1.00: irq_stat 0x40000001
Mar 25 23:09:10 xen0 kernel: ata1.00: cmd ea/00:00:00:00:00/00:00:00:00:00/a0 tag 0
Mar 25 23:09:10 xen0 kernel: res 51/04:00:38:df:f7/00:00:00:00:00/a7 Emask 0x1 (device error)
Mar 25 23:09:10 xen0 kernel: ata1.00: status: { DRDY ERR }
Mar 25 23:09:10 xen0 kernel: ata1.00: error: { ABRT }
Mar 25 23:09:10 xen0 kernel: ata1.00: configured for UDMA/133
Mar 25 23:09:10 xen0 kernel: ata1: EH complete
Mar 25 23:09:10 xen0 kernel: end_request: I/O error, dev sda, sector 18297870
Mar 25 23:09:10 xen0 kernel: md: super_written gets error=-5, uptodate=0
Mar 25 23:09:10 xen0 kernel: md: md3: recovery done.
Mar 25 23:09:10 xen0 kernel: RAID1 conf printout:
Mar 25 23:09:10 xen0 kernel: --- wd:1 rd:2
Mar 25 23:09:10 xen0 kernel: disk 0, wo:1, o:0, dev:sda3
Mar 25 23:09:10 xen0 kernel: disk 1, wo:0, o:1, dev:sdb3
Mar 25 23:09:10 xen0 kernel: RAID1 conf printout:
Mar 25 23:09:10 xen0 kernel: --- wd:1 rd:2
Mar 25 23:09:10 xen0 kernel: disk 1, wo:0, o:1, dev:sdb3

O setor é sempre o mesmo: 18297870 . Se eu checar a saída de smartctl -a /dev/sda ele não mostra nenhum setor realocado, então, eu pensei, eu poderia impor a realocação com um método que eu encontrei aqui .

hdparm --read-sector  18297870 /dev/sda
hdparm --write-sector  18297870 --yes-i-know-what-i-am-doing /dev/sda

Mas com os comandos acima, o disco não relata nenhum erro - e, portanto, não realoca o setor:

smartctl -a /dev/sda | grep -i reall
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0

Eu pesquisei a mensagem status: { DRDY ERR } e alguns dizem que isso pode ser um bug do kernel. Mas então eu me pergunto por que isso começou a acontecer agora. Não houve mudança no sistema nos últimos anos.

Há uma coisa que ainda me incomoda: smartctl -a /dev/sda também relata alguns erros nos logs. É sempre o mesmo erro:

Error 15 occurred at disk power-on lifetime: 39971 hours (1665 days + 11 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  04 51 00 38 df f7 a7

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  ea 00 00 00 00 00 00 08  35d+12:17:45.571  FLUSH CACHE EXT
  61 80 f0 0e 96 2d 00 08  35d+12:17:44.033  WRITE FPDMA QUEUED
  61 80 e8 8e 95 2d 00 08  35d+12:17:44.033  WRITE FPDMA QUEUED
  61 80 e0 0e 95 2d 00 08  35d+12:17:44.033  WRITE FPDMA QUEUED
  61 80 d8 8e 94 2d 00 08  35d+12:17:44.033  WRITE FPDMA QUEUED

Tudo isso não faz sentido para mim: se o disco está realmente com defeito, por que posso ler e gravar com sucesso no setor em que a ressincronização de RAID falha a cada vez? E por que o disco não tenta primeiro realocar o setor quebrado se ele realmente detectar um erro?

    
por Michael Härtl 25.03.2013 / 23:36

2 respostas

1

Se, de acordo com o seu comentário, o erro ocorrer o tempo todo no mesmo setor do que um problema de disco, por algum motivo o disco expirará escrevendo (com base no log de erros inteligente) e não poderá realocar ou por algumas razões desconhecidas decide não realocar.

Em um disco SAS, você pode usar um comando explícito para realocar o setor, mas não estou ciente desse comando no SATA.

Sua única opção seria tentar uma gravação explícita no setor enquanto definia um tempo limite muito grande no disco. Você pode controlar o tempo limite do disco configurando / sys / block / sdX / device / eh_timeout para um valor grande, até 600 segundos (5 minutos). Isso poderia ajudar a escrever a localização incorreta e evitar abortar a solicitação toda vez.

    
por 30.08.2014 / 09:03
-2

Você tem o RAID1 para não perder dados. Eu substituiria o disco e faria outra ressincronização.

    
por 31.03.2013 / 19:46