tarでバックアップセットを作る
한국어 원문으로 표시합니다.
목표
tar 로 전체 백업과 증분 백업을 만들고, 제외 규칙과 권한 보존과 분할까지 다룹니다.
왜 중요한가
tar 옵션 하나가 복원 결과를 바꿉니다. -C 없이 절대 경로를 담으면 복원 위치를 고를 수 없고, --numeric-owner 없이 복원하면 다른 시스템에서 소유자가 엉뚱하게 매핑되고, --selinux 없이 복원하면 SELinux 시스템에서 서비스가 아예 뜨지 않습니다. 그리고 --listed-incremental 의 스냅샷 파일이 증분 체인의 상태를 들고 있으므로 그 파일도 함께 보관해야 합니다 — 이걸 잃으면 다음 증분이 사실상 전체 백업이 됩니다.
단계
/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같은 것이면 충분합니다./root/bk/full.tar.gz로 전체 백업을 만드세요. 아카이브 안의 경로가src/로 시작해야 합니다(절대 경로 금지).- 아카이브 항목 수를 숫자 한 줄로
/root/bk/count.txt에 적으세요. - 증분 백업을 만드세요. 스냅샷 파일은
/root/bk/snap.snar입니다. 먼저/root/bk/inc0.tar.gz를 만들고,src/app/new.py파일을 추가한 뒤/root/bk/inc1.tar.gz를 만드세요.inc1의 항목 수가inc0보다 적어야 합니다. logs/를 제외한 백업/root/bk/nolog.tar.gz를 만드세요. 목록에logs가 없어야 합니다./root/bk/src/app/conf.yaml의 권한을640으로 바꾼 뒤 다시 전체 백업(/root/bk/perm.tar.gz)을 만들고,/root/bk/restore-perm/에 권한을 보존해 복원하세요. 복원된 파일의 권한을 숫자 한 줄로/root/bk/perm.txt에 적으세요.640이어야 합니다./root/bk/full.tar.gz를 64KB 단위로 분할해/root/bk/split/full.part접두사로 저장하고, 다시 합쳐/root/bk/rejoined.tar.gz를 만드세요. 원본과 sha256 이 같아야 합니다./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 가 적용돼 값이 달라집니다.
백업 대상 만들기
/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 같은 것이면 충분합니다.
하위 디렉터리와 로그를 섞어 두면 뒤 단계의 제외 규칙이 의미를 갖습니다.
전체 백업
/root/bk/full.tar.gz 로 전체 백업을 만드세요. 아카이브 안의 경로가 src/ 로 시작해야 합니다(절대 경로 금지).
절대 경로가 아카이브에 들어가지 않게 하는 옵션이 있습니다. 그래야 복원 위치를 고를 수 있습니다.
목록 확인
아카이브 항목 수를 숫자 한 줄로 /root/bk/count.txt 에 적으세요.
추출하지 않고 내용만 보는 옵션이 있습니다. 항목 수를 세어 파일에 적으세요.
증분 백업 두 번
증분 백업을 만드세요. 스냅샷 파일은 /root/bk/snap.snar 입니다. 먼저 /root/bk/inc0.tar.gz 를 만들고, src/app/new.py 파일을 추가한 뒤 /root/bk/inc1.tar.gz 를 만드세요. inc1 의 항목 수가 inc0 보다 적어야 합니다.
스냅샷 파일이 상태를 들고 있습니다. 같은 스냅샷 파일을 계속 쓰면 증분 체인이 이어집니다.
제외 규칙 적용
logs/ 를 제외한 백업 /root/bk/nolog.tar.gz 를 만드세요. 목록에 logs 가 없어야 합니다.
제외 패턴은 여러 번 지정하거나 파일에서 읽을 수 있습니다. 결과 목록에 그 항목이 없어야 합니다.
권한 보존 확인
/root/bk/src/app/conf.yaml 의 권한을 640 으로 바꾼 뒤 다시 전체 백업(/root/bk/perm.tar.gz)을 만들고, /root/bk/restore-perm/ 에 권한을 보존해 복원하세요. 복원된 파일의 권한을 숫자 한 줄로 /root/bk/perm.txt 에 적으세요. 640 이어야 합니다.
복원할 때 권한과 소유자를 정확히 되살리는 옵션이 있습니다. 복원 후 stat 으로 비교하세요.
아카이브 분할과 재결합
/root/bk/full.tar.gz 를 64KB 단위로 분할해 /root/bk/split/full.part 접두사로 저장하고, 다시 합쳐 /root/bk/rejoined.tar.gz 를 만드세요. 원본과 sha256 이 같아야 합니다.
split 은 접두사를 받고 조각 파일을 만듭니다. 재결합은 cat 으로 합니다.
백업 세트 요약
/root/bk/report.txt 를 다음 5줄로 만드세요.
FULL_ENTRIES=<3번 값> / INC0_ENTRIES=<inc0 항목 수> / INC1_ENTRIES=<inc1 항목 수> / NOLOG_HAS_LOGS=no / REJOIN_OK=yes
각 아카이브의 크기와 항목 수를 모으세요. 값은 실제 측정치여야 합니다.