btrfs 파일 시스템 내용의 전체 사본 을 어떻게 만들 수 있습니까? 으로 전체 사본 나는뿐만 아니라 의미 현재의 데이터 뿐만 아니라 다른 서브 볼륨을 자신과 스냅 샷 같은 내용으로 블록을 복제하지 : 이상적으로 자신의 암소 구조 (즉 보존.
dd
UUID를 복제 하는 블록 레벨 사본 (예 : with )은 좋은 생각 이 아니며, 쉽게 변경할 수있는 방법이 없습니다 .
btrfs 파일 시스템 내용의 전체 사본 을 어떻게 만들 수 있습니까? 으로 전체 사본 나는뿐만 아니라 의미 현재의 데이터 뿐만 아니라 다른 서브 볼륨을 자신과 스냅 샷 같은 내용으로 블록을 복제하지 : 이상적으로 자신의 암소 구조 (즉 보존.
dd
UUID를 복제 하는 블록 레벨 사본 (예 : with )은 좋은 생각 이 아니며, 쉽게 변경할 수있는 방법이 없습니다 .
답변:
소스 파티션이 마운트 해제되었고 자동 마운트되지 않는지 확인하십시오.
사용 중 dd
(느린, 벙어리) 또는partclone.btrfs -b -s /dev/src -o /dev/target
btrfstune -u
복사 후 및 마운트하기 전에 UUID를 변경하는 데 사용하십시오 .
데이터 손실 경고 : 음주 NOT 마운트 (자동)로 시도 중 원본 또는 복사 UUID가 변경 될 때까지
btrfs-clone
개인적으로 시도 btrfs-clone
하지는 않았지만 기존의 BTRFS 파일 시스템을 새로운 서브 시스템으로 복제하여 각 하위 볼륨을 순서대로 복제합니다.
오늘 (2016-05-06) 현재 기성품 솔루션을 찾지 못했지만 쓰기시 복사 처리를 포함하여 내 목적으로 문제를 해결했습니다. "복제" /source
하는 단계 /target
는 다음과 같습니다.
주문한 서브 볼륨의 목록을 가져옵니다 ogen
: btrfs subvolume list -qu --sort ogen /source
. 정렬은 이전의 스냅 샷 또는 하위 볼륨이 먼저 처리되도록 보장하기에 충분합니다. 이것은 기본 볼륨을 먼저 전송해야하므로 쓰기시 복사를 처리하는 데 중요합니다.
을 사용하여 모든 하위 볼륨을 읽기 전용으로 설정하십시오 btrfs property set -ts /source/some-volume ro true
.
이제 위 목록의 각 하위 볼륨에 대해 맨 위에서 시작하여 다음을 수행하십시오.
볼륨에 상위 UUID (로 표시됨 -
)가 없거나 상위 UUID가 목록에 더 이상 존재하지 않으면 다음을 실행하십시오.btrfs send /source/some/volume | btrfs receive /target/some/
볼륨에 여전히 존재하는 상위 UUID가있는 경우,이를 위해 이미 전송 했어야하며 --sort ogen
데이터 중복을 피하기 위해이를 기본으로 사용할 수 있습니다. 따라서 목록에서 부모 UUID의 경로를 찾아서 실행하십시오 btrfs send -p /source/parent/volume/ -c /source/parent/volume/ /source/some/volume/ | btrfs receive /target/some/
(btrfs는 아마도 -p
인수를 자동으로 추측 하지만 명시 적 인 것을 선호합니다).
위 명령 중 하나를 실행 한 후 대상 및 소스를 다시 읽기 / 쓰기로 작성하십시오 btrfs property set -ts /source/some/volume ro false; btrfs property set -ts /target/some/volume ro false
. 소스가 이전에 읽기 전용 인 경우이 단계를 건너 뛸 수 있습니다.
많은 경우를 처리해야합니다. 주의 사항 :
하위 볼륨 / 스냅 샷을 중첩 할 때 순서와 관련하여 약간의 문제가있을 수 있습니다.
스크립트를 작성하면 전체 프로세스가 더 재미있어집니다.
btrfs send
여러 클론 소스 ( -c
) 인수를 허용합니다 . 부모의 볼륨 경로뿐만 아니라 조상이나 이전에 보낸 볼륨의 경로를 지정하는 것이 유리할 수 있습니다. 여기서는 아무런 차이가 없었지만 추측으로 데이터 중복을 피하는 데 도움이 될 수 있습니다.
스냅 샷 또는 하위 볼륨의 메타 정보가 손실되는지 확실하지 않지만 대부분의 사용 사례에서 흥미로운 다른 모든 정보는 보존해야합니다.
전체 프로세스를 통해 3.8GB를 사용하여 800GB 파일 시스템을 3.8GB를 사용 df
하여 10GB 이미지로 전송할 수 있었습니다. 없이 전송 -p
및 -c
데이터 중복이 실제로 피할 그래서, 190기가바이트에 대해 사용했을 것이다.
ogen
의미 인지 설명해 주실 수 있습니까 ?
ogen
는 하위 볼륨의 "원본 생성"입니다. 차이점을 이해하지 못하거나 (원본이 아닌) 세대를 사용하는 것이 올바른지 여부를 인정해야하지만 일부 테스트에서 이것이 더 잘 작동한다고 가정합니다 (중복을 피하십시오). 하위 볼륨을 기반으로 스냅 샷을 생성 할 때 세대가 업데이트되는 것처럼 보이지만, 그렇지 않습니다. 일부 결과에 대해 듣고 싶습니다. IRC 또는 Btrfs 메일 링리스트를 확인하는 것이 가장 좋습니다.
나는 이것을 할 수 있는 파이썬 도구 를 만들었습니다 . 내 자신과 @Johannes Ernst의 구현 모두에서 @Thomas Luzat의 접근 방식을 시도했으며 복제 공간에서 사용 공간이 20GB에서 40GB로 두 배가 되었기 때문에이 작업을 수행했습니다. 더 효율적인 것이 필요하다고 생각했습니다.
이 공통 파일 시스템 히스토리를 고려하십시오.
current ---------------------------------\
| | | |
snap4 snap3 snap2 snap1
Thomas의 알고리즘을 사용하면 "current"가 먼저 복제되고 모든 "현재"상태의 스냅 샷 인 모든 스냅 샷은 "current"를 복제 소스 / 부모로 사용합니다. 분명히 snap3에 snap3, snap3에 snap2 등을 두는 것이 좋습니다.
그리고 이것은 빙산의 일각 일뿐입니다. 복잡한 히스토리를 가진 btrfs 파일 시스템에서 "공간 절약 측면에서 가장 좋은"복제 소스를 찾는 것은 쉽지 않은 문제입니다. 공간을 훨씬 더 효율적으로 사용하는 것처럼 보이는이 문제를 해결하기위한 3 가지 다른 전략을 생각해 냈습니다. 실제로 복제본의 크기가 소스의 복제본보다 약간 작습니다.
당신 이 관심이 있다면 github 페이지 에서 세부 사항을 읽을 수 있습니다 .
거기에있다 unix.stackexchange.com에 비슷한 질문 사항이 partclone.btrfs에,하지만 나는 이것에 대해 어떤 구체적인 모른다.
커널 메일 링리스트에 대한 토론 도 있지만 실제로 유망하지는 않습니다 ...
함께 btrfs-send
하는 마지막 I 톱, 여전히 메일 링리스트 btrfs를 주위에 떠있는 실험적인 패치이었다.