[Linux] 중복 파일을 합쳐서 용량 확보하기 Duperemove

시놀로지의 ‘일부’나스의 경우 중복 파일을 병합하는 기능을 가지고 있습니다.

파일을 여러개 저장하는 경우, (특히 사진이나 영상) 파일이 중복되는 경우가 흔한데, 이 경우 중복 파일로 인한 낭비되는 공간을 줄이며 효과적인 관리가 가능합니다.

단…….
이 기능은 일부 NAS… FS시리즈의 상위 모델이라던가, XS계열의 상위 모델이라던가… 너무 비싸서 일반 사용자는 꿈도 못꾸는 제품들에만 있습니다.

데비안 패키지에는 Duperemove 라는 패키지가 있는데, 이 패키지는 BTRFS 파일 시스템의 중복 제거 기능을 효과적으로 처리해주는 패키지라고 합니다.
참고 : https://kamilake.com/507
제작자 : https://github.com/markfasheh/duperemove
사용 설명 : http://markfasheh.github.io/duperemove/duperemove.html

버전별 OS 이미지나 사진, 영상 등을 두는 공간에는 중복 데이터가 계속해서 생깁니다.

도커 허브에서 검색해보니 프랑스 분이 만들어둔 이미지가 있습니다.
https://registry.hub.docker.com/r/htdemony/duperemove/
htdemony/duperemove:debian 으로 컨테이너를 생성하고, 패키지 설치 부분을 건너뛰어도 됩니다.

해당 이미지의 alpine 버전에서는 duperemove v2가 설치되고, debian 버전에서는 v3이 설치됩니다.
alpine 패키지 저장소가 업데이트 된다면 v3이 설치될 것 같습니다. 용량이 거대해지긴 하지만, 최근버전을 쓰기 위해서는 데비안 태그의 컨테이너를 실행해야 합니다.

데비안 계열 리눅스나, docker 사용이 가능하다면 어디서나 사용 가능할 것으로 예상됩니다.

이 프로그램은 중복 병합이고, 중복 제거를 원한다면 rdfind 라는 툴을 사용하면 됩니다.
아래 우분투 도커에서 apt install rdfind 옵션으로 설치해 사용하면 됩니다. 해당 내용은 조만간 다시 포스팅 해 볼게요.

Contents

Docker-compose 작성

docker-compose 작성은 아래와 같이 합니다. ssh에서

version: "3.8" services: duperemove: image: htdemony/duperemove:debian container_name: duperemove volumes: - /volume1:/volume1 # 마운트 할 폴더 1 - /volume2:/volume2 # 마운트 할 폴더 2 시스템에 따라 적당히 증감하시면 됩니다. - ./:/root # duperemove에서 파일 해시를 저장할 폴더 tty: true # 애가 없으면 컨테이너가 죽음 privileged: true # 높은 권한으로 컨테이너 실행 - 이게 없으면 제대로 동작하지 않음 stdin_open: true # tty: true 와 둘 중 하나만 있어도 됨


docker에 ubuntu를 올려서 사용하겠습니다.
제 개인적으로는, ssh로 접속하여 컨테이너를 띄우고, volume 자체를 마운트하는 방법이 더 좋아 보입니다.
그러면 한방에 공유폴더 전체 마운트가 가능해서..

컨테이너 띄우기

레지스트리에서 우분투를 찾습니다.

Docker 패키지를 실행하고, 레지스트리에서 ubuntu를 검색해서 설치합니다.

저는 익숙한 20.04 버전을 설치합니다.
이미지 다운로드가 끝나면, 이미지 탭에서 해당 이미지를 더블클릭 해 컨테이너 생성 페이지를 열어줍니다.

패키지 다운로드가 완료되면 이미지 탭에서 해당 이미지를 더블클릭합니다.

네트워크 기본값

높은 권한을 사용하여 컨테이너 실행을 꼭 체크해야 합니다.
리소스 제한이 필요할 수 있습니다, 사무실에서 업무용으로 사용한다거나 하는 경우, 새벽시간에 실행을 시키시거나 리소스 제한을 활성화시켜서 나스 사용에 제한이 없도록 합니다.

리소스 제한이 되지 않는 경우, 시스템 자원을 모두 긁어다 사용하므로 시스템이 느려질 수 있습니다.

포트 추가 페이지는 넘어가구요.(필요없음)

중요한 부분입니다. 볼륨 설정.. 중복 병합을 원하는 모든 폴더를 여기서 마운트 해 줍니다.

docker 폴더 내에 hashfile이 저장될 부분을 만들어 줍니다. 저는 ubuntu로 만들게요.

마운트 경로는 컨테이너에서 사용할 경로입니다.

‘마법사 완료 후 이 컨테이너 실행’을 체크해서 바로 컨테이너 실행하구요

컨테이너 탭에 ubuntu가 올라옵니다.

더블클릭해 터미널로 가면

이렇게 나옵니다. 이제 duperemove 설치를 해 볼게요.

DUPEREMOVE 설치

아래 명령을 입력합니다.

apt update && apt upgrade -y && apt install duperemove -y

터미널에서 뭔가를 신나게 합니다. 아마 이대로 따라하셨다면 timezone을 고르라고 할겁니다.

타임존 설정을 하라고 한다.
설치 완료

6(Asia), 69(Seoul)을 입력합니다. 조금 지나면 설치가 완료됩니다.

중복 파일 제거 명령 실행

이제 duperemove 명령 입력이 가능합니다.

저는 테스트를 위해서 50GB의 더미 파일을 두개 생성할거에요.
총 100GB 의 스토리지를 사용하게 됩니다.

cp 명령으로 동일한 파일을 만들어줍니다.

생성을 ubuntu 폴더에 해서, /temp 폴더가 필요 없어졌습니다;;

Total 100GB 사용이 보이구요.

저장소 관리자에서는 149.8GB의 용량을 사용합니다. 50GB 두개이므로 duperemove를 쓰면 저장소 용량이 99GB가 되겠네요. 실행 해 봅니다.

–hashfile 옵션은 파일 해시를 저장하는 옵션으로, 재실행 시간의 단축, 메모리 사용량 절약의 효과를 가져옵니다. 꼭 넣어주세요.
-d 옵션을 넣지 않았기 때문에 목록만 생성합니다.

duperemove -hr --hashfile=/ubuntu/dupe.db /ubuntu

어느정도 시간이 지나면 아래와 같이 메시지가 뜨고 완료됩니다.

실제 실행을 위해 d옵션을 넣어줍니다.

duperemove -dhr --hashfile=/ubuntu/dupe.db /ubuntu

이미 목록을 생성했으므로, 작업은 금방 종료됩니다.

읭?

에러가 뜨네요?
권한 문제인가 싶어 chmod 777 * 명령을 줘서 권한을 만들어 주고 실행해봅니다.

실제 파일은 그대로 보이고…
–debug 옵션으로 디버깅 옵션을 줘서 실시간 진행상황을 확인할 수 있습니다. 사용 중 용량이 줄어듭니다.

작업이 완료되었고, 용량이 줄어듬을 확인할 수 있습니다.

파일들을 모두 스캔하는 작업을 하는만큼 시스템 자원을 꽤 많이 먹습니다. 리소스 제한을 해 두시거나, 사용자가 없을 시간에 실행하는것을 추천합니다.

사용 가능한 옵션

아래 글에 내용이 잘 설명되어 있습니다.

https://myevan.net/synology_ubuntu_dedup/

  • –hashfile=파일명: 파일 해쉬를 저장(중요)
  • 메모리 사용량 대폭 절약
  • 재실행 시간 단축
  • -r: 디렉토리 재귀 순회
  • -h: 읽기 쉬운 형식 숫자 출력
  • -d: 중복 제거 실행 (btrfs 나 flxfs 에서만 작동)
  • -v: 상세 로그 출력
  • -A: 읽기 전용 모드 처리 (읽기 전용 스냅샷용)
  • –io-threads=숫자: I/O 스레드 숫자 (디폴트 호스트 CPU 숫자)
  • –cpu-threads=숫자: CPU 바운드 작업용 스레드 숫자 (디폴트 호스트 CPU 숫자)

정리

  1. duperemove 컨테이너를 띄우거나 우분투 컨테이너 등에 duperemove를 띄웁니다.
    띄우는 과정에서 파일 해쉬가 저장될 폴더와 중복 제거를 할 폴더를 마운트 해 줍니다.
    (이 글에서는 해쉬 저장 폴더를 /data 로 마운트 합니다.)
  2. 중복 확인을 하고
    docker exec [컨테이너이름] duperemove –hashfile=/data_folder/dupe.db -hr /TARGET_DIR
  3. 중복 정리를 실행합니다.
    docker exec [컨테이너이름] duperemove –hashfile=/data_folder/dupe.db -dhr /TARGET_DIR

해보진 않았지만 ssh 에서 sudo 권한으로 실행한다면 volume 자체를 마운트 하는것도 될 것 같습니다.
사용자 스크립트 등을 이용해 매일 실행한다던지 하는 방법도 가능하겠네요.

{{#is "post"}} {{/is}}