BTRFS에서 파일 크기가 남은 디스크 공간보다 큰 경우 이전 버전의 파일로 되돌리는 방법은 무엇입니까?

BTRFS에서 파일 크기가 남은 디스크 공간보다 큰 경우 이전 버전의 파일로 되돌리는 방법은 무엇입니까?

이 상황을 상상해 봅시다. 내 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다음과 같이 진행하십시오.

  1. 전체 Btrfs 파일 시스템( subvol=/)을 /some/mountpoint.

    요점은 필요한 파일과 대상 디렉터리가 존재하기를 원한다는 것입니다 /some/mountpoint. 파일 시스템의 하위 볼륨 레이아웃(트리)에 따라 특정 하위 볼륨(반드시 전체 파일 시스템일 필요는 없음)을 마운트하여 이를 수행할 수 있습니다. 전체 파일 시스템을 마운트하면 원하는 결과를 확실히 얻을 수 있습니다.

    아마도 이 요구 사항을 충족하는 마운트 지점이 실행 중인 운영 체제에 이미 존재하고 이를 사용할 수 있을 것입니다. 이 답변을 비교해보세요:btrfs: 하위 볼륨 찾아보기.

  2. cp --reflink=always위와 같이 필요한 파일을 대상 디렉터리에 복사하는 데 사용됩니다 . 중요한 것은 /some/mountpoint대상 디렉토리가 있는 하위 볼륨이 (역시) 다른 곳에 마운트되어 있더라도 이를 유지하는 것입니다. 장착 지점을 교차하지 마십시오. 단일 마운트 지점에 전체 파일 시스템을 마운트하는 것은 정확히 cp단일 마운트 지점에서 작동할 수 있도록 하기 위한 것입니다.

  3. umount /some/mountpoint(기존 마운트를 사용하지 않는 한)

관련 정보