Qual é a maneira correta de recuperar erros do ZFS após uma falha de energia?

0

Algumas vezes tive uma perda repentina de energia, o que tornou um pool do ZFS inutilizável até depois de uma reinicialização total do sistema. Eu pretendo obter um no-break para evitar problemas futuros, mas parece que deve haver uma maneira de corrigir um problema tão simples sem um desligamento completo do sistema.

A reprodução do problema é muito fácil: Meu pool do ZFS é executado em dois discos rígidos conectados via USB. Este é o status enquanto o pool está sendo executado corretamente:

$ sudo zpool status
pool: tank
state: ONLINE
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                ONLINE       0     0     0
  mirror-0                                          ONLINE       0     0     0
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  ONLINE       0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  ONLINE       0     0     0

Se eu desligar a energia das unidades USB sem interromper o ZFS primeiro e, em seguida, ligá-lo novamente após alguns segundos, ocorrerão os seguintes problemas: Se eu tentar LS dentro do ponto de montagem do ZFS, ele será interrompido indefinidamente, exigindo que eu feche o terminal. (O processo de l permanecerá como um zumbi). Qualquer computador conectado ao servidor nfs via samba também será interrompido se tentar acessar o diretório compartilhado.

O status será agora parecido com:

$ sudo zpool status
  pool: tank
 state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://zfsonlinux.org/msg/ZFS-8000-HC
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                UNAVAIL      0     0     0  insufficient replicas
  mirror-0                                          UNAVAIL      0     0     0  insufficient replicas
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  UNAVAIL      0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  UNAVAIL      0     0     0

apesar do fato de que as unidades USB foram ligadas novamente.

Eu tentei os seguintes comandos para corrigir o problema.

$ sudo zpool clear tank
cannot clear errors for tank: I/O error

$ sudo zfs unmount tank
cannot open 'tank': pool I/O is currently suspended

# Note: Because other computers were trying to access the zfs share via     samba, there are zombie processes, which is why an export won't work.

$ sudo zpool export tank
umount: /tank: target is busy
    (In some cases useful info about processes that
     use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed

$ sudo zpool export -f tank
umount: /tank: target is busy
    (In some cases useful info about processes that
     use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed

# Tried this just for kicks, and got the expected result.
$ sudo zpool import -nfF tank
cannot import 'tank': a pool with that name already exists
use the form 'zpool import <pool | id> <newpool>' to give it a new name

Passei algumas horas lendo postagens semelhantes de pessoas, mas nenhuma delas parece resolver esse problema exato. Se eu reiniciar o computador executando o ZFS todos os erros desaparecerá, os processos mortos serão resolvidos e tudo voltará ao normal.

Mas deve haver uma maneira mais clara de corrigir esse problema. Alguma sugestão?

EDITAR: Eu provavelmente deveria esclarecer. O servidor ao qual as unidades são conectadas é um laptop redirecionado, portanto, ele possui uma fonte de alimentação interna. Assim, sob operação normal, se houver uma queda de energia, é possível que as unidades USB percam energia e mais tarde voltem a funcionar sem que o servidor / laptop passe por uma reinicialização.

    
por klfwip 27.12.2016 / 01:28

1 resposta

2

Não consigo reproduzir seu cenário no momento, mas a primeira coisa que tentaria depois de uma falha desse tipo seria zpool reopen do pool e possivelmente zpool online do (s) dispositivo (s), se necessário. Por exemplo, quando você tem

$ sudo zpool status
  pool: tank
 state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://zfsonlinux.org/msg/ZFS-8000-HC
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                UNAVAIL      0     0     0  insufficient replicas
  mirror-0                                          UNAVAIL      0     0     0  insufficient replicas
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  UNAVAIL      0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  UNAVAIL      0     0     0

você poderia tentar

$ sudo zpool reopen tank

e se isso não esclarecer completamente as coisas também

$ sudo zpool online tank 'usb-ST4000DM_000-1F2168_000000000000-0:0-part1'
$ sudo zpool online tank 'usb-ST3000DM_001-1E6166_000000000000-0:1-part1'

É perfeitamente possível que apenas zpool reopen $POOL faça o pool funcionar novamente, já que instrui o ZFS a reabrir todos os dispositivos associados ao pool. (A página man descreve resumidamente como Reabrir todos os vdevs associados ao pool. Não sei se ele irá disparar uma varredura do vdev ou se simplesmente tentará reabrir sob os nomes já conhecidos. ) Contanto que os dispositivos ainda sejam encontrados sob os mesmos nomes, isso deve ser suficiente, e pode ser suficiente se os dispositivos forem conhecidos por nomes alternativos (se um vdev varredura é realizada).

Talvez você ainda precise zpool clear de erros de E / S, mas isso depende se o ZFS teve tempo de registrá-los. Se ambas as unidades morreram, é provável que o ZFS não tenha tido tempo para registrar os erros nas unidades, portanto zpool clear não deve ser necessário.

Como um aparte, você também pode verificar a propriedade failmode do pool ( zpool get failmode tank ). Parece que seu pool atualmente tem failmode=wait , mas, para o seu caso de uso, failmode=continue pode ser mais apropriado. Veja man 8 zpool para uma descrição dos vários valores para a propriedade failmode .

    
por 27.12.2016 / 13:20

Tags