Como verificar somas de verificação on-line em brtfs?

1

TL; DR: Dois discos em raid1 usando brtfs. Somas de verificação são verificadas apenas para o disco do qual os dados do arquivo foram lidos. Como forçar a verificação de todos os checksums ocasionalmente, por exemplo em um cron semanal?

Eu tenho um btrfs em 2 discos no raid1 ( /dev/sd{b,c}1 ). Para testar a correção de erros, eu escrevi um arquivo para o disco, procurei em qual setor ele foi armazenado e alterei um único bit escrevendo diretamente para /dev/sdc1 . Desde que montei /dev/sdb1 , imaginei que escrever para /dev/sdc1 seria um bom teste para ver se ele era replicado e se detectaria a alteração.

Ao ler o arquivo, nenhum erro ocorreu e o bit alterado ainda estava presente em sdc1 (não estava presente em sdb1 ). Demorou até desmontar sdb1 e montar sdc1 , em seguida, lendo o arquivo, para o erro ser corrigido.

Como posso verificar regularmente as somas de verificação (por exemplo, semanalmente, usando o cron) em ambos os discos sem precisar desmontar?

Se você quiser replicar a situação, isso é o que eu fiz:

$ mount /dev/sdb1 /mnt && cd /mnt
$ yes | head -100 > yes
$ filefrag -e yes # Look up in which sector the file is stored
$ echo x | dd of=/dev/sdc seek=$((offset*4096)) bs=1 count=1 # offset*sector_size

$ grep x yes # no results, no errors
$ dmesg | tail # nothing relevant
$ dd if=/dev/sdc skip=$((offset*4096)) bs=1 count=10 # To verify the x is actually there, and it is

$ # Mount sdc1 instead of sdb1
$ cd .. && umount mnt && mount /dev/sdc1 mnt
$ grep x yes # no results, no errors
$ dmesg | tail
[3695509.439534] BTRFS warning (device sdc1): csum failed ino 466 off 469331968 csum 444003100 expected csum 3637724482
[3695509.555018] BTRFS warning (device sdc1): csum failed ino 466 off 469331968 csum 444003100 expected csum 3637724482
[3695509.590762] BTRFS info (device sdc1): read error corrected: ino 466 off 469331968 (dev /dev/sdc1 sector 3692728)
# Finally, it was detected and silently corrected

Estou no kernel versão 4.9.

    
por Luc 20.04.2017 / 10:48

1 resposta

1

o scrub btrfs preenche esta função:

btrfs scrub is used to scrub a btrfs filesystem, which will read all data and metadata blocks from all devices and verify checksums. Automatically repair corrupted blocks if there’s a correct copy available.

É útil apenas em uma configuração RAID do btrfs como a sua (ou talvez uma DUP configuração), pois ela precisa de outra cópia para ser corrigida. Muitas vezes é sugerido para executar isso como um serviço em um temporizador. A página man sugere todos os meses como padrão, mas isso pode ser feito com mais frequência.

    
por 20.04.2017 / 14:36

Tags