Erro permanente do ZFS; opções para recuperação

4

Histórico: pequeno servidor pessoal, email, web, shell, etc., para familiares e amigos. SunOS 5.11, snv_113 de novembro de 2008. Servidor construído em 2009. Acredito que seja o opensolaris ou o release de acesso antecipado do Solaris. Processador AMD de 64 bits, 4 GB de RAM.

Espelho de três vias do zpool raiz, originalmente composto por três discos giratórios de 320 gb do tamanho de um laptop. Após três anos, cada um dos discos giratórios desapareceu, um por um; cada um substituído na garantia do fabricante. Nos últimos meses, outro disco foi estúpido novamente. Por enquanto, decidi apenas executar um espelho bidirecional. Na última semana, um erro permanente apareceu, com três arquivos listados. Depois de um scrub, esses erros desapareceram, exceto por um erro de metadados. Como o segundo disco começou a falhar também, eu joguei uma unidade de desktop sobressalente e resilvered para isso. A mesma soma de verificação e erro de metadados persistiram. Em desespero, comprei um par de SSDs (cheguei a odiar discos giratórios). Eu adicionei um ao pool como um terço, e naturalmente durante o resilver, eu permaneço com o seguinte:

root-klaatu /root% zpool status -v
  pool: rpool
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://www.sun.com/msg/ZFS-8000-8A
 scrub: resilver in progress for 1h47m, 84.53% done, 0h19m to go

config:

    NAME        STATE     READ WRITE CKSUM
    rpool       ONLINE       0     0     1
      mirror    ONLINE       0     0     6
        c1d0s0  ONLINE       0     0     6
        c1d1s0  ONLINE       0     0     6  55.0G resilvered
        c0d1s0  ONLINE       0     0     6  55.3G resilvered

erros:

Permanent errors have been detected in the following files:
    <metadata>:<0x172>

No momento em que terminar, haverá dez erros de soma de verificação por disco relatados e dois no próprio rpool. Um 'zpool clear' funciona como "ótimo" para limpar a contagem de erros da soma de verificação, mas o arquivo de metadados com erro persiste, e cada resilver / scrub apenas retorna os mesmos erros de soma de verificação. Note que eu apaguei todos os instantâneos, pois li que às vezes é onde os dados com erro existem - mas não há alegria.

Eu tenho backups - mas eles são via CrashPlan e na nuvem - então restaurar a coisa toda levaria dias para a conexão limitada que eu mantenho para o servidor, o que significa que dias do servidor estão indisponíveis, o que simplesmente não é tenable.

Soooo - tudo isso dito. Qual é a minha opção de recuperação diferente de restaurar a partir do backup (já que o 'arquivo' de metadados é obviamente algo que não posso excluir).

Se eu fosse criar um novo pool do zfs em um novo disco - fazer um zfs enviar / receber 'limpar' o erro? Ou seria melhor configurar o novo pool, depois rsincronizar os dados antigos do pool para ele, renomear o novo pool para o original, instalar os blocos de inicialização nos discos espelhados e tentar inicializar a partir dele? Eu li que há bits de dados em cache relacionados ao nome real do pool que podem interferir na inicialização.

Eu sei que a coisa "lógica" a fazer seria apenas construir um servidor novo e fresco em um sistema operacional recente como o OmniOS ou o OpenIndiana ou qualquer outra coisa - mas com todo o código compilado personalizado neste servidor (que era originalmente um Sparc 20 de volta no início dos anos 2000), eu presumo que rsyncing tudo não funcionaria bem.

Obrigado por qualquer ajuda.

Oh - eu devo adicionar - o servidor está funcionando bem. Sem travamentos, sem travamentos, nada.

    
por anastrophe 04.08.2015 / 21:02

1 resposta

1

Consegui me "recuperar" deste incidente enviando o conjunto corrompido para um novo pool.

# crie um novo conjunto de discos único (ou um espelho com antecedência, se desejar)
zpool create -f tpool c0d0s0

# cria um instantâneo de base do pool antigo em zfs snapshot -r rpool@now

# zfs envia para o novo tpool em zfs send -vR rpool@now | zfs receive -Fduv tpool

# note que isso irá redefinir o ponto de montagem do tpool para rpool - por isso, certifique-se de atualize-o para zfs set mountpoint=/tpool tpool

# ir usuário único; como depende do seu sistema
# edit:
/rpool/boot/grub/menu.lst

# (Note que este arquivo deve ser mantido pelo bootadm; sob as circunstâncias, eu escolhi apenas ir direto)

#duplicate primeiro conjunto de notas, edite a cópia, altere o findroot em findroot (pool_rpool,0,a)
# para findroot (pool_tpool,0,a)

# faça um segundo instantâneo agora que, em um único usuário, zfs snapshot -r rpool@now2

# envia o snap incremental para o novo tpool em zfs send -vR -i rpool@now rpool@now2 | zfs receive -Fduv tpool

# mount tpool - tenha em mente novamente, o ponto de montagem precisa ser atualizado em zfs mount=/tpool tpool

# rm o arquivo 'bootsign' e substitua por novo:
rm /tpool/boot/grub/bootsign/pool_rpool
touch /tpool/boot/grub/bootsign/pool_tpool

# formalize onde inicializar a partir de zpool set bootfs=tpool/ROOT/snv_113 tpool

# adicione os blocos de inicialização em installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0d0s0

# poweroff, desanexe os discos do rpool - ou deixe-os para uma investigação mais aprofundada
# se for espelhar, conectar fisicamente o segundo disco
# inicializar
# virar carretel para um espelho | zpool attach tpool c0d0s0 c1d0s0

# concluído

Note que se tudo for satisfatório, você pode editar o menu grub para mover a nova entrada de inicialização do tpool para ser a primeira, ou alterar a declaração 'default' para apontar para a que estiver na lista (ou, se não há outras declarações de inicialização, então apenas apague aquela para o rpool).

Além disso - embora eu tenha me referido a mais de cem sites e páginas da web diferentes ao tentar resolver isso, a "receita" acima é derivada em grande parte de Como reduzir um rpool do ZFS espelhado, por Joe Mocker .

    
por 09.08.2015 / 06:37