鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略
最近升級日期:2009/09/18
| 萬一不幸你的 Linux 被黑客入侵了、或是你的 Linux 系統由於硬件關系 (不論是天災還是人禍) 而掛掉了!這個時候,請問如何快速的回復你的系統呢?呵呵!當然羅,如果有備份數據的話,那么回復系統所花費的時間與成本將降低相當的多!平時最好就養成備份的習慣,以免突然間的系統損毀造成手足無措!此外,哪些文件最需要備份呢?又,備份是需要完整的備份還是僅備份重要數據即可?嗯!確實需要考慮看看呦! |
1. 備份要點
1.1 備份數據的考量
1.2 哪些 Linux 數據具有備份的意義
1.3 備份用儲存媒體的選擇
2. 備份的種類、頻率與工具的選擇
2.1 完整備份之累積備份 (Incremental backup),使用軟件
2.2 完整備份之差異備份 (Differential backup)
2.3 關鍵數據備份
3. VBird 的備份策略與 scripts
3.1 每周系統備份的 script
3.2 每日備份數據的 script
3.3 遠程備援的 script
4. 災難復原的考量
5. 重點回顧
6. 本章習題
7. 參考數據與延伸閱讀
8. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23896
備份要點
備份是個很重要的工作,很多人總是在系統損毀的時候才在哀嚎說:『我的數據啊!天那...!』此時才會發現備份數據的可愛!但是備份其實也非常可怕!因為你的重要數據都在備份檔里面,如果這個備份被竊取或遺失,其實對你的系統資安影響也非常大!同時,備份使用的媒體選擇也非常多樣,但是各種儲存媒體各有其功能與優劣,所以當然得要選擇羅!閑話少說,來談談備份吧!
備份數據的考量
老實說,備份是系統損毀時等待救援的救星!因為你需要重新安裝系統時,備份的好壞會影響到你系統復原的進度!不過,我們想先知道的是,系統為什么會損毀啊?是人為的還是怎樣產生的啊?事實上,系統有可能由於不預期的傷害而導致系統發生錯誤!什么是不預期的傷害呢?這是由於系統可能因為不預期的硬件損壞,例如硬盤壞掉等等,或者是軟件問題導致系統出錯,包括人為的操作不當或是其他不明因素等等所致。底下我們就來談談系統損壞的情況與為何需要備份吧!
- 造成系統損毀的問題-硬件問題
基本上,『計算機是一個相當不可靠的機器』這句話在大部分的時間內還是成立的!常常會聽到說『要計算機正常的工作,最重要的是要去拜拜!』嘿嘿!不要笑!這還是真的哩!尤其是在日前一些計算機周邊硬件的生產良率 (就是將硬件產生出來之后,經過測試,發現可正常工作的與不能正常工作的硬件總數之比值) 越來越差的情況之下,計算機的不穩定狀態實在是越來越嚴重了!
舉個例子來說,鳥哥曾經同時買過同一廠牌的 30GB 硬盤三顆,回來之后經過一個星期,嘿嘿!掛掉了兩顆!其中一顆是有壞軌,另外一顆是『完全死掉』,拿去公司要求修理,結果呢?嗯!店家直接拿了一顆新的給我,害我嚇一跳,店家的工程師說『唉呀!目前這個牌子的良率太差了,所以代理商為了怕麻煩,都會直接拿新的替換給我們啦!』要曉得的是,當初那一顆完全死掉的硬盤,是我用來備份我的主機數據的....好在當時我將備份的數據放在三四個地方,還好...
一般來說,會造成系統損毀的硬件組件應該要算硬盤吧!因為其他的組件壞掉時,雖然會影響到系統的運行,不過至少我們的數據還是存在硬盤當中的啊!為了避免這個困擾,於是乎有可備份用的 RAID1, RAID5 等磁盤陣列的應用啊!但是如果是 RAID 控制芯片壞掉呢?這就麻煩了~所以說,如果有 RAID 系統時,鳥哥個人還是覺得需要進行額外的備份才好的!如果數據夠重要的話。
- 造成系統損毀的問題-軟件問題
根據分析,其實系統的軟件傷害最嚴重的就屬使用者的操作不當啦!像最近這幾天才在鳥園討論區發現,有網友手滑了一下,結果在命令列輸入了『 rm -rf /home 』,這造成什么后果?就造成使用者家目錄被刪光光~因為當時下達命令的身份是 root 啊~會欲哭無淚喔!為了避免這方面的『手滑』問題,備份是重要的!
軟件傷害除了來自主機上的使用者操作不當之外,最常見的可能是資安攻擊事件了。假如你的 Linux 系統上面某些 Internet 的服務軟件是最新的!這也意味著可能是『相對最安全的』,但是,這個世界目前的閑人是相當多的,你不知道什么時候會有所謂的『黑客軟件』被提供出來,萬一你在Internet 上面的服務程序被攻擊,導致你的 Linux 系統全毀,這個時候怎么辦?當然是要復原系統吧?
那如何復原被傷害的系統呢?『重新安裝就好啦!』或許你會這么說,但是,像鳥哥管理的幾個網站的數據,尤其是 MySQL 數據庫的數據,這些都是彌足珍貴的經驗數據,萬一被損毀而救不回來的時候,不是很可惜嗎?這個還好哩,萬一你是某家銀行的話,那么數據的損毀可就不是能夠等閑視之的!關系的可是數千甚至上萬人的身家財產!這就是備份的重要性了!他可以最起碼的稍微保障我們的數據有另外一份copy 的備援以達到『安全回復』的基本要求!
- 主機角色不同,備份任務也不同
由於軟硬件的問題都可能造成系統的損毀,所以備份當然就很重要啦!問題是,每一部主機都需要備份嗎?多久備份一次呢?要備份什么數據呢?
如果是針對個人桌上型計算機使用的數據,那么 Norton 的『 Ghost 』應該算是一套好到不行的備份大師了!最主要是 Ghost 可以針對整個 partition 來進行備份,所以羅,我們可以將 Windows 系統當中的整個 C或者是整個 D 槽完整的備份下來。甚至在還原方面也是非常的快速,而且操作簡便!另外,由於個人桌上型計算機所使用的數據量通常不大,所以當ghost 完成之后,通常只要將數據燒錄到光盤片當中,大約只要一至兩片的光盤片也就綽綽有余羅!那么將光盤片保存好,這就是最簡易的數據備份模式羅!此外,由於個人的數據變動性不大,所以數據的備份頻率方面也不需要非常的頻繁!
但是,萬一你的主機有提供 Internet 方面的服務呢?又該如何備份啊?舉個例子來說,像是我們 Study Area 團隊的討論局域網站 http://phorum.study-area.org 提供的是類似 BBS 的討論文章,雖然數據量不大,但是由於討論區的文件是天天在添加的,每天都有相當多的資訊流入,由於某些資訊都是屬於重要的人物之留言,這個時候,我們能夠讓機器死掉嗎?或者是能夠一季三個月才備份一次嗎?這個備份頻率需求的考量是非常重要的!
再提到 2002 年左右鳥哥的討論區曾經掛點的問題,以及 2003 年初 Study-Area 討論區掛點的問題,討論區一旦掛點的話,該數據庫內容如果損毀到無法救回來,嘿嘿!要曉得討論區可不是一個人的心血耶!有的時候 (像 Study-Area 討論區) 是一群熱心 Linux 的朋友們互相創建交流起來的數據流通網,如果死掉了,那么不是讓這些熱血青年的熱情付之一炬了嗎?所以羅,創建備份的策略 (頻率、媒體、方法等) 是相當的重要的。
- 備份因素考量
由於計算機 (尤其是目前的計算機,操作頻率太高、硬件良率太差、使用者操作習慣不良、『某些』操作系統的死機率太高....) 的穩定性較差,所以羅!備份的工作就越來越重要了!那么一般我們在備份時考慮的因素有哪些呢?
- 備份哪些文件:
哪些數據對系統或使用者來說是重要的?那些數據就是值得備份的數據!例如 /etc/* 及 /home/* 等。
- 選擇什么備份的媒介:
是可讀寫光盤、另一顆硬盤、同一顆硬盤的不同 partition、還是使用網絡備援系統?哪一種的速度最快,最便宜,可將數據保存最久?這都可以考慮的。
- 考慮備份的方式:
是以完整備份(類似 ghost)來備份所有數據,還是使用差異備份僅備份有被更動過的數據即可?
- 備份的頻率:
例如 MySQL 數據庫是否天天備份、若完整備份,需要多久進行一次?
- 備份使用的工具為何:
是利用 tar 、 cpio 、 dd 還是 dump 等等的備份工具?
底下我們就來談一談這些問題的解決之道吧! ^_^
哪些Linux 數據具有備份的意義
一般來說,鳥哥比較喜歡備份最重要的文件而已 (關鍵數據備份),而不是整個系統都備份起來(完整備份, Full backup)!那么哪些文件是有必要備份的呢?具有備份意義的文件通常可以粗分為兩大類,一類是系統基本配置資訊、一類則是類似網絡服務的內容數據。那么各有哪些文件需要備份的呢?我們就來稍微分析一下。
- 操作系統本身需要備份的文件:
這方面的文件主要跟『帳號與系統配置檔』有關系!主要有哪些帳號的文件需要備份呢?就是/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的使用者家目錄等等,而由於 Linux 默認的重要參數檔都在 /etc/ 底下,所以只要將這個目錄備份下來的話,那么幾乎所有的配置檔都可以被保存的!
至於 /home 目錄是一般用戶的家目錄,自然也需要來備份一番!再來,由於使用者會有郵件吧!所以呢,這個/var/spool/mail/ 內容也需要備份呦!另外,由於如果你曾經自行更動過核心,那么/boot 里頭的資訊也就很重要羅!所以羅,這方面的數據你必須要備份的文件為:
- /etc/ 整個目錄
- /home 整個目錄
- /var/spool/mail
- /boot
- /root
- 如果你自行安裝過其他的套件,那么 /usr/local/ 或 /opt 也最好備份一下!
- 網絡服務的數據庫方面:
這部份的數據可就多而且復雜了,首先是這些網絡服務軟件的配置檔部分,如果你的網絡軟件安裝都是以原廠提供的為主,那么你的配置文件大多是在/etc 底下,所以這個就沒啥大問題!但若你的套件大多來自於自行的安裝,那么/usr/local 這個目錄可就相當的重要了!
再來,每種服務提供的數據都不相同,這些數據很多都是人們提供的!舉例來說,你的 WWW 服務器總是需要有人提供網頁文件吧?否則瀏覽器來是要看啥咚咚?你的討論區總是得要寫入數據庫系統吧?否則討論的數據如何升級與記載?所以,使用者主動提供的文件,以及服務運行過程會產生的數據,都需要被考慮來備份。若我們假設我們提供的服務軟件都是使用原廠的 RPM 安裝的!所以要備份的數據文件有:
- 軟件本身的配置文件,例如:/etc/ 整個目錄,/usr/local/ 整個目錄
- 軟件服務提供的數據,以 WWW 及 MySQL 為例:
WWW 數據:/var/www 整個目錄或 /srv/www 整個目錄,及系統的使用者家目錄
MySQL : /var/lib/mysql 整個目錄 - 其他在 Linux 主機上面提供的服務之數據庫文件!
- 推薦需要備份的目錄:
由上面的介紹來看的話,如果你的硬件或者是由於經費的關系而無法全部的數據都予以備份時,鳥哥建議你至少需要備份這些目錄呦!
- /boot
- /etc
- /home
- /root
- /usr/local(或者是 /opt 及 /srv 等)
- /var(注:這個目錄當中有些緩存目錄則可以不備份!)
- 不需要備份的目錄:
有些數據是不需要備份的啦!例如我們在第六章文件權限與目錄配置里頭提到的 /proc 這個目錄是在記錄目前系統上面正在跑的程序,這個數據根本就不需要備份的呢!此外,外掛的機器,例如/mnt 或 /media 里面都是掛載了其他的硬盤裝置、光驅、軟盤機等等,這些也不需要備份吧?所以羅!底下有些目錄可以不需要備份啦!
- /dev :這個隨便你要不要備份
- /proc:這個真的不需要備份啦!
- /mnt 與 /media:如果你沒有在這個目錄內放置你自己系統的東西,也不需要備份
- /tmp :干嘛存緩存檔!不需要備份!
備份用儲存媒體的選擇
用來儲存備份數據的媒體非常的多樣化,那該如何選擇呢?在選擇之前我們先來講個小故事先!
- 一個實際發生的故事
在備份的時候,選擇一個『數據存放的地方』也是很需要考慮的一個因素!什么叫做數據存放的地方呢?講個最簡單的例子好了,我們知道說,較為大型的機器都會使用tape 這一種磁帶機來備份數據,而如果是一般個人計算機的話,很可能是使用類似Mo 這一種可讀寫式光盤片來存取數據!但是你不要忘記了幾個重要的因素,那就是萬一你的Linux 主機被偷了呢?
這不是不可能的,之前鳥哥在成大念書時,隔壁校區的研究室曾經遭小偷,里面所有的計算機都被偷走了!包括『Mo 片』,當他們發現的時候,一開始以為是硬件被偷走了,還好,他們都有習慣進行備份,但是很不幸的,這一次連『備份的MO 都被拿走了!』怎么辦?!只能道德勸說小偷先生能夠良心發現的將硬盤拿回來羅!唉~真慘....
- 異地備援系統
這個時候,所謂的『異地備援系統』就顯的相當的重要了!什么是異地備援呀!說的太文言了!呵!簡單的說,就是將你的系統數據『備份』到其他的地方去,例如說我的機器在臺南,但是我還有另一部機器在高雄老家,這樣的話,我可以將臺南機器上面重要的數據都給他定期的自動的透過網絡傳輸回去!也可以將家里重要的數據給他丟到臺南來!這樣的最大優點是可以在臺南的機器死掉的時候,即使是遭小偷,也可以有一個『萬一』的備份所在!
有沒有缺點啊?有啊!缺點就是~頻寬嚴重的不足!在這種狀態下,所能采取的策略大概就是『僅將最重要的數據給他傳輸回去羅!』至於一些只要系統從新安裝就可以回復的咚咚!那就沒有這個必要了!當然羅,如果你的網絡是屬於T1 專線的話,那么完整備份將數據丟到另一地去,也是很可行的啦!只是鳥哥沒有那么好命...
- 儲存媒體的考量
在此同時,我們再來談一談,那么除了異地備援這個『相對較為安全的備份』方法之外,還有沒有其他的方法可以儲存備份的呢?畢竟這種網絡備援系統實在是太耗頻寬了!如果像我們一般家用的ADSL 根本就是吃不消!那么怎么辦?喔~那就只好使用近端的裝置來備份羅!這也是目前我們最常見到的備份方法!例如一般我們使用的 Tape, Mo, Zip, CD-RW, DVD-RW 還有備份用抽取式硬盤與攜帶式硬盤等等!那么在選擇上需要注意些什么呢?需要注意的地方有幾點:
- 備份速度要求 -- 思考硬盤用途:
『備份』在 Linux 主機上面也是蠻耗系統資源的!因為需要將系統的數據拷貝到其他裝置上面去,這個時候I/O 與 CPU 的負載都會大!你總不希望系統就這樣給他掛點吧!此外,有些系統的數據實在太多咯,怎么樣也備份不完!所以羅,越快的儲存裝置是越好的!如果你是個重視速度甚於一切的人,那么我覺得抽取式硬盤是個不錯的方式,只不過.....目前我知道的抽取式硬盤都需要冷啟動才行,不太符合Linux 主機 24 小時全年無休的狀態....
但是硬盤真的越來越大、越來越便宜了,不使用速度快的硬盤來備份實在很可惜~加上目前的火線 (IEEE 1394) 以及 U盤 2.0 外接式硬盤盒技術已經相當的成熟,傳輸速度又快,又可以直接熱拔插 (Plug and Play),接上 U盤 硬盤,整個復制一下,傳輸速度理論上可達 480Mbps (約 60 MBytes/second) ,快的哩!復制完畢,又可以將硬盤帶走,不需要與主機放置在一起,還可以避免同時被偷,真是不錯。
但是,硬盤還是有一定的困擾,那就是『不接電源的硬盤需要很好很好的保養』。我們知道計算機最好的保養就是常常啟動去運行一下,免得長期不啟動,造成受潮而損壞。這個攜帶式硬盤只是偶而才會連上主機來進行備份的數據,除非你額外購買一部防潮箱來放置硬盤,否則很容易損壞!所以,近年來速度越來越快的 DVD-RW 就變的很方便羅!至於磁帶 (tape),在速度上完全是落后的.....
至於使用直接安裝在主機上的第二顆硬盤來備份,類似 RAID 或者是安裝一顆備份的硬盤在 Linux 系統當中,這個方案也很好,而且速度上絕對是最具優勢的!但是就如同我們剛剛提到的,萬一你的機器被偷了,連帶的,這顆備份的硬盤自然也就不見了.....
- 儲存容量 -- 磁帶備份考量:
這也是一個需要考量的因素!而且常常是最大考量的因素呢!雖然目前硬盤越來越便宜,但是畢竟就如同前面說的,抽取式硬盤需要將系統冷啟動,而建構在系統內的硬盤又同時具有不安全的成分在,攜帶式硬盤可能又有不容易保存的特性,這個時候一個大容量的替代方案就顯的很重要了!雖然CD-RW 與 DVD-RW 可以提供不錯的速度,但是其容量畢竟不足 (雖然有高達幾十 GB 的藍光 DVD 可用,但目前 (2009) 尚未普及,光盤片太貴了!) 所以說,具有大容量的 tape (磁帶容量最小的一款也可以到達 8 GB 左右!) 就相當的具有這方面的優勢了!而且攜帶方便,存放也容易!更可以帶著走~~
- 經費與數據可靠性 -- DVD 的使用,可保存 10 年左右:
在經費不短缺的情況下,我們當然會建議你上面的幾個裝置都買一買,然后分別在不同的時間進行不同的備份作業 (底下我們有些建議的啦!^_^) !但是如果經費也是需要考量的話,那么磁帶機這個目前還算貴重的物品可能暫時還動不到!這個時候近來漸漸便宜的 DVD-RW 就顯的活躍的多了!而且光盤片也可以保存很久的ㄋㄟ~當然,目前應該不會有人以軟盤來備份了吧!呵呵!軟盤可是相當不安全的。
無論如何,如果經費允許的話, Tape 備份數據真的是一個不錯的點子!因為他的高容量讓我好滿意!再來,如果經費稍微短缺的話,那么 DVD-RW 經常性的將數據燒錄下來,這也是蠻好的,尤其 DVD 片又不占空間!再來,如果還是沒有辦法,那么一顆內建在 Linux 的硬盤用來備份也是不錯的!什么!連備份的硬盤都沒有,唉!怎么跟我一樣~這個時候沒辦法啦,用原來的安裝系統的硬盤,多留一個partition 用來當作備份之用吧 (這也是目前鳥哥常用的方法之一!)底下我們來看一看一些常見的裝置代號!
- 光驅: /dev/cdrom (其實應該是 /dev/sdX 或 /dev/hdX)
- 磁帶機: /dev/st0 (SCSI 介面), /dev/ht0 (IDE 介面)
- 軟盤機: /dev/fd0, /dev/fd1
- 硬盤機: /dev/hd[a-d][1-63] (IDE), /dev/sd[a-p][1-16] (SCSI/SATA)
- 外接式 U盤 硬盤機: /dev/sd[a-p][1-16] (與 SCSI 相同)
- 打印機: /dev/lp[0-2]
特別留意的是磁帶機呦!如果你有錢的話,那么買一部磁帶機是相當不錯的建議!沒錢的話,買 IDE 或 SATA 介面的硬盤也很不錯!! ^_^
備份的種類、頻率與工具的選擇
講了好多口水了,還是沒有講到重點,真是的....好了,再來提到那個備份的種類,因為想要選擇什么儲存媒體與相關備份工具,都與備份使用的方式有關!那么備份有哪些方式呢?一般可以粗略分為『累積備份』與『差異備份』這兩種 (注1)。當然啦,如果你在系統出錯時想要重新安裝到升級的系統時,僅備份關鍵數據也就可以了!
完整備份之累積備份(Incremental backup)
備份不就是將重要數據復制出來即可嗎?干嘛需要完整備份 (Full backup) 呢?如果你的主機是負責相當重要的服務,因此如果有不明原因的死機事件造成系統損毀時,你希望在最短的時間內復原系統。此時,如果僅備份關鍵數據時,那么你得要在系統出錯后,再去找新的 Linux distribution 來安裝,安裝完畢后還得要考慮到數據新舊版本的差異問題,還得要進行數據的移植與系統服務的重新創建等等,等到創建妥當后,還得要進行相關測試!這種種的工作可至少得要花上一個星期以上的工作天才能夠處理妥當!所以,僅有關鍵數據是不夠的!
- 還原的考量
但反過來講,如果是完整備份的話呢?若硬件出問題導致系統損毀時,只要將完整備份拿出來,整個給他傾倒回去硬盤,所有事情就搞定了!有些時候 (例如使用 dd 命令) 甚至連系統都不需要重新安裝!反正整個系統都給他倒回去,連同重要的 Linux 系統文件等,所以當然也就不需要重新安裝啊!因此,很多企業用來提供重要服務的主機都會使用完整備份,若所提供的服務真的非常重要時,甚至會再架設一部一模一樣的機器呢!如此一來,若是原本的機器出問題,那就立刻將備份的機器拿出來接管!以使企業的網絡服務不會中斷哩!
那你知道完整備份的定義了吧?沒錯!完整備份就是將根目錄 (/) 整個系統通通備份下來的意思!不過,在某些場合底下,完整備份也可以是備份一個文件系統 (filesystem)!例如 /dev/sda1 或/dev/md0 或 /dev/myvg/mylv 之類的文件系統就是了。
- 累積備份的原則
雖然完整備份在還原方面有相當良好的表現,但是我們都知道系統用的越久,數據量就會越大!如此一來,完整備份所需要花費的時間與儲存媒體的使用就會相當麻煩~所以,完整備份并不會也不太可能每天都進行的!那你想要每天都備份數據該如何進行呢?有兩種方式啦,一種是本小節會談到的累積備份,一種則是下個小節談到的差異備份。
所謂的累積備份,指的是在系統在進行完第一次完整備份后,經過一段時間的運行,比較系統與備份檔之間的差異,僅備份有差異的文件而已。而第二次累積備份則與第一次累積備份的數據比較,也是僅備份有差異的數據而已。如此一來,由於僅備份有差異的數據,因此備份的數據量小且快速!備份也很有效率。我們可以從下圖來說明:
圖 2.1.1、 累積備份 (incremental backup) 操作示意圖
假如我在星期一作好完整備份,則星期二的累積備份是系統與完整備份間的差異數據;星期三的備份是系統與星期二的差異數據,星期四的備份則是系統與星期三的差異數據。那你得要注意的是,星期二的數據是完整備份加第一次累積備份,星期三的數據是完整備份加第一次累積與第二次累積備份,星期四的數據則是星期一的完整備份加第一次加第二次加第三次累積備份。由於每次都僅與前一次的備份數據比較而已,因此備份的數據量就會少很多!
那如何還原?經過上面的分析,我們也會知道累積備份的還原方面比較麻煩!假設你的系統在星期五的時候掛點了!那你要如何還原?首先,你必須要還原星期一的完整備份,然后還原星期二的累積備份,再依序還原星期三、星期四的累積備份才算完全復原!那如果你是經過了九次的累積備份,就得要還原到第九次的階段,才是最完整的還原程序!
- 累積備份使用的備份軟件
完整備份常用的工具有 dd, cpio, dump/restore 等等。因為這些工具都能夠備份裝置與特殊文件!dd 可以直接讀取磁碟的磁區 (sector) 而不理會文件系統,是相當良好的備份工具!不過缺點就是慢很多!cpio 是能夠備份所有檔名,不過,得要配合 find 或其他找檔名的命令才能夠處理妥當。以上兩個都能夠進行完整備份,但累積備份就得要額外使用腳本程序來處理。可以直接進行累積備份的就是 dump 這個命令羅!詳細的命令與參數用法,請前往第九章查閱,這里僅列出幾個簡單的范例而已。
| # 1. 用 dd 來將 /dev/sda 備份到完全一模一樣的 /dev/sdb 硬盤上: [root@www ~]# dd if=/dev/sda of=/dev/sdb # 由於 dd 是讀取磁區,所以 /dev/sdb 這顆磁碟可以不必格式化!非常的方便! # 只是你會等非常非常久!因為 dd 的速度比較慢!# 2. 使用 cpio 來備份與還原整個系統,假設儲存媒體為 SATA 磁帶機: [root@www ~]# find / -print | cpio -covB > /dev/st0 <==備份到磁帶機 [root@www ~]# cpio -iduv < /dev/st0 <==還原 |
假設 /home 為一個獨立的文件系統,而 /backupdata 也是一個獨立的用來備份的文件系統,那如何使用 dump將 /home 完整的備份到 /backupdata 上呢?可以像底下這樣進行看看:
| # 1. 完整備份 [root@www ~]# dump -0u -f /backupdata/home.dump /home# 2. 第一次進行累積備份 [root@www ~]# dump -1u -f /backupdata/home.dump.1 /home |
除了這些命令之外,其實 tar 也可以用來進行完整備份啦!舉例來說,/backupdata 是個獨立的文件系統,你想要將整個系統通通備份起來時,可以這樣考慮:將不必要的 /proc, /mnt, /tmp 等目錄不備份,其他的數據則予以備份:
| [root@www ~]# tar --exclude /proc --exclude /mnt --exclude /tmp \ > --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 / |
完整備份之差異備份(Differential backup)
差異備份與累積備份有點類似,也是需要進行第一次的完整備份后才能夠進行。只是差異備份指的是:每次的備份都是與原始的完整備份比較的結果。所以系統運行的越久,離完整備份時間越長,那么該次的差異備份數據可能就會越大!差異備份的示意圖如下所示:
圖 2.2.1、 差異備份 (differential backup) 操作示意圖
差異備份常用的工具與累積備份差不多!因為都需要完整備份嘛!如果使用 dump 來備份的話,那么每次備份的等級 (level)就都會是 level 1 的意思啦!當然啦,你也可以透過 tar 的 -N 選項來備份喔!如下所示:
| [root@www ~]# tar -N '2009-06-01' -jpcv -f /backupdata/home.tar.bz2 /home # 只有在比 2009-06-01 還要新的文件,在 /home 底下的文件才會被打包進 home.bz2 中! # 有點奇怪的是,目錄還是會被記錄下來,只是目錄內的舊文件就不會備份。 |
此外,你也可以透過 rsync 來進行鏡像備份喔!這個 rsync 可以對兩個目錄進行鏡像 (mirror) ,算是一個非常快速的備份工具!簡單的命令語法為:
| [root@www ~]# rsync -av 來源目錄 目標目錄# 1. 將 /home/ 鏡像到 /backupdata/home/ 去 [root@www ~]# rsync -av /home /backupdata/ # 此時會在 /backupdata 底下產生 home 這個目錄來! [root@www ~]# rsync -av /home /backupdata/ # 再次進行會快很多!如果數據沒有更動,幾乎不會進行任何動作! |
根據分析 (注2) ,差異備份所使用的磁碟容量可能會比累積備份來的大,但是差異備份的還原較快,因為只需要還原完整備份與最近一次的差異備份即可。無論如何,請依據你自己的喜好來選擇備份的方式吧!
關鍵數據備份
完整備份雖然有許多好處,但就是需要花費很多時間!所以,如果在主機提供的服務并不是一定要 24 小時提供的前提下,我們可以僅備份重要的關鍵數據即可。由於主機即使死機個一兩天可能也不會影響到你的正常生活時,僅備份關鍵數據就好啦!不需要整個系統都備份。僅備份關鍵數據是有許多好處的!由於完整備份可能是在系統運行期間進行,不但會花費非常多時間,而且如果備份當時系統已經被攻破,那你備份的數據是有問題的,那還原回去也是有問題的系統啊!
如果僅是備份關鍵數據而已,那么由於系統的絕大部分運行檔都可以后來重新安裝,因此若你的系統不是因為硬件問題,而是因為軟件問題而導致系統被攻破或損毀時,直接捉取最新的 Linux distribution ,然后重新安裝,然后再將系統數據 (如帳號/口令與家目錄等等) 與服務數據 (如 www/email/crontab/ftp 等等) 一個一個的填回去!那你的系統不但保持在最新的狀態,同時也可以趁機處理一下與重新溫習一下系統配置!是很不錯的呦!
不過,備份關鍵數據最麻煩的地方其實就是在還原啦!上述的還原方式是你必須要很熟悉系統運行,否則還原得要花費很多時間的!尤其近來的 Linux 強調安全性,所以加入 SELinux 了,你如果要從舊版的 Linux 升級到新版時,原本若沒有 SELinux 而換成新版則需要啟動 SELinux 時,那個除錯的時間會花很長一段日子哩!鳥哥認為這是僅備份關鍵數據的一些優缺點啦~
備份關鍵數據鳥哥最愛使用 tar 來處理了!如果想要分門別類的將各種不同的服務在不同的時間備份使用不同檔名,配合 date 命令是非常好用的工具!例如底下的案例是依據日期來備份 mysql 的數據庫喔!
| [root@www ~]# tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql |
備份是非常重要的工作,你可不希望想到才進行吧?交給系統自動處理就對啦!請自己撰寫 script ,配合 crontab 去運行吧!這樣子,備份會很輕松喔!
鳥哥的備份策略
每部主機的任務都不相同,重要的數據也不相同,重要性也不一樣,因此,每個人的備份思考角度都不一樣!有些備份策略是非常有趣的,包括使用多個磁帶機與磁帶來自動備份企業數據哩 (注3) 。
就鳥哥的想法來說,鳥哥并沒有想要將整個系統完整的備份下來,因為太耗時間了!而且就鳥哥的立場而言,似乎也沒有這個必要,所以通常鳥哥只備份較為重要的文件而已!不過,由於鳥哥需要備份 /home 與網頁數據,如果天天都備份,我想,系統遲早會受不了 (因為這兩個部分就已經占去數 10 GB 的磁盤空間...),所以鳥哥就將我的備份分為兩大部分,一個是每日備份經常性變動的重要數據,一個則是每周備份就不常變動的資訊。這個時候我就寫了兩個簡單的 scripts ,分別來儲存這些數據。
所以針對鳥哥的『鳥站』來說,我的備份策略是這樣的:
那就來看看鳥哥是怎么備份的吧! ^_^
每周系統備份的 script
底下提供鳥哥的備份的 scripts ,希望對大家有點幫助!鳥哥假設你已經知道如何掛載一個新的 filesystem 到 /backup 去,所以格式化與掛載這里就不再強調羅。
| [root@www ~]# vi /backup/backupwk.sh #!/bin/bash # ==================================================================== # 使用者參數輸入位置: # basedir=你用來儲存此腳本所預計備份的數據之目錄(請獨立文件系統) basedir=/backup/weekly <==您只要改這里就好了!# ==================================================================== # 底下請不要修改了!用默認值即可! PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH export LANG=C# 配置要備份的服務的配置檔,以及備份的目錄 named=$basedir/named postfixd=$basedir/postfix vsftpd=$basedir/vsftp sshd=$basedir/ssh sambad=$basedir/samba wwwd=$basedir/www others=$basedir/others userinfod=$basedir/userinfo # 判斷目錄是否存在,若不存在則予以創建。 for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod do[ ! -d "$dirs" ] && mkdir -p $dirs done# 1. 將系統主要的服務之配置檔分別備份下來,同時也備份 /etc 全部。 cp -a /var/named/chroot/{etc,var} $named cp -a /etc/postfix /etc/dovecot.conf $postfixd cp -a /etc/vsftpd/* $vsftpd cp -a /etc/ssh/* $sshd cp -a /etc/samba/* $sambad cp -a /etc/{my.cnf,php.ini,httpd} $wwwd cd /var/libtar -jpc -f $wwwd/mysql.tar.bz2 mysql cd /var/wwwtar -jpc -f $wwwd/html.tar.bz2 html cgi-bin cd /tar -jpc -f $others/etc.tar.bz2 etc cd /usr/tar -jpc -f $others/local.tar.bz2 local# 2. 關於使用者參數方面 cp -a /etc/{passwd,shadow,group} $userinfod cd /var/spooltar -jpc -f $userinfod/mail.tar.bz2 mail cd /tar -jpc -f $userinfod/home.tar.bz2 home cd /var/spooltar -jpc -f $userinfod/cron.tar.bz2 cron at[root@www ~]# chmod 700 /backup/backupwk.sh [root@www ~]# /backup/backupwk.sh <==記得自己試跑看看! |
上面的 script 主要均使用 CentOS 5.x (理論上, Red Hat 系列的 Linux 都是用) 默認的服務與目錄,如果你有配置某些服務的數據在不同的目錄時,那么上面的 script 是還需要修改的!不要只是拿來用而已喔!上面 script 可以在底下的連結取得。
- http://vbird.dic.ksu.edu.tw/linux_basic/0580backup/backupwk-0.1.sh
每日備份數據的 script
再來,繼續提供一下每日備份數據的腳本程序!請注意,鳥哥這里僅有提供 MySQL 的數據庫備份目錄,與 WWW 的類似留言版程序使用的 CGI 程序與寫入的數據而已。如果你還有其他的數據需要每日備份,請自行照樣造句羅! ^_^
| [root@www ~]# vi /backup/backupday.sh #!/bin/bash # ========================================================= # 請輸入,你想讓備份數據放置到那個獨立的目錄去 basedir=/backup/daily/ <==你只要改這里就可以了!# ========================================================= PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH export LANG=C basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2 basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2 [ ! -d "$basedir" ] && mkdir $basedir# 1. MysQL (數據庫目錄在 /var/lib/mysql) cd /var/libtar -jpc -f $basefile1 mysql# 2. WWW 的 CGI 程序 (如果有使用 CGI 程序的話) cd /var/wwwtar -jpc -f $basefile2 cgi-bin[root@www ~]# chmod 700 /backup/backupday.sh [root@www ~]# /backup/backupday.sh <==記得自己試跑看看! |
上面的腳本可以在底下的連結取得。這樣一來每天的 MySQL 數據庫就可以自動的被記錄在 /backup/daily/ 目錄里頭啦!而且還是文件名稱會自動改變的呦!呵呵!我很喜歡!OK!再來就是開始讓系統自己跑啦!怎么跑?就是 /etc/crontab 呀!提供一下我的相關配置呦!
- http://vbird.dic.ksu.edu.tw/linux_basic/0580backup/backupday.sh
| [root@www ~]# vi /etc/crontab # 加入這兩行即可 (請注意你的文件目錄!不要照抄呦!) 30 3 * * 0 root /backup/backupwk.sh 30 2 * * * root /backup/backupday.sh |
這樣系統就會自動的在每天的 2:30 進行 MySQL 的備份,而在每個星期日的3:30 進行重要文件的備份!呵呵!你說,是不是很容易呢!但是請千萬記得呦!還要將/backup/ 當中的數據 copy 出來才行耶!否則整部系統死掉的時候...那可不是鬧著玩的!所以鳥哥大約一個月到兩個月之間,會將 /backup 目錄內的數據使用 DVD 復制一下,然后將 DVD放置在家中保存!這個 DVD 很重要的喔!不可以遺失,否則系統的重要數據 (尤其是帳號資訊) 流出去可不是鬧著玩的!
| Tips: 有些時候,你在進行備份時,被備份的文件可能同時間被其他的網絡服務所修改喔!舉例來說,當你備份 MySQL 數據庫時,剛好有人利用你的數據庫發表文章,此時,可能會發生一些錯誤的信息。要避免這類的問題時,可以在備份前,將該服務先關掉,備份完成后,再啟動該服務即可!感謝討論區 duncanlo 提供這個方法! |
遠程備援的 script
如果你有控管兩部以上的 Linux 主機時,那么互相將對方的重要數據保存一份在自己的系統中也是個不錯的想法!那怎么保存啊?使用 U盤 復制來去嗎?當然不是啦!你可以透過網絡來處置啦!我們假設你已經有一部主機,這部主機的 IP 是 192.168.1.100 ,而且這部主機已經提供了 FTP 與 sshd 這兩個網絡服務,同時你已經做好了 FTP 的帳號,sshd 帳號的免口令登陸功能等 (這部分請參考服務器篇的介紹),接下來你可以這樣做:
- 使用 FTP 上傳備份數據
假設你要上傳的數據是將 /backup/weekly/ 目錄內的文件統整為一個 /backup/weekly.tar.bz2 ,并且上傳到服務器端的 /home/backup/ 底下,使用的帳號是 dmtsai ,口令是 dmtsai.pass 。那么你可以這樣做看看:
| [root@www ~]# vi /backup/ftp.sh #!/bin/bash # =========================================== # 先輸入系統所需要的數據 host="192.168.1.100" # 遠程主機 id="dmtsai" # 遠程主機的 FTP 帳號 pw='dmtsai.pass' # 該帳號的口令 basedir="/backup/weekly" # 本地端的欲被備份的目錄 remotedir="/home/backup" # 備份到遠程的何處?# =========================================== backupfile=weekly.tar.bz2 cd $basedir/..tar -jpc -f $backupfile $(basename $basedir)ftp -n "$host" > ${basedir}/../ftp.log 2>&1 <<EOF user $id $pw binary cd $remotedir put $backupfile bye EOF |
- 使用 rsync 上傳備份數據
另一個更簡單的方法就是透過 rsync ,但是你必須要在你的服務器上面取得某個帳號使用權后,并讓該帳號可以不用口令即可登陸才行!這部分得要先參考服務器篇的遠程連線服務器才行!假設你已經配置好 dmtsai 這個帳號可以不用口令即可登陸遠程服務器,而同樣的你要讓 /backup/weekly/整個備份到 /home/backup/weekly 底下時,可以簡單這樣做:
| [root@www ~]# vi /backup/rsync.sh #!/bin/bash remotedir=/home/backup/ basedir=/backup/weekly host=127.0.0.1 id=dmtsai# 底下為程序階段!不需要修改喔! rsync -av -e ssh $basedir ${id}@${host}:${remotedir} |
由於 rsync 可以透過 ssh 來進行鏡像備份,所以沒有變更的文件將不需要上傳的!相當的好用呢!好了!大家趕緊寫一個適合自己的備份 script 來進行備份的行為吧!重要重要喔!
災難復原的考量
之所以要備份當然就是預防系統掛點啦!如果系統真的掛點的話,那么你該如何還原系統呢?
- 硬件損毀,且具有完整備份的數據時
由於是硬件損毀,所以我們不需要考慮系統軟件的不穩定問題,所以可以直接將完整的系統復原回去即可。首先,你必須要先處理好你的硬件,舉例來說,將你的硬盤作個適當的處理,譬如建置成為磁盤陣列之類的。然后依據你的備份狀態來復原。舉例來說,如果是使用差異備份,那么將完整備份復原后,將最后一次的差異備份復原回去,你的系統就恢復了!非常簡單吧!
- 由於軟件的問題產生的被攻破資安事件
由於系統的損毀是因為被攻擊,此時即使你恢復到正常的系統,那么這個系統既然會被攻破,沒道理你還原成舊系統就不會被再次攻破!所以,此時完整備份的復原可能不是個好方式喔!最好是需要這樣進行啦:
軟件資安事件造成的問題可大可小,一般來說,標準流程都是建議你將出問題的系統備份下來,如果被追蹤到你的主機曾經攻擊過別人的話,那么你至少可以拿出備份數據來佐證說,你是被攻擊者,而不是主動攻擊別人的壞人啊!然后,記得一定要找出問題點并予以克服,不然的話,你的系統將一再地被攻擊啊!那樣可就傷腦筋羅~
重點回顧
- 備份是系統損毀時等待救援的救星,但造成系統損毀的因素可能有硬件與軟件等原因。
- 由於主機的任務不同,備份的數據與頻率等考量參數也不相同。
- 常見的備份考慮因素有:關鍵文件、儲存媒體、備份方式(完整/關鍵)、備份頻率、使用的備份工具等。
- 常見的關鍵數據有:/etc, /home, /var/spool/mail, /boot, /root 等等
- 儲存媒體的選擇方式,需要考慮的地方有:備份速度、媒體的容量、經費與媒體的可靠性等。
- 與完整備份有關的備份策略主要有:累積備份與差異備份。
- 累積備份可具有較小的儲存數據量、備份速度快速等。但是在還原方面則比差異備份的還原慢。
- 完整備份的策略中,常用的工具有 dd, cpio, tar, dump 等等。
本章習題
( 要看答案請將鼠標移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- 挑戰題:嘗試將你在學習本書所進行的各項任務備份下來,然后刪除你的系統,接下來重新安裝最新的 CentOS 5.x ,再將你備份的數據復原回來,看看能否成功的讓你的系統回復到之前的狀態呢?
- 挑戰題:查詢一下何謂企鵝龍軟件,討論一下該軟件的還原機制是屬於累積備份?還是完整備份?
- 常用的完整備份 (full backup) 工具命令有哪些? dump + restore, dd, cpio 搭配 find 等軟件。
- 你所看到的常見的儲存設備有哪些? Floppy, Mo, Zip, CD-RW, DVD-RW, 外接式 U盤 硬盤, Tape, 外接式儲存陣列 (RAID),額外的儲存架構,如 SAN, NAS 等。
參考數據與延伸閱讀
- 注1:維基百科的備份說明:http://en.wikipedia.org/wiki/Incremental_backup
- 注2:關於 differential 與 incremental 備份的優缺點說明:
http://www.backupschedule.net/databackup/differentialbackup.html - 注3:一些備份計畫的實施:http://en.wikipedia.org/wiki/Backup_rotation_scheme
2002/07/06:第一次完成
2003/02/12:重新編排與加入 FAQ
2005/10/25:舊版的數據已經移動到 此處 。
2005/10/25:主要是添加了一些簡單的說明,以及將一些不合時宜的數據拿掉而已!
2009/07/15:將原本的基於 FC4 的文章移動到 此處。
2009/09/18:加入簡單的幾個題目練習
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0580backup.php
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第二
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第二