증분 스트림으로 인해 btrfs 수신이 실패함: "파일이 존재함"

증분 스트림으로 인해 btrfs 수신이 실패함: "파일이 존재함"

btrfs 하위 볼륨의 경우 두 단계로 생성된 간단한 증분 백업이 있습니다.

btrfs send old/@ > base.btrfs
btrfs send new/@ -p old/@ > update.btrfs

두 개의 소스 하위 볼륨은 동일한 활성 마운트 하위 볼륨에서 별도의 시간에 캡처된 스냅샷입니다.

대상에서 다음을 복원하려고 시도합니다.

btrfs receive ./ < base.btrfs
btrfs receive ./ < update.btrfs

이전 명령은 초기 백업 단계의 복원된 스냅샷을 생성하고 후자가 추가 증분 단계를 적용할 것으로 예상됩니다.

이전 명령은 성공했지만 후자는 실패했습니다.

ERROR: creating snapshot ./@ -> @ failed: File exists

존재하지 않는 대상에 대해서는 후자의 단계를 유용하게 적용할 수 없다는 것이 당연하기 때문에 프로세스가 이 검사를 수행하는 이유와 업데이트 적용에 성공할 것으로 예상되는 프로세스가 무엇인지 궁금합니다.

초기 단계를 복원하여 생성된 대상에 업데이트 단계를 어떻게 적용할 수 있나요?

답변1

전송 측에서와 같이 동일한 이름을 가진 여러 하위 볼륨을 가질 수 없습니다.

mv대상 시스템에서 기본 스냅샷/하위 볼륨을 만들 수 있습니다 .

mv @ @.old
btrfs receive ./ < update.btrfs

답변2

질문을 게시한 이후로 질문에 답할 만큼 충분히 배웠습니다.

대답은 두 부분으로 구성됩니다.

첫째, receive하위 명령은 새 하위 볼륨이 하위 스트림에서 생성되거나 상위 스트림에서 생성되는지 여부에 관계없이 항상 원래 하위 볼륨과 동일한 이름을 가진 대상 디렉터리에 새 항목을 생성합니다. 따라서 대상 디렉터리는 비어 있어야 하며 최소한 원래 하위 볼륨과 동일한 이름을 가져야 합니다. 일반적인 기술은 상위 볼륨과 모든 하위 볼륨에 대해 각각 새로운 빈 디렉토리를 생성하는 것입니다.

둘째, 하위 명령을 호출하면 상위에 대한 참조가 제공되지 않지만 상위가 동일한 파티션의 하위 볼륨으로 복원된 경우 상위에서 필요한 데이터를 활용할 수 있습니다. 즉, receive하위 명령은 상위에 대한 동일한 파티션에서 이전에 호출된 경우 하위 스트림에 대해 원하는 효과를 갖습니다.

상위 및 하위 항목이 복원되면 하위 항목에 피해를 주지 않고 모든 상위 항목을 삭제할 수 있습니다.

결과적으로 다음은 원래 목표에 대한 효과적인 명령 순서입니다.

mkdir _tmp
btrfs receive _tmp/ < base.btrfs
btrfs receive ./ < update.btrfs
btrfs subvolume delete _tmp/@
rmdir _tmp

그러면 하위 스트림의 전체 콘텐츠를 를 통해 사용할 수 있습니다 ./@.

당연히 보존 대상 하위 스트림에 여러 상위 스트림이 있는 경우(예: base.btrfs자체 상위 스트림이 있는 경우) 추가 명령이 필요할 수 있습니다.

관련 정보