分類: Linux

Ubuntu 系統備份

No Comments

在 5900HX 主機上線才不到半個月,就因筆者操作不當,安裝 glibc 失敗造成系統 panic。
若沒有一系列的防護關卡與至少是補救的方法,那損失將是慘重的。
所以防護系統這一課題,有相當多樣的目的導向與層面取向與採取措施等就不容筆者再多加置喙了。
筆者只能貢獻一下幼幼班層級的方式。
本篇使用 rsync 來備份本地端系統;關於遠端備份也只是多加些參數就不再提及(但再經爬文,需動到 /etc/sudoers;連同 root-ssh 皆不建議,有安全性及誤操作等問題,故只以本地端實現為佳),請見參考連結。

  • 說明一下以下這份 shell script:
  • BACKUP_BASE,任一份備份檔所存放的根路徑,這支 script file 也可放在此處。此根路徑需要/會被 excluded。
  • THE_SOURCE,備份的來源。”/”,備份 “/” 路徑下的所有目錄及子目錄檔案。當然也可改為單單使用者的家目錄如 /home/ken。
    此外請注意,若所使用的路徑不是 “/”,則在 exclude 參數中使用的路徑將需是相對路徑。
  • THE_HOST,會在 BACKUP_BASE 目錄下建立此一子目錄,備份的所有檔案會置於此子目錄底下(搭配 MAX_VOLUMES,見下述)。例如備份本地端就置於 localhost 目錄下;備份 some_remote 就會置於 some_remote 底下。所指定的目錄會自動建成。
  • MAX_VOLUME,定期自動備份(需搭配 crontab)下,會一直保持最新的 2 份備份在磁碟中(當然可改為更多份),即,更舊的會先被刪除再做備份。而每一次備份,都會自動建立當下時間為子目錄名的目錄以放置此次備份,請見圖示。
  • 使用者可自行更名那個含時間的目錄名,則該目錄/該備份/只要被更名的目錄,不會被計入 MAX_VOLUMES,其以作為最原始備份或特別備份並可於該目錄下建立說明檔,但千萬不要與含時間的自動建成的目錄名稱同格式。
  • 定期備份:我們先用 sudo -i 切換成 root,再 crontab -e,建立排程檔。
    這行就是筆者的排程,每隔 4 天於半夜 3 點 33 分開始做備份
    33 03 */4 * * /MyBackups/critical_backup.sh
  • (.sh 內也有設定頻寬上限為 40MB/s,以維持 web server 有一定的效能。請自行修改。)
  • 其他的排除路徑請自行於 .sh 內增刪修。
  • 還原的話,(光碟啟動)就是命令列上將 source & destination 互換即可。原則上還原不需要加 – -delete 參數/視需要而定。
    不過須特別注意,所備份者,目的是為了萬一哪天系統嚴重錯誤了,僅供做比對使用以輔助調查哪邊出了問題;另一方面,若真以此備份直接回存覆蓋,則,筆者已嘗試過,系統將無法再開機了,請務必避免直接回存/除非已無法挽救可姑且一試但一定要使用其他系統開機來對原系統做回存,而且第一次必須先排除 /boot;再來才再嘗試含 /boot。
    因此,正確安全的 SOP 便是,問題系統做一次備份,再比對此兩份備份檔,自己若無法解決,系統又很重要,求助外援。
#!/bin/bash


# customized here
BACKUP_BASE="/MyBackups"
THE_SOURCE="/"
THE_HOST="localhost"
MAX_VOLUMES=2


if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

BACKUP_DIR="${BACKUP_BASE}/${THE_HOST}"
DATE=$(date +%Y%m%d-%H%M%S)
THE_TARGET="${BACKUP_DIR}/${THE_HOST}-backup-${DATE}"
BEGIN_TIME=`date`;

sleep 1
echo "======================="
echo "rsyncing ..."
echo ""
set --
set -- ${BACKUP_DIR}/${THE_HOST}-backup-????????-??????
lastname=${!#}

if [ $# -ge ${MAX_VOLUMES} ]; then
  rm -rf $1
fi

mkdir -p ${THE_TARGET}

# exchange source and target when restore and consider using --delete or not.
# limits to KBPS, 40MB, 40000.
rsync -aAXH --delete --bwlimit=40000 --exclude={"/dev","/proc","/sys","/tmp","/run","/mnt","/media","/lost+found",/home/*/{.cache,.gvfs,.local/share/Trash},"/var/cache/apt/archives","${BACKUP_BASE}","/swap.img"} ${THE_SOURCE} ${THE_TARGET}

echo ""
echo "rsync began at:    ${BEGIN_TIME}"
echo "rsync finished at: `date`"
echo ""

ls -la ${BACKUP_DIR}
du -sh ${BACKUP_DIR}

參考資料

Categories: Linux

PHP Code Snippets Powered By : XYZScripts.com