Assim como o sistema de arquivos ext4 do linux tem a ferramenta fsck para checar e ver se há erros no disco, ZFS tem o scrub para examinar o pool à procurar de falha na integridade dos dados.
Uma vantagem que o scrub tem sobre o fsck é que não é preciso deixar o disco em off ao tentar corrigir os dados com erro. Sim, para usar fsck a fim de corrigir erros temos que desmontar o disco usando a opção umount.
Um outro ponto que é desvantagem para o sistema de arquivos ext4 é quando ele trabalha com array.
Abaixo temos um array com 2 discos espelhados usando raid-1. Dois discos trabalhando como se fossem apenas um. O sistema de arquivos desse espelhamento é o ext4. O ext4 não tem conhecimento dos discos abaixo dele, os discos do array.
Também, se, por exemplo, tivermos um bloco ruim(bad block) no disco01 e outro bom no disco02 o programa que gerencia o raid não saberá qual é qual. O programa que gerencia o raid irá pegar o dado ruim se estiver lendo do disco01 e se estiver lendo o disco02 pegará dado bom.
Esses problemas nós não teremos ao usar o Sistema de Arquivos ZFS. ELe pode pegar as informações do bloco bom que está no disco íntegro e usar no lugar do que está ruim.
O Scrub do ZFS irá checar cada bloco usando o algorítimo fletcher4 e checksum.
Usando zpool scrub
Como todos os demais comandos do zfs, usar o scrub é fácil, basta executarmos “zpool scrub nome_do_pool”
elder@server01:~$ sudo zpool scrub meuPool
Enquanto executa o scrub podemos ver seu status com
elder@server01:~$ sudo zpool status [sudo] senha para elder: pool: meuPool state: ONLINE scan: scrub in progress since Thu Feb 11 18:11:35 2021 319K scanned at 319K/s, 89K issued at 89K/s, 397K total 0B repaired, 22,42% done, no estimated completion time config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 spares sdf AVAIL errors: No known data errors
Acima vemos em laranja que não foi preciso reparar nada ainda(0B) e, laranja, que o scrub está em execução e já examinou 22,42%.
Ao executar “zpool status” após o término do scrub termos um aviso. Alaranjei a parte relacionada abaixo:
elder@server01:~$ sudo zpool status pool: meuPool state: ONLINE scan: scrub repaired 0B in 0 days 00:00:01 with 0 errors on Thu Feb 11 18:11:36 2021 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 spares sdf AVAIL errors: No known data errors
Vemos que não foi encontrado nenhum dado corrompido.
Parando e Pausando o Scrub
Executar um scrub pode deixar o sistema lento. Recomendados seu uso fora do horário de expediente da empresa ou, se for em sua casa, em um horário ocioso.
Mas se por acaso executou o scrub e quer pará-lo basta executar “zpool scrub -s nome_do_pool”
elder@server01:~$ sudo zpool scrub -s meuPoo
Se quiser pausar ao invés de parar basta executar “zpool scrub -p meuPoo”.
elder@server01:~$ sudo zpool scrub -p meuPoo
Para continuar um scrub pausado basta executar novamente “zpool scrub meuPoo”
elder@server01:~$ sudo zpool scrub meuPool
Conclusão
Como dito acima, realizar um scrub é algo custoso e compromete a performance do sistema. É recomendado executar em horário ocioso de usuário.
Uma recomendação é em relação com qual frequência é recomendado executar o scrub e isso tem muito haver com qual disco é usado.
- Disco SAS ou Disco FC: Executar o scrub uma vez ao mês.
- Sata ou SCSI: Uma vez na semana
Outra coisa importante é agendarmos a execução automática usando crontab. Já que o zfs não executa scrub automaticamente.
Fontes: pthree.org, manual zpool