沒那么神秘:Linux下生存實錄(7) |
發(fā)布時間: 2012/9/8 15:14:07 |
四、系統(tǒng)(QQ:小默862693539)管理 linux系統(tǒng)(QQ:小默862693539)管理是很大一個領域,有專門的一群從業(yè)者靠此養(yǎng)家糊口,我無法在此進行詳細講解,僅以幾類常規(guī)操作拋磚引玉。 1、數(shù)據(jù)備份。隨著對電腦的依賴,我們多多少少積累了些重要資料,可以說這些資料是形成我們"個人能力"的主要來源,一旦丟失,多年的工作經驗、生活點滴均將化為煙云,這是我們一筆無形的財富。硬盤老化、操作系統(tǒng)(QQ:小默862693539)異常、電腦遺失等等都會導致資料丟失,為避免損失,應該養(yǎng)成定期備份數(shù)據(jù)的習慣。 就我個人經驗來看,數(shù)據(jù)備份要注意以下幾點: 1)存放備份的介質。必須要有一塊獨立外置硬盤(500G移動硬盤外套硬盤盒)用于存放備份數(shù)據(jù),而不是在電腦內置硬盤上的一個分區(qū)備份到另一個分區(qū),否則即便有備份,一旦內置硬盤出問題,原始數(shù)據(jù)和備份數(shù)據(jù)都將掛掉; 2)內置硬盤的分區(qū)。電腦內置硬盤在分區(qū)規(guī)劃時,應單獨創(chuàng)建一個文件系統(tǒng)(QQ:小默862693539),專門用于存放需要定期備份的數(shù)據(jù)(這里的幾個說法容易混淆,概念澄清下,外置硬盤中用于存放備份而來的分區(qū)不妨稱之為backup分區(qū),內置硬盤中用于存放我們重要資料的需要被定期備份出去的分區(qū)稱之為data分區(qū)); 3)其他項: A)全備,每次將所有數(shù)據(jù)資料全量備份而非僅備有差異部分(非增備); B)兩個快照,任何時候應保留上上次和上次的兩個備份快照,完成本次備份后再刪除上上次備份快照,避免備份過程出問題導致歷史備份丟失; C)直備,保持數(shù)據(jù)資料完整目錄結構,直接備份到外置硬盤的backup分區(qū),說白了就是直接復制,不進行任何再加工; D)月備,數(shù)據(jù)備份的周期要視你具體數(shù)據(jù)量和數(shù)據(jù)更新頻率而定,個人而言,100g的數(shù)據(jù)量,備份耗時差不多25分鐘,我一般每月備份一次(小提示,將工作、生活上需要定期做的事項按不同執(zhí)行周期分類梳理到一張電子表格中,不時看看,你會發(fā)現(xiàn),原來我是那么井井有條--引至《愛我何需理由》,作者:自戀小王子(這是筆名,真名吳鳳輝,嘎嘎嘎嘎~):-)。 在備份軟件方面,無須其他特殊軟件,只要有tar、bzip2、gzip、zip、unzip幾個常見命令即可。下面依次以直接打包備份、打包壓縮備份、打包壓縮帶進度備份三種方式,由淺入深介紹具體備份操作。 1)直接打包備份。為了保持目錄結構,通過采用打包命令tar進行備份。比如,希望將/data目錄備份到名為backup_120g的外置硬盤上,備份文件命名為data_backup.tar,那么完整命令及參數(shù)如下:
其中,-p表示完全保持/data目錄下所有文件的文件屬性,-cf表示需要創(chuàng)建一個備份文件且命名為backup.tar。 數(shù)據(jù)備份的時間點往往是我們最為關心的信息,所以習慣上備份文件名應該加上時間戳。linux的date命令能根據(jù)不同參數(shù)生成指定日期信息,完整的命令及參數(shù)如下:
其中,包裹命令date的"`"符號是tab鍵正上方、1鍵左邊那個鍵,而非單引號。以指示shell優(yōu)先執(zhí)行整個命令行中該符號對包裹的命令(即,date +%m-%d)。 如果外置硬盤空間有限,/data中又包含部分不那么重要的數(shù)據(jù)(如,臨時目錄tmp,與windows虛擬機同享文件的目錄share_folder),那么備份時可以將這些目錄排除掉,通過tar的--exclude參數(shù)即可實現(xiàn):
其中,--exclude參數(shù)語法非常特殊(其他命令中的該參數(shù)也是如此),注意幾點:A)命令中的所有參數(shù)必須為絕對路徑而非相對路徑,且不能用~等等縮寫字符;B)所有路徑最后不能以"/"結尾。 2)打包壓縮備份。如果排除了部分不重要數(shù)據(jù)后外置硬盤空間仍然緊張,可以考慮對打包文件進行壓縮。linux上常見的壓縮命令包括gzip和bzip2,由于兩者采用的不同壓縮算法,導致前者壓縮率較低但速度較快,后者壓縮率較高但速度慢,但相關用法差不多,請按需擇優(yōu)選用(本例以gzip為例,若需bzip2則直接替換即可)。打包和壓縮是兩個獨立操作,寫兩條命令多麻煩!不用,借助linux強大的管道和重定向機制,可以在一條命令中以非常自然的方式實現(xiàn):
別被這些奇怪符號嚇著,管道符("|")用于實現(xiàn)"打包一點壓縮一點",重定向符(">")用于實現(xiàn)"壓縮一點寫一點到備份文件中",這樣,串起來就是"不停打包、不停壓縮、不停寫文件"的流水作業(yè),理解了吧!其中,上個命令中-cf后面跟的是備份文件名,本命令中改為"-",就在告訴shell說,"先別急著寫文件,你(shell)把我(tar)剛生成的數(shù)據(jù)流傳遞給后面負責壓縮的兄弟(gzip),它知道該寫哪個文件,謝謝哈~"。說明兩點,A)你是否注意到備份文件的擴展名為".tar.gz",不僅本例,涉及l(fā)inux主題的網(wǎng)站提供的下載幾乎都采用這種命名方式,這叫命名約定,通常來說,如果僅打包不壓縮則擴展名為".tar",如果打包且采用gzip壓縮則擴展名為".tar.gz",如果打包且采用bzip2壓縮則擴展名為".tar.bz"或".tar.bz2";B)其實tar命令使用--gzip和--bzip2參數(shù)可以直接實現(xiàn)打包壓縮,無須像上例,采用管道和重定向來實現(xiàn),但,為精確顯示整個備份進度率,必須采用這種變通方式,請接著看。 3)打包壓縮帶進度備份。要顯示備份進度,必須得事前知道待備份數(shù)據(jù)(/data)的大小,可通過du命令實現(xiàn):
其中,-s表示計算/data整個目錄包括子目錄下所有文件的大小總和,-k表示計算結果以k為單位(或者m、g、t等)顯示,單位的精度越高,在計算百分比進度時就越精確。 待備份目錄大小知道了,如何計算進度?上面介紹過,打包、壓縮、寫文件都在借助管道傳遞數(shù)據(jù)流,如果能查看到管道中已經傳遞的數(shù)據(jù)量大小,用此大小除以總大小不就能顯示出當前備份進度了么?噹噹噹噠~,pv就可以,顧名思義pv就是pipe viewer,明白了吧,管道查看器,它是監(jiān)測管道數(shù)據(jù)的超級武器,沒事多用用、系統(tǒng)(QQ:小默862693539)更健康。
其中,xxx部分請用前面du命令輸出結果(待備份目錄/data總大。⑹止ぬ砑訂挝籯。效果如下: (可視化備份進度) 好了,到此包括打包、壓縮、排除不重要目錄、打時間戳、顯示進度等特性在內的linux常規(guī)備份操作就介紹完了,一條命令啰哩吧嗦說了一大堆,看來的確是老了(小吳,好好干,路還長)。內容是多了點,一次沒看明白就多看幾次,其實也不復雜,我們一起看看簡化模型吧(啰嗦的平方就是在下,謝謝,:O)。
有備份就有恢復,相對備份操作而言,恢復就太簡單了。仍用tar命令,參數(shù)不同而言:
其中,-x表示執(zhí)行解壓解包操作,采用哪種解壓算法由tar自行偵測后決定,-v表示顯示以及解壓出的文件列表,-f表示該參數(shù)后面緊跟的就是待解壓的文件名,-C表示該參數(shù)后面緊跟是解壓后的文件存放路徑。 這次真的說完了,沒想到我對樸實的tar如此動情,不知不覺談了這么多關于她的點滴。在介紹她的同時,我也再次品味到了unix(linux的大哥)哲學——分工明確、各司其職、齊心協(xié)作。(tar哭著說,你娶我是想更接近我哥)。 2、碎片整理。要理解碎片,必須先了解硬盤基本結構和硬盤讀寫機制兩個概念。之后,再看看不同操作系統(tǒng)(QQ:小默862693539)寫文件的策略,你自然會明白碎片在linux下是啥東東。 硬盤基本結構。硬盤內部是由多張磁片和一個機械臂組成,磁片上最小單位是扇區(qū),一旦硬盤停止工作后(如,關機),機械臂將復位到第一個扇區(qū)處。對于扇區(qū)而言,不論寫入數(shù)據(jù)有多小,一旦占用了某個扇區(qū)后,其他數(shù)據(jù)就不能再寫入通過扇區(qū),即便該扇區(qū)還有空余空間(這就是為什么我們說一個大文件要比拆分為多個小文件的合計要小一些的原因)。每次讀或寫操作之前,機械臂先移動尋找到要訪問的扇區(qū),這個過程稱之為“尋址”,由于機械臂移動是個物理動作,如果讀寫操作老是在不同扇區(qū)間不停移來移去,勢必會增長讀寫操作耗時。 硬盤讀寫機制。我們?yōu)槊總扇區(qū)編個號,最開始的是0號扇區(qū)、接著是1號、然后2號、以此類推,任何操作系統(tǒng)(QQ:小默862693539)都會嘗試盡量將文件寫入靠前的扇區(qū),若已被占用則嘗試下個扇區(qū),直到找到空閑扇區(qū),這樣,理想情況下,整個硬盤應該是先用完靠前的空間。 了解了基礎概念后,我們假定有A、B、C三個文件,依次連續(xù)占據(jù)0~3號扇區(qū)、4~7號扇區(qū)、8~9號扇區(qū),如下圖所示: (碎片:初始狀態(tài)) 這時,用戶編輯了文件B,增加了大量內容,導致文件B體積增大了2個扇區(qū)的大小,windows寫文件時采用的策略——“可以接受兩地分居”,即,將增加部分內容寫入最靠前空閑的10號和11號兩個扇區(qū),如下圖所示: (windows寫文件策略) 以后,一旦用戶需要訪問文件B,系統(tǒng)(QQ:小默862693539)先尋找到4號扇區(qū),將4~7號扇區(qū)讀入內存,再尋找到10號扇區(qū),將10~11號扇區(qū)讀入內存,最后將這6個扇區(qū)合并供用戶使用。設想一下,剛裝好系統(tǒng)(QQ:小默862693539)時硬盤上有5000個文件,其中1000個在后來系統(tǒng)(QQ:小默862693539)使用過程中被人為或程序調整過大小,那么這1000個文件個個都被截成幾段,這就形成了“碎片”,文件越多、文件寫入次數(shù)越多,產生的碎片就越多。 linux寫文件采用的是與windows恰好相反的另一個策略——“分開就不是家庭”,即,將文件B后面緊挨著的文件C向后移動兩個扇區(qū),移動后文件C就從先前的8~9號扇區(qū)變成10~11號扇區(qū),8~9號扇區(qū)空出來用于存放文件B增大的部分,如下圖所示: (linux寫文件策略) 顯然,按linux的策略,無論硬盤中有多少文件、寫入多少次,系統(tǒng)(QQ:小默862693539)永遠不可能產生碎片。再回到前面的問題,linux碎片整理代表什么?代表沒事找抽~~ 有童鞋問,每次我寫完文件要保持時,系統(tǒng)(QQ:小默862693539)都要移動那個文件后面的所有文件,豈不是更慢?移動是肯定的,但linux也不會那么弱智,至少有三種輔助手段緩解這個問題:A)數(shù)據(jù)搬遷不一定在我們編輯完文件后立馬執(zhí)行(即便已經關閉了文件),系統(tǒng)(QQ:小默862693539)會結合CPU、內存、IO等資源使用情況,綜合判斷何時搬遷,以減少大規(guī)模移動數(shù)據(jù)對用戶帶來的不好感知;B)linux會記錄下經常被更改的文件,在適當時候將這些文件后面緊跟的文件向后移動,以騰出空間讓這些頻繁更改的文件在下次體積增大時可以直接使用連續(xù)扇區(qū);C)系統(tǒng)(QQ:小默862693539)采用dd命令在底層進行數(shù)據(jù)搬遷,效率不是cp等輩可觸及的。linux通過這三種方式,既實現(xiàn)了消除碎片,又讓用戶對整個過程感知最小化。 其實,我們可以算本帳。windows是"今朝有酒今朝醉",即,這種方式在寫文件的當下感覺是最直接,但后續(xù)每次訪問這個文件都要不同移動機械臂;而linux是"今天的短暫擁堵是為了明天長久的通暢"(引至成都BRT建設宣傳語),即,在寫文件當下是要慢些,但后續(xù)每次訪問就會一致性讀入。兩種方式,隨著文件數(shù)目的增加,個人覺得后者更優(yōu)! 本文出自:億恩科技【mszdt.com】 |