스냅샷의 공유 데이터를 보존하기 위해 btrfs 파일 시스템을 다른 매체에 복제하는 방법

스냅샷의 공유 데이터를 보존하기 위해 btrfs 파일 시스템을 다른 매체에 복제하는 방법

나는 btrfs raid 기능을 시험해 보기로 결정했습니다. btrfs를 설정했습니다

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

이제 기존 btrfs 파티션(linux-raid 위에)을 복제하고 싶습니다. cp -a스냅샷 기반 백업이 40개가 넘고(보관하고 싶음) 여러 번 비울 수 있는 저장 공간을 모두 채우게 되므로 단순을 사용할 수 없습니다 .

지금까지 두 가지 옵션을 볼 수 있습니다.

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

아직은 필요한 것 같아btrfs balance start /dev/sda9

그리고

해야 할 일: cp -a가능한 한 많은 콘텐츠를 스토리지에 증분 복사한 다음 사용합니다.bedup파일 중복을 제거하고 반복합니다.

선호되는(예: 모범 사례) 접근 방식은 무엇입니까? 나는 첫 번째 것을 선호합니다. 시간이 덜 걸릴 것입니다. 아니면 그 과정에 사악한 "문제"가 숨어 있을 수도 있습니다(물론 btrfs가 실험적이라는 사실은 제외).


첫 번째 문제는 의심의 여지가 없습니다. 도구가 아무리 훌륭하더라도 partclone.btrfs분명히 다중 장치 파일 시스템을 지원하지 않습니다. :-(

답변1

나는 물었다유제2 년 전.

하지만 제 경우에는 하나의 장치만 raid0에 복사하겠습니다.

결국엔 알게 됐어떨어져 있는. 당시에는 raid0에서 raid10으로 변환할 수 없었지만 이제는 커널 3.3부터 변환할 수 있습니다. 따라서 이 솔루션이 마침내 귀하에게 도움이 될 수 있습니다.

이 접근 방식의 한 가지 문제점은 fsuid를 복사한다는 것입니다. 이는 FS와 해당 복사본을 동일한 컴퓨터에 설치할 수 없음을 의미합니다. fsuid당시에는 FS의 속성을 변경하는 도구가 없었지만 지금은 변경되었을 수 있습니다.

아이디어는 기록할 수 있도록 원시 장치 위에 쓰기 시 복사 레이어를 추가하는 것입니다. 하지만 수정 사항은 다른 곳에서 수행되므로 나중에 삭제할 수 있습니다. 이는 추가 저장 공간(예: 외장 드라이브)이 필요함을 의미합니다.

그런 다음 원본 파일 시스템 대신 COW의 FS를 마운트하고 FS 복사 장치를 추가한 다음 COW 장치를 제거합니다.

쓰기 중 복사의 경우 장치 매퍼를 사용할 수 있습니다.

쓰기 영역의 일회성 복사본을 위해 여기서는 루프 장치를 사용합니다.

/dev/sda다음 위치에 복제하고 싶다고 가정해 보겠습니다 /dev/sd[bcde].

COW 백엔드 스토리지 생성:

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store

이제 원본 FS(설치된 경우)를 제거하고 modprobe -r btrfs방해가 되지 않는지 확인하고 장치 검색을 잊어버리게 만드세요.

그런 다음 COW 장치를 만듭니다.

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed

이제는 기록된 내용을 제외하고는 결국 보존되고 /dev/mapper/cowed영향 을 받지 않을 것입니다./dev/sda/dev/loop0/dev/sda

이제 설치할 수 있습니다:

mount /dev/mapper/cowed /mnt

추가 장치 추가:

btrfs dev add /dev/sd[bcde] /mnt

이전 것을 삭제하십시오.

btrfs dev del /dev/mapper/cowed /mnt

이 작업이 모두 끝나면 종료하고 플러그를 뽑거나 /dev/sda다른 장치와 동일한 fsuid를 가지며 btrfs여전히 엉망이 될 수 있으므로 읽기 전용으로 만들 수 있습니다.

이제 내가 올바르게 이해했다면 최근 btrfs-prog가 있다고 가정하면 다음을 수행할 수 있을 것입니다.

btrfs balance start -d convert=raid10 /mnt

raid10으로 변환합니다. 이론적으로 이는 모든 데이터 블록이 최소 2개의 디스크에 복사되도록 보장해야 합니다.

먼저 루프 장치의 가상 btrfs에서 테스트하는 것이 좋습니다. 이는 모두 메모리에서 나온 것이므로 잘못될 수 있습니다(예: 편집하기 전에 원래 답변을 참조하세요).

커널 3.6부터 btrfs는 zfs와 비슷하게 보내기/받기를 구현합니다. 이것은 당신을 위한 선택 사항일 수 있습니다.

답변2

Stephane의 아이디어는 btrfs 내장 도구를 사용하여 수행할 수 있습니다(이것이 바로 멋진 이유입니다). 오래된 btrfs를종자 장치으로 btrfstune -S 1 /dev/device디바이스 추가, 시드 디바이스 삭제, 실행을 수행합니다 btrfs balance start. 시드 장치는 읽기 전용 장치이며 읽기-쓰기 파일 시스템의 일부가 될 수 있습니다.

답변3

@ignis가 제안한 대로 시드를 사용해 보았지만 문제가 발생했습니다. 시드 장치를 제거하려고 할 때 시스템에서 오류가 발생하여 문제를 극복할 수 없었습니다. 그런 다음 (현재 - btrfs-progs v3.19-64-g19a806f, 이전에는 아닐 수도 있음) 명령이 있음을 발견했습니다.

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

이로 인해 기존 btrfs 파일 시스템(LVM 논리 볼륨에 있음)을 새 파티션에 매우 쉽게 복제할 수 있었습니다. 2015년 5월 현재 RAID5/6 프로필에서는 작동하지 않습니다. 전체 정보는 매뉴얼 페이지를 확인하세요.

답변4

여기에 0.02달러를 추가하면 됩니다. 나는 이것이 오래된 스레드라는 것을 알고 있습니다. BTRFS 파일 시스템을 사용하는 동안 복구할 수 없는 오류가 발생했기 때문에 어젯밤에 btrfs-clone을 시도했습니다. btrfs-clone은 btrfs 스냅샷 및 전송 기능을 사용합니다. 파일 시스템에 오류가 있으면 스냅샷이 작동하지 않습니다. 나는 또한 오류도 성공적으로 복제한다는 점에서 dd와 약간 비슷하게 작동하는 partclone.btrfs를 시도했습니다. 이것은 제가 작업 중인 가상 머신이기 때문에 새 볼륨에 부분적으로 복제를 시도하고 원래 볼륨에서 문제가 되는 파티션을 포맷한 다음 해당 파티션에 다시 복제를 시도했는데 오류가 다시 발생했습니다. 내가 아는 한, btrfs는 약간 취약하고 잘 복구되지 않습니다. 체크섬 오류가 발생하기 시작하면 스냅샷 작동이 중지되고 체크섬 오류를 복구할 수 없습니다. 또한 현재 하위 볼륨으로 연결된 별도 볼륨의 데이터 스냅샷을 찍을 수 없습니다. 지금 새로운 가상 머신을 구축 중입니다. 오염되지 않은 새 볼륨을 새 가상 머신에 연결할 수 있습니다.

다시 한번 말씀드리지만 제 0.02달러입니다. 건배

관련 정보