天天看點

Windows 到 Linux 之旅: 第 8 部分. 備份與恢複

Linux 是一個穩定而可靠的環境。但是任何計算系統都有無法預料的事件,比如硬體故障。擁有關鍵配置資訊的可靠備份是任何負責任的管理計劃的組成部分。在 Linux 中可以通過各種各樣的方法來執行備份。所涉及的技術從非常簡單的腳本驅動的方法,到精心設計的商業化軟體。備份可以儲存到遠端網絡裝置、錄音帶驅動器和其他可移動媒體上。備份可以是基于檔案的或基于驅動器映像的。可用的選項很多,您可以混合搭配這些技術,為您的環境設計理想的備份計劃。

<a>确定政策</a>

所備份的内容很大程度上取決于您備份它們的理由。您是否試圖從嚴重的故障(比如硬碟驅動器問題)中恢複?您是否想歸檔以便能在需要時恢複舊的檔案?您計劃從一個冷系統和還原着手,還是從一個預加載的備用系統着手?

<a href="http://www.ibm.com/developerworks/cn/linux/l-roadmap/part8/index.html#ibm-pcon">回頁首</a>

<a>确定要備份的内容</a>

在備份和還原系統時,Linux 基于檔案的性質成了一個極大的優點。在 Windows 系統中,系統資料庫與系統是非常相關的。配置和軟體安裝不僅僅是将檔案放到系統上。是以,還原系統就需要有能夠處理 Windows 這種特性的軟體。在 Linux 中,情況就不一樣了。配置檔案是基于文本的,并且除了直接處理硬體時以外,它們在很大程度上是與系統無關的。硬體驅動程式的現代方法是,使它們以動态加載的子產品的形式可用,這樣核心就變得更加與系統無關。不同于讓備份必須處理作業系統如何安裝到系統和硬體上的複雜細節,Linux 備份處理的是檔案的打包和解包。

一般情況下,以下這些目錄是需要備份的:

/etc

包含所有核心配置檔案。這其中包括網絡配置、系統名稱、防火牆規則、使用者、組,以及其他全局系統項。

/var

包含系統守護程序(服務)所使用的資訊,包括 DNS 配置、DHCP 租期、郵件緩沖檔案、HTTP 伺服器檔案、db2 執行個體配置,等等。

/home

包含所有使用者的預設使用者主目錄。這包括他們的個人設定、已下載下傳的檔案和使用者不希望失去的其他資訊。

/root

是根(root)使用者的主目錄。

/opt

是安裝許多非系統檔案的地方。IBM 軟體就安裝在這裡。OpenOffice、JDK 和其他軟體在預設情況下也安裝在這裡。

有些目錄是應該考慮 不備份的。

/proc

應該永遠不要備份這個目錄。它不是一個真實的檔案系統,而是運作核心和環境的虛拟化視圖。它包括諸如 /proc/kcore 這樣的檔案,這個檔案是整個運作記憶體的虛拟視圖。備份這些檔案隻是在浪費資源。

/dev

包含硬體裝置的檔案表示。如果計劃還原到一個空白的系統,那就可以備份 /dev。然而,如果計劃還原到一個已安裝的 Linux 系統,那麼備份 /dev 是沒有必要的。

其他目錄包含系統檔案和已安裝的包。在伺服器環境中,這其中的許多資訊都不是自定義的。大多數自定義都發生在 /etc 和/home 目錄中。不過出于完整性的考慮,您可能希望備份它們。

在生産環境中,我希望確定資料不會丢失,因而我會備份除 /proc 目錄之外的整個系統。如果最擔心使用者和配置,我會僅備份 /etc、/var、/home 和 /root 目錄。

<a>備份工具</a>

正如前面提到過的, Linux 備份在很大程度上就是打包和解封包件。這允許使用現有的系統實用工具和腳本來執行備份,而不必購買商業化的軟體包。在許多情況下,這類備份将是足夠的,并且為管理者提供了極大的控制能力。備份腳本可以使用

<code>cron</code> 指令來自動化,這個指令控制 Linux 中預定的事件。

<a>tar</a>

<code>tar</code> 是一個已移植到 Linux 中的經典 UNIX 指令。 <code>tar</code> 是 tape

archive(錄音帶歸檔)的縮寫,最初設計用于将檔案打包到錄音帶上。如果您下載下傳過 Linux 源代碼,或許已經碰到過 tar 檔案。這是一個基于檔案的指令,它本質上是連續地、首尾相連地堆放檔案。

使用 <code>tar</code> 可以打包整個目錄樹,這使得它特别适合用于備份。歸檔檔案可以全部還原,或從中展開單獨的檔案和目錄。備份可以儲存到基于檔案的裝置或錄音帶裝置上。檔案可以在還原時重定向,以便将它們重新放到一個與最初儲存它們的目錄(或系統)不同的目錄(或系統)。

<code>tar</code> 是與檔案系統無關的。它可以使用在 ext2、ext3、 jfs、Reiser 和其他檔案系統上。

使用 <code>tar</code> 非常類似于使用諸如 PKZip 這樣的檔案實用工具。隻需将它指向一個目的(可以是檔案或裝置),然後指定您想要打包的檔案。您可以通過标準的壓縮類型來動态壓縮歸檔檔案,或指定一個自己選擇的外部壓縮程式。要通過 bzip2 壓縮或解壓縮檔案,可使用

<code>tar -z</code> 指令。

要使用 <code>tar</code> 來把除 /proc 目錄之外的整個檔案系統備份到 SCSI 錄音帶裝置:

在上面的例子中, <code>-c</code> 開關表示歸檔檔案正在被建立。 <code>-p</code> 開關表示我們希望保留檔案許可權限,這對良好的備份來說是很關鍵的。

<code>-f</code> 開關指向該歸檔檔案的檔案名。在本例中,我們使用的是原始錄音帶裝置 /dev/st0。/ 表示我們想要備份的内容。既然我們想要備份整個系統,是以把這個開關指定為根(root)。當把

<code>tar</code> 指向一個目錄(以 / 結尾)時,它會自動遞歸。最後,我們排除了 /proc 目錄,因為它沒有包含需要儲存的任何内容。如果單盒錄音帶容納不下這個備份,我們需要添加

<code>-M</code> 開關(本例中沒有顯示)以進行多卷備份。

<a></a>

不要忘了 Linux 是區分大小寫的。例如, <code>tar</code> 指令應該總是以小寫的形式執行。指令行開關可以是大寫、小寫或大小寫的混合。例如,

<code>-t</code> 和 <code>-T</code> 執行不同的功能。檔案或目錄名稱可以混合使用大小寫,而且就像指令和指令行開關一樣,是區分大小寫的。

要還原一個或多個檔案,可以使用帶提取開關( <code>-x</code> )的 <code>tar</code> 指令:

這裡的 <code>-f</code> 開關同樣指向歸檔檔案, <code>-p</code> 開關表明我們想要還原歸檔的權限。 <code>-x</code> 開關表明從歸檔中提取檔案。

<code>-C /</code> 表明我們想要讓還原從 / 開始。 <code>tar</code> 通常還原到運作這個指令的目錄。 <code>-C</code> 開關使我們的目前目錄不再相關。

您可能會經常使用的另外兩個 <code>tar</code> 指令是 <code>-t</code> 和 <code>-d</code> 開關。 <code>-t</code> 開關列出某個歸檔檔案的内容。 <code>-d</code> 開關将歸檔檔案的内容與系統上的目前檔案作比較。

為便于操作和編輯,您可以将想要歸檔的檔案和目錄放進一個文本檔案中,然後在指令行通過 <code>-T</code> 開關引用這個文本檔案。這些檔案和目錄可以與指令行上列出的其他目錄結合起來。下面的指令行備份 MyFiles 中列出的所有檔案和目錄、/ 根目錄和 /tmp 目錄中的所有 iso 檔案。

檔案清單隻是一個文本檔案,其中列出檔案或目錄。下面是一個例子:

請注意 <code>tar -T</code> (或 <code>files-from</code> )指令不能接受通配符。檔案必須明确地列出。上面的例子展示了一種單獨地引用檔案的方法。您還可以執行腳本來搜尋系統,然後建立一個清單。下面就是這樣一個腳本的例子:

上面的腳本首先将 MyFiles 中的所有現有檔案清單複制到 TempList。然後它執行兩個 <code>find</code> 指令來搜尋檔案系統中比對某個模式的檔案,并将它們附加到 TempList。第一次是搜尋 /usr/share 目錄樹中以

<code>.png</code> 結尾的所有檔案。第二次是搜尋 /tmp 目錄樹中以 <code>.iso</code> 結尾的所有檔案。在建立好清單之後, <code>tar</code> 然後在檔案裝置 /dev/st0 (第一個 SCSI 錄音帶裝置)上建立 一個新的歸檔檔案,該檔案使用 g zip 格式來壓縮,并保留所有檔案權限。該歸檔檔案将跨越多個卷。要歸檔的檔案的名稱将從 TempList 檔案中提取。

還可以使用腳本來執行更精細的操作,比如增量備份。Gerhard Mourani 在他的 Securing and Optimizing Linux

也可以編寫腳本來還原檔案,雖然還原通常是手動進行的。正如上面提到過的,用于提取檔案的 <code>-x</code> 開關代替了 <code>-c</code> 開關。可以還原整個歸檔檔案,或者還原指定的個别檔案或者目錄。使用通配符來引用歸檔檔案中的檔案是可以的。還可以使用開關來轉儲和還原。

<a>dump 和 restore</a>

<code>dump</code> 可以執行類似 <code>tar</code> 的功能。然而, <code>dump</code> 傾向于考慮檔案系統而不是個别的檔案。下面是引自 dump 手冊檔案中的内容:“dump 檢查 ext2 檔案系統上的檔案,并确定哪些檔案需要備份。這些檔案将出于安全保護而被複制到給定的磁盤、錄音帶或其他存儲媒體上……大于輸出媒體容量的轉儲将被劃分到多個卷。在大多數媒體上,容量是通過一直寫入直至傳回一個 end-of-media 标記來确定的。”

配合 <code>dump</code> 的程式是 <code>restore</code> ,它用于從轉儲映像還原檔案。

<code>restore</code> 指令執行轉儲的逆向功能。可以首先還原檔案系統的完全備份,而後續的增量備份可以在已還原的完全備份之上覆寫。可以從完全或部分備份中還原單獨的檔案或者目錄樹。

<code>dump</code> 和 <code>restore</code> 都能在網絡上運作,是以您可以通過遠端裝置進行備份或還原。 <code>dump</code> 和

<code>restore</code> 使用錄音帶驅動器和提供廣泛選項的檔案裝置。然而,兩者都僅限用于 ext2 和 ext3 檔案系統。如果使用的是 JFS、Reiser 或者其他檔案系統,您将需要其他的實用工具,比如

<code>tar</code> 。

<a>使用 dump 執行備份</a>

使用 <code>dump</code> 執行備份是相當簡單的。下面的指令執行一個完全 Linux 備份,它把所有 ext2 和 ext3 檔案系統備份到一個 SCSI 錄音帶裝置。

在這個例子中,系統中有兩個檔案系統。一個用于 /boot,另一個用于 / ,這是常見的配置。它們必須在執行備份時單獨地引用。 /dev/nst0 引用第一個 SCSI 錄音帶驅動器,不過是以非重繞的模式引用。這樣確定各個卷在錄音帶上一個接一個地排列。

<code>dump</code> 的一個有趣特性是其内置的增量備份功能。在上面的例子中, 0 表示 0 級或基本級備份。這是完全系統備份,您要定期執行以儲存整個系統。對于後續的備份,您可以使用其他數字(1-9)來代替 0,以改變備份級别。1 級備份會儲存自從執行 0 級備份以來更改過的所有檔案。2 級備份會儲存自從執行 1 級備份以來更改過的所有檔案,以此類推。使用

<code>tar</code> 和腳本可以執行相同的功能,但要求腳本建立人員提供一種機制來确定上次備份是何時執行的。 <code>dump</code> 具有它自己的機制,即它在執行備份時會輸出一個更新檔案(/etc/dumpupdates)。這個更新檔案将在每次執行 0 級備份時被重設。後續級别的備份會保留它們的标記,直至執行另一次 0 級備份。如果您在執行基于錄音帶的備份,

<code>dump</code> 會自動跟蹤多個卷。

标記将被 <code>dump</code> 跳過的檔案和目錄是可以做到的。實作此目的的指令是 <code>chattr</code> ,它改變 ext2 和 ext3 檔案系統上的擴充屬性。

chattr +d &lt;filename&gt;

上面的指令向檔案添加一個标記,讓 <code>dump</code> 在執行備份時跳過該檔案。

<a>使用 restore 來執行還原</a>

要還原使用 <code>dump</code> 儲存的資訊,可以使用 <code>restore</code> 指令。像 <code>tar</code> 一樣,

<code>dump</code> 能夠列出( <code>-t</code> )歸檔檔案的内容,并與目前檔案作比較( <code>-C</code> )。使用 <code>dump</code> 時必須小心的地方是還原資料。有兩種非常不同的還原方法,您必須使用正确的方法才能獲得可預測的結果。

<a>重建 (-r)</a>

記住,在設計 <code>dump</code> 時考慮得更多的是檔案系統,而不是單獨的檔案。是以,存在兩種不同的檔案還原風格。要重建一個檔案系統,可使用 <code>-r</code> 指令行開關。設計重建的目的是為了能在空檔案系統上操作,并将它還原為已儲存的狀态。在執行重建之前,您應該已經建立、格式化和裝載(mount)了該檔案系統。不應該對包含檔案的檔案系統執行重建。

下面是使用上面執行的轉儲來執行完全重建的例子。

上面這個指令需要針對要還原的每個檔案系統分别執行。

在需要的時候,可以重複這個過程來添加增量備份。

<a>提取 (-x)</a>

如果需要使用單獨的檔案而不是使用整個檔案系統,您必須使用 <code>-x</code> 開關來提取它們。例如,要僅從我們的錄音帶備份中提取 /etc 目錄,可使用以下指令:

<a>互動式還原 (-i)</a>

<code>restore</code> 提供的另外一個特性是互動式模式。使用指令:

将把您置于互動式 shell 中,同時還顯示了包含在該歸檔檔案中的項。鍵入“help”将會顯示一個指令清單。然後您就可以浏覽并選擇希望提取的項。務必記住,您提取的任何檔案都将進入目前目錄。

<a>dump 與 tar</a>

<code>dump</code> 和 <code>tar</code> 都有一批擁護者。兩者都各有優點和缺點。如果您運作的是除 ext2 或 ext3 之外的任何檔案系統,那麼

<code>dump</code> 就對您不可用。然而如果不是這種情況,那麼隻需最少的腳本就能運作 <code>dump</code> ,并且 <code>dump</code> 還具有可用于幫助還原的互動式模式。

我傾向于使用 <code>tar</code> ,因為我喜歡編寫腳本來獲得額外的控制級别。此外還有用于操作 .tar 檔案的多平台工具。

<a>其他工具</a>

在 Linux 中,任何能夠複制檔案的程式都可以用來執行某種程度的備份。有人就使用 <code>cpio</code> 和 <code>dd</code> 來執行備份 。

<code>cpio</code> 是又一個與 <code>tar</code> 差不多的打包實用工具,但使用得不太普遍。 <code>dd</code> 是一個檔案系統複制實用工具,它産生檔案系統的二進制副本。

<code>dd</code>還可用于産生硬碟驅動器的映像,類似于使用諸如 Symantec 的 Ghost 這樣的産品。然而, <code>dd</code> 不是基于檔案的,是以您隻能使用它來将資料還原到完全相同的硬碟驅動器分區。

<a>商業化備份産品</a>

可用于 Linux 的商業化備份産品有很多。商業化産品一般提供了便利的界面和報告系統,而在使用諸如 <code>dump</code> 和 <code>tar</code> 這樣的工具時,您必須自食其力。商業化産品很廣泛,通常提供大量的特性。使用商業軟體包的最大好處是,有一個預先建立的用于處理備份的政策,您可以立即投入工作。商業化的開發人員已經犯了您即将要犯的許多錯誤,他們的智慧的代價相比于丢失您的寶貴資料來說是廉價的。

<a>Tivoli Storage Manager</a>

Tivoli Storage Manager 或許是現在可用于 Linux 的最好的商業化備份和存儲管理實用工具。Tivoli Storage Manager 伺服器可運作在多種平台上,包括 Linux,而客戶機則可以運作在更多種類的平台上。

本質上,Storage Manager 伺服器是通過适合于備份該環境的裝置來配置的。要參與備份的任何系統都要加載一個與伺服器通信的客戶機。備份可以按計劃執行、通過 Tivoli Storage Manager 客戶機界面手動執行,或者使用基于 Web 的界面遠端執行。

TSM 基于政策的性質意味着無需經常調整檔案清單,就能夠為備份行為定義中心規則。此外,IBM Tivoli Storage Resource Manager 還能夠識别、評估、控制和預測企業存儲資産的利用情況,能夠檢測潛在的問題并自動應用自修複調整。更多細節請參見 Tivoli Web 站點(參見

<a>圖 1. Tivoli Storage Manager 菜單</a>

然後備份和還原就通過遠端裝置來處理 。

<a>圖 2. Tivoli Storage Manager 界面</a>

<a>前瞻和回顧</a>

擁有良好備份的第一步是擁有計劃。首先知道您需要儲存的資料以及需要什麼恢複政策,然後使用最适合該政策的工具。

Linux 附帶了一些現成的(out of the box)有用備份工具。其中兩個最常用的是 <code>tar</code> 和 <code>dump/restore</code> 。兩者都能執行完全系統備份。使用創造性的腳本,您能夠設計一個自定義的方案來本地和遠端地備份系統。

然而,編寫自己的備份腳本可能是一項繁重的任務,對于複雜的企業來說更是如此。諸如 Tivoli Storage Manager 這樣的商業化軟體降低了學習難度,并允許您立即控制自己的備份,但是您可能必須調整自己的政策來适應這些工具的功能。