파일을 XFS로 이동할 때 중복 제거

파일을 XFS로 이동할 때 중복 제거

reflink사용할 수 없는 파일 시스템(ext4)에 동일한 블록을 가진 많은 파일이 포함된 폴더가 있습니다 .

이 디렉터리를 중복 제거하는 동안 XFS 파일 시스템으로 이동/복사하고 싶습니다. (즉, 복사된 파일의 블록이 이미 다른 파일에 존재하는 경우 실제로 복사하고 싶지 않고 두 번째 블록 참조 지점이 새 파일의 블록을 가리킵니다.)

물론 한 가지 옵션은 먼저 모든 파일을 XFS 파일 시스템에 복사하고 duperemove거기서 실행하여 나중에 중복 항목을 제거하는 것입니다. 작은 문제: 대상 파일 시스템에 대한 무작위 액세스가 그다지 빠르지 않기 때문에 시간이 많이 걸릴 수 있습니다.

따라서 파일을 복사하는 프로세스는 이미 커널에 이 블록이 이미 존재하는 다른 블록의 복사본임을 알려주는 역할을 담당할 것으로 예상됩니다.

그런 일이 가능합니까?

답변1

더 많은 공간을 확보할 수 있도록 댓글을 답변으로 이동하겠습니다.

복사할 수 있는 방법이 있는지는 모르겠습니다. 나는 많은 드라이브를 동기화하고 참조 링크 파일의 복사본을 많이 만들기 때문에 그렇게 되기를 바랍니다. Btrfs는 중복 제거를 수행한다고 가정하는 "전송" 메커니즘을 지원합니다. 그래도 나는 대부분의 경우 XFS를 사용합니다.

제가 살펴본 중복 제거 유틸리티는 느립니다. 느릴 뿐만 아니라,엄청나게 느림. 적어도 기계식 드라이브에서는 사용이 거의 불가능합니다. 그 이유는 작업이 완전히 동기식이기 때문에 디스크가 완전히 손상되기 때문입니다.

나는 캐싱을 사용하는 유틸리티를 작성하고 싶었습니다(커널 패치가 필요할 수 있음). 덜 안전하지만 더 빠르므로 실제로 사용할 수 있습니다. 나는 누군가가 이 작업을 수행하기를 기다리고 있으며 그러한 유틸리티가 존재한다면 이에 대해 듣고 싶습니다.

아직 시도하지 않은 또 다른 옵션은 드라이브를 가상 머신에 연결하고 그곳에서 중복 제거를 실행하는 것입니다. 그런 다음 백엔드에서 강제로 "안전하지 않은" 캐싱을 활성화할 수 있습니다. 물론 이것은 안전하지 않지만 더 빠르기를 바랍니다.

답변2

편집: 이것은 질문에 대한 답변이 아니라 묻지 않은 질문에 대한 답변입니다(중복 파일을 감지하고 할당을 취소하는 방법).

내 접근 방식은 각 파일의 해시인 hadlink가 포함된 디렉터리를 만드는 것입니다.

해시가 이미 있으면 파일을 해시의 하드 링크로 바꾸고, 해시 파일이 없으면 해시 디렉터리의 파일에서 새 하드 링크를 만듭니다.

이 같은:

#!/bin/bash
dupes=/mnt/xfs/.dupes_dir
for x in "$@"
do
    sha=$( sha1sum "$x" | cut -d\  -f1 ) 
    if [ -e $dupes/$sha ] 
    then
        ln -f $dupes/$sha "$x" 
    else
        ln "$x" $dupes/$sha
    fi
done

관련 정보