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.