본문으로 건너뛰기

[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

참고 자료