백업과 복구 · tar 와 rsync · 실습
tar 로 백업 세트 만들기
목표
tar 로 전체 백업과 증분 백업을 만들고, 제외 규칙과 권한 보존과 분할까지 다룹니다.
왜 중요한가
tar 옵션 하나가 복원 결과를 바꿉니다. -C 없이 절대 경로를 담으면 복원 위치를 고를 수 없고, --numeric-owner 없이 복원하면 다른 시스템에서 소유자가 엉뚱하게 매핑되고, --selinux 없이 복원하면 SELinux 시스템에서 서비스가 아예 뜨지 않습니다. 그리고 --listed-incremental 의 스냅샷 파일이 증분 체인의 상태를 들고 있으므로 그 파일도 함께 보관해야 합니다 — 이걸 잃으면 다음 증분이 사실상 전체 백업이 됩니다.
단계
1. /root/bk/src 아래에 다음을 만드세요. app/main.py, app/conf.yaml, data/records.csv, logs/app.log, logs/old.log. 각 파일에 한 줄 이상 넣되, data/records.csv 만은 200KB 이상으로 채우세요. 7단계에서 아카이브를 64KB 로 쪼개는데, 한 줄짜리 파일만 넣으면 압축본이 1KB도 안 되어 조각이 하나만 생깁니다. base64 /dev/urandom | head -c 240000 > data/records.csv 같은 것이면 충분합니다.
2. /root/bk/full.tar.gz 로 전체 백업을 만드세요. 아카이브 안의 경로가 src/ 로 시작해야 합니다(절대 경로 금지).
3. 아카이브 항목 수를 숫자 한 줄로 /root/bk/count.txt 에 적으세요.
4. 증분 백업을 만드세요. 스냅샷 파일은 /root/bk/snap.snar 입니다. 먼저 /root/bk/inc0.tar.gz 를 만들고, src/app/new.py 파일을 추가한 뒤 /root/bk/inc1.tar.gz 를 만드세요. inc1 의 항목 수가 inc0 보다 적어야 합니다.
5. logs/ 를 제외한 백업 /root/bk/nolog.tar.gz 를 만드세요. 목록에 logs 가 없어야 합니다.
6. /root/bk/src/app/conf.yaml 의 권한을 640 으로 바꾼 뒤 다시 전체 백업(/root/bk/perm.tar.gz)을 만들고, /root/bk/restore-perm/ 에 권한을 보존해 복원하세요. 복원된 파일의 권한을 숫자 한 줄로 /root/bk/perm.txt 에 적으세요. 640 이어야 합니다.
7. /root/bk/full.tar.gz 를 64KB 단위로 분할해 /root/bk/split/full.part 접두사로 저장하고, 다시 합쳐 /root/bk/rejoined.tar.gz 를 만드세요. 원본과 sha256 이 같아야 합니다.
8. /root/bk/report.txt 를 다음 5줄로 만드세요.FULL_ENTRIES=<3번 값> / INC0_ENTRIES=<inc0 항목 수> / INC1_ENTRIES=<inc1 항목 수> / NOLOG_HAS_LOGS=no / REJOIN_OK=yes
참고
tar -czf /root/bk/full.tar.gz -C /root/bk src형태로 만들면 아카이브 안 경로가src/...가 됩니다.- 항목 수는
tar -tzf <파일> | wc -l입니다. - 증분은
tar --listed-incremental=/root/bk/snap.snar -czf <출력> -C /root/bk src입니다. - 분할은
split -b 64K <파일> /root/bk/split/full.part, 재결합은cat /root/bk/split/full.part* > <출력>입니다. - 흔한 실수 1: 4번에서 스냅샷 파일을 매번 지우면 계속 전체 백업이 됩니다.
- 흔한 실수 2: 6번에서 복원 시 권한 보존 옵션을 빼먹으면 umask 가 적용돼 값이 달라집니다.
단계 8개
- 백업 대상 만들기
- 전체 백업
- 목록 확인
- 증분 백업 두 번
- 제외 규칙 적용
- 권한 보존 확인
- 아카이브 분할과 재결합
- 백업 세트 요약