LabHub
배우기 러닝패스 코스

バックアップとリストア

tarとrsyncを正確に使う

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

tar 는 시점을 담는 도구이고 rsync 는 상태를 맞추는 도구다. 백업 설계에서 둘은 경쟁이 아니라 역할 분담이다.

概念マップ: 시점을 담는 도구・상태를 맞추는 도구・둘 다・-C 는 작업 전에 디렉터리를 바꾼다.

왜 이게 필요했나

"백업은 tar 로 하나요 rsync 로 하나요?" 라는 질문에는 답이 정해져 있지 않다. 세대별 아카이브가 필요하면 tar, 최신 상태의 사본이 필요하면 rsync 다. 그리고 대부분의 실무 구성은 둘 다 쓴다.

어떻게 동작하나

tar

tar -czf /backup/etc-$(date +%F).tar.gz --acls --xattrs --selinux --numeric-owner -C / etc
tar -tzf /backup/etc-2026-08-20.tar.gz | head
tar -xzf /backup/etc-2026-08-20.tar.gz -C /restore/

옵션의 정확한 의미.

복원 시 경로를 반드시 확인하라. -C / 로 바로 풀면 현재 시스템 설정을 덮어쓴다. 안전한 절차는 임시 경로로 풀어 내용을 확인한 뒤 필요한 파일만 옮기는 것이다.

mkdir -p /restore/etc-check
tar -xzf /backup/etc-2026-08-20.tar.gz -C /restore/etc-check
diff -r /restore/etc-check/etc/nginx /etc/nginx | head -40

GNU tar 와 BSD tar(bsdtar)는 옵션 처리와 일부 동작이 다르다. macOS 에서 만든 아카이브를 리눅스에서 풀 때 확장 속성 관련 파일이 함께 나오는 문제가 대표적이다. 백업 스크립트는 실제 운영 배포판에서 검증해야 한다.

rsync

rsync -aHAX --numeric-ids --delete --dry-run /srv/data/ backup@10.0.9.2:/backup/prod/data/

세대 백업은 하드 링크로 값싸게 만든다.

rsync -aHAX --numeric-ids --delete --link-dest=/backup/prod/daily.1 /srv/data/ /backup/prod/daily.0/

각 세대가 전체 스냅샷처럼 보이지만 디스크는 변경분만 차지한다.

두 도구의 역할 분담

필요 도구
특정 시점의 아카이브 파일 하나 tar
오프사이트로 옮길 단일 객체 tar (+ 압축, 암호화)
최신 상태의 사본 유지 rsync
세대별 스냅샷을 값싸게 rsync --link-dest
대역폭을 아껴 원격 동기화 rsync (델타 전송)

현장에서 만나는 모습

--delete 사고. 원본이 비어 있거나 마운트가 풀린 상태에서 실행되면 대상 데이터를 전부 지운다. 실무에서 실제로 반복되는 사고다. 가드가 필수다.

세대 백업을 하드 링크 모르는 도구로 복사해 용량이 3배가 되는 사고. -H-a 에 포함되지 않는다.

옮기는 도중에 어긋나지 않게

tarrsync 는 단순해 보이지만, 대용량을 옮길 때 조용히 어긋나는 자리가 있다.

바뀌는 파일을 그대로 담으면 깨진다. tar 는 읽는 도중에 파일이 바뀌면 file changed as we read it 경고를 내고 그 파일만 깨진 채로 넘어간다. 서비스를 멈출 수 없다면 스냅샷(LVM, 파일 시스템, 클라우드 볼륨)을 뜨고 그것을 담는다.

하드 링크와 희소 파일을 보존한다. 옵션 없이 옮기면 하드 링크가 각각의 사본이 되어 용량이 몇 배가 되고, 희소 파일은 0으로 채워져 폭발한다.

tar --numeric-owner --acls --xattrs --sparse -cf - /srv | zstd -T0 > srv.tar.zst
rsync -aHAX --sparse --numeric-ids /srv/ backup:/srv/

-a 만으로는 하드 링크(H)·ACL(A)·확장 속성(X)이 안 따라간다. SELinux 라벨은 -X 에 들어 있다.

중간에 끊겨도 이어지게 만든다. --partial --append-verify 를 주면 다시 시작할 때 처음부터 받지 않는다. 큰 파일 하나를 며칠에 걸쳐 옮길 때 차이가 크다.

끝에 슬래시가 있고 없고가 다르다. rsync -a /src/ /dst/ 는 내용물을 옮기고, rsync -a /src /dst//dst/src 를 만든다. 스크립트에서 이 한 글자 때문에 경로가 한 단계 깊어지는 사고가 반복된다.

지울 때는 먼저 눈으로 본다. --delete 는 목적지에만 있는 것을 지운다. 출발지 경로가 잘못되면 목적지를 통째로 비운다.

rsync -aHAX --delete --dry-run --itemize-changes /src/ /dst/ | head -50

검증은 별도 단계다. rsync 는 전송 중 체크섬을 쓰지만, 나중에 파일이 상했는지는 알려 주지 않는다. 목록과 해시를 함께 남겨 두면 몇 달 뒤에도 확인할 수 있다.

find /srv -type f -print0 | sort -z | xargs -0 sha256sum > manifest.sha256
sha256sum -c manifest.sha256 --quiet

다음 실습에서 할 것

tar 로 전체·증분·제외·분할을 다루고, rsync 로 dry-run·가드·세대 백업·부하 제어를 다룬다. 두 실습 모두 마지막에 결과를 검증한다.