내 디스크는 RAID1 btrfs에서 오류가 발생하여 쓰기가 불규칙하지만 읽기는 대부분 작동합니다. 교체하는 방법?

내 디스크는 RAID1 btrfs에서 오류가 발생하여 쓰기가 불규칙하지만 읽기는 대부분 작동합니다. 교체하는 방법?

RAID1에 데이터와 메타데이터가 포함된 이중 디스크 btrfs 파일 시스템이 있습니다(mdraid가 아닌 btrfs 기능을 통해). 이 디스크는 상단에 dm-crypt가 있는 USB3 드라이브입니다. 디스크 중 하나에 오류가 발생했습니다(수천 개의 불량 섹터가 있고 쓰기 시간이 자주 초과됨). 고장난 USB 드라이브를 교체하기 위해 세 번째 USB 드라이브를 얻었습니다. 어떻게 교체합니까?

답변1

이것은 로얄 피타 빵으로 밝혀졌습니다. 첫째, 이제 btrfs에 적절한 대체 명령이 있다는 점을 기억하는 것이 중요합니다. 이는 새 명령을 추가하고 실패한 명령을 삭제하는 것보다 훨씬 낫습니다.

먼저 새 디스크를 파티션하고 여기에 dm-crypt를 설정하는 것부터 시작하세요. 계속해서 잠금을 해제하세요.

디스크에 쓰기 시간 제한(각각 360초 소요)이 없으면 간단한 작업을 수행할 수 있습니다.

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                       /dev/mapper/luks-NEW-disk-uuid /mount/path

그러나 이로 인해 불량 디스크에 일부 일상적인 쓰기가 수행되고 이로 인해 시간 초과가 발생하는 경우 약 30초의 빠른 복사 후 시간 초과를 기다리는 6~12분의 유휴 시간이 표시됩니다.

쓰기를 방지하려면 장치 매퍼를 사용하여 스냅샷을 설정할 수 있습니다. 읽기는 기본 불량 장치로 이동하고(읽기는 기본적으로 괜찮음) 쓰기는 COW(기록 중 복사) 저장소로 이동합니다. 첫째, COW 저장을 위한 적절한 크기의 블록 장치가 필요합니다. Watt-sdj1_dmsnap이에 대한 새 논리 볼륨( )을 만들었습니다 . 모든 블록 장치(루프 장치 포함)가 작동해야 합니다. 저는 개인적으로 혹시라도 문제가 생길 경우를 대비해 영구 디스크를 사용하는 것을 권장하지만, 위험에 처해 있고 RAM이 충분하다면 RAM 디스크도 괜찮을 것입니다.

광산에는 약 1.7GB의 COW 공간이 필요합니다(3TB 드라이브에서 2.24TiB 이동). COW 공간을 넉넉하게 확보하는 것이 좋습니다. 공간이 부족한 것은 나쁜 일이 될 수 있으며 일단 사용하고 나면 모두 확보할 수 있습니다.

다음으로 btrfs 파일 시스템을 마운트 해제하고(마운트된 경우) dm-crypt 장치를 잠그(중지)해야 합니다. 암호화되지 않은 데이터가 디스크에 기록되는 것을 원하지 않기 때문에 스냅샷을 암호화 아래에 두었습니다.

제 경우에는 파티션이 이었습니다 /dev/sdj1. 먼저 오류를 방지하려면 읽기 전용으로 설정하세요.

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

(나중에 재설정을 사용할 수 있습니다 --setrw). 이제 실제로 스냅샷을 설정하려면 다음을 수행하십시오.

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

이것이 무엇을 의미하는지 빠르게 설명하기 위해 장치 매퍼 테이블의 형식은 다음과 같습니다.시작 섹터 섹터 수 대상 유형 대상 매개변수. 시작 섹터는 0입니다. 섹터 수는 sdj1의 크기와 같습니다(결국 모든 작업을 수행하려고 함). 대상 유형은 snapshot입니다. 스냅샷 대상에는 여러 매개변수가 있습니다.소스 개발 가축 개발자 모델 블록 크기. 우리가 제공하는 소스 장치는 /dev/sdj1제가 생성한 논리 볼륨입니다.내구성(메타데이터는 재부팅 시 백업될 수 있도록 디스크에 기록됨) 및verflow(스냅샷에 많은 데이터를 쓰면 복원 가능) 블록 크기는 스냅샷의 세분성입니다. 바이트를 쓰면 해당 바이트 주변의 전체 블록이 복사됩니다(그리고 스냅샷의 공간을 소비합니다). 8은 4K이므로 정렬 문제가 없습니다.

이제 마침내 장치를 다시 잠금 해제합니다. 그러나 잠금을 해제하는 대신 /dev/sdj1잠금을 해제합니다 /dev/mapper/sdj_divert. 그런 다음 btrfs 파일 시스템을 다시 마운트하십시오.

다음 명령을 사용하여 스냅샷 사용량을 확인할 수 있습니다 dmsetup status sdj_divert. 비슷한 내용이 표시되어야 합니다(그러나 슬래시 앞에 숫자가 훨씬 적음).

0 5860524928 snapshot 914216/545259520 3568

처음 세 가지 항목은 시작 섹터, 섹터 수 및 대상 유형입니다. 다음 숫자는 사용된 섹터 수(슬래시 앞)이고 그 다음은 총 섹터 수(슬래시 뒤)입니다. 이는 사용된 공간의 일부일 뿐입니다. 마지막 숫자는 메타데이터에 사용되는 섹터 수로, 이미 사용된 수에 포함되어 있습니다.

btrfs replace start이제 마지막으로 답변 상단에 있는 간단한 명령을 사용할 수 있습니다. 즉시 반환되며 를 실행하여 상태를 관찰합니다 btrfs replace status /mount/path.

교체가 완료되면 손상된 장치가 파일 시스템에서 제거되었는지 확인하고(예: btrfs fi show /mount/path) 오류가 발생한 드라이브를 잠그거나 종료한 다음 스냅샷을 삭제할 수 있습니다( dmsetup remove sdj_divert). 그런 다음 COW 공간을 확보할 수 있습니다(편집증이 있는 경우 이를 지운 후).

기술적으로 선택적인 마지막 단계가 하나 있습니다. 교체 장치는 더 크지만 btrfs는 아직 추가 공간을 사용하지 않았습니다. btrfs에서 사용할 수 있도록 하려면 btrfs fi show출력에서 ​​devid를 찾아 실행하세요.

btrfs fi resize DEVID:max /mount/path

거의 즉각적으로 이루어져야 합니다.

관련 정보