[백업] Linux 백업 스크립트 가이드
본문 바로가기
IT 이야기/ETC

[백업] Linux 백업 스크립트 가이드

by 찬찬이 아빠 2020. 3. 5.
반응형
  1. 목적

 

시스템 운영 중 불의의 사고로 인해 특정 디렉터리 삭제 시 시스템이 재부팅이 되지 않은 상태에서 삭제된 데이터의 빠른 복구를 위해 작성하였습니다.

백업 받을 파티션(디렉터리)의 여유 공간을 확인 후 백업 스크립트를 수행하길 권장드립니다.

 

  2. 지원 범위

 

RHEL 6.x, CentOS 6.x

RHEL 7.x, CentOS 7.x

 

 

  3. OS 백업 수행

반드시 관리자(root) 권한으로 작업 수행하시기 바랍니다.

 

1. 백업 스크립트

  1) OS 백업 스크립트 : OS_Backup_v1.0.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/sh
 
export LANG=en_US
 
#--------------- User Configuration --------------------------
# Please enter a directory for backup.
BACKUP_DIR="/BACKUP"
 
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/"
 
# Enter the exclude items in the "excludelist.conf" file
BACKUP_EXCLUDE_LIST="excludelist.conf"
 
#---------------- Environment variable declarations -----------------------
DATE='date +%Y%m%d'
BK_DIR="${BACKUP_DIR}/${HOSTNAME}"
BK_FILE="${BK_DIR}/${HOSTNAME}_${DATE}.tgz"
CONFIG_FILE="${BK_DIR}/${HOSTNAME}_${DATE}.txt"
 
if [ ! -d ${BK_DIR} ]; then                # 백업 디렉터리가 없으면
    mkdir -p ${BK_DIR}                    # /BACKUP/HOSTNAME으로 상위 경로도 함께 생성
fi
 
#---------------- Check Setting List --------------------------------------
echo -"\n  Do you want to run the \\033[0;32m OS Backup\\033[0;39m Scripts ?\n"
echo -" ===================================================="
echo -" Backup Location : ${BK_DIR}"
echo -" Include Backup List : ${BACKUP_INCLUDE_LIST}"
 
# grep -v : 지정한 패턴과 일치하지 않는 행만 출력, -e : 패턴
# ^ : 라인의 시작, $ : 라인의 끝, ^$ : 빈라인
# tr : 문자 변환, tr 문자열1 문자열2, tr "\n" "  " : 새줄을 두칸으로 변환
 
if [ -f ${BACKUP_EXCLUDE_LIST} ]; then
    echo -" Excloude Backup List : $(cat ${BACKUP_EXCLUDE_LIST} | grep -v -e '^$' | tr "\n" "  ") "    # BACKUP_EXCLUDE_LIST 파일에서 빈라인은 제외하고 한깐씩 띄워서 출력
else
    echo -" Exclude Backup List : Exclude List Not Found"
fi
 
# df -h ${BACKUP_DIR} | grep -v "Filesystem" : df -h /BACKUP 정보 첫줄 제거
# 백업 다렉터리 여유 공간 정보(사용량, 사용 가능량, 사용률, 파티션 정보 출력)
 
echo -" \\033[0;32m ${BACKUP_DIR}\\033[0;39m Directory Space :" \
    $(df -h ${BACKUP_DIR} | grep -"Filesystem" | grep --'^$' | tr "\n" "  " | awk '{print "Used=" $3 "\\033[0;32m Avail=" $4 "\\033[0;31m  Use%=" $5 "\\033[0;39m Partition=" $6}'
echo -" ========================================================\n"
 
# Input Yes or No 출력 후 answer 읽기
read -" [ Input Yes or No : ] " answer
case $answer in
    [Yy]* )
        continue;;
    [Nn]* )
        echo -"\n  Cancel OS Backup !!\n"
        exit;;
    * )
        echo -"\n Input Yes or No !!\n"
        exit;;
esac
 
# ----------------------- Deleted Backup File ------------------------------------
if [ -f ${BK_FILE} ]; then
    rm -f ${BK_FILE}
fi
 
if [ -f ${CONFIG_FILE} ]; then
    rm -f ${CONFIG_FILE}
fi
 
 
# ---------------------- Archived Directory ----------------------------------
if [ -f ${BACKUP_EXCLUDE_LIST} ]; then            #BACKUP_EXCLUDE_LIST 파일이 존재하면
    /bin/tar cvfpz ${BK_FILE} ${BACKUP_INCLUDE_LIST} --exclude-backups --exclude-from=${BACKUP_EXCLUDE_LIST}    #BACKUP_EXCLUDE_LIST를 제외하고 TAR 백업수행
 else
     /bin/tar cvfpz ${BK_FILE} ${BACKUP_INCLUDE_LIST} --exclude-backups
fi
 
# ------------------------- Copy Configuration -------------------------------------
echo -"==========================================" >> ${CONFIG_FILE}
echo -" ===== OS information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
echo -"$(cat /etc/system-release) \n========== Uname Check ======== \n$(uname -a)" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== /etc/fstab information =====" >> ${CONFIG_FILE}
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -"$(ls -al /etc/fstab)===== : \n$(cat /etc/fstab)" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== DISK information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
echo -"\nDISK List : \n$(fdisk -l)" >> {CONFIG_FILE}
echo -"\nUUID : \n %(blkid)" >> {CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== Network information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
 
    # RHEL 버전에서 Maipo, Core가 나오면 1, -ge 1 : 1보다 크거나 같으면, 즉 OS 버전이 RHEL 7.x 이면
    if [ 'cat /etc/system-release | egrep "Maipo|Core" | wc -l' -ge 1 ]; then
        DEV_NAME=`ifconfig | grep "flage=" | awk -F: '{print $1}'`                # 네트워크 디바이스명 저장
    else
        DEV_NAME=`ifconfig | grep "Link encap:" | awk '{print $1}'`               # 네트워크 디바이스명 저장
    fi
    
    for DEV in ${DEV_NAME[@]}                                                     # 네트워크 디바이스명을 하나씩 꺼내서 아래 수행
    do
        echo -"\n=====ifcfg-${DEV}===== : " >> ${CONFIG_FILE}                   # 네트워크 디바이스명 출력
        cat /etc/sysconfig/network-scripts/ifcfg-${DEV} &>> ${CONFIG_FILE}        # 설정 내용 저장
    done
 
echo -"\n$(ls /etc/sysconfig/network-scripts/route-*) \n$(cat /etc/sysconfig/networ-scripts/route-*)" >> ${CONFIG_FILE}
echo -"\n$(ifconfig) \n$(netstat -nr)" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== /etc/hosts information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
echo -"$(cat /etc/hosts)" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== /etc/sysctl.conf information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
echo -"$(cat /etc/sysctl.conf)" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== Ulimits file information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
echo -"$(ls -al /etc/security/limits.conf)" >> ${CONFIG_FILE}
echo -"\n $(cat /etc/security/limits.conf | grep -v '#' | grep -v -e '^$')" >> ${CONFIG_FILE}
 
# /etc/secuity/limits.d/ -type f : 데릭터리 파일을 찾아 출력, 설정 내용 출력(주석, 빈라인 제거)
echo -"\n $(find /etc/security/limits.d/ -type f)" >> ${CONFIG_FILE}
echo -"\n $(cat /etc/security/limits.d/*-nproc.conf | grep -v '#' | grep -v -e '^$')" >> ${CONFIG_FILE}
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== Service Daemon file information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
    if [ 'cat /etc/system-release | egrep "Maipo|core" | grep -v "grep" | wc -l' -ge 1 ]; then               # RHEL 7.x 이면
        echo -"$(systemctl list-unit-files | grep -i "enable" | grep -i "service")" >> ${CONFIG_FILE}      # grep -i : 대소문자 구분X
    else
        echo -"$(chkconfig --list | grep -i "3:on|5:on")" >> ${CONFIG_FILE}                                # egrep : 하나 이상 조건 검색
    fi
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== Grub information ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
    if [ -/etc/grub2.cfg ] ; then
        echo -"$(cat /etc/grub2.cfg)" >> ${CONFIG_FILE}
    else
        echo -"$(cat /etc/grub.conf)" >> ${CONFIG_FILE}
    fi
 
echo -"\n\n======================================" >> {CCONFIG_FILE}
echo -" ===== Process Check ======" >> ${CONFIG_FILE}
echo -"==========================================" >> ${CONFIG_FILE}
 
if [ -/etc/gruc2.cfg ]; then
    echo -"$(cat /etc/grub2.cfg)" >> ${CONFIG_FILE}
else
    echo -"$(cat /etc/grub.conf)" >> ${CONFIG_FILE}
fi
 
echo -"\n ===== OS Backup End ====="
echo -"\n -------------------------------------------"
echo -" Backup Archive path and File Name : $(ls -lh ${BK_FILE})"
echo -" Backup Configuration path and File Name : $(ls -lh ${CONFIG_FILE})"
echo -" =============================================\n"
cs

 

  2) 백업 제외 대상 설정 파일 : excludelist.conf

1
2
3
4
5
6
7
8
/BACKUP
/media
/mnt
/tmp
/proc
/var/log/*log*
/nas
cs

 

2. 설정 방법

  1) OS 백업 스크립트 설정

     ● 백업파일 생성 디렉터리 설정

        - BACKUP_DIR에 경로를 지정하며 host명은 제외

1
2
# Please enter a directory for backup.
BACKUP_DIR="/BACKUP"
cs

 

    ● 백업 대상 리스트 설정

        - BACKUP_INCLUDE_LIST에 백업할 디렉터리 리스트는 띄어쓰기 단위로 설정하며 최상위 디렉터리는 "/"로 설정

1
2
3
4
5
6
7
<최상위 설정>
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/"
 
<디렉터리별 설정>
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/etc /usr/ bin/ sbin/ lib /lib64"
cs

   

  2) 백업 제외 대상 설정

    ● 백업 제외 대상 리스트 설정

        -  백업 제외 리스트는 "excludelist.conf" 파일에 별도로 설정하며 해당 파일은 OS_Backup 스크립트 파일과 동일한 디렉터리 내에 위치해야함

        - 백업 제외 리스트는 디렉터리 또는 파일의 경로이며 엔터 단위로 설정

       - 시스템 내에 존재하지 않는 디렉터리를 설정한 경우 무시 후 정상 수행

 

  3) 제외 대상 설정 참고사항

    ● 백업 제외 리스트 설정 참고

       - 백업 제외 리스트에는 /dev, /proc, /var/log의 로그 파일 등 시스템에서 실시간적으로 변경사항이 있는 항목들은 제외

       - 백업 파일을 생성할 디렉터리는 반드시 제외(백업 파일 생성 디렉터리를 백업하면 해당 파일의 사이즈가 늘어남으로써 계속적으로 동일 파일만 백업받게 되어 스크립트가 종료되지 않음)

 

    ● 특정 디렉터리만 백업

       - 특정 디렉터리만 백업

       - 제외 대상이 없을 경우 BACKUP_INCLUDE_LIST만 설정하고, excludelist.conf 파일은 없어도 됨(예 : DBMS의 데이터베이스 디렉터리)

1
2
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/CUBRID/DBDATA"
cs

 

 

 

3. 백업 실행 및 실행 결과 확인

 1) 파일 복사

   ① OS_Backup_v1.0.sh 파일 복사 후 퍼미션 750으로 변경

   ② excludelist.conf 파일 복사 후 퍼미션 640으로 변경

1
2
# chmod 750 OS_Backup_v1.0.sh
# chmod 640 excludelist.conf
cs

 

 2) 백업 파일 환경 설정

  ① 백업 환경에 맞추어 백업 파일 생성 디렉터리, 백업 대상 리스트 변경(OS_Backup_v1.0.sh)

  ② 백업 환경에 맞추어 백업 제외 대상 리스트 변경(excludelist.conf)

 

 3) 백업 실행

OS_Backup_v1.0.sh 실행을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
# ./OS_Backup_v1.0.sh
 
 Do you want to run the OS Backup Scripts ?
 
 ===========================================================================
 Backup Location : /BACKUP/chan
 Include Backup List : /boot
 Exclude Backup List : /BACKUP /media /mnt /tmp /proc /var/log/*log*
 /BACKUP Directory Space :   Used=11G   Avail=27G   Use%=29%   Partition=/
 ===========================================================================
 
[ Input Yes or No : ]
cs

 

 4) 결과 확인

1
2
3
4
5
6
7
8
9
=========== OS Backup End ==========
 
 -------------------------------------
 Backup Archive path and Filne Name :
 -rw-r-----    1    root    root    1.2GB    Mar    05    19:20    /BACKUP/chan/chan_20200305.tgz
 
 backup Configuration path and File Name :
 -rw-r-----    1    root    root    12K        Mar    05    19:20    /BACKUP/chan/chan_20200305.txt
 ====================================
cs

 

 5) Backup Configuration 내용

  설정 파일은 txt로 하나의 파일에 설정 내용이 저장되어 있으니 해당 파일에서 항목별로 비교 및 내용 복사로 복구가 가능합니다.

 

  ① OS information

  ② fstab information

  ③ DISK information

  ④ Network information

  ⑤ hosts information

  ⑥ sysctl.conf information

  ⑦ ulimits file information

  ⑧ Service Daemon information

  ⑨ Grub Setting information

 

 

 

4. OS 백업 복구

반드시 관리자(root) 권한으로 작업 수행하시기 바랍니다.

 

 1) 파일명 : ${HOSTNAME}_${DATE}.tgz

 

 2) 전체 백업을 한 경우

  특정 디렉터리에 압축을 해제 후 필요한 파일 또는 디렉터리를 복사합니다.

  ① 백업 시 옵션

1
2
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/"
cs

 

  ② 전체 복구

1
# tar xvfpz 호스트명_날짜.TGZ -C /
cs

 

  ③ 부분 복구

1
2
3
# mkdir /BACKUP_DIR
# tar xvfpz 호프스명_날짜.tgz -C /
# cp -aRPf /BACKUP_DIR/etc /
cs

 

 3) 특정 디렉터리만 백업한 경우

  특정 디렉터리를 바로 덮어쓰기로 수행합니다.

  필요한 경우 다른 디렉터리에 압축 해제 후 파일 복사로 수행하셔도 됩니다.

 

  ① 백업 시 옵션

1
2
# Please enter a destination directory for backup.
BACKUP_INCLUDE_LIST="/CUBRID/DBDATA"
cs

 

  ② 복구

 

1
# tar xvfpz 호스트명_날짜.tgz -C /
cs
반응형

댓글