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. 기능 확장 가이드
새로운 체크섬 알고리즘 추가
새로운 해싱 알고리즘을 도입하려면 다음의 인터페이스 절차를 따라야 합니다.
lib/checksums/내에 해당 알고리즘의 C 파일을 구현합니다.lib/checksum.h에 새로운 알고리즘에 대한 식별자(Enum)를 추가합니다.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 개발 시 반드시 준수해야 할 핵심 가치는 다음과 같습니다.
- 비파괴 원칙: 파일 시스템을 직접 수정하지 않고, 항상 사용자가 검토할 수 있는 실행 스크립트를 생성하는 것을 우선으로 합니다.
- 유닉스 철학: 단일 도구로서의 명확한 역할에 집중하며, 다른 파이프라인 도구와 결합하기 쉬운 구조를 유지합니다.
- 성능 지향: 알고리즘의 복잡도를 항상 고려하며 성능 저하가 예상되는 기능은 선택적으로 제공합니다.