단일 장치 Btrfs의 파일이 손상되면 어떤 일이 발생하는지 상상해 보십시오. 이 경우 손상된 비트가 포함된 파일 내용을 있는 그대로 포함해야 합니다.
mount의 매뉴얼 페이지에 명시된 바와 같이:
nodatasum
Enable/disable data checksumming for newly created files.
따라서 파일을 읽을 때 체크섬 검사를 비활성화하지 않습니다.
나는 파일 시스템 읽기와 관련된 모든 표준 시스템 호출이 이 파일에서 실패할 것이라고 추측합니다. 조각화 가능성으로 인해 원시 디스크 읽기는 옵션이 아닙니다.
해당 파일을 시도하면 cat
오류가 발생합니다.
cat: file: Input/output error
dmesg
다음 메시지를 보고합니다.
[631847.884641] BTRFS warning (device loop0): csum failed ino 257 off 0 csum 1280268577 expected csum 2391276770
손상이 발생한 위치를 알면 off 0
이것이 파일의 첫 번째 4096바이트이므로 실제로 손상되지 않은 블록을 매우 쉽게 검색할 수 있었습니다.
dd if=file bs=4K skip=1
그런데, 손상된 파일의 손상되지 않은 블록에 데이터를 쓰고 추가하는 것도 성공합니다. 적어도 손상된 블록이 하나만 있고 그것이 마지막 블록이 아닌 경우에는 그렇습니다. 처음에는 놀랐지만 나중에 중요한 데이터를 추가해야 하는 응용 프로그램이 손상된 파일에 걸리는 것을 방지할 수 있는 좋은 기능일 수 있다고 생각했습니다.
문제는 손상된 블록(또는 전체 손상된 파일)에서 데이터를 검색하는 방법입니다.
답변1
최후의 수단으로 시도해 볼 수 있습니다.
btrfs 확인 --init-csum-tree /tmp/copy_of_the_device.bin
이 명령은 파일 시스템을 변경하고 결과가 이전보다 나빠질 수 있으므로 파일 시스템의 dd 또는 ddrescue 복사본에서만 이 명령을 실행하십시오.
답변2
Linux 커널 5.11에는 파일 체크섬을 마운트하고 무시하는 옵션이 도입되었습니다. 이렇게 하면 데이터가 잘못된 csum에서 복사될 수 있습니다.
mount -o rescue=ignoredatacsums /dev/sdX /mnt
이를 통해 파일이 최소한으로 손상되었고 일종의 패리티가 있는 경우 파일을 완전히 복구할 수 있습니다.2스트로크