SysDump.sh 스크립트
1. 용도
OS Disk의 시스템 파티션 영역 Backup
2. 설치방법
만약 sda(OS Disk), sdb(Data Disk) 가 있다고 가정하면 아래와 같다.
- 백업 대상 디스크 : sda
- 백업 데이터 저장 디스크 : sdb
/data1 - sdb Disk에 속한 디렉토리라고 한다면 /data1 에 SysDump.sh 를 위치시키고 실행 권한 설정을 한다.
# chmod +x /data1/SysDump.sh
3. 사용법
1) 직접 실행
# /data1/SysDump.sh sda1,sda3,sda5 /data1
-> OS Disk의 swap을 제외한 파티션을 , 로 구분지어 지정.
-> 백업대상 파티션은 OS 디스크에 속한 파티션에 한정됨.
# /data1/SysDump.sh sda1 /data1
-> 만약 한개의 파티션만 백업한다면 하나만 설정.
2) cron 스케쥴 실행
# crontab -e
00 13 * * 1 /bin/bash /data1/SysDump.sh sda1,sda3,sda5 /data1
-> 월요일 오후 1시에 sda1,sda3,sda5 파티션정보&데이터를 /data1/Backup-System 디렉토리에 로테이션 설정에 맞게 보관 되도록 dd 백업.
3) 실행 결과
스크립트가 실행되어 백업이 완료되면 /data1/Backup-System 디렉토리 안의 First 디렉토리에 압축된 백업파일이 확인된다.
스크립트 실행 여부 로그가 /var/log/messages에 기록됨.
아래는 SysDump.sh - bash shell 스크립트 코드임.
#!/bin/bash
################################ 환경 변수 ###################################
RotateCycle=0
Compression=on
# RotateCycle 값은 0 ~ 3 까지 지정 가능함.
##############################################################################
# 스크립트 실행 시 인자 두개를 받는다. 만약 인자 2개가 만족되지 못하면 사용법 메시지를 출력
# 받은 인자는 각각 $TargetDisk, $Dest 변수값이 된다.
ARGS=2
if [ $# -ne $ARGS ]; then
echo "사용법: `basename $0` 타겟디스크 백업볼륨"
exit $E_BADARGS
fi
# 쉘로부터 받은 인자를 각각 TargetDisk와 Dest 변수로 변경. 이유는 MvImg, DDImg, FirstDDImg 함수에서 $1, $2 변수가 먹지 않는다.
if [ `echo $1 | grep ','` ]; then
TargetDisk=$(echo $1 | awk -F "," '{print $1}' | sed -s 's/[1-99]//g')
echo -e "\033[1;32mTarget Disk : $TargetDisk \033[0m"
IN=$1
List=$(echo $IN | tr "," "\n")
cnt=0
for Part in $List
do
cnt=$((cnt+1))
echo -e "\033[1;32mPartitions $cnt : $Part \033[0m"
done
echo -e "\033[1;32m---------------------------- \033[0m"
echo -e "\033[1;32mStore Directory : $2 \033[0m"
else
TargetDisk=$(echo $1 | awk -F "," '{print $1}' | sed -s 's/[1-99]//g')
echo -e "\033[1;32mTarget Disk : $TargetDisk \033[0m"
Part=$1
echo -e "\033[1;32mPartitions 1 : $Part \033[0m"
echo -e "\033[1;32m---------------------------- \033[0m"
echo -e "\033[1;32mStore Directory : $2 \033[0m"
fi
TargetPart=$1
Dest=$2
LastPart=$(echo $Part | tail -n 1)
Dest=$2
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
Host=`hostname`
Mtime=$(date --rfc-2822 | awk -F " " '{print $3 " " $2 " " $5}')
CurrDate=$(date --rfc-2822 | awk -F " " '{print $3 " " $2}')
CheckDay=$(echo "$CurrDate" | awk -F "" '{print $5}')
BackupDir=$Dest/Backup-System
cd $Dest ;
SwapPart=$(fdisk -l /dev/$TargetDisk | grep swap | awk -F " " '{ print $1 }' | awk -F "/" '{ print $3 }')
MvImg () {
if [ -f $BackupDir/3-week/3-week-Comp.tar.gz ]; then
mv -f $BackupDir/3-week/3-week-Comp.tar.gz $BackupDir/4-week/4-week-Comp.tar.gz >& /dev/null
mv -f $BackupDir/3-week/{*.img,*.sf,*.mbr,*.part,*.gz} $BackupDir/4-week >& /dev/null ; mv -f $BackupDir/3-week/SysInfo/* $BackupDir/4-week/SysInfo >& /dev/null
fi
if [ -f $BackupDir/2-week/2-week-Comp.tar.gz ]; then
mv -f $BackupDir/2-week/2-week-Comp.tar.gz $BackupDir/3-week/3-week-Comp.tar.gz >& /dev/null
mv -f $BackupDir/2-week/{*.img,*.sf,*.mbr,*.part,*.gz} $BackupDir/3-week >& /dev/null ; mv -f $BackupDir/2-week/SysInfo/* $BackupDir/3-week/SysInfo >& /dev/null
fi
if [ -f $BackupDir/1-week/1-week-Comp.tar.gz ]; then
mv -f $BackupDir/1-week/1-week-Comp.tar.gz $BackupDir/2-week/2-week-Comp.tar.gz >& /dev/null
mv -f $BackupDir/1-week/{*.img,*.sf,*.mbr,*.part,*.gz} $BackupDir/2-week >& /dev/null ; mv -f $BackupDir/1-week/SysInfo/* $BackupDir/2-week/SysInfo >& /dev/null
fi
}
DDImg () {
if [ `echo $TargetPart | grep ','` ]; then
TargetDisk=$(echo $TargetPart | awk -F "," '{print $1}' | sed -s 's/[1-99]//g')
IN=$TargetPart
List=$(echo $IN | tr "," "\n")
for Part in $List
do
sync
dd if=/dev/$Part of=$BackupDir/$WEEK/$Part".img" bs=10M ;
done
else
TargetDisk=$(echo $TargetPart | awk -F "," '{print $1}' | sed -s 's/[1-99]//g')
Part=$TargetPart
sync
dd if=/dev/$Part of=$BackupDir/$WEEK/$Part".img" bs=10M ;
fi
sfdisk -d /dev/$TargetDisk > $BackupDir/$WEEK/$TargetDisk.sf ;
sync
dd if=/dev/$TargetDisk of=$BackupDir/$WEEK/$TargetDisk.mbr count=1 bs=446 ;
dd if=/dev/$TargetDisk of=$BackupDir/$WEEK/$TargetDisk.part count=1 bs=512 ;
}
SysInfoRecord () {
find $BackupDir/$WEEK/SysInfo >& /dev/null
if [ $? == "1" ]; then
mkdir -p $BackupDir/$WEEK/SysInfo
fi
sync;
cat /proc/cpuinfo > $BackupDir/$WEEK/SysInfo/cpu.info
crontab -l > $BackupDir/$WEEK/SysInfo/crontab.info
df > $BackupDir/$WEEK/SysInfo/df.info
echo "" >> $BackupDir/$WEEK/SysInfo/df.info
echo "------------ human-readable -----------" >> $BackupDir/$WEEK/SysInfo/df.info
df -h >> $BackupDir/$WEEK/SysInfo/df.info
dmidecode > $BackupDir/$WEEK/SysInfo/dmidecode.info
fdisk -l > $BackupDir/$WEEK/SysInfo/fdisk.info
cat /etc/fstab > $BackupDir/$WEEK/SysInfo/fstab.info
echo $Host > $BackupDir/$WEEK/SysInfo/hostname.info
ifconfig -a > $BackupDir/$WEEK/SysInfo/ifconfig.info
netstat -rn > $BackupDir/$WEEK/SysInfo/route.info
lspci > $BackupDir/$WEEK/SysInfo/lspci.info
cat /proc/meminfo > $BackupDir/$WEEK/SysInfo/mem.info
cat /etc/rc.d/rc.local > $BackupDir/$WEEK/SysInfo/rclocal.info
cat /etc/redhat-release > $BackupDir/$WEEK/SysInfo/release.info
uname -r -m > $BackupDir/$WEEK/SysInfo/uname.info
cat /proc/scsi/scsi > $BackupDir/$WEEK/SysInfo/disk.info
cat /proc/ide/hd*/model >& /dev/null
if [ $? == "0" ]; then
echo "" >> $BackupDir/$WEEK/SysInfo/disk.info
echo "IDE Disk Info:" >> $BackupDir/$WEEK/SysInfo/disk.info
ls /dev/hd* | grep hd* | egrep -v 'hd[a-z][0-9]' >> $BackupDir/$WEEK/SysInfo/disk.info
echo "-----------" >> $BackupDir/$WEEK/SysInfo/disk.info
cat /proc/ide/hd*/model >> $BackupDir/$WEEK/SysInfo/disk.info
fi
if [ -d /home/webpage ]; then
cd /home ;
tar zcf webpage.tar.gz webpage/
mv webpage.tar.gz $BackupDir/$WEEK
cd $Dest ;
fi
}
Compress () {
find $BackupDir/$WEEK/"$LastPart".img >& /dev/null
CheckIMG2=$?
find $BackupDir/$WEEK/"$LastPart".img -size 0 | grep img >& /dev/null
CheckIMG22=$?
if [ $Compression == "on" ]; then
cd $BackupDir
echo "In file compression... Takes a few minutes."
tar zcf $WEEK-Comp.tar.gz $WEEK/ && find $BackupDir/$WEEK -type f | xargs rm -f >& /dev/null ; rm -f $BackupDir/$WEEK/SysInfo/* >& /dev/null
mv $WEEK-Comp.tar.gz $BackupDir/$WEEK
fi
if [ $CheckIMG2 == "0" ] && [ $CheckIMG22 == "1" ]; then
echo -e "\033[1;32mSysDump: System $WEEK Dump Success. \033[0m"
if [ $CheckDay == "0" ]; then
Mtime2=$(echo "$Mtime" | awk -F "" '{print $1 $2 $3 " " $4 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15}')
echo "$Mtime2 $Host SysDump: System $WEEK Dump Success." >> /var/log/messages
else
echo "$Mtime $Host SysDump: System $WEEK Dump Success." >> /var/log/messages
fi
else
echo -e "\033[1;31mSysDump: System $WEEK Dump Error. Check nFile System. \033[0m"
if [ $CheckDay == "0" ]; then
Mtime2=$(echo "$Mtime" | awk -F "" '{print $1 $2 $3 " " $4 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15}')
echo "$Mtime2 $Host SysDump: System $WEEK Dump Error. Check nFile System." >> /var/log/messages
else
echo "$Mtime $Host SysDump: System $WEEK Dump Error. Check nFile System." >> /var/log/messages
fi
fi
exit
}
Rotate () {
find $BackupDir/$RWEEK/*.img >& /dev/null
CheckFile1=$?
find $BackupDir/$RWEEK/*-Comp.tar.gz >& /dev/null
CheckFile2=$?
if [ $CheckFile1 == "0" ] || [ $CheckFile2 == "0" ]; then
rm -f $BackupDir/$RWEEK/*.{img,sf,mbr,part,gz} ; rm -f $BackupDir/$RWEEK/SysInfo/*
find $BackupDir/4-week/*.img >& /dev/null
CheckFile11=$?
find $BackupDir/4-week/*-Comp.tar.gz >& /dev/null
CheckFile22=$?
if [ $CheckFile11 == "0" ] || [ $CheckFile22 == "0" ]; then
rm -f $BackupDir/4-week/*.{img,sf,mbr,part,gz} ; rm -f $BackupDir/4-week/SysInfo/*
fi
MvImg ;
else
MvImg ;
fi
}
find $BackupDir >& /dev/null
if [ $? == "1" ]; then
mkdir -p $BackupDir/{1,2,3,4}-week/SysInfo
chmod 700 $BackupDir ;
fi
find $BackupDir/First/*.img >& /dev/null
CheckFirstFile1=$?
find $BackupDir/First/*-Comp.tar.gz >& /dev/null
CheckFirstFile2=$?
if [ $CheckFirstFile1 == "1" ] && [ $CheckFirstFile2 == "1" ]; then
WEEK=First
find $BackupDir/$WEEK/SysInfo >& /dev/null
if [ $? == "1" ]; then
mkdir -p $BackupDir/$WEEK/SysInfo
fi
DDImg ;
SysInfoRecord ;
Compress ;
fi
if [ $RotateCycle == "3" ]; then
find $BackupDir/First/*-Comp.tar.gz >& /dev/null
CheckFirstFile2=$?
if [ $CheckFirstFile1 == "1" ] && [ $CheckFirstFile2 == "1" ]; then
WEEK=First
find $BackupDir/$WEEK/SysInfo >& /dev/null
if [ $? == "1" ]; then
mkdir -p $BackupDir/$WEEK/SysInfo
fi
DDImg ;
SysInfoRecord ;
Compress ;
fi
if [ $RotateCycle == "3" ]; then
find $BackupDir/4-week/*.img >& /dev/null
CheckFile1=$?
find $BackupDir/4-week/*-Comp.tar.gz >& /dev/null
CheckFile2=$?
if [ $CheckFile1 == "0" ] || [ $CheckFile2 == "0" ]; then
rm -f $BackupDir/4-week/*.{img,sf,mbr,part,gz} ; rm -f $BackupDir/4-week/SysInfo/*
MvImg ;
else
MvImg ;
fi
elif [ $RotateCycle == "2" ]; then
RWEEK=3-week
Rotate ;
elif [ $RotateCycle == "1" ]; then
RWEEK=2-week
Rotate ;
elif [ $RotateCycle == "0" ]; then
RWEEK=1-week
Rotate ;
else
echo -e "\033[1;31mSysDump: System Dump Error. Checking - Sysdump.sh RotateCycle variable. \033[0m"
if [ $CheckDay == "0" ]; then
Mtime2=$(echo "$Mtime" | awk -F "" '{print $1 $2 $3 " " $4 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15}')
echo "$Mtime2 $Host SysDump: System Dump Error. Checking - Sysdump.sh RotateCycle variable." >> /var/log/messages
else
echo "$Mtime $Host SysDump: System Dump Error. Checking - Sysdump.sh RotateCycle variable." >> /var/log/messages
fi
exit
fi
WEEK=1-week
DDImg ;
SysInfoRecord ;
Compress ;
SysDump 스크립트