본문 바로가기
일반IT/리눅스

아직도 백업에 cp 쓰세요? 똑똑한 관리자가 rsync를 쓰는 이유 🧙‍♂️

by gasbugs 2025. 10. 10.

안녕하세요! 리눅스 시스템을 관리하다 보면 '백업'은 숙명과도 같은 작업입니다. 가장 먼저 배우는 명령어는 단연 cp죠. 직관적이고 간단하니까요. 하지만 정기적인 백업 스크립트에 cp를 사용했다가 예상치 못한 문제로 당황해 본 적 없으신가요? 🤔

"분명 백업했는데 왜 디렉토리 구조가 이상해지지?"

 

오늘은 이 흔한 함정과 그에 대한 명쾌한 해답을 알려드리려고 합니다. 왜 단순한 복사(copy)가 아닌 동기화(sync)가 필요하며, 왜 rsync가 백업 작업의 표준으로 불리는지 그 이유를 속 시원하게 파헤쳐 보겠습니다!

 


1. cp 명령어의 숨겨진 함정: "어? 왜 폴더가 또 생기지?"

백업 스크립트에 아래와 같은 cp 명령어를 넣었다고 가정해 봅시다.

Bash
 
# /var/www/ 디렉토리를 /opt/www-backup/으로 백업한다
cp -a /var/www/ /opt/www-backup/

이 스크립트를 처음 실행하면 아무 문제 없이 /opt/www-backup 폴더 안에 /var/www의 내용물이 잘 복사됩니다. 하지만 두 번째 실행부터 문제가 발생합니다. /opt/www-backup 안에 www라는 폴더가 또 생겨버리죠!

  • 1회차: /opt/www-backup/[...www의 내용물...] 👍
  • 2회차: /opt/www-backup/www/[...www의 내용물...] 👎
  • 3회차: /opt/www-backup/www/www/[...www의 내용물...] 😱

이것은 cp가 대상 폴더의 존재 여부에 따라 동작을 달리하기 때문입니다.

  • 대상이 없으면: 대상 폴더를 만들고 그 안에 내용물을 복사합니다.
  • 대상이 있으면: 대상 폴더 안에 원본 폴더 자체를 복사합니다.

마치 빈 상자에 물건을 정리하는 것과, 이미 물건이 든 상자 안에 또 다른 상자를 통째로 넣는 것의 차이와 같습니다.


2. cp로 문제를 해결하는 '무식한' 방법

물론 cp만으로 이 문제를 해결할 수는 있습니다. 바로 복사하기 전에 기존 백업을 몽땅 지워버리는 것이죠.

Bash
 
# 1. 일단 기존 백업을 깨끗하게 지운다.
rm -rf /opt/www-backup/

# 2. 그리고 다시 복사한다.
cp -a /var/www/ /opt/www-backup/

매번 백업 폴더를 지워서 cp가 항상 '첫 번째 실행'처럼 행동하게 만드는 원시적인 방법입니다. 동작은 하지만, 이 방법은 왜 우리가 cp를 백업에 사용하면 안 되는지를 명확하게 보여주는 단점들을 내포하고 있습니다.


3. 왜 cp + rm 방식이 최악의 선택일까?

🐢 극심한 비효율

가장 큰 문제입니다. 원본에서 1KB짜리 텍스트 파일 하나만 수정되어도, 이 스크립트는 수십 GB의 전체 백업을 지우고 처음부터 다시 복사합니다. 이는 엄청난 시간 낭비와 시스템 I/O 부하를 유발합니다. 액자 하나 바꾸려고 집 전체를 리모델링하는 것과 같죠.

💣 백업 공백 시간

rm으로 백업을 지운 순간부터 cp가 완료될 때까지, 여러분의 서버에는 백업이 존재하지 않는 위험한 시간이 발생합니다. 만약 이 사이에 시스템에 문제가 생긴다면? 상상하고 싶지도 않네요.

🗑️ 삭제 파일 미반영

만약 rm 없이 cp -u (업데이트) 옵션을 사용하면, 원본에서 삭제한 파일이 백업 폴더에는 그대로 남아있게 됩니다. 시간이 지날수록 백업 폴더는 유령 파일들로 가득 차게 됩니다.


4. 전문가의 선택: rsync (The Right Tool for the Job)

이 모든 문제를 해결하는 명령어가 바로 rsync입니다. rsync는 'Remote Sync'의 약자로, 이름처럼 두 디렉토리를 '동기화'하는 데 특화된 도구입니다.

rsync는 단순히 모든 것을 복사하는 게 아니라, 두 디렉토리를 비교해서 변경된 부분(Delta)만賢く 전송합니다.

완벽한 백업을 위한 rsync 명령어

rsync -avh --delete /var/www/ /opt/www-backup/
  • -a (archive): 권한, 소유자 등 모든 속성을 보존하며 재귀적으로 복사합니다.
  • -v (verbose): 진행 상황을 자세히 보여줍니다.
  • -h (human-readable): 파일 크기를 M, G 등 읽기 편한 단위로 보여줍니다.
  • --delete: 핵심 옵션입니다. 원본에서 삭제된 파일은 백업에서도 똑같이 삭제하여, 두 디렉토리를 완벽한 거울 상태로 만듭니다.

⚠️ rsync의 절대 규칙: 경로 끝의 슬래시(/)

rsync를 사용할 때 이것 하나만은 꼭 기억하세요. 원본(Source) 경로의 끝에 /를 붙이면 '그 안의 내용물'을 의미하고, 붙이지 않으면 '디렉토리 자체'를 의미합니다. cp에서 겪었던 문제를 피하려면 반드시 원본 경로 끝에 /를 붙여주세요!

  • /var/www/ ➡️ /var/www의 내용물을 의미 (O)
  • /var/www ➡️ /var/www 디렉토리 자체를 의미 (X)

결론: 망치와 전동 드라이버

cp와 rsync의 관계는 망치(🔨)와 전동 드라이버(🔩)에 비유할 수 있습니다. 못 하나를 박을 땐 망치가 빠르고 유용합니다. 하지만 수십 개의 나사로 가구를 조립해야 할 땐 전동 드라이버가 압도적으로 효율적이고 정확하죠.

단순한 일회성 복사에는 cp를, 반복적이고 안정성이 중요한 백업과 동기화 작업에는 반드시 rsync를 사용하세요. 올바른 도구를 선택하는 것이 당신의 시간과 시스템의 안정을 지켜주는 첫걸음입니다.


태그:

리눅스, 백업, 동기화, cp, rsync, 셸 스크립트, 시스템관리, DevOps, 리눅스팁