btrfs 하위 볼륨을 다른 btrfs 파일 시스템으로 이동하는 쉬운 방법이 있습니까?

btrfs 하위 볼륨을 다른 btrfs 파일 시스템으로 이동하는 쉬운 방법이 있습니까?

통합하려는 두 개의 별도 btrfs 파일 시스템이 있습니다. 하위 볼륨 구조는 다음과 같습니다.

/ filesystemA
|- subvolume1
|- subvolume2
|- ...
|- subvolumeN

/ filesystemB
|- subvolume1
|- subvolume2
|- ...
|- subvolumeM

filesystemB목표입니다. 일일 스냅샷 하위 볼륨이기 때문에 하위 볼륨 1을 N에서 filesystemB.over 1000 으로 이동하고 싶습니다. N또한 둘 사이의 차이가 작습니다. 즉, 공유 데이터가 많습니다. filesystemA1TB이지만 du경로의 총 파일 수가 300TB를 초과합니다(드라이브의 실제 공간 사용량은 500GB 미만입니다).

따라서 btrfs 하위 볼륨이나 데이터의 공유 특성을 인식하지 못하기 때문에 직접 mv또는 cpto filesystemAto가 실현 가능하다고 생각하지 않습니다 .filesystemB

btrfs send문서를 몇 번 읽었 btrfs receive는데 이것이 작동할 것 같습니다. 기본적으로 filesystemB전체 하위 볼륨 구조를 점진적으로 다시 빌드합니다. 그러나 더 쉬운 방법이 있기를 바랍니다. 왜냐하면 스크립트를 작성해야 하고(하위 볼륨의 수가 많기 때문에) 오류가 발생하기 쉬울 수 있다고 생각하기 때문입니다.

(또한 보내기/받기에는 하위 볼륨이 읽기 전용이어야 하며 Ubuntu 14.04의 btrfs-tools 버전에는 btrfs property기존 하위 볼륨을 읽기 전용으로 설정할 수 있는 명령이 없는 것 같습니다. 이후 버전에서는 이 컴퓨터에서 그렇게 하기 위해 "프로덕션" 컴퓨터에서 구성 관리를 수행하는 것은 이 작업을 원하지 않습니다.

답변1

나는 당신이 btrfs-send/btrfs-receive를 우회하지 않을 것이라고 확신합니다. 또 다른 옵션은 하위 볼륨을 복사한 다음 대상에서 중복을 제거하는 것이지만 시간이 오래 걸립니다.

읽기 전용 질문: 일일 스냅샷이므로 대부분의 볼륨이 읽기 전용이 아닌가요?

내가 하나 만들게

$btrfs subvolume create /subvolumeA/source
$for i in /filesystemA/subvolume*; do btrfs subvolume snapshot -r $i /filesystemA/source/$i; done

이제 /filesystemA/source/readonly 아래에 모든 하위 볼륨이 있습니다.

이제 상위 문과 함께 btrfs-send를 사용하여 루프의 대상으로 점진적으로 보낼 수 있습니다.

일부 스냅샷을 다시 쓸 수 있어야 하는 경우 해당 스냅샷의 내용을 쓰기 가능한 새 하위 볼륨에 복사 를 사용할 수 있습니다 cp --reflink.

답변2

귀하의 목록을 찾았기를 바랍니다. property해당 버전의 명령이 문서화되지 않았 습니까 ?이 답변btrfs property set -ts /path/to/snapshot ro true비슷한 명령을 사용하여 문제를 해결하는 것이 좋습니다 .

향후 독자를 위해: 새 스냅샷을 읽기 전용으로 설정하고 -r스냅샷을 생성할 때 매개변수를 사용하십시오. 내 스크립트에서는 다음과 같은 것을 사용합니다.

comm -23 \
    <(btrfs subvolume list -ors --sort=path /fsA/ | perl -ne 'print if s/.+?\spath\s+(.+)/\1/') \
    <(btrfs subvolume list -ors --sort=path /fsB/ | perl -ne 'print if s/.+?\spath\s+(.+)/\1/')

파일 시스템의 읽기 전용 스냅샷 볼륨 목록을 제공해야 합니다.어느 것아니요파일 시스템에서두번째. 동기화할 각 목록에 대해 보내기/받기를 수행하여 목록을 반복할 수 있습니다.

관련 정보