
데이터와 메타데이터가 모두 RAID1에 있는(mdraid가 아닌 btrfs 기능을 통해) 2개의 디스크로 구성된 btrfs 파일 시스템이 있습니다. 디스크는 상단에 dm-crypt가 있는 USB3 드라이브입니다. 디스크 중 하나에 오류가 발생했습니다(수천 개의 불량 섹터가 있고 쓰기 시간이 초과되는 경우가 많습니다). 결함이 있는 드라이브를 교체하기 위해 세 번째 USB 드라이브를 얻었습니다. 어떻게 교체할 수 있습니까?
답변1
이것은 왕실 PITA로 밝혀졌습니다. 첫째, 이제 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분 동안 유휴 상태로 시간 초과를 기다리는 것을 볼 수 있습니다.
쓰기를 방지하기 위해 device-mapper를 사용하여 스냅샷을 설정할 수 있습니다. 읽기는 기본 불량 장치로 이동합니다(대부분 읽기에 문제 없음). 쓰기는 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의 크기와 같습니다(결국 우리는 모든 작업을 수행하려고 합니다). 대상 유형은 스냅샷입니다. 스냅샷 대상은 여러 인수를 사용합니다.소스 개발 소개발 방법 청크 크기. 우리는 소스 장치를 제공하고 있습니다 /dev/sdj1
. COW 장치는 제가 만든 논리 볼륨입니다. PO 모드는 다음을 의미합니다.피지속성(메타데이터가 디스크에 기록되므로 재부팅 후 백업 설정 가능)영형verflow (스냅샷에 많이 쓰면 복구 가능) 청크 크기는 스냅샷이 얼마나 세분화되었는지를 나타냅니다. 1바이트라도 쓰면 해당 바이트 주위의 전체 청크가 복사됩니다(그리고 스냅샷의 공간을 소비합니다). 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에서 사용할 수 있도록 하려면 출력에서 devid를 찾은 다음 btrfs fi show
다음을 실행하십시오.
btrfs fi resize DEVID:max /mount/path
거의 즉각적으로 이루어져야 합니다.