The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

保哥的 Linux 備份/還原筆記(支援甲機備份,乙機還原)

這幾個月以來,因為之前 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"

當然有備份就要能想到要如何還原,不然備份就失去了真正的價值了!而我定義的還原策略是如下:

  1. 先安裝 Ubuntu 8.04 LTS Server,用最基本的安裝即可
  2. 系統正常開機後,先安裝 nfs-common 將 NFS Client 架設起來
    apt-get install nfs-common
  3. 掛載我之前備份檔案所在的 NFS 目錄
    mkdir /mnt/backup
    mount 10.0.0.99:/home/nfs /mnt/backup
  4. 執行還原指令,但需保留 /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
  5. 查看 /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
  6. 最後編輯 /boot/grub/menu.lst 檔案,將檔案中所有 UUID 都更換成從 /etc/fstab 中查到的 UUID=38e447ec-dd3e-4c02-8035-78ca438d2432

做到這裡系統還原作業就大功告成了,重新開機之後應該可以正常運作。雖然步驟麻煩了些,但至少可以將備份的資料還原到任意主機(包括虛擬機器),所以這也算是保哥的 P2V 解決方案,省時、省事又省錢。

相關連結