硬件不肯定是可靠的
軟件肯定是不可靠的
人不肯定是不可靠的
而自然肯定是可靠的
本張說明為什麼、如何、何時要做備份,及如何回存備份的東西。
備份的重要
數據是有價值的。重新產生它需要你花費時間和努力,並且要花費金錢或至少傷心和眼淚,有時甚至不可能重新產生,例如一些實驗結果。由於數據是一種投資,你必須保護它,並采取措施避免丟失。
丟失數據一般有4個原因:硬件失敗、軟件曲線、人為因素或自然災害。 雖然現代硬件已經相當可靠,但仍可能自然損壞。存儲數據最決定性的硬件是硬盤,它依賴微小的磁區在充滿電噪聲的世界上保存數據。現代軟件依然不可靠,一個真正可靠的程序是理想、罕見的,而不是規律。人更不可靠,他們很容易犯錯誤,甚至為某種目的惡意地破壞數據。自然可能不是邪惡的,但也可能造成破壞。一切的一切,希望什麼都正常、完美幾乎是不可能的。
備份是保護數據投資的方法。有數據的多個拷貝,就不怕某個損壞(所需做的僅僅是從備份中恢復丟失的數據)。
正確的備份是很重要的。正如物理世界中任何東西都與其他相關,備份也遲早會失效。好的備份確保有效,你不希望你的備份無效。 如果你的備份又壞了,這將雪上加霜,如果你只有一個備份,它可能根本是壞的,只留下你和硬盤中冒煙的灰燼。 或者當你恢復時,發現忘了備份一些重要的東西,比如15000個用戶站點的用戶數據庫。 Best of all, all your backups might be working perfectly, but the last known tape drive reading the kind of tapes you used was the one that now has a bucketful of water in it.
When it comes to backups, paranoia is in the job description.
選擇備份介質
備份所需的最重要的決定是選擇備份介質。需要考慮成本、可靠性、速度、可得到、可用性。
成本是很重要的,因為你的數據可能需要多個存儲、多個備份。便宜的介質可以用很多。
可靠性是最重要的,因為壞的備份會雪上加霜。備份介質必須能存儲數據多年而不損壞。作為備份介質,使用方法影響可靠性。硬盤一般是很可靠的,但作為備份介質並非很可靠,如果它和備份源在同一計算機裡的話。
速度通常不太重要,如果備份可以非交互地完成。備份花2個小時無所謂,無須監督,多長時間都沒有關系。另一方面,if the backup can't be done when the computer would otherwise be idle, 那麼速度也是個問題。
可得到是明顯必要的,因為你無法使用不存在的備份介質。不太明顯的是要在將來還能得到這種介質,並且能在其他計算機上使用。否則災害之後,你可能無法恢復你的備份。
可用性是決定備份周期的主要因素。備份越容易使用越好。備份介質不能難以使用。
一般用軟盤和磁帶。軟盤很便宜,還算可靠,不太快,很容易得到,但數據量大時不容易使用。磁帶也很便宜,還算可靠,還算快,很容易得到,而且,依賴於磁帶的容量,使用很輕松。
還有其他選擇。但通常可得性不好,但如果這不成問題,有時也不錯。例如,磁光盤同時具有軟盤(隨機存取,可以快速地恢復單個文件)和磁帶(大容量)的優點.
選擇備份工具
備份有很多工具,傳統的UNIX備份工具是tar 、 cpio 和dump 。另外,還可以使用大量第三方軟件包(包括freeware和商業版)。備份介質的選擇可能影響工具的選擇。
tar 和cpio 類似,從備份來看二者基本等效。都能將文件存到磁帶並取出文件。都能使用幾乎所有介質,因為核心設備驅動處理低級設備操作,對用戶級程序看來所有設備都差不多。有寫Unix版本的tar 和cpio 對不是普通文件可能有問題(符號連接、設備文件、極長路徑名的文件等等),但Linux的能正確處理所有文件。
dump 不同,它直接讀文件系統,而不通過文件系統。 It is also written specifically for backups; tar 和cpio are really for archiving files, although they work for backups as well.
直接讀文件系統有些優點,它可能不考慮time stamps備份所有文件;對於tar 和cpio ,必須先將文件系統只讀安裝。直接讀文件系統更有效,如果所有東西都要備份,因為它使磁頭移動最少。它的主要缺點是每個文件系統種類需要特定的備份程序, Linux的dump 程序只理解ext2文件系統。
dump 也直接支持備份級(下面討論);對tar 和cpio ,這必須用其他工具實現。
第三方備份工具的比較超出了本書的范圍。Linux Software Map列出了許多freeware的。
簡單備份
一個簡單的備份方案是一次備份所有東西,然後備份上次備份後改變的所有東西。第一個備份叫全備份full backup,後來的叫i增量備份ncremental backups。全備份比增量備份費時費力,因為有更多的東西寫到磁帶,而且全備份可能不能放如一盤磁帶中(更別說軟盤了)。回存增量備份比全備份可能要花更多的時間。備份可以這樣優化,就是自上次全備份以後,總用增量備份保存所有改過的文件。這樣,備份可能需要多一些的工作,但你只需回存一個全備份和一個增量備份。
如果有6盤磁帶想每天備份,可以用磁帶1做第一個全備份(比如在星期五),用磁帶2-5做增量備份(周一到周四)。然後用磁帶6做新的全備份(第二個周五),然後再用磁帶2-5做增量備份。在做完新的全備份之前不要覆蓋舊的全備份(磁帶1),一面在做全備份的時候出現問題。有了新的全備份磁帶6以後,最好在另一個地方保存磁帶1,這樣如果有一個全備份磁帶在火災中損失了,還能有一個。當再做下一個全備份是,再用磁帶1而保存磁帶6。
如果你有多於6盤磁帶,可以用多的做全備份。每次做全備份,應該使用最老的磁帶。這樣你會有最近幾周的全備份,對你如果想找到一個現在已經刪除的就文件,或一個文件的舊版本很有用。
用tar備份
一個全備份可以很容易地用tar 實現:
# tar -create -file /dev/ftape /usr/src tar: Removing leading / from absolute path names in the archive #
上面的例子使用GNU版本的tar 及其長選項名。傳統版本的tar 只理解單字符選項。 GNU版還能處理一盤磁帶或一張磁盤不能容納的備份,及很長的路徑名;這不是所有傳統的版本能作到的。 (Linux只使用GNU tar 。)
如果你的備份一盤磁帶不能容納,你需要使用-multi-volume (-M)選項:
# tar -cMf /dev/fd0H1440 /usr/src tar: Removing leading / from absolute path names in the archive Prepare volume #2 for /dev/fd0H1440 and hit return: #
注意開始備份前要格式化所有軟盤,或在tar 需要新軟盤時用另一個虛擬控制台或虛擬終端格式化它。
備份完後,應該檢查它是否完好,用-compare (-d)選項:
# tar -compare -verbose -f /dev/ftape usr/src/ usr/src/linux usr/src/linux-1.2.10-includes/ .... #
失敗的備份檢查意味著如果你丟失了原始數據,備份也無法恢復。
增量備份可用帶-newer (-N)選項的tar 來實現:
# tar -create -newer '8 Sep 1995' -file /dev/ftape /usr/src -verbose tar: Removing leading / from absolute path names in the archive usr/src/ usr/src/linux-1.2.10-includes/ usr/src/linux-1.2.10-includes/include/ usr/src/linux-1.2.10-includes/include/linux/ usr/src/linux-1.2.10-includes/include/linux/modules/ usr/src/linux-1.2.10-includes/include/asm-generic/ usr/src/linux-1.2.10-includes/include/asm-i386/ usr/src/linux-1.2.10-includes/include/asm-mips/ usr/src/linux-1.2.10-includes/include/asm-alpha/ usr/src/linux-1.2.10-includes/include/asm-m68k/ usr/src/linux-1.2.10-includes/include/asm-sparc/ usr/src/patch-1.2.11.gz #
不幸的是,tar 不能知道一個文件的i節點信息變化,例如,文件的權限位變化,或文件名變化。這可用find 命令和比較當前文件系統狀態和先前備份的文件列表。用於此的Scripts和程序可以在Linux FTP站點上找到。
用tar回存
tar 的-extract (-x)選項展開文件:
# tar -extract -same-permissions -verbose -file /dev/fd0H1440 usr/src/ usr/src/linux usr/src/linux-1.2.10-includes/ usr/src/linux-1.2.10-includes/include/ usr/src/linux-1.2.10-includes/include/linux/ usr/src/linux-1.2.10-includes/include/linux/hdreg.h usr/src/linux-1.2.10-includes/include/linux/kernel.h ... #
也可以用命令行只展開特定的文件和目錄(及其中的文件和子目錄):
# tar xpvf /dev/fd0H1440 usr/src/linux-1.2.10-includes/include/linux/hdreg.h usr/src/linux-1.2.10-includes/include/linux/hdreg.h #