作者: ken

Ubuntu 系統備份

No Comments

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

  • 說明一下以下這份 shell script:
  • BACKUP_BASE,任一份備份檔所存放的根路徑,這支 script file 也可放在此處。此根路徑需要/會被 excluded。
  • THE_SOURCE,備份的來源,”/”,備份 “/” 路徑下的所有目錄及子目錄檔案。當然也可改為單單使用者的家目錄如 /home/ken。
  • 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 參數/視需要而定。
#!/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