원인

원인

내 NAS에는 BTRFS가 포함된 500GB 디스크가 있었습니다. 최근에 4TB 디스크를 받았는데 다운타임 없이 새 디스크만 사용하고 싶었습니다. 그래서 나는 실행하고 btrfs replace start 1 /dev/sdb .그것이 끝날 때까지 기다렸다가 500GB 드라이브를 뽑았습니다.

이제 4TB 디스크에 액세스할 수 없으므로 교체된 500GB 디스크에서 모든 데이터를 복구하고 싶지만 해당 디스크의 BTRFS 파티션은 더 이상 인식되지 않습니다. -o degraded, , 심지어 시도 -o recovery,ro했지만 모두 실패했습니다. 여기서 내 옵션은 무엇입니까?btrfs restorebtrfs check

답변1

과거의 질문입니다만, 저도 같은 상황을 접해서 답변드립니다.
나는 btrfs replacedebian Bullseye(5.10.0-13-amd64)에서 RAID1 파일 시스템을 실행했고 다음 절차를 사용하여 Manjaro(5.13.19-2)에서 복구했습니다.

원인

적어도 커널 버전 5.10의 경우 btrfs replace명령은 결국 btrfs_scratch_superblocks다음 위치에서 함수를 호출합니다.GitHub
이 기능은 원본 디스크의 슈퍼블록에 있는 "마법의 문자열"을 제거합니다.

실제로 내 환경에서 다음과 같은 결과를 얻었습니다.

# btrfs inspect-internal dump-super -F /dev/sdb1
superblock: bytenr=65536, device=/dev/sdb1
---------------------------------------------------------
csum_type       0 (crc32c)
csum_size       4
csum            0x7d4435b9 [DON'T MATCH]
bytenr          65536
flags           0x1
            ( WRITTEN )
magic           ........ [DON'T MATCH]

에 따르면btrfs 위키, "마법"(= "마법의 문자열")은 이어야 합니다 _BHRfS_M.

복구 절차

What if I don't have wipefs at hand?에 참고하여btrfs 위키, 쉘에서 다음을 실행하십시오.
교체된 디스크가 연결된 PC가 아닌 다른 PC에서 실행하는 것이 더 안전할 것입니다.

사용자 환경에 맞게 장치 및 마운트 지점 위치를 다시 작성하십시오.
(제 환경에서는 /dev/sdb1 로 성공했습니다!)

# # backup magic strings just in case
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024+64)) of=~/magic1
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024*1024+64)) of=~/magic2
# dd bs=1 count=8 if=/dev/sdb skip=$((256*1024*1024*1024+64)) of=~/magic3

# # write magic string
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((256*1024*1024*1024+64))

# btrfs device scan
# mkdir -p /mnt/before_replace
# mount -o degraded,ro /dev/sdb /mnt/before_replace

제가 영어를 잘 못해서 읽기 힘들면 죄송합니다. 하지만 이것이 같은 상황에 있는 다른 사람들에게도 도움이 되기를 바랍니다.

관련 정보