문제 상황
회사 업무로 외부 네트워크와 완전히 분리된 환경(망 분리 환경)에 설치된 특정 솔루션을 점검하러 방문했다. 해당 사이트에서 수집된 정보(이미지, 영상, 로그 등)를 반출해야 하는 상황이었는데, 이러한 환경에서는 외부와의 통신이 차단되어 있기 때문에 SSH, SFTP, 클라우드 업로드 등의 일반적인 데이터 백업 수단을 사용할 수 없었다.
물리적인 외장 스토리지를 이용한 데이터 반출이 유일한 방법이었다.
이번 작업의 목적은 해당 솔루션에 저장된 다량의 이미지, 로그, 영상 등 이력 데이터를 외장 SSD를 통해 수집하고 반출하는 것이었다.
데이터는 날짜별로 수많은 폴더로 나뉘어 저장되어 있으며, 총 파일 수는 약 3만 건 이상, 용량은 약 30GB에 달했다.
초기에는 단순하게 GUI를 이용해 마우스로 복사를 시도했지만, 예상보다 심각하게 느린 속도(30분 이상 소요)가 문제로 드러났다.
이에 따라, 우분투 환경에서 다량의 파일을 보다 효율적으로 압축하고 전송할 수 있는 백업 최적화 전략을 고안하게 되었다.
시스템 구성 (제약 환경 예시)
구성 요소 | 설명 |
---|---|
OS | Ubuntu 22.04 LTS |
소스 디스크 | 내장 HDD (~/project/data ) |
중간 디스크 | 내장 SSD (~/Download ) |
대상 디스크 | 외장 SSD (/media/your-ssd ) |
파일 구조 | 날짜별 폴더 수천 개 + 이미지/영상 다수 포함 |
💡 실제 사용된 경로는 사내 솔루션 고유 경로로, 보안을 위해 예시로 변경해 표기함.
전체 백업 시나리오
- 내장 HDD → 내장 SSD로 다중 폴더 복사 (
rsync
) - 내장 SSD에서 전체 폴더를 압축 (
tar + pigz + pv
) - 압축된 파일을 외장 SSD로 전송 (
rsync
)
사전 준비
압축 및 진행률 확인을 위해 pigz
, pv
도구를 먼저 설치해야 한다.
sudo apt update
sudo apt install pv pigz
단계별 진행
1.HDD → SSD로 다중 폴더 복사 (rsync)
# 예: 2025-04-20 ~ 2025-05-15 범위 복사
rsync -a --info=progress2 \
~/project/data/2025-04-{20..30} \
~/project/data/2025-05-{01..15} \
~/Download/backup-archives/
- -a: 권한, 링크, 시간 정보 보존
- --info=progress2: 전체 진행률 출력
2.SSD에서 폴더 압축 (tar + pigz + pv)
cd ~/Download
tar -cf - backup-archives | pv | pigz > diskIO.tar.gz
- tar -cf -: tar 결과를 stdout으로 출력
- pv: 진행률, 속도, ETA 확인 가능
- pigz: gzip의 병렬처리 버전 (멀티코어 활용)
- 결과 파일: ~/Download/diskIO.tar.gz
3.외장SSD로 압축 파일 전송 (rsync)
rsync -ah --info=progress2 diskIO.tar.gz /media/your-ssd/
- -h: 사람이 읽기 쉬운 단위(MB, GB 등)
- --info=progress2: 전송 속도, 진행률 출력
차이 비교
방식 | 전체 소요 시간 |
---|---|
GUI 마우스 복사 | 약 30~40분 |
rsync + pigz 방식 |
약 7~12분 (압축 + 전송 포함) |
- .tar.gz 파일은 Windows에서 반디집, 7-Zip 등으로 바로 해제 가능
- 단일 파일 전송이라 외장 SSD의 순차 쓰기 성능을 최대한 활용
정리
- 수많은 소용량 파일은 무작정 복사하면 비효율적이다.
- 압축하여 단일 파일로 만들고 전송하는 구조가 훨씬 빠르다.
- rsync, tar, pigz, pv 조합은 우분투 환경에서 대량 파일 백업 최적화에 매우 효과적이다
'개발 일상' 카테고리의 다른 글
YOLO 객체 감지 후 위험 영역 판단 로직 개선기 (1) | 2025.06.10 |
---|---|
[python] data.dict() vs jsonable_encoder(). 그리고 datetime 쿼리 삽질기 (0) | 2025.05.26 |
MongoDB Aggregation을 활용한 통계 API 구현(python) (1) | 2025.05.22 |
주기적인 MongoDB 서비스 Down 증상 해결 (0) | 2025.05.19 |
[React.js] setTimeout 사용 시 최신 상태(state)가 반영되지 않는 이슈 처리 (0) | 2025.04.07 |