본문으로 건너뛰기

[L] 백업스크립트_home 디렉토리 백업

💡 요약 정리

  • /home 디렉토리 전체를 자동으로 백업하는 bash 스크립트입니다
  • /home/BACKUP 디렉토리에 날짜별로 백업본을 저장합니다
  • 디스크 사용량이 95% 이상일 경우 백업을 중지하여 디스크 풀 방지
  • 기본 7일간 백업본을 보관하며, 오래된 백업은 자동 삭제됩니다

/home/BACKUP 디렉토리를 생성하여, /home 디렉토리 내의 모든 데이터를 백업하는 스크립트입니다.

이 스크립트는 날짜별로 백업본을 관리하며, 지정된 기간이 지난 백업은 자동으로 삭제합니다.


1. 백업 스크립트 전체 코드

① backup_home.sh

#!/bin/bash

################################################################################
# /home 디렉토리 백업 스크립트
################################################################################

##### 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}/log ];then
 mkdir -p ${BACKUPDIR}/log
fi

if [ ! -e ${BACKUPDIR}/${DATE} ];then
 mkdir -p ${BACKUPDIR}/${DATE}
fi

##### Run BACKUP #####
## 백업 실행. /home 파티션의 사용량이 95%이상일 경우 백업이 실행 되지 않고, 에러로그를 생성한다.
## 백업을 하지 않을 디렉토리가 있을 경우는 아래의 "grep -v BACKUP" 과 같이 파이프(|)로 연결하여 추가 한다.
## 백업 디렉토리 내에 날짜별로 디렉토리를 생성하여 각각의 디렉토리명으로 압축 파일을 생성하여 백업
if [ $USAGE -ge 95 ]
        then
        echo "Not enough Disk space... " > ${BACKUPDIR}/log/${DATE}_err.log
        exit 1;
else
        cd /home

        for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)
                do tar cvzfp ${BACKUPDIR}/${DATE}/${list}.tar.gz $list
        done

        /bin/rm -rf ${BACKUPDIR}/home/${OLDDATE}

        echo "$DATE BACKUP OK" > ${BACKUPDIR}/log/${DATE}.log
        ls -l ${BACKUPDIR}/$DATE/ >> ${BACKUPDIR}/log/${DATE}.log
fi

2. 스크립트 구성 요소 설명

① 날짜 변수 설정

DATE=`/bin/date +%Y_%m_%d`

기능:

  • 오늘 날짜를 YYYY_MM_DD 형식으로 저장
  • 백업 디렉토리 이름과 로그 파일명에 사용

예시:

2025_11_17

② 백업 보관 주기 설정

KEEP=7

기능:

  • 백업본을 며칠 동안 보관할지 설정
  • 기본값: 7일 (일주일)

수정 방법:

KEEP=14  # 2주간 보관
KEEP=30  # 30일간 보관

③ 삭제할 백업본 날짜 계산

OLDDATE=`/bin/date +%Y_%m_%d -d "${KEEP} day ago"`

기능:

  • KEEP 일수 전의 날짜를 계산
  • 해당 날짜의 백업 디렉토리를 삭제 대상으로 지정

예시:

오늘: 2025_11_17
KEEP: 7
OLDDATE: 2025_11_10

④ 디스크 사용량 체크

USAGE=`/bin/df -h | grep /home | awk '{print $5}' | cut -d% -f1`

기능:

  • /home 파티션의 사용률(%)을 확인
  • 95% 이상일 경우 백업 중지

출력 예시:

$ df -h | grep /home
/dev/sda2       100G   80G   15G   85% /home
                                    ^^
                                   85 (USAGE 변수값)

⑤ 백업 디렉토리 생성

BACKUPDIR="/home/BACKUP/home"

if [ ! -e ${BACKUPDIR}/log ];then
 mkdir -p ${BACKUPDIR}/log
fi

if [ ! -e ${BACKUPDIR}/${DATE} ];then
 mkdir -p ${BACKUPDIR}/${DATE}
fi

생성되는 디렉토리 구조:

/home/BACKUP/home/
├── log/                    # 백업 로그 디렉토리
├── 2025_11_10/            # 7일 전 백업 (삭제 예정)
├── 2025_11_11/            # 6일 전 백업
├── ...
└── 2025_11_17/            # 오늘 백업 (생성)

3. 백업 실행 로직

① 디스크 공간 체크

if [ $USAGE -ge 95 ]
    then
    echo "Not enough Disk space... " > ${BACKUPDIR}/log/${DATE}_err.log
    exit 1;

동작:

  • 사용률이 95% 이상이면 백업 중지
  • 에러 로그 생성: ${DATE}_err.log
  • 스크립트 종료 (exit 1)

예시 에러 로그:

/home/BACKUP/home/log/2025_11_17_err.log

② 백업 실행

cd /home

for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)
    do tar cvzfp ${BACKUPDIR}/${DATE}/${list}.tar.gz $list
done

동작 흐름:

  1. /home 디렉토리로 이동
  2. /home 하위 디렉토리 목록 가져오기
  3. 제외할 디렉토리 필터링:
    • grep -v BACKUP: BACKUP 디렉토리 제외
    • grep -v lost+found: lost+found 디렉토리 제외
  4. 각 디렉토리를 tar.gz로 압축

백업 예시:

tar cvzfp /home/BACKUP/home/2025_11_17/user1.tar.gz user1
tar cvzfp /home/BACKUP/home/2025_11_17/user2.tar.gz user2
tar cvzfp /home/BACKUP/home/2025_11_17/user3.tar.gz user3

③ 추가 디렉토리 제외

특정 디렉토리를 백업에서 제외하려면:

# 기존
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)

# temp 디렉토리 추가 제외
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found | grep -v temp)

④ 오래된 백업 삭제

/bin/rm -rf ${BACKUPDIR}/home/${OLDDATE}

동작:

  • KEEP 일수 전의 백업 디렉토리 삭제
  • 예: 7일 전 백업 자동 삭제

⑤ 백업 로그 생성

echo "$DATE BACKUP OK" > ${BACKUPDIR}/log/${DATE}.log
ls -l ${BACKUPDIR}/$DATE/ >> ${BACKUPDIR}/log/${DATE}.log

생성되는 로그 예시:

2025_11_17 BACKUP OK
total 15360
-rw-r--r-- 1 root root 5242880 Nov 17 10:30 user1.tar.gz
-rw-r--r-- 1 root root 7340032 Nov 17 10:31 user2.tar.gz
-rw-r--r-- 1 root root 2621440 Nov 17 10:32 user3.tar.gz

4. 스크립트 사용 방법

① 스크립트 파일 생성

vi /root/backup_home.sh

위 코드를 복사하여 붙여넣기 합니다.

② 실행 권한 부여

chmod +x /root/backup_home.sh

③ 수동 실행 테스트

/root/backup_home.sh

④ 백업 결과 확인

# 백업 디렉토리 확인
ls -l /home/BACKUP/home/

# 오늘 백업 파일 확인
ls -lh /home/BACKUP/home/$(date +%Y_%m_%d)/

# 백업 로그 확인
cat /home/BACKUP/home/log/$(date +%Y_%m_%d).log

5. Cron 자동 실행 설정

① crontab 편집

crontab -e

② 매일 새벽 2시 실행

0 2 * * * /root/backup_home.sh > /dev/null 2>&1

설명:

  • 0 2 * * *: 매일 02:00 실행
  • > /dev/null 2>&1: 표준 출력 및 에러 무시

③ 다른 실행 시간 예시

# 매일 새벽 3시 30분
30 3 * * * /root/backup_home.sh

# 매주 일요일 새벽 1시
0 1 * * 0 /root/backup_home.sh

# 매월 1일 새벽 2시
0 2 1 * * /root/backup_home.sh

6. 백업 복구

① 특정 사용자 디렉토리 복구

# 백업 파일 확인
ls -l /home/BACKUP/home/2025_11_17/

# 압축 해제
cd /home
tar xvzf /home/BACKUP/home/2025_11_17/user1.tar.gz

② 특정 날짜 백업 복구

# 3일 전 백업 복구
cd /home
tar xvzf /home/BACKUP/home/2025_11_14/user1.tar.gz

③ 압축 해제 옵션 설명

tar xvzf backup.tar.gz
  • x: 압축 해제 (extract)
  • v: 상세 출력 (verbose)
  • z: gzip 압축 해제
  • f: 파일 지정

7. 주의사항

① 디스크 공간 확보

  • 백업 디렉토리가 차지할 공간 고려
  • /home 파티션 사용률 주기적 확인

② 백업 보관 주기 조정

  • KEEP 값을 너무 크게 설정 시 디스크 공간 부족 가능
  • 서버 용량에 맞게 적절히 조정

③ 중요 데이터 오프사이트 백업

  • 서버 내 백업만으로는 부족할 수 있음
  • 외부 스토리지나 클라우드로 주기적 백업 권장

8. 문제 해결

① 백업이 실행되지 않음

원인:

  • 디스크 사용률 95% 이상

해결:

# 디스크 사용률 확인
df -h | grep /home

# 에러 로그 확인
cat /home/BACKUP/home/log/*_err.log

② 권한 오류

원인:

  • 스크립트 실행 권한 없음

해결:

chmod +x /root/backup_home.sh

③ 백업 파일이 너무 큼

원인:

  • /home 디렉토리 크기가 큼

해결:

  • 불필요한 디렉토리 제외
  • 압축 옵션 최적화

참고 자료