rmlint 핵심 아키텍처 분석 및 확장 개발을 위한 심층 가이드

rmlint는 파일 시스템 내의 중복 데이터와 불필요한 파일을 신속하게 찾아내는 고성능 툴입니다. 이 가이드는 rmlint 프로젝트에 기여하거나 기능을 확장하려는 개발자를 위해 핵심 아키텍처와 개발 방법론을 상세히 다룹니다.

1. 개발 환경 설정 및 빌드 시스템

rmlint 프로젝트는 SCons를 빌드 시스템으로 사용하며, 주요 개발 작업은 develop 브랜치에서 이루어집니다.

# 리포지토리 복제 및 개발 브랜치 전환
git clone https://github.com/sahib/rmlint.git
cd rmlint
git checkout develop
git checkout -b feature/new-extension

컴파일 시 다양한 옵션을 통해 디버깅 및 프로파일링 모드를 활성화할 수 있습니다.

  • 디버그 모드: scons DEBUG=1 (런타임 어설션 및 추가 로그 활성화)
  • 설치 경로 지정: scons --prefix=/usr/bin install
  • 프로파일링: CC=clang CFLAGS='-pg' LDFLAGS='-pg' scons

2. 소스 코드 구조 분석

rmlint는 모듈화된 설계를 통해 유지보수성을 높였습니다. 전체적인 디렉터리 구성은 다음과 같습니다.

rmlint/
├── lib/      # 핵심 로직 (C 언어 구현부: 체크섬, 트래버스 등)
├── src/      # CLI 진입점 및 메인 로직
├── gui/      # Python 기반의 GUI 인터페이스 (Shredder)
├── tests/    # Pytest 기반의 통합 테스트 세트
└── docs/     # 기술 문서 및 API 명세

성능의 핵심인 파일 시스템 순회는 lib/traverse.c에서 담당하며, 데이터 무결성 검사를 위한 해시 계산 로직은 lib/checksum.c에 집중되어 있습니다.

3. 핵심 기술 아키텍처 및 최적화 기법

멀티스레딩 모델

rmlint는 I/O 병목 현상을 최소화하기 위해 지능적인 스레드 관리 전략을 채택합니다.

  • 디스크별 독립 스레드: 물리적으로 분리된 디스크마다 별도의 탐색 스레드를 할당하여 헤드 이동을 최적화합니다.
  • 작업 분리: 해시 계산 스레드 풀과 I/O 처리 스레드를 분리하여 연산 중에도 읽기 작업이 멈추지 않도록 설계되었습니다.

지능형 해싱 전략

모든 데이터를 처음부터 끝까지 읽지 않고도 중복 여부를 판단하기 위해 단계적 검증 방식을 사용합니다.

  • 크기 기반 사전 그룹화: 파일 크기가 다른 경우 해시 계산을 즉시 제외합니다.
  • 증분 해싱: 파일의 일부만 먼저 해싱하여 차이점이 발견되면 즉시 중단을 선언합니다.
  • FIEMAP 최적화: 하드 디스크 드라이브(HDD)에서 데이터가 실제로 위치한 물리적 순서대로 읽도록 유도하여 탐색 시간을 단축합니다.

4. 기능 확장 가이드

새로운 체크섬 알고리즘 추가

새로운 해싱 알고리즘을 도입하려면 다음의 인터페이스 절차를 따라야 합니다.

  1. lib/checksums/ 내에 해당 알고리즘의 C 파일을 구현합니다.
  2. lib/checksum.h에 새로운 알고리즘에 대한 식별자(Enum)를 추가합니다.
  3. lib/checksum.c의 해시 등록 테이블에 해당 구현체를 연결합니다.

사용자 정의 출력 포맷터 개발

rmlint의 검사 결과를 JSON이나 CSV 외의 다른 형식으로 출력하고 싶다면 lib/formats/ 내에 새로운 포맷터를 정의할 수 있습니다. RmlintFormatter 구조체의 콜백 함수들을 구현해야 합니다.

/* 포맷터 구현 예시 구조 */
static void my_custom_header(RmlintFormatter *self) {
    /* 결과 상단 출력 로직 */
}

static void my_custom_add_clones(RmlintFormatter *self, RmlintNode *node) {
    /* 중복 파일 발견 시 출력 로직 */
}

5. 품질 보증 및 테스트

모든 기여 코드는 기존 테스트 세트를 통과해야 하며, 메모리 안정성이 검증되어야 합니다.

# 기본 테스트 실행
pytest tests/

# Valgrind를 이용한 메모리 누수 탐지
USE_VALGRIND=1 pytest tests/test_options.py

# 코드 스타일 교정
clang-format -style=file -i $(find lib src -name "*.[ch]")

6. 개발 원칙 및 철학

rmlint 개발 시 반드시 준수해야 할 핵심 가치는 다음과 같습니다.

  • 비파괴 원칙: 파일 시스템을 직접 수정하지 않고, 항상 사용자가 검토할 수 있는 실행 스크립트를 생성하는 것을 우선으로 합니다.
  • 유닉스 철학: 단일 도구로서의 명확한 역할에 집중하며, 다른 파이프라인 도구와 결합하기 쉬운 구조를 유지합니다.
  • 성능 지향: 알고리즘의 복잡도를 항상 고려하며 성능 저하가 예상되는 기능은 선택적으로 제공합니다.

태그: rmlint C Linux-Filesystem performance-optimization Multi-threading

8월 8일 15:11에 게시됨