2009年12月21日 星期一

自動及同歩化完成異地備份所有使用者家目錄

任務目標 : 自動及同歩化完成異地備份所有使用者家目錄.

於Host OS(OpenSUSE11), 建立一指令稿(使用bash) backup.sh 存放於/root/bin/內, 工作內容是對/home目錄進行增量備份(incremental backup), 且必須滿足以下需求:
a) 指令稿內必須使用tar 指令進行備份.

b) 指令稿內必須使用(定義及呼叫)函式(function)

c) 於每週一時, 指令稿必須進行完整備份(full backup).

d) 自每週二至週五, 指令稿必須進行增量備份(incremental backup), 只備份當日有異動的部份資料.

e) 指令稿內以date找出備份當日的星期名稱(如 Sun,Mon,Tue,...), 以便能判斷出必須採用的備份方法.

f) 使用一快照檔案(/var/log/backup/snapshot_file), 以便進行 backup 時的依據.

g) 對產生的備份檔須符合以下格式:

* Full backup: /var/backup/full-YYY-MM-DD.tar.gz

* Differential backup: /var/backup/incremental-YYYY-MM-DD.tar.gz (YYY-MM-DD 是備份當日的格式 (如. 2009-12-18).

h) 若進行備份失敗, 該指令稿必須能發出 email 給 root@localhost. 主旨為"Backup failed !", email內容可不需要指定.

i) 於指令稿內使用rsync進行同歩Host OS(OpenSUSE11)的/var/backup目錄, push 到 Guest OS(SLES10)的 ~/backup目錄內,以實現異地備份任務.

j) 使用例行式排程於週一至週五18:30執行backup.sh.

k) 注意事項 :

* 預於2009/12/24進行驗收

* 請盡可能自己編寫(勿抄襲他人的). 若有問題請於班版提出.

祝 大家順利完成. Guru





#!/bin/bash
DOW=`date +%a`   ->將日期顯示改為 Mon、..作為變數


[ -d /var/log/backup ] || mkdir /var/log/backup    ->判斷 是否有此directory
[ -d /var/backup ] || mkdir /var/backup


#full (){ getfacl -R /home > /home/acls-`date +%F`
#         tar -czvf /var/backup/backup-full-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
#         touch /var/log/backup/last-backup
#         x=`echo $?`
#       }


->每次皆會參考 snapshot 作為複製檔案的依據,故進行Full 之前,先刪除snapshot檔來進行完全備份。

full (){ getfacl -R /home > /home/acls-`date +%F`       

         rm -rf /var/backup/snapshot_file                                    
         tar -czv -g /var/backup/snapshot_file -f /var/backup/backup-full-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
         touch /var/log/backup/last-backup
         x=`echo $?`
      }


->增量備份,參考snapshot_file檔,來備份最新的檔案。
 incr (){ getfacl -R /home > /home/acls-`date +%F`
         tar -czv -g /var/backup/snapshot_file -f /var/backup/backup-incremental-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
        x=`echo $?`
      }


#diff (){ getfacl -R /home > /home/acls-`date +%F`
#        find /home -type f -newer /var/log/backup/last-backup -print0 | tar --null -cvf /tmp/backup-diff-`date +%F`.tar -T - > /var/log/backup/backup-`date +%F`.log
#        x=`echo $?`
#      }

->利用case 來判斷 執行 Full or Incremental  backup!
case "$DOW" in
Mon) full ;;
Tue) incr ;;
Wed) incr ;;
Thu) incr ;;
Fri) incr ;;
esac


if [ $x -ne 0 ] ; then
echo "" | mail -s "Backup failed !" root
fi


#########-------------Remote rsync backup--------#############(以下須手動執行)
# 1.  input --> ssh-keygen -t dsa -N ""     ->產生金鑰
# 2.  Remote computer need--> mkdir ~/backup      ->建立遠端備份目錄
#########------------------------Run---------------------#############(以下註解拿掉即可執行)
echo -n "Please input Remote IP address : "
read IP
# echo Please wait....
# sleep 2 
# scp /root/.ssh/id_dsa.pub root@$IP:/root/.ssh/authorized_keys
 ->將剛產生的金鑰複製傳送到遠端電腦。之後登入,自動信任此帳戶!
echo Please wait....
sleep 2 
->判斷如果,備份 執行成功,則複製傳送到遠端電腦,進行異地備份。

if [ $x -eq 0 ] ; then
rsync -azv /var/backup -e ssh root@$IP:~/backup
echo "Test Only^^ " | mail -s "Backup Succeed" root
fi


###############################################################


# if [ $x -eq 0 ] ; then
# echo "Test Only " | mail -s "Backup Succeed" root
# fi


## result :  nl /var/log/backup/last-backup  = = tar -tvf /backup-full .. .tar | nl
## in other to have /var/log/backup/last-backup file, modify your date to friday first !!




##---------------------Create-Cron ----------------##
## 以下提供兩種方法!
## touch /etc/cron.d/incre-cron 
## echo '30 18 * * 1-5 root /root/bin/Incremental_backup.sh'  >>  incre-cron

# touch incre-cron
# echo '30  18  *  *  1-5  root /root/bin/Incremental_backup.sh' >> incre-cron
# crontab incre-cron
###################################



沒有留言:

張貼留言