bedup을 사용하여 Btrfs 파일 시스템의 중복을 제거했으므로 이제 모든 중복 파일(특정 크기 이상)은 "reflink" 복사본입니다.
파일 이름이 주어지면 동일한 링크에서 참조되는 다른 파일을 확인할 수 있는 방법이 있습니까?
답변1
btrfs와 같은 CoW(기록 중 복사) 파일 시스템의 핵심은 여러 버전의 파일 내용을 효율적으로 공유하는 것입니다. 따라서 파일을 다른 파일과 공유하거나 공유하지 않을 수 있는 콘텐츠가 포함된 범위 모음으로 생각할 수 있습니다. 또는 다른 버전의 파일을 통해. 구현은 확장을 공유할 수 있는 확장 트리와 비슷합니다.
파일에 변경 사항을 쓰는 동안(따라서 해당 파일의 새 버전을 생성하는 동안) 작동하는 동일한 메커니즘이 중복 제거를 수행하는 데 사용됩니다. 이 구현은 다음에 설명되어 있습니다.https://github.com/g2p/bedup:
중복 제거는 데이터를 한 파일에서 다른 파일로 복제할 수 있는 Btrfs 기능을 사용하여 수행됩니다. 복제된 범위는 디스크에서 공유되므로 공간이 절약됩니다.
커널의 구현은 (예를 들어) 다음 위치에 있습니다.http://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843;이 주석은 파일을 "다시 연결"하는 것이 아니라 범위에 관한 것임을 분명히 합니다.
2843 /**
2844 * btrfs_clone() - clone a range from inode file to another
2845 *
2846 * @src: Inode to clone from
2847 * @inode: Inode to clone to
2848 * @off: Offset within source to start clone from
2849 * @olen: Original length, passed by user, of range to clone
2850 * @olen_aligned: Block-aligned value of olen, extent_same uses
2851 * identical values here
2852 * @destoff: Offset within @inode to start clone
2853 */
따라서 다시 링크되는 파일이 아니라 공유되는 범위입니다. 여러 파일과 범위를 공유하여 새 파일을 만들 수도 있습니다. 또는 여러 볼륨으로 공유할 수도 있습니다. 또는 (현재 지원되는지 확실하지 않음) 동일한 파일에서 동일한 범위를 여러 번 가질 수도 있습니다.)
따라서 전체 파일을 공유하는 파일을 찾는 고급 도구는 존재하지 않습니다. 이는 파생된 개념이기 때문입니다. 물론 이에 대한 지원이 작성될 수도 있지만, 제가 아는 한에는 그렇지 않습니다...
답변2
방금 다음과 같은 프로젝트를 게시했습니다.fienode
(← 링크) 파일의 물리적 범위에 대한 SHA1 해시를 계산합니다. CoW의 동일한 복사본은 동일한 해시 값을 갖습니다.
원칙적으로 파일 시스템의 모든 파일에 대해 이 명령을 실행한 다음 동일한 해시를 찾을 수 있습니다.
이것이 필요한 이유를 설명하는 더 자세한 답변은 다음과 같습니다.
그러나 BTRFS는 물리적 범위를 자유롭게 변경할 수 있습니다. 나는 대규모 참조 링크 파일이 아무런 문제 없이 물리적 범위를 변경하여 fienode
대부분의 물리적 범위가 여전히 공유되었음에도 불구하고 출력이 달라지는 것을 관찰했습니다.