UNIX系統備份關鍵的資訊

roninwei發表於2006-09-30
大多數 UNIX® 管理員都有相應的方法來備份 UNIX 計算機中的資料和資訊,但對於配置檔案和提供計算機執行所需配置資料的其他內容,又應該如何處理呢?本文提供了相關技術的詳細資訊,這些技術用於針對關鍵的檔案,實現有效和高效的備份系統。

通常,UNIX® 管理員都擁有一套常用的輔助程式管理的關鍵實用工具、訣竅和系統。本文提供了各種用於簡化各個過程的關鍵實用工具、命令列鏈和指令碼。這些工具中的一部分來自於作業系統,而大部分的訣竅則來源於長期的經驗積累和減輕系統管理員的工作壓力的要求。本系列文章主要專注於最大限度地利用各種 UNIX 環境中可用的工具,包括簡化異類環境中的管理任務的方法。

在對 UNIX 系統建立備份時,最重要的是其中包含的資料。無論是資料庫、開發原始碼檔案或其他型別的所謂使用者生成的 資訊,備份這些資料都是很重要的,它們可以確保在出現故障或其他問題的情況下,您可以恢復這些資料,並重新回到工作中。

然而,系統中存在大量這樣的檔案和資訊,從技術上看它們並不是使用者資料,但這些檔案可能需要耗費相當長的時間進行重建或者重新配置。例如,重新配置伺服器或為您的域重建域名系統 (DNS) 檔案需要多長時間?

完全備份,即複製系統中所有的檔案,很明顯這樣做可以儲存所有的資訊,但這可能是一種代價很大的資訊備份方式。您應該能夠透過挑選那些配置、生成或支援相關資訊和應用程式的特定檔案,從而建立有效的備份。

在 UNIX 或 Linux® 系統中,大部分系統配置檔案位於 /etc 目錄,但是您應該考慮對所有可能的檔案(以及可能的位置)進行備份,具體包括:

  • 主配置目錄 (/etc)
  • DNS 域資訊 (/var/bind)
  • NIS/NIS+ 檔案和配置 (/var/yp)
  • Apache 或其他 Web 伺服器配置(/var/apache、/etc/apache 或 /usr/local/apache)
  • 郵件檔案或資料夾(/var/mail 和 /usr/mail)
  • Lightweight Directory Access Protocol (LDAP) 伺服器資料(/var/ldap 或 /usr/local/ldap)
  • 安全證書
  • 自定義核心驅動程式
  • 核心配置或構建配置和引數
  • 許可金鑰和序列號
  • 自定義指令碼和應用程式
  • 使用者/root 登入指令碼
  • 郵件配置;特別是,如果您使用了像 Cyrus Internet Message Access Protocol (IMAP) 這樣的解決方案,其中對使用者郵件資料夾進行了特殊的記錄和索引

其他的檔案和資訊來源則取決於具體的系統和環境,但是提出這樣一份關鍵配置檔案的列表不應該耗費太長的時間,而如果丟失這些資訊,將會對您的公司或系統造成極大的影響。

儘管直接從資料的源位置對其進行備份非常方便,但是在對其進行備份之前,先將備份資料複製到一個單獨的目錄將使得您能夠更好地選擇要複製的檔案,並且讓您能夠更靈活地選擇合適的備份方法。如果檔案位於同一個位置,那麼您可以將其備份到磁帶、磁碟,或將這些內容複製到另一臺計算機,而無需對原始檔進行重新組織。

要對備份到任何目標的檔案進行重新配置,只需更改相應的指令碼,而該指令碼對這些檔案進行整理並將其複製到備份準備目錄。因為您擁有這些資訊的本地的和直接的副本,所以在發生故障時可以快速和輕鬆地恢復這些資料,並且您依然保留了將這些資訊備份到磁帶、磁碟或另一個系統的能力。

資訊的整理方式非常重要,因為不同的解決方案對應著不同的儲存需求、技術和恢復機制。

您可以選擇各種各樣的方法來進行實際的備份和資訊儲存。顯而易見的選擇是將檔案備份到傳統媒介,如磁帶。可以將相關資訊複製到網路上的另一臺計算機,這是一種比較簡單的解決方案,但是存在許多優缺點。任何成功的備份解決方案都有一個關鍵要素,即在另一個位置儲存重要資訊的副本。無論是另一個物理裝置、可移動儲存裝置或另一臺計算機,都是可行的。

從災難恢復的角度來看,可移動儲存裝置(磁帶、磁碟、甚至 USB)是最可靠的備份,因為可以將所儲存的資訊儲存在現場以外的其他位置。這樣做可以在放置計算機的場所遭遇大災難(如火災或被盜)時,得以倖免。

使用另一臺計算機進行儲存則意味著備份資料基本上是聯機的和可用的。在這種情況下,恢復備份資料可能非常簡單,在發生故障時只需將這些檔案複製回您的伺服器,或者在發生系統故障時將它們複製到替換系統。

當使用另一臺計算機來儲存您的備份資料時,最好在本地儲存這些檔案的多個副本,但是應該在可能的情況下,為這些檔案使用直接可用的非現場位置。這臺計算機可能是 Internet 上的另一臺計算機、您的 WAN 或其他站點上的另一臺計算機。這樣可以提供必要的冗餘和安全性。

使用專業的或商業的備份解決方案,您需要在恢復備份資料之前,重新安裝該軟體,而在安裝該軟體之前,可能需要使用某些配置資訊和關鍵檔案。

使用 tar、cpio 或其他的存檔檔案型別,可能是最直接的資訊儲存方式。當使用這種方法時,最好註明這些檔案的日期,並建立一個簡單的備份指令碼,專門用來生成指定的檔案。另一方面,您還需要一種方法,以便刪除不再需要的備份資料(例如,那些超過了特定時間段的備份資料)。

清單 1 顯示了一個簡單的指令碼,該指令碼為不同的目錄建立了經過 tar 處理和壓縮(使用 bzip2)的備份。這些備份檔案建立於與遠端系統共享的網路檔案系統 (NFS),而該遠端系統保留了相應的備份副本。



#!/bin/bash
DATE=`date +%Y%m%d.%H%M`
HOST=`hostname`
TEMP=/mnt/backupprepare
echo "Preparing backup..."
cd $TEMP
files=`/usr/local/mcslp/filesbydate.pl notlast5days $HOST*`
if [ -n "$files" ]
then
    echo "Deleting old files: $files"
    rm $files
fi
cd /etc
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-etc.$DATE.tar.bz2
cd /var/bind
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-bind.$DATE.tar.bz2
cd /export/home/webs
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-webs.$DATE.tar.bz2
cd /etc/apache2
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-webconfig.$DATE.tar.bz2
      

使用 date 命令生成 DATE 變數,並建立一個“20060627.2200”或“10PM on 27th of June 2006”形式的檔名。要使得備份指令碼具有可移植性,要求建立的所有檔案的字首中包含建立該檔案的主機的名稱,這樣一來就可以很容易地將多臺主機的內容備份到相同的位置,並且 TEMP 目錄作為每個備份的目標。

使用單獨的 Perl 指令碼來確定可以對備份準備目錄中哪些檔案進行刪除。稍後將研究這個指令碼。在這個指令碼中,您可以指定需要保留最近 5 天的檔案,換句話說,該指令碼將根據備份檔案的檔名中的日期說明,選擇那些不是最近 5 天內建立的檔案。

實際的備份過程是一個簡單的 tar 命令,同時還使用了 bzip2 對檔案進行壓縮。因為生成的檔案可能很大,所以您可能需要對這個方法進行改進,以便僅選擇那些可能在某個時間段內進行過更改的檔案。透過使用 find 命令選擇所需的檔案(請參見清單 2),您可以達到這個目的。



tar cf - `find . -type f -mtime -1` | bzip2 -9 -
 >$TEMP/$HOST-webconfig.$DATE.tar.bz2
      

您可以在 find 語句中僅指定需要選擇的檔案,這樣可以防止對目錄的更改導致將那些沒有更改的檔案包含到 tar 檔案中。這將包含當前目錄中的檔案,如清單 3 所示。



$ cd /etc
$ tar cf etc.tar ./*
      

這樣做可以避免顯式地指定目錄,如清單 4 所示。



$ tar cf etc.tar /etc
      

這樣可以確保將恢復的檔案放到備用的目錄,而不是執行中的某個位置。

這個用於刪除舊檔案的指令碼將使用檔名,提取其中嵌入的日期和時間,並確定該檔案是否屬於指定的界限,例如,在不在特定的天數之內(請參見清單 5)。

#!/usr/local/bin/perl
my $choice = shift;
my @files = @ARGV;
my @selection;
if ($choice =~ /thismonth/)
{
    my ($day,$mon,$year) = dateaslist();
    my $match = sprintf('%04d%02d',$year,$mon);
    foreach my $file (@files)
    {
        if ($file =~ m/$match/ && $choice eq 'thismonth')
        {
            push @selection,$file;
        }
        elsif ($file !~ m/$match/ && $choice eq 'notthismonth')
        {
            push @selection,$file;
        }
    }
}
elsif ($choice =~ /today/)
{
    my ($day,$mon,$year) = dateaslist();
    my $match = sprintf('%04d%02d%02d',$year,$mon,$day);
    foreach my $file (@files)
    {
        if ($file =~ m/$match/ && $choice eq 'today')
        {
            push @selection,$file;
        }
        elsif ($file !~ m/$match/ && $choice eq 'nottoday')
        {
            push @selection,$file;
        }
    }
}
elsif ($choice =~ /last(d+)days/)
{
    my $days = $1;
    my ($day,$mon,$year) = dateaslist(time()-($1*24*3600));
    my $match = sprintf('%04d%02d%02d',$year,$mon,$day);
    my $spec = sprintf('last%ddays',$days);
    my $notspec = sprintf('notlast%ddays',$days);
    foreach my $file (@files)
    {
        my ($date) = ($file =~ m/(d{8})/);
        push @selection,$file if ($date >= $match && $choice eq
 $spec);
        push @selection,$file if ($date < $match && $choice eq
 $notspec);
    }
}
print join ' ',@selection;
sub dateaslist
{
    my ($time) = @_;
    $time = time() unless defined($time);
    my ($day,$mon,$year) = (localtime($time))[3..5];
    $mon++;
    $year+= 1900;
    return($day,$mon,$year);
}
      

使用這個指令碼,您可以透過各種方法挑選出備份檔案(請參見清單 6)。



$ filesbydate.pl last5days         # Files created in the last 5 days
$ filesbydate.pl notlast14days  # Files 15 days or older
$ filesbydate.pl nothismonth    # Files not created this month
      

請記住,比較操作針對於檔名,而不是檔案系統的建立或修改日期,所以該指令碼可以對頭天晚上建立的檔案進行操作。

rsync 工具可以在不同的位置或計算機之間複製整個目錄結構,它透過使用一種特殊的演算法,可以實現僅傳輸更改過的檔案。這使得它成為一種非常高效的複製檔案的方法,特別是在不同的計算機之間,這也意味著,備份過程將很快完成。

有兩種使用 rsync 的方法,要麼作為一種簡單的同步方法,使用這種方法,您可以將所有重要的檔案複製到新的驅動器或系統,要麼作為一種備份方法,按日期複製整個目錄樹,這與在前面的示例中建立 tar 備份檔案的方法相同。

前面這種方法既快速又簡單,但是您不能回到出現故障之前某個特定的日期。而後面這種方法提供了基於日期的選擇,但是它需要更多的管理(尤其是因為您需要刪除不再需要的舊版本的檔案)以及相當數量的儲存空間,因為沒有對這些檔案進行壓縮。然而,您獲得了更簡單和更直接的訪問方式。

如何對 rsync 進行設定,這超出了本文的範圍,但在完成了相應的配置工作之後,進行資訊的傳輸和同步就非常簡單了。清單 7 顯示了使用 rsync 進行檔案同步的指令碼。



#!/bin/bash
DESTBASE=admin@atuin:/mnt/backupprepare
HOST=`hostname`
cd /export/data/svn
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og 
--links . $DESTBASE/$HOST/svn
cd /export/home/webs
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og 
--links . $DESTBASE/$HOST/webs
cd /var/bind
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og 
--links . $DESTBASE/$HOST/bind
cd /etc
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og 
--links . $DESTBASE/$HOST/etc
      

指定的 rsync 命令選項如下所示:

  • --stats 顯示同步的統計資訊。
  • --rsh 告訴 rsync 使用安全 Shell (SSH) 複製檔案(出於安全考慮)。
  • --delete 刪除目標中那些在本地目錄中不存在的檔案。
  • --recursive 確保對整個目錄進行檢查。
  • --times 保留檔案的建立和修改時間。
  • -og 保留所有權和組資訊。
  • --links 將連結複製為連結,而不是它們所連結的檔案。

DESTBASE 變數指定了基本位置(在本示例中為遠端主機上的檔案系統),而 HOST 變數則儲存了主機名資訊,以便您能夠對多臺主機使用相同的指令碼進行備份。

在前面的部分中,您已經使用了 tar 和 rsync 在單獨的資料夾中建立相應的備份。您可以使用這種經過整理的資訊作為主備份,尤其是當檔案位於另一臺計算機時。然而理想的情況下,您還應該將這些檔案備份到另一個位置。

使用上面介紹的這些指令碼,無論是 tar 或 rsync,都可以將多臺主機的多個目錄中的資訊整理到單個位置。基於這一點,您可以使用自己喜歡的方法進一步地對這些資訊進行備份,包括將其複製到另一臺計算機或裝置,或複製到磁帶或磁碟。

大多數備份解決方案,儘管對其進行了良好的管理,但通常依賴於交替和迴圈使用用於儲存資料的介質或目標。然而,您可能需要長期儲存相關資訊的某些型別的關鍵資料,甚至可能需要能夠記錄這些資料的變更和修改資訊,並作為備份過程的一部分。

實際上,記錄這些資訊的時間間隔僅受到可用磁碟空間或儲存空間的限制。使用基於日期的方法,特別是在使用 tar 或 cpio 時,您可以長期儲存相關記錄,而不會對儲存空間造成很大的影響。透過使用常規的完整備份(換句話說,包括所有的檔案)和增量 (diff) 備份(其中僅備份變更的內容),您可以進一步延長其保留時間。

備份關鍵檔案涉及到確定相關檔案,並找到一種合適的方法儲存和備份這些資訊。檔案可能儲存在許多不同的位置,而您應該多加小心,以確保包含重要的、但經常被遺忘的內容,比如核心驅動程式、庫和相關配置。

然後使用合適的方法,就可以對這些資訊進行有效的備份。與使用者資料不同,通常需要優先對關鍵檔案進行恢復,以便在繼續進行其他的還原操作之前,使計算機獲得正確的配置。透過使用 tar 或 rsync,做好對該資訊進行訪問的準備,這樣通常將更加有效。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7507082/viewspace-869052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章