Software raid mdadm não adicionando reposição

1

Acabei de descobrir o mesmo problema em dois servidores novos e idênticos instalados há apenas 9 meses. Não consegui gravar no disco em ambos, porque o sistema tinha marcado como somente leitura. Logs indicavam que havia algum tipo de erro de disco em ambos.

Note que estou executando o KVM com vários convidados em cada um desses servidores. Os convidados estavam todos correndo bem, mas o problema estava no host KVM. Isso provavelmente não importa, mas talvez seja pertinente. Ambos os sistemas têm apenas duas unidades com o software raid1 e o LVM no topo. Cada convidado do KVM também possui sua própria partição LVM.

Ambos os sistemas mostravam um array RAID1 degradado ao olhar para /proc/mdstat .

Então eu reiniciei um dos sistemas, e ele me disse que eu precisava executar manualmente fsck . Então eu fiz isso. Parecia para corrigir os problemas e uma reinicialização trouxe o sistema de volta normalmente. O mesmo processo funcionou no segundo servidor também.

Em seguida, executei mdadm --manage /dev/md0 --add /dev/sdb1 para adicionar a unidade com falha de volta à matriz. Isso funcionou bem em ambos os servidores. Durante a próxima hora, ver /proc/mdstat mostrou que estava sendo feito progresso na sincronização das unidades. Após cerca de uma hora, um sistema foi concluído e /proc/mdstat mostrou que tudo estava funcionando bem com [UU] .

No entanto, no outro sistema, após cerca de 1,5 horas, a carga do sistema disparou e nada foi responsivo. Alguns minutos depois, tudo voltou. Mas olhar para /proc/mdstat agora mostra o seguinte:

root@bond:/etc# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sda1[2] sdb1[1]
      293033536 blocks [2/1] [_U]

unused devices: <none>

Como você pode ver, parece que não está mais sincronizando. A porcentagem concluída, o tempo restante, etc. não são mais exibidos. No entanto, a execução de mdadm --detail /dev/md0 mostra isso:

root@bond:/etc# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90
  Creation Time : Mon Nov 30 20:04:44 2009
     Raid Level : raid1
     Array Size : 293033536 (279.46 GiB 300.07 GB)
  Used Dev Size : 293033536 (279.46 GiB 300.07 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Fri Sep 10 23:38:33 2010
          State : clean, degraded
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

           UUID : 4fb7b768:16c7d5b3:2e7b5ffd:55e4b71d
         Events : 0.5104310

    Number   Major   Minor   RaidDevice State
       2       8        1        0      spare rebuilding   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

A linha inferior parece indicar que o sobressalente está sendo reconstruído. Por que é um sobressalente? O sistema está relatando ambos os dispositivos como limpos. Ele ficou assim por horas. Os drives são pequenos e rápidos VelociRaptors de 10K RPM de 300K, então eu acho que já teria sido sincronizado. A tentativa de adicionar novamente diz que o dispositivo está ocupado:

root@bond:/etc# mdadm /dev/md0 --re-add /dev/sda
mdadm: Cannot open /dev/sda: Device or resource busy

A execução do dmesg no servidor "bom" mostra isso no final:

[ 4084.439822] md: md0: recovery done.
[ 4084.487756] RAID1 conf printout:
[ 4084.487759]  --- wd:2 rd:2
[ 4084.487763]  disk 0, wo:0, o:1, dev:sda1
[ 4084.487765]  disk 1, wo:0, o:1, dev:sdb1

No servidor "ruim", essas últimas 4 linhas são repetidas centenas de vezes. No servidor "bom", eles são exibidos apenas uma vez.

As unidades ainda estão sendo sincronizadas? Esta "reconstrução" terminará? Eu só preciso ser mais paciente? Se não, o que devo fazer agora?

ATUALIZAÇÃO:

Acabei de reinicializar e a unidade começou a sincronizar novamente. Depois de quase 2 horas, a mesma coisa aconteceu como descrito acima (ainda recebe um [_U]). No entanto, consegui ver os logs do dmesg antes que os fragmentos de impressão do RAID1 consumissem tudo:

[ 6348.303685] sd 1:0:0:0: [sdb] Unhandled sense code
[ 6348.303688] sd 1:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 6348.303692] sd 1:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]
[ 6348.303697] Descriptor sense data with sense descriptors (in hex):
[ 6348.303699]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 6348.303707]         22 ee a4 c7 
[ 6348.303711] sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
[ 6348.303716] end_request: I/O error, dev sdb, sector 586065095
[ 6348.303753] ata2: EH complete
[ 6348.303776] raid1: sdb: unrecoverable I/O read error for block 586065024
[ 6348.305625] md: md0: recovery done.

Então, talvez a pergunta que eu deveria estar fazendo seja: "Como eu executo o fsck em um disco reserva em um conjunto de ataques?"

    
por Tauren 11.09.2010 / 09:17

3 respostas

2

Não estou certo se você realmente substituiu a (s) unidade (s) com falha (s)? Porque seus sintomas farão sentido para mim se você tiver adicionado novamente a unidade defeituosa, caso em que há uma boa chance de a unidade ter sido bloqueada. Se você adicionou novamente a unidade defeituosa, há erros subseqüentes em / var / log / messages ou dmesg?

(Incidentalmente, eu recomendaria strongmente contra nunca adicionar novamente uma unidade defeituosa a uma matriz RAID. Se a falha corrompido dados no prato você pode achar que quando você adicioná-lo de volta para a matriz, a ressincronização deixa o corrompido arquivo no disco, e da próxima vez que você ler os arquivos, será uma armadilha se você obtiver dados bons ou ruins, dependendo de qual disco responde primeiro; eu vi isso acontecer em estado selvagem.)

    
por 11.09.2010 / 11:06
0

Usando mdadm --details listará uma unidade como sobressalente enquanto estiver sendo reconstruída. Após a conclusão da reconstrução, ela não será mais mostrada como sobressalente.

[ 6348.303711] sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
[ 6348.303716] end_request: I/O error, dev sdb, sector 586065095
[ 6348.303753] ata2: EH complete
[ 6348.303776] raid1: sdb: unrecoverable I/O read error for block 586065024
[ 6348.305625] md: md0: recovery done.

A primeira linha indica que houve falha de realocação e os dados não foram lidos. As três linhas a seguir estão apontando que os dados não puderam ser lidos e listam os setores que são ilegíveis.

Como Rodger apontou, o disco está ruim, não volte a adicioná-lo. Nunca é uma boa ideia adicionar novamente uma unidade que falhou. Puxe a unidade e substitua-a. Se desejar, execute diagnósticos na unidade com falha, mas somente depois de ter sido puxada e substituída.

    
por 15.09.2010 / 00:13
0

Primeiro, sim, livre-se de qualquer disco que esteja jogando erros de leitura que acabam no arquivo de log. Isso significa que a realocação de blocos defeituosos falhou e / ou a unidade está prestes a morrer.

Eu sugiro que você resgate seus dados usando um CD de resgate do Linux, como o link para usar o ddrescue. Isso pode fazer uma cópia de imagem para a partição de um novo disco e fará muitas tentativas, etc., para tentar recuperar sua partição. Monte uma unidade USB ou outra partição

mkdir /tmp/x && mount /dev/sdd1 /tmp/x

para manter o arquivo de log do ddrescue - então você pode parar o ddrescue (ctrl-C) e reiniciá-lo mais tarde a partir do mesmo ponto.

Faça uma partição no novo disco um pouco maior que o disco antigo. Você não precisa usar todo o disco!

Inicialize o CD de recuperação com "nodmraid" como um parâmetro de inicialização do kernel. Se estiver usando o live CD do Ubuntu, instale o RAID e o LVM se você estiver usando-o

apt-get install mdadm lvm2 gddrescue

você precisará estar na internet para que isso funcione). Caso contrário, use o CD de recuperação do Ubuntu para a etapa do ddrescue. Troquei entre o CD de resgate para execuções do ddrescue e o live CD para o grub e o fsck.

Assumindo que / dev / sdb é seu disco de origem com falha, e / dev / sdx é seu novo disco, e / mnt / x é uma chave USB ou uma partição em outro disco que foi montado. Você precisa do arquivo de log do ddrescue, realmente! Como ele rastreia como o ddrescue está indo e permite que ele seja interrompido.

De acordo com o link

ddrescue --no-split /dev/sdb /dev/sdX imagefile /mnt/x/logfile

então

ddrescue --direct --max-retries=3 /dev/sdb /dev/sdX /mnt/x/logfile

então

ddrescue --direct --retrim --max-retries=3 /dev/sdb /dev/sdX /mnt/x/logfile

Não tenha medo de pressionar Ctrl-C caso esteja levando horas para recuperar um único setor. Basta ir para o próximo passo (passo 1 deve ter sucesso, não importa o quê). A última etapa tenta recuperar as últimas migalhas de dados utilizáveis.

Você também terá que fazer

mdadm --create /dev/md99 --level-1 --raid-devices=2 missing /dev/sdX

para criar uma nova matriz RAID usando o novo disco, isso cria um novo superbloco RAID na partição (nos últimos 64K a 128K no final da partição).

Remova seu disco com falha / dev / sdb antigo do sistema para que ele não fique visível para o linux.

Torne seu disco RAID de origem acessível. Você pode ter que usar o parâmetro "nodmraid" para o kernel de inicialização do kernel, já que eu tive problemas com o CD de recuperação do Ubuntu, e acabei usando o live CD do Ubuntu (10.4) onde o nodmraid está em Opções F6. Você só precisa usar

mdadm --assemble /dev/md99 /dev/sdX

Então fsck ou faça qualquer checagem que você precise fazer nos dados na matriz RAID md99 (eu usei o vgscan e consegui ver os LVs do LVM para executar a checagem). Eu uso o XFS para o mythtv, mas o comando xfs_check travou o meu sistema, mas o xfs_repair foi OK.

Monte o diretório / boot do seu novo / dev / sdX

mount /dev/mapper/my_vg/root_lv /tmp/x

em seguida, insira um novo registro de inicialização do GRUB no novo disco RAID / dev / sdX (somente se você inicializar a partir do RAID!)

grub-setup -d /tmp/x/boot/grub /dev/sdX

agora você tem uma matriz RAID (quase) inicializável. Você também pode fazer a configuração usando o próprio GRUB, ou usar o dd para copiar os primeiros 446 bytes do / dev / sdb para / dev / sdX. SOMENTE os primeiros 446 bytes, o resto do primeiro setor é sua tabela de partições, que você armazenará poderosamente se copiar mais! Você também pode ter que fazer o mesmo para o primeiro setor em sua partição / dev / sdX1 (digamos). Faça backup de todos os setores que você irá sobrescrever, usando também o dd.

Se estiver usando o grub2 e estiver inicializando a partir do RAID, você descobrirá que o UUID da matriz RAID mudou e sua inicialização falhará. Edite a linha de comando de inicialização (e no painel de inicialização do Grub) para remover respingos e tranquilidade, para que você possa ver o que está acontecendo. Então, após a falha na inicialização, você fica no initramfs.

mdadm --assemble /dev/md99 /dev/sdX

depois, verifique / proc / mdstat para ter certeza de que a matriz está lá. Se for apenas "exit" e espero que sua sub-rotina GRUB funcione bem (o meu foi configurado para usar o LVM, então ele encontrou os LVs no dispositivo RAID assim que havia algum dispositivo RAID lá, ele apenas procurou pelo LV). Depois de iniciado, você está quase pronto.

O arquivo de imagem initrd (arquivo gps do cpio) contém uma cópia do mdadm.conf usado durante o processo de inicialização, visível e editável como /etc/mdadm/mdamdm.conf durante o processo de inicialização. Se você pode obter o seu sistema inicializado normalmente apenas atualize o initramfs usando

update-initramfs -u

Se você não conseguir inicializar o sistema por causa do UUID incompatível no arquivo mdadm.conf

Esteja ciente de que seu dispositivo de destino / dev / sdX pode aparecer como / dev / sdY quando você inicializar de uma forma diferente (Grub, rescue, boot real).

A propósito, a menos que você esteja usando RAID5 e esteja realmente interessado em alinhamento de blocos, eu usaria uma partição para sua matriz RAID, você não precisa usar um disco inteiro (especialmente se você estiver substituindo um disco de 1TB com um 2TB um). Você sempre pode adicionar outra partição e um segundo array RAID mais tarde para usar todos os 2TB.

Ufa! Feito!

    
por 11.05.2011 / 18:15