저는 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 해시를 계산하고 여러 개의 (동일한) 참조 링크 복사본을 찾는 데 사용할 수 있습니다. 그러나 몇 가지 주의 사항이 있습니다(참조).문서). BTRFS는 내가 도발이나 경고 없이 만든 리핑 복사본의 물리적 범위 중 일부(전부는 아님)를 변경하기로 결정하여 값이 변경되었습니다.
답변3
가장 간단한 해결책은 btrfs filesystem du .
CoW의 경우 0.00B인 Exclusive를 사용하는 것입니다.
답변4
이것은 허용되는 답변에 많은 것을 추가하지 않지만 누군가 여기에 문제와 몇 가지 접근 방식을 요약했습니다.https://www.ctrl.blog/entry/distinguish-file-link-clone.html
질문:
- 심볼릭 링크, 하드 링크, 참조 링크 구별
- 부분 복제 식별(전체가 아닌 일부 데이터를 공유하는 파일)
해결책:
- 파일 조각화 사용
stat
복제본은 동일한 파일 시스템에 상주해야 하므로 장치를 식별 하는 데 사용됩니다 .
인용하다:
하드 링크는 대상과 동일한 i-노드 번호를 공유하는 반면, 복제본은 자체 i-노드를 갖습니다. 이러한 구별(기록 중 복사 파일 시스템과 결합)을 통해 클론을 인식하지 못하는 프로그램에 의해 수정된 경우에도 클론이 원래 버전과 독립적으로 작동할 수 있습니다. "
- filefrag -v file1 file2(e2fsprogs의 일부) 명령을 실행합니다. 익스텐트 라인 내 파일의 Physical_offset 범위를 공유 플래그 세트와 비교합니다.
이 두 파일이 동일하거나 겹치는 범위를 공유하는 경우 스토리지 드라이브의 중복 제거/복제 데이터를 공유합니다.
어느 것이 원본이고 어느 것이 복제품인지 판단하는 데 있어서… 타임머신이 없으면 이를 결정하는 것이 거의 불가능합니다.