這幾個月以來,因為之前 Linux 掛掉的事件讓我對備份還原更加的謹慎,我一直在尋找一套好用的備份/還原工具,我是希望備份過的資料或系統可以還原到不同的主機,所以我希望在 A 主機備份時,可以還原到不同硬體規格的 B 主機,而且備份的時候必須是 Online 的,也就是在不關機的情況下完成備份程序,但還原的時候要以最短的時間完成還原作業。
我之前試過 mkCDrec 也試過 Mondo Rescue,這兩套都符合我的期望,是我理想中的備份/還原工具,但這兩個備份工具在 Ubuntu 就是一直無法正常運作,這兩套都可以正常備份,但是在還原的時候做到一半就是會掛掉,真不知道該如何是好,如果有人有相關經驗希望可以傳授一下,謝謝!
所以總是沒有找到一個真的讓我十分滿意的備份/還原工具,最後還是決定用最簡單的 tar 來幫我備份資料,以下是我前陣子寫的備份指令(Bash):
#!/bin/bash
rnd=$RANDOM
date=`date +%y%m%d`
backup_to="/mnt/backup"
echo -n "Today is $date. Writing /tmp/$rnd-exclude-file-list ... "
echo "lost+found" > /tmp/$rnd-exclude-file-list
echo "/mnt/*" >> /tmp/$rnd-exclude-file-list
echo "/media/*" >> /tmp/$rnd-exclude-file-list
echo "/proc/*" >> /tmp/$rnd-exclude-file-list
echo "/dev/*" >> /tmp/$rnd-exclude-file-list
echo "/sys/*" >> /tmp/$rnd-exclude-file-list
echo "/tmp/*" >> /tmp/$rnd-exclude-file-list
echo "/var/spool/squid/*" >> /tmp/$rnd-exclude-file-list
echo "done."
echo ""
#----------------------------------------------------
datetime=`date "+%Y-%m-%d %H:%M:%S"`
echo "Backup job started at $datetime"
#####################################################
tar -cf $backup_to/$date-full-backup.tar / --totals --absolute-names \
--ignore-failed-read --exclude-from=/tmp/$rnd-exclude-file-list
if [ "${?}" != 0 ] ; then
echo "Backup failed."
fi
rm -f /tmp/$rnd-exclude-file-list
#####################################################
datetime=`date "+%Y-%m-%d %H:%M:%S"`
echo "Backup job ended at $datetime"
echo ""
#----------------------------------------------------
datetime=`date "+%Y-%m-%d %H:%M:%S"`
echo "Compressing job started at $datetime"
#####################################################
gzip --best --rsyncable $backup_to/$date-full-backup.tar
if [ "${?}" != 0 ] ; then
echo "Gzip failed."
fi
gzip --test $backup_to/$date-full-backup.tar.gz
if [ "${?}" != 0 ] ; then
echo "Check the compressed file integrity failed."
fi
#####################################################
datetime=`date "+%Y-%m-%d %H:%M:%S"`
echo "Compressing job ended at $datetime"
當然有備份就要能想到要如何還原,不然備份就失去了真正的價值了!而我定義的還原策略是如下:
- 先安裝 Ubuntu 8.04 LTS Server,用最基本的安裝即可
- 系統正常開機後,先安裝 nfs-common 將 NFS Client 架設起來
apt-get install nfs-common
- 掛載我之前備份檔案所在的 NFS 目錄
mkdir /mnt/backup
mount 10.0.0.99:/home/nfs /mnt/backup
- 執行還原指令,但需保留 /etc/fstab 的設定,因為重新安裝之後硬碟的 UUID 不一樣
tar -zx --totals --absolute-names --preserve --exclude=/etc/fstab \
-f /mnt/backup/full-backup.tar.gz
換成較短的指令如下:
tar -zx -P --preserve --exclude=/etc/fstab -f /mnt/backup/full-backup.tar.gz
- 查看 /etc/fstab 的內容,將 root 磁碟的 UUID 複製下來
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
# /dev/sda1
UUID=38e447ec-dd3e-4c02-8035-78ca438d2432 / ext3 relatime,errors=remount-ro 0 1
# /dev/sda5
UUID=d790099e-a149-4372-977b-52a16a870386 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
- 最後編輯 /boot/grub/menu.lst 檔案,將檔案中所有 UUID 都更換成從 /etc/fstab 中查到的 UUID=38e447ec-dd3e-4c02-8035-78ca438d2432
做到這裡系統還原作業就大功告成了,重新開機之後應該可以正常運作。雖然步驟麻煩了些,但至少可以將備份的資料還原到任意主機(包括虛擬機器),所以這也算是保哥的 P2V 解決方案,省時、省事又省錢。
相關連結