btrfs에서 온라인으로 체크섬을 확인하는 방법은 무엇입니까?

btrfs에서 온라인으로 체크섬을 확인하는 방법은 무엇입니까?

간단히 말해서:raid1의 두 디스크는 btrfs를 사용합니다. 체크섬은 파일 데이터를 읽은 디스크에 대해서만 확인됩니다. 주간 크론과 같이 때때로 모든 체크섬을 강제로 확인하려면 어떻게 해야 합니까?


raid1 () 의 2개 디스크에 btrfs가 있습니다 /dev/sd{b,c}1. 디버깅을 테스트하기 위해 디스크에 파일을 쓰고 어느 섹터에 저장되어 있는지 찾아본 후 직접 쓰기로 복사를 해봤기 때문에 /dev/sdc1복사 가 되는지 확인해 보는 /dev/sdb1것도 쓰기가 좋은 테스트가 될 거라 생각했고 , /dev/sdc1변경 사항이 감지되는지 여부.

파일을 읽을 때 오류가 발생하지 않고 변경된 비트가 여전히 존재합니다 sdc1(그렇지 않았습니다 sdb1). 을(를) 제거 sdb1하고 설치한 sdc1다음 파일을 읽어야 오류가 수정되었습니다.

제거하지 않고 주기적으로(예: 일주일에 한 번, cron을 사용하여) 두 디스크의 체크섬을 확인하려면 어떻게 해야 합니까?

이 상황을 재현하고 싶다면 다음과 같이 했습니다.

$ 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

내 커널 버전은 4.9입니다.

답변1

BTRFS 스크럽이 역할을 수행했습니다.

BTRFS 스크럽 모든 장치에서 모든 데이터 및 메타데이터 블록을 읽고 체크섬을 확인하는 btrfs 파일 시스템을 정리하는 데 사용됩니다. 올바른 복사본이 있으면 손상된 블록이 자동으로 복구됩니다.

DUP수정하려면 다른 복사본이 필요하므로 귀하와 같은 btrfs RAID 설정(또는 가능한 설정)에만 유용합니다 . 일반적으로 타이머에서 서비스로 실행하는 것이 좋습니다. 매뉴얼 페이지에서는 기본값을 한 달에 한 번으로 권장하지만 더 자주 수행할 수도 있습니다.

관련 정보