Btrfs 파일 시스템에서 특정 파일의 데이터 복사본을 찾는 방법은 무엇입니까?

Btrfs 파일 시스템에서 특정 파일의 데이터 복사본을 찾는 방법은 무엇입니까?

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물리적 범위의 대부분이 여전히 공유되었음에도 불구하고 출력이 달라지는 것을 관찰했습니다 .

관련 정보