나는 cp --reflink
쓰기 중 복사를 허용하는 btrfs를 가지고 놀고 있습니다. 와 같은 다른 프로그램에서도 lxc-clone
이 기능을 사용할 수 있습니다. 제 질문은 파일이 다른 파일의 CoW인지 어떻게 알 수 있느냐는 것입니다. 하드링크와 마찬가지로 inode 번호로 알 수 있습니다.
답변1
좋은 질문. 현재로서는 쉽게 알 수 있는 높은 수준의 방법이 없는 것 같습니다.
한 가지 문제는 파일이 기록 중 복사를 통해 데이터의 일부만 공유할 수 있다는 것입니다. 이를 물리적 범위라고 하며,일부 또는 모두CoW 파일 간에 물리적 범위를 공유할 수 있습니다.
. (편집: 참조내 다른 대답).inode
파일 간에 비교할 때 파일이 동일한 물리적 범위를 공유한다는 것을 알려주는 것과 유사한 것은 없습니다
낮은 수준의 대답은 다음을 사용하여 파일에 사용되는 물리적 범위를 커널에 요청할 수 있다는 것입니다.FS_IOC_FIEMAP
ioctl
, 이는문서화Documentation/filesystems/fiemap.txt
. 원칙적으로 모든 물리적 범위가 동일한 경우 파일은 동일한 기본 스토리지를 공유해야 합니다.
더 높은 수준에서 이 정보를 볼 수 있는 방법을 구현하는 것은 거의 없습니다. 좀 찾았어여기에 코드를 입력하세요. 분명히filefrag
유틸리티는 -v를 사용하여 범위를 표시해야 합니다. 게다가,btrfs-debug-tree
이 정보를 보여줍니다.
그러나 이러한 것들은 실제로 이 목적으로 거의 사용되지 않았을 수 있으므로 잘못된 답변을 제공하는 버그를 발견할 수 있으므로 주의해야 합니다. 따라서 데이터 손상을 일으킬 수 있는 작업을 결정할 때 이 데이터에 의존하는 것을 조심하세요.
몇 가지 관련 질문:
답변2
이전 답변에 더 나아가, 방금 풀렸어요fienode
파일의 물리적 범위에 대한 SHA1 해시를 계산하고 일부 (동일한) reflink 복사본을 찾는 데 사용할 수 있습니다. 하지만 주의할 점이 있습니다(참조:문서). BTRFS는 내가 도발이나 경고 없이 만든 리핑 복사본의 물리적 범위 중 일부가 아닌 일부를 변경하기로 결정하여 값이 변경되었습니다.
답변3
이에 대한 가장 쉬운 해결책은 btrfs filesystem du .
Exclusive를 사용하는 것입니다. CoW인 경우 0.00B가 됩니다.
답변4
이것은 허용되는 답변에 많은 것을 추가하지 않지만 누군가 여기에 문제와 몇 가지 방법을 요약했습니다.https://www.ctrl.blog/entry/distinguish-file-link-clone.html
문제:
- 참조 링크와 기호 링크 및 하드 링크를 구별합니다.
- 부분 복제 식별(전체 데이터가 아닌 일부 데이터를 공유하는 파일)
솔루션:
- 파일 조각 사용
stat
복제본이 동일한 파일 시스템에 상주해야 하므로 장치를 식별하는 데 사용됩니다 .
인용하다:
하드 링크는 대상과 동일한 inode 번호를 공유하는 반면 클론에는 자체 inode가 있습니다. 이러한 구별(기록 중 복사 파일 시스템 포함) 덕분에 복제를 인식하지 않는 프로그램에 의해 수정된 경우에도 복제가 원본과 독립적으로 작동할 수 있습니다."
- filefrag -v file1 file2(e2fsprogs의 일부) 명령을 실행합니다. 공유 플래그가 설정된 익스텐트 행 내에서 파일의 Physical_offset 범위를 비교합니다.
두 파일이 동일하거나 겹치는 범위를 공유하는 경우 스토리지 드라이브에서 중복 제거/복제된 데이터를 공유합니다.
어느 것이 원본이고 어느 것이 복제품인지 판단하는 데 있어서… 타임머신 없이는 이를 결정하는 것이 거의 불가능합니다.