ZFS Recuperar do Estado do Conjunto com Falhas

3

Eu tenho um pool raidz1 ZFS de seis discos e tive uma falha recente que exigiu a substituição do disco. Não há problema normalmente, mas desta vez meu hardware de servidor morreu antes que eu pudesse fazer a substituição (mas depois e sem relação com a falha da unidade, tanto quanto eu posso dizer).

Eu consegui outra máquina de um amigo para reconstruir o sistema, mas no processo de mover minhas unidades eu tive que trocar seus cabos em torno de um monte até que eu consegui a configuração correta onde os 5 discos bons restantes foram vistos como online. Este processo parece ter gerado alguns erros de soma de verificação para o pool / raidz.

Eu tenho as 5 unidades restantes configuradas agora e uma boa unidade instalada e pronta para ocupar o lugar da unidade que morreu. No entanto, como meu estado do pool é FAULTED , não consigo fazer a substituição.

root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb
cannot open 'tank': pool is unavailable

Existe alguma maneira de se recuperar desse erro? Eu acho que ter 5 das 6 unidades on-line seria suficiente para reconstruir os dados corretos, mas isso não parece ser suficiente agora.

Este é o log de status do meu pool:

root@zfs:~# zpool status tank
  pool: tank
 state: FAULTED
status: One or more devices could not be used because the label is missing or invalid.
        There are insufficient replicas for the pool to continue functioning.
action: Destroy and re-create the pool from a backup source.
   see: http://zfsonlinux.org/msg/ZFS-8000-5E
  scan: none requested
config:

    NAME                     STATE     READ WRITE CKSUM
    tank                     FAULTED      0     0     1  corrupted data
      raidz1-0               ONLINE       0     0     8
        sdd                  ONLINE       0     0     0
        sdf                  ONLINE       0     0     0
        sdh                  ONLINE       0     0     0
        1298243857915644462  UNAVAIL      0     0     0  was /dev/sdb1
        sde                  ONLINE       0     0     0
        sdg                  ONLINE       0     0     0

Atualização (31/10): Tentei exportar e reimportar o array algumas vezes na semana passada e não obtive êxito. Primeiro eu tentei:

zpool import -f -R /tank -N -o readonly=on -F tank

Isso produziu esse erro imediatamente:

cannot import 'tank': I/O error
       Destroy and re-create the pool from a backup source.

Eu adicionei a opção '-X' ao comando acima para tentar verificar o log de transação. Deixei isso acontecer por cerca de 48 horas antes de desistir porque ele tinha bloqueado completamente minha máquina (não consegui fazer login localmente ou pela rede).

Agora estou tentando um comando zpool import tank simples e parece que ele é executado por um tempo sem saída. Deixarei isso em funcionamento durante a noite para ver se sai alguma coisa.

Atualização (11/1): zpool import tank foi executado por cerca de 12 horas sem nenhuma saída de linha de comando até o momento. No entanto, meu computador ainda responde, então é uma vantagem.

    
por Nick 25.10.2013 / 09:16

2 respostas

2

Basicamente, não há nenhuma maneira oficial de recuperar além de restaurar a partir do backup. Mas há um recurso do ZFS chamado retroceder, que pode ser possível remover transações da piscina a um ponto em que a piscina está funcional novamente. O texto a seguir é do ZFS Internals blog part # 11

DO NOT TRY IT IN PRODUCTION. USE AT YOUR OWN RISK!

zpool import -FX mypool where options mean:
* -F Attempt rewind if necessary.
* -X Turn on extreme rewind.
* -T Specify a starting txg to use for import. This option is intentionally undocumented option for testing purposes.

Primeiro, tentei recuperar usando este procedimento de retrocesso. Não funcionou para mim, talvez não esteja implementado no zfs-fuse para Linux. De acordo com o ZFSOnDiskFormat.pdf, há um array com 128 valores possíveis para o txg. Na minha versão zfs-fuse versão 0.7.0 -T não existe. Então eu modifiquei o zfs-fuse para listar o txg disponível no array do uberblock e para permitir iniciar do txg com um ID específico. Usando o zfs-fuse modificado, consegui acessar sistemas de arquivos no ZFS.

Eu recuperei meu pool usando esse método. Assim, é possível recuperar, mas é um método não suportado e tem que ser feito com muito cuidado, pois é muito fácil mexer com as coisas ainda pior. Minha opinião é que a Sun / Oracle deve fornecer o fsck para o ZFS para essas situações.

    
por 20.11.2014 / 16:41
0

BTW, na esperança de ajudar alguém no futuro:

Acho que esse erro foi exacerbado e possivelmente causado pelo uso da nomenclatura / dev / sdX, / dev / hdX de minhas unidades no meu pool fora do período de configuração inicial.

Eu recomendaria usar outro esquema de nomeação como descrito muito melhor no FAQ do ZFS on Linux . Para minha pequena piscina, mudei para / dev / disk / by-id / . É muito fácil de mudar de esquema em um pool existente, se necessário.

    
por 02.03.2015 / 08:24

Tags