이 상황을 상상해 봅시다. 내 btrfs 디스크에 20GB 파일이 있지만 남은 공간은 10GB뿐입니다. 스냅샷을 생성한 다음 파일을 수정합니다. 이 파일을 스냅샷에 저장된 원본 파일로 어떻게 복원할 수 있나요?
나는 이것이 불가능하다고 생각한다. 예, 스냅샷을 마운트한 다음 스냅샷의 파일을 기본 파일 시스템으로 다시 복사할 수 있습니다. 하지만 남은 공간보다 크기 때문에 수용할 수 없습니다. 그러면 변경된 파일을 삭제하여 공간을 확보할 수 있나요? 아니요, 파일을 삭제해도 사용 가능한 공간이 늘어나지 않으므로 btrfs입니다. 공간을 확보하려면 스냅샷을 삭제해야 하는데 원본 파일이 손실됩니다. 그래서 유일한 방법은 다음과 같습니다.
- 스냅샷 마운트
- cp 파일을 외부 파일 시스템(외부 저장소)으로
- 변경된 파일 삭제
- 스냅샷 삭제
- 외부 저장소에서 원본 파일을 다시 복사
다른 솔루션에 대한 아이디어가 있습니까?
답변1
가능하고 쉽습니다. 다음을 사용 하면 cp
충분합니다 --reflink=always
.
cp --reflink=always /path/to/desired/file /target/directory/
--reflink=always
중대한. 또한 -a
.
의심스러운 경우 다른 이름으로 복사하는 것이 합리적입니다. 즉, 수정된 파일을 덮어쓰지 마십시오. 이렇게 하면 성공할 수 있고 cp
결과를 확인하여 올바른 디렉터리에 올바른 파일이 있는지 확인한 다음 수정된 파일( mv
대상 디렉터리에 있음)을 덮어쓸 수 있습니다.
충분히 새로운 Linux 커널(5.18이상) 이 명령은 필요한 파일과 대상 디렉터리만 동일한 Btrfs 파일 시스템에 있는 경우에만 작동합니다(분명히 귀하의 경우입니다).
커널이 충분히 새롭지 않으면 Invalid cross-device link
오류 메시지가 나타날 수 있습니다. 마운트 지점을 확장 하려고 하면 cp --reflink=always
이 오류가 발생합니다. 필요한 파일을 필요한 디렉터리에 다시 연결하는 것은 여전히 가능합니다. 이 작업은 단일 마운트 지점에서만 수행하면 됩니다. 따라서 이를 얻으면 Invalid cross-device link
다음과 같이 진행하십시오.
전체 Btrfs 파일 시스템(
subvol=/
)을/some/mountpoint
.요점은 필요한 파일과 대상 디렉터리가 존재하기를 원한다는 것입니다
/some/mountpoint
. 파일 시스템의 하위 볼륨 레이아웃(트리)에 따라 특정 하위 볼륨(반드시 전체 파일 시스템일 필요는 없음)을 마운트하여 이를 수행할 수 있습니다. 전체 파일 시스템을 마운트하면 원하는 결과를 확실히 얻을 수 있습니다.아마도 이 요구 사항을 충족하는 마운트 지점이 실행 중인 운영 체제에 이미 존재하고 이를 사용할 수 있을 것입니다. 이 답변을 비교해보세요:btrfs: 하위 볼륨 찾아보기.
cp --reflink=always
위와 같이 필요한 파일을 대상 디렉터리에 복사하는 데 사용됩니다 . 중요한 것은/some/mountpoint
대상 디렉토리가 있는 하위 볼륨이 (역시) 다른 곳에 마운트되어 있더라도 이를 유지하는 것입니다. 장착 지점을 교차하지 마십시오. 단일 마운트 지점에 전체 파일 시스템을 마운트하는 것은 정확히cp
단일 마운트 지점에서 작동할 수 있도록 하기 위한 것입니다.umount /some/mountpoint
(기존 마운트를 사용하지 않는 한)