[L] 백업스크립트_지정디렉토리 백업
💡 요약 정리
- 원하는 디렉토리만 선택적으로 백업하는 bash 스크립트입니다
- BACKUPLIST 변수에 백업할 디렉토리를 지정하여 사용합니다
- 전체 백업이 아닌 중요 디렉토리(/boot, /etc 등)만 백업 시 유용합니다
- 기본 7일간 백업본을 보관하며, 오래된 백업은 자동 삭제됩니다
/home/BACKUP 디렉토리를 생성하여, 지정한 디렉토리만 선택적으로 백업하는 스크립트입니다.
이전 FAQ의 전체 백업과 달리, 중요한 디렉토리만 선택하여 백업할 수 있습니다.
1. 백업 스크립트 전체 코드
① backup_dir.sh
#!/bin/bash
################################################################################
# 지정 디렉토리 백업 스크립트
################################################################################
##### Today #####
## 오늘 날짜
DATE=`/bin/date +%Y_%m_%d`
##### Keeping day for Backup data #####
## 백업본 보관 주기(일주일간 보관) 숫자를 수정하여 원하는 기간으로 변경
KEEP=7
##### Delete day for Backup data #####
## 삭제할 백업본의 날짜를 지정
OLDDATE=`/bin/date +%Y_%m_%d -d "${KEEP} day ago"`
##### Disk Usage #####
## /home 디렉토리 사용량
USAGE=`/bin/df -h | grep /home | awk '{print $5}' | cut -d% -f1`
##### Make Backup DIR #####
## 백업 데이터를 보관할 디렉토리와 log 디렉토리
## 디렉토리가 존재하지 않으면 생성한다
BACKUPDIR="/home/BACKUP/home"
if [ ! -e ${BACKUPDIR} ];then
mkdir -p ${BACKUPDIR}
fi
if [ ! -e ${BACKUPDIR}/log ];then
mkdir -p ${BACKUPDIR}/log
fi
##### Backup Directory #####
## 데이터를 백업할 디렉토리, 원하는 디렉토리를 추가한다.
BACKUPLIST="/boot /etc /home/jook"
##### Run BACKUP #####
## 백업 실행. /home 파티션의 사용량이 95%이상일 경우 백업이 실행 되지 않고, 에러로그를 생성한다.
## 백업 디렉토리내에, 날짜별로 압축 파일을 생성
if [ $USAGE -ge 95 ]
then
echo "Not enough Disk space... " > ${BACKUPDIR}/log/${DATE}_err.log
exit 1;
else
cd /home
tar cvzfp ${BACKUPDIR}/${DATE}.tar.gz $BACKUPLIST
/bin/rm -rf ${BACKUPDIR}/${OLDDATE}.tar.gz
echo "$DATE BACKUP OK" > ${BACKUPDIR}/log/${DATE}.log
ls -l ${BACKUPDIR} >> ${BACKUPDIR}/log/${DATE}.log
fi
2. 전체 백업 스크립트와의 차이점
| 항목 | 전체 백업 (이전 FAQ) | 지정 디렉토리 백업 (현재) |
|---|---|---|
| 백업 대상 | /home 하위 모든 디렉토리 | BACKUPLIST에 지정한 디렉토리만 |
| 반복 로직 | for 루프로 각 디렉토리 순회 | 한 번에 여러 디렉토리 압축 |
| 백업 파일 | user1.tar.gz, user2.tar.gz (개별) | 2025_11_17.tar.gz (통합) |
| 활용 사례 | 전체 사용자 디렉토리 백업 | 시스템 설정 파일 백업 |
3. 스크립트 구성 요소 설명
① 백업 대상 디렉토리 지정
BACKUPLIST="/boot /etc /home/jook"
기능:
- 백업할 디렉토리를 공백으로 구분하여 지정
- 여러 디렉토리를 한 번에 압축
수정 예시:
# 웹 서버 설정 백업
BACKUPLIST="/etc/httpd /etc/php.ini /var/www/html"
# 데이터베이스 설정 백업
BACKUPLIST="/etc/my.cnf /var/lib/mysql"
# 시스템 설정 백업
BACKUPLIST="/boot /etc /root"
② 백업 실행
cd /home
tar cvzfp ${BACKUPDIR}/${DATE}.tar.gz $BACKUPLIST
동작:
- BACKUPLIST의 모든 디렉토리를 하나의 압축 파일로 생성
- 파일명:
YYYY_MM_DD.tar.gz
생성되는 백업 파일:
/home/BACKUP/home/2025_11_17.tar.gz
압축 파일 내용:
2025_11_17.tar.gz
├── boot/
├── etc/
└── home/jook/
③ 오래된 백업 삭제
/bin/rm -rf ${BACKUPDIR}/${OLDDATE}.tar.gz
동작:
- 개별 파일 삭제 (디렉토리가 아닌 압축 파일)
- 예:
2025_11_10.tar.gz삭제
4. 활용 사례
① 시스템 설정 파일 백업
BACKUPLIST="/boot /etc /root/.bashrc /root/.ssh"
백업 대상:
- 부트 설정 파일
- 시스템 전역 설정
- root 사용자 환경 설정
- SSH 키 및 설정
② 웹 서버 백업
BACKUPLIST="/etc/httpd /etc/nginx /var/www/html /home/webapp"
백업 대상:
- Apache/Nginx 설정
- 웹 콘텐츠
- 웹 애플리케이션 파일
③ 데이터베이스 설정 백업
BACKUPLIST="/etc/my.cnf /var/lib/mysql /home/dbbackup"
백업 대상:
- MySQL 설정 파일
- 데이터베이스 파일
- 수동 백업 디렉토리
④ 특정 사용자 디렉토리만 백업
BACKUPLIST="/home/user1 /home/user2 /home/admin"
백업 대상:
- 선택한 사용자 디렉토리만
5. 스크립트 사용 방법
① 스크립트 파일 생성
vi /root/backup_dir.sh
위 코드를 복사하여 붙여넣기 합니다.
② BACKUPLIST 수정
자신의 환경에 맞게 백업할 디렉토리를 지정합니다:
BACKUPLIST="/boot /etc /home/myuser /var/www"
③ 실행 권한 부여
chmod +x /root/backup_dir.sh
④ 수동 실행 테스트
/root/backup_dir.sh
⑤ 백업 결과 확인
# 백업 파일 확인
ls -lh /home/BACKUP/home/
# 백업 로그 확인
cat /home/BACKUP/home/log/$(date +%Y_%m_%d).log
6. 백업 복구
① 압축 파일 내용 확인
tar tzf /home/BACKUP/home/2025_11_17.tar.gz
출력 예시:
boot/
boot/grub/
boot/grub/grub.conf
etc/
etc/passwd
etc/httpd/
home/jook/
② 전체 복구
cd /
tar xvzf /home/BACKUP/home/2025_11_17.tar.gz
주의:
- 기존 파일을 덮어쓰므로 신중하게 실행
③ 특정 디렉토리만 복구
# /etc 디렉토리만 복구
cd /
tar xvzf /home/BACKUP/home/2025_11_17.tar.gz etc/
# /home/jook 디렉토리만 복구
cd /
tar xvzf /home/BACKUP/home/2025_11_17.tar.gz home/jook/
④ 특정 파일만 복구
# /etc/httpd/conf/httpd.conf 파일만 복구
cd /
tar xvzf /home/BACKUP/home/2025_11_17.tar.gz etc/httpd/conf/httpd.conf
7. Cron 자동 실행 설정
① crontab 편집
crontab -e
② 매일 새벽 3시 실행
0 3 * * * /root/backup_dir.sh > /dev/null 2>&1
③ 다른 실행 시간 예시
# 매일 새벽 4시
0 4 * * * /root/backup_dir.sh
# 평일만 새벽 3시 (월~금)
0 3 * * 1-5 /root/backup_dir.sh
# 매주 일요일 새벽 2시
0 2 * * 0 /root/backup_dir.sh
8. 고급 활용
① 여러 백업 세트 운영
서로 다른 백업 목적에 따라 스크립트를 분리합니다:
backup_system.sh (시스템 설정)
BACKUPDIR="/home/BACKUP/system"
BACKUPLIST="/boot /etc /root"
backup_web.sh (웹 서버)
BACKUPDIR="/home/BACKUP/web"
BACKUPLIST="/var/www /etc/httpd"
backup_db.sh (데이터베이스)
BACKUPDIR="/home/BACKUP/db"
BACKUPLIST="/var/lib/mysql /etc/my.cnf"
② 백업 전 알림
스크립트 시작 부분에 알림 추가:
echo "Backup started at $(date)" | mail -s "Backup Start" admin@example.com
③ 백업 후 결과 통지
스크립트 끝부분에 결과 전송:
if [ $? -eq 0 ]; then
echo "Backup completed successfully" | mail -s "Backup Success" admin@example.com
else
echo "Backup failed" | mail -s "Backup Failed" admin@example.com
fi
9. 주의사항
① 절대 경로 사용
# ✅ 올바른 방법 (절대 경로)
BACKUPLIST="/boot /etc /home/jook"
# ❌ 잘못된 방법 (상대 경로)
BACKUPLIST="boot etc home/jook"
② 백업 디렉토리 자체를 백업하지 않기
# BACKUPDIR 경로를 BACKUPLIST에 포함하지 말 것
BACKUPDIR="/home/BACKUP/home"
BACKUPLIST="/boot /etc /home/BACKUP" # ❌ 순환 백업 발생
③ 디스크 공간 확인
백업 전 충분한 공간이 있는지 확인:
df -h /home
10. 문제 해결
① 특정 디렉토리가 백업되지 않음
원인:
- 경로 오류
- 권한 부족
해결:
# 경로 확인
ls -l /boot /etc /home/jook
# 권한 확인
ls -ld /boot /etc /home/jook
② 백업 파일이 너무 큼
원인:
- BACKUPLIST에 큰 디렉토리 포함
해결:
- 필요한 디렉토리만 선택
- 큰 디렉토리는 별도 백업
③ 복구 시 권한 오류
원인:
- root 권한 없이 복구 시도
해결:
# root로 전환
sudo su -
# 복구 실행
tar xvzf /home/BACKUP/home/2025_11_17.tar.gz
참고 자료
- tar 명령어 옵션: 'GNU tar Manual' 바로가기
- 백업 모범 사례: 'Red Hat Backup Strategy' 바로가기