Ubuntu桌面生存指南(4):Ubuntu系統備份恢復升級策略

發表於2012-12-11

注:本文來自文章作者張佳偉@ghosert)的投稿(原文連結)。

繼續上篇的內容,在最初使用開發者系統的時候,無論是構建Ubuntu系統基礎設施,還是安裝配置各種軟體都是一個費心勞力的過程:由於開發者系統是一個需要付出腦力成本換取高效率的系統,它因此被設計成一個高可定製又極度自由的系統,暫且不說你可以自由地從編譯原始碼的方式配置安裝整個作業系統,即便是大多數的常用軟體例如:vi,emacs等等通過變更配置檔案都可以玩出無數的操作方式,使用者需要花費時間去變更嘗試這些配置,使得操作這些軟體的方式最符合自己的習慣,達到高效的目的。因此經過一段時間調配,每一個Linux使用者都會有一個自己專屬的高效系統,有1000個使用者就會有1000個專屬高效系統,每一個系統上安裝的軟體和配置方法都各不一樣,並且每一個使用者在打造這個專屬系統的過程中都會耗費大量的精力和時間。

丟失自己的專屬系統,就意味著時間精力的丟失,對於一個長期使用Linux的使用者更是如此:使用者已經在這個系統上積累太多軟體和操作習慣,如果因為系統崩潰而需要從頭開始配置一個全新的系統,在事前又沒有任何備份措施,那剩下的簡直就是一場災難。這也是有經驗的Linux使用者很注意備份的原因。介於此,筆者在本章節結合自己的一些經驗來介紹一下Ubuntu系統的備份恢復以及升級策略:

1.指令碼恢復策略 — 完全格式化更新

2.指令碼恢復策略 — 沿用/home分割槽資料

3.tar包全盤備份恢復策略

4.遷徙wubi系統到物理分割槽

5.Ubuntu系統升級策略

 

這些備份恢復策略不僅適用於Ubuntu,對於使用其他發行版的Linux使用者,同樣可以參閱以下內容,對其中的步驟稍加改造即可。

ubuntu logo

 

指令碼恢復策略 — 完全格式化更新

我們前面介紹過Ubuntu系統的一個特色就是可以從自己的源通過apt-get命令來下載需要的軟體,因此使用者可以建立一個指令碼檔案,通過寫入常用的apt-get install命令的方式來備份需要的軟體(參見上一篇中的在雲端儲存一個軟體安裝的指令碼部分),同時在這個指令碼檔案中加入某些需要手工干預的個性化配置的具體步驟,例如:更改啟用拼音輸入法快捷鍵的具體步驟(大多數拼音輸入法搶佔了ctrl+space,如果不更改,開發者使用者就無法在諸如Eclipse這樣的IDE裡使用這個快捷鍵啟用智慧程式碼提示的功能),又例如:你可能對 Firefox 的預設字型並不滿意,需要替換一下,這些詳細的步驟都應該以註釋的形式記錄在這個指令碼里,如果這些步驟實在太過繁瑣,也可以在配置以後,找到對應的配置檔案,直接儲存在Dropbox裡,方便今後直接從雲端恢復這些配置到本機。例如,你自己定製化了Vim的行為並且加裝了Vim外掛,那你只需要將~/.vimrc ~/.vim備份在雲端即可。

所以一旦建立了這樣一個指令碼檔案,即使需要重灌系統或者面對一臺全新的計算機,只需要執行這個指令碼檔案,檢視指令碼里的註釋記錄,就可以保證軟體沒有丟失,配置軟體的步驟可以還原,重要的資料都被儲存在雲端:Dropbox(二進位制檔案),GitHub(文字檔案,以後詳述)。自然這個策略的前提是:你在使用系統的時候必須保持勤於更新指令碼的習慣,用於日後的系統恢復。

優點

這種方法比較適用於希望將現有系統遷徙到更高版本的情形。例如:遷徙 Ubuntu 10.04 至 12.04的時候,在格式化系統,重新安裝12.04以後,使用者就可以通過這個指令碼恢復原先計算機的面貌。並且由於Ubuntu源裡的軟體版本和Ubuntu發行版版本之間存在對應關係(例如:10.04源裡的firefox版本可能在某個版本以後不再提供更新),如果12.04在目前還是一個比較新的LTS版本,那麼就可以保證在12.04上使用apt-get install安裝的軟體版本都比較新。同時如果你大多數的配置恢復是通過還原具體步驟完成的,那麼就有機會檢查這些步驟在新版本軟體上是否仍舊適用。也不會出現從雲端恢復舊版本軟體的配置到新版本軟體以後無法適用的狀況,當然理論上這也不是一個太大的問題,Linux下許多著名的軟體都非常尊重使用者的舊有習慣,輕易不會變更自己讀取配置檔案的方式,大多數情況下恢復舊有軟體的配置到新版本不會出現太多狀況。

缺點

由於沒有采用全盤備份的方式,這種備份恢復策略的缺點同樣明顯,儘管可以保證在升級以後,計算機的原始面貌不會有任何丟失,但是相對來說,手動恢復許多軟體的配置仍舊需要投入相當的時間和精力,即使在備份策略完善的前提下,筆者通過這種方式將Ubuntu 10.04升級到12.04的時候仍然花費了整整5天的國慶長假。因此個人建議只在每隔兩年釋出一次的LTS版本出現的時候才做這樣的升級,以此保證計算機的全新狀態。

 

指令碼恢復策略 — 沿用/home分割槽資料

我們前面提到過獨立/home分割槽的原因在於使用者大多數重要的個性化配置和資料都儲存在這個目錄,以至於Ubuntu官方的雲端備份軟體Ubuntu One在預設情況下就是協助使用者備份/home分割槽所在的資料到雲端。因此如果可以在重灌系統的時候沿用這個分割槽的資料,無疑可以為我們節省大量的資料恢復和配置恢復的時間,更何況某些資料如電影,照片可能佔據幾百個G的空間,沒有獨立/home分割槽,使用者在重灌系統,格式化分割槽的時候根本就沒有可以容納那麼大資料的第二個媒介做臨時的備份,除非你有第二塊硬碟。另一方面在恢復系統的時候因為配置和資料仍舊在/home目錄,你只需要執行前面提到的指令碼重新安裝軟體即可,無需手工還原配置軟體的步驟。

為了使用這種恢復策略,在首次安裝Ubuntu的時候可以參考上一篇部落格的分割槽推薦方案獨立出/home分割槽,在使用系統的過程中時刻保證只在這個目錄下儲存自己重要的資料和配置,如果一定有一些特例狀況也一定要在恢復指令碼中加以記錄,在雲端有另外的備份措施。只要你的/home分割槽沒有被損壞,再次恢復的代價就相當的小。重灌系統的時候可以格式化 / 目錄所掛載的分割槽,但是記得在以下Installation type介面上千萬不要選擇格式化 /home 所在的分割槽,否則就無法沿用這個分割槽的資料。

installation-type

優點

顯而易見,這種策略很經濟,省去很多的麻煩,是非常常見的系統恢復策略,同樣也適用於在重新安裝一個高版本的Ubuntu以後恢復計算機原先的面貌,例如從10.04LTS升級至12.04LTS。

缺點

沿用過去/home分割槽的資料畢竟在保留了資料的同時也保留了舊有的配置和目錄結構,如前所述雖然在匹配新版本軟體的時候,這不會是一個太大的問題,但是一旦出現狀況,例如兩個軟體版本之間的差異過大,導致新版本無法正常工作在舊配置或者目錄結構上,使用者要有一定解決問題的能力,仍然需要通過檢視指令碼註釋手動還原配置步驟。

 

tar包全盤備份恢復策略

上述兩種恢復策略免不了還是需要在分割槽以後,插入啟動U盤或者光碟,從頭開始安裝作業系統本身,並且安裝完作業系統以後繼續安裝軟體,恢復配置,熟悉Windows下大名鼎鼎的Ghost的同學一定在想,Ubuntu下是否也有這種一站式的全盤備份方案:無論計算機系統當前的狀態,我可以對整個系統的每一個位元組都做資料備份,當需要恢復系統的時候甚至都不必再次安裝Ubuntu本身就可以把當初備份的那個狀態復原到新的機器或者格式化以後的當前機器上,甚至是虛擬機器上。這也是一般公司的IT部門在幫員工重灌機器的時候最常用的策略,沒有其它原因,就是因為這種方式最快捷。備份恢復一個系統的時間不會超過一個小時。

優點

最迅速快捷的備份恢復方式,可以通過燒錄母盤的方式在各處恢復自己的備份。你既可以在一臺物理機上做備份恢復到另一臺物理機或者虛擬機器,你甚至也可以將一臺虛擬機器裡的備份恢復到一臺物理機或者另一臺虛擬機器上,非常的靈活方便。

缺點

採用這種方式的一個問題在於,如果需要還原的目標機器和做備份的源機器硬體配置差異過大,可能會發生恢復以後某些驅動程式工作不正常的狀況,例如計算機沒有聲音,或者圖形解析度特別低,無法聯網等狀況。這個時候需要使用者自行嘗試解決。第二個問題在於由於全盤備份,意味著如果你備份的是10.04的系統,那你也只能恢復到10.04的系統,這種恢復方式沒有辦法升級你的Ubuntu到更高的版本。第三個問題:一定的學習實踐成本,以下就我個人的實踐經驗提供tar包全盤備份的基本步驟和原理,也許你在網路上可以找到更方便的指令碼或者備份軟體替代這些工作,但是如果遇到問題回到這些具體的步驟和原理可以幫助你瞭解到底是哪裡出了問題,怎麼解決這些問題。

1. 全盤備份

得益於Linux系統強大的命令列和系統設計,全盤備份一個Ubuntu系統的基本原理相當簡單:使用tar命令打包必要的檔案目錄即可,也就是說備份系統和備份資料基本沒有區別。

新建一個指令碼檔案BACKUP_SYSTEM.sh,在其中新增以下內容:

這兩條命令首先在home目錄新建了一個BACKUP_SYSTEM的目錄用於放置備份後的tar包。隨後tar命令的 –exclude 引數排除了某些你認為沒有必要進行備份的目錄,例如 Download, Templates 目錄,同時我的案例裡也排除 VirtualBox VMs 這個目錄,因為安裝虛擬機器以後,Virtualbox所在的這個目錄會極度膨脹,我們沒有必要把幾十個G的虛擬機器映象全都備份進tar包。-jpcvf 這個命令中:j 表示使用 bzip2 格式打包,這是一種壓縮耗時但是壓縮比很高的格式,經常用於壓縮大資料。p 表示在製作tar包的時候保留目錄結構的使用者許可權資訊,最大程度的對檔案系統做現場保護。cvf 表示建立一個壓縮包,並且列出詳細的壓縮過程。~/BACKUP_SYSTEM/Ubuntu-12.04-20121114-home-pc.tar.bz2 指定了壓縮包的檔名,我個人偏向於在這個檔名裡寫清楚版本資訊,打包的時間和在哪一臺機器上做的備份,有助於今後做恢復操作。這條命令的最後有一個 “/” 字元就是表示從本機的根目錄開始做全盤備份,你本機的所有東西除了被 –exclude 的目錄都會被打進最終的壓縮包。即使是全盤備份,事前一定要甄別清楚到底哪些目錄是沒必要備份的,否則壓縮和解壓過程都會變得無法接受的漫長。

開啟終端執行 sh BACKUP_SYSTEM.sh 開始備份。取決於使用者備份資料的多少和硬體配置的好壞,備份的時長會有所不同。在筆者本機上,去除非必要目錄的全盤備份花費了大約1個小時,把 40G 的資料壓縮在 9G 大小的壓縮包內。如果你想時刻了解壓縮的進度,可以開啟另一個終端,執行以下命令:

這個watch命令用於每隔5秒執行一遍隨後的 ‘ls -alh ~/BASHUP_SYSTEM/’ 幷高亮出兩次執行之間的不同,因此你可以觀察到正在製作中的壓縮包大小的變化。

2. 全盤恢復

恢復系統的步驟會比備份繁瑣許多,以下是主要步驟,我會盡量解釋每個步驟的含義。

●確保事先備份的壓縮包在某個分割槽可以被訪問到,這裡假設你的備份壓縮包位於/home/jiawzhang/BACKUP_SYSTEM/UBUNTU-2012-02-05.tar.bz2

●通過Ubuntu的啟動U盤或者光碟重啟電腦,進入試用Ubuntu的模式。

●在試用模式的Ubuntu中開啟終端,執行命令

切換至 root 許可權,取得 root 許可權以後類似 fdisk -l, df -h 這些命令才能返回準確的結果。

●執行命令

開啟Linux下的分割槽軟體gparted,如果提示需要安裝,則執行

之後可以按照上一篇部落格的分割槽推薦方案進行分割槽,如果你對自己的分割槽已經滿意,也可以略過分割槽的步驟,只需要格式化 / 所在分割槽即可,/home 所在分割槽因為用於存放備份壓縮包,可以選擇暫時不做格式化。

●解壓備份壓縮包

使用U盤啟動到live Ubuntu模式幷不會實際上掛載你的物理分割槽,所以這裡需要使用mount命令手動掛載你剛才格式化以後的 / 分割槽並且將壓縮包解壓匯入。新建兩個目錄/tmp/root /tmp/root2,將分割槽/dev/sda1 /dev/sda2分別掛載到這兩個目錄。確保sda1是系統恢復以後掛載 / 目錄的分割槽,sda2是原來/home目錄掛載的分割槽,其中有我們需要的備份壓縮包存在。掛載完畢以後,/tmp/root 對應了 sda1 分割槽,/tmp/root2 對應了 sda2 分割槽,進入 /tmp/root2/jiawzhang/BACKUP_SYSTEM 就是我們原先的備份儲存的位置。執行 sudo tar -jpxvf xxx.tar.bz2 -C /tmp/root 做解壓操作,jpxvf 中的 x 指解壓,-C /tmp/root 則指定了需要解壓的目標目錄,這裡實際上就是 sda1 分割槽所在的根目錄。完成這個操作以後,所有的資料就已經被還原到 sda1 分割槽。

你應該可以檢視到類似 /tmp/root/etc, /tmp/root/home/ 這樣的目錄,它們對應的目錄就是原先的 /etc, /home。我們下面的步驟會指定啟動系統的時候把 sda1 分割槽掛載回 / 目錄,sda2分割槽掛載回 /home 目錄,這樣在系統的目錄結構就完全恢復了。另外由於/home目錄對應的 sda2 分割槽之前沒有進行過格式化操作,此時你可以選擇刪除/tmp/root2/jiawzhang/下除了BACKUP_SYSTEM以外的所有資料,然後執行

將剛才從備份壓縮包中解壓出的/tmp/root/home部分的資料重新拷貝到/tmp/root2,然後刪除/tmp/root/home,即完成了從sda1分割槽轉移恢復後的home資料到sda2分割槽的工作:sda2 分割槽是過後用來掛載 /home 目錄的分割槽,理應把home下的資料恢復在這個分割槽。

●恢復分割槽的 GRUB/MBR 資訊

經過格式化,分割槽等等步驟以後,即便你是在現有硬碟上恢復自己的系統,分割槽的 uuid 都可能已經被改變,因此當初備份在壓縮備份包裡的啟動引導資訊諸如:GRUB/MBR都已經不再和目前實際的資訊相匹配,我們因此要做修復工作。

仍舊在 live ubuntu 模式下執行:

下載執行啟動修復軟體 boot-repair,啟動後點選預設推薦方式即可。如果想了解這個軟體具體做了哪些工作,可以在這裡參看手工修復的步驟。不過由於筆者並未驗證其正確性,不能保證一定可用。

再次檢視各個分割槽的 uuid 資訊,確保這些 uuid 和 /tmp/root/etc/fstab 中使用的 uuid 一致, 需要掛載的 /, /home,swap 在 /tmp/root/etc/fstab 中也和相應的 uuid 匹配。因為我們恢復的備份使用的是舊有的 uuid 資訊,如果不一致:手工開啟/tmp/root/etc/fstab這個檔案做更正,主要工作就是替換其中的 uuid 字串和上述命令中的一致。在啟動系統的時候,/etc/fstab 這個檔案指定了分別掛載sda1 sda2 sda3分割槽到 /,/home,swap,如果沒有正確的 uuid 以及分割槽目錄掛載匹配,系統就無法正確啟動。大家可以大致參看一下 /etc/fstab 這個檔案的內容片段:

另外如果你加裝第二塊硬碟以後也可以通過 ‘ls -al /dev/disk/by-uuid’ 檢視新硬碟的 uuid,幷新建這塊硬碟分割槽對應的掛載目錄以後,將這些資訊一併寫入 /etc/fstab,這樣,系統在啟動以後就會自動載入你的新硬碟分割槽。

●重建系統目錄

這些目錄就是我們當初做備份時加在 –exclude 引數後面的目錄。

記得一定要賦予 /tmp/root/tmp 777 許可權,這是一個系統級別的臨時目錄,需要完全的讀寫許可權,否則你的系統無法啟動成功,我自己在最初實踐全盤備份恢復的時候就因為忽視了這個小細節,導致屢次恢復系統失敗,差點放棄。

●重啟計算機

關閉計算機,幷從硬碟重啟計算機,一切順利的話,全盤恢復已經成功,至此,你可以別無二致的使用備份當時的專屬高效系統了。

全盤備份恢復的操作對初學者來說有一定的風險,如果擔心操作不當丟失資料,可以先在虛擬機器環境裡練習,筆者實踐過這種方法對虛擬機器一樣適用。

 

遷徙wubi系統到物理分割槽

另外有一些使用者最初是在Windows上通過Wubi的方式試用Ubuntu,最後決定徹底拋棄Windows的時候才發覺已經在Wubi裡積累了太多的軟體和配置,重灌系統的代價很大,筆者自己最初也是在Wubi系統中操練Ubuntu,一年半以後才正式遷移到獨立分割槽,徹底告別Windows。所以這裡簡要介紹一下如何將一個Wubi系統移植到物理分割槽。

●新建分割槽

在Windows下使用分割槽工具從現有的分割槽中劃分出兩個分割槽,假設分別叫做 /dev/sda5 用作安裝系統, /dev/sda6 用作 swap 分割槽。(如果需要獨立的/home分割槽,可以再多分一個)

●進入Wubi系統

●下載執行移植指令碼

點選下載Wubi移植指令碼後解壓執行

如果有獨立的/home分割槽,讀者可參考前面解壓備份壓縮包小節中恢復/home分割槽資料的部分。

●重啟計算機

一切順利的話,系統會出現Grub引導選單,你可以通過選擇選單選擇進入Windows還是物理分割槽上的Ubuntu系統,這個Ubuntu系統的內容和你的Wubi系統也同樣地別無二致。

這個指令碼的使用方法和更新也在持續進行中,目前支援從Ubuntu 8.04 到 12.04 之間的所有版本。這裡只是做了一些摘要,讀者可以自行訪問Ubuntu Forums檢視這個指令碼更多的用法和其它詳細資訊。

 

Ubuntu系統升級策略

頻率

Ubuntu官方一直以來每隔半年就會發布自己的新版本,對於使用者來說實質上是一個不小的負擔,往往還沒有適應現在的版本,新的版本又推送過來,所以我個人的意見是不用追新,只升級兩年一次的LTS版本即可。

時機

我們之前還說過Ubuntu某個版本源裡的軟體版本都會和Ubuntu自己的版本存在對應關係,例如:Ubuntu 10.04上的輸入法軟體iBus只會更新到1.2版本,如果你想使用最新的1.4版本,要麼自己去編譯安裝,要麼設法說服軟體作者或者其它愛好者打包更新Ubuntu10.04源裡的iBus版本或者找第三方源,相當的不方便。對於一個太早的發行版很多軟體作者沒有動力和熱情再去為其做相容性開發,測試和更新源的工作。所以當你發現自己手上的發行版源裡的軟體都過於腐舊,互相之間出現越來越多的相容性問題的時候,這也是一個提醒你應當對現有系統做一次升級的訊號。舉我自己的例子,兩個月前決定從10.04升級到12.04就是因為10.04下的拼音輸入法fcitx和firefox較新版本之間存在衝突,總是導致頁面假死。詢問fcitx的源打包者又無果:不願意更新10.04下的fcitx版本解決這個問題,才有了這次升級。

方式

雖然Ubuntu自己也提供了’sudo apt-get dist-upgrade’這樣的命令做發行版之間的大升級,但是從一些使用者反饋來看效果並不理想,採用這種方式升級的系統總會存在各種問題。因此還是建議讀者可以參照本文前面的備份恢復策略進行跨大版本的升級,一般這樣的升級不會有太多問題,除非某些軟體的差異過大,使用者自行適應一段時間即可。另一方面在 Ubuntu Server 上做大版本升級的時候,我又推薦使用’sudo apt-get dist-upgrade’這種方式,其一沒有GUI軟體的升級會更平滑,其二以我自己的實踐:在 Server 端做這樣的升級會相當順利,執行apt命令以後,只用了半小時就完成了Ubuntu版本的升級和全部軟體的更新。

未完待續……

 

前三篇:

Ubuntu桌面生存指南(1):選擇 Linux

Ubuntu桌面生存指南(2):Ubuntu桌面體驗簡介

Ubuntu桌面生存指南(3):構建Ubuntu系統基礎設施

 

相關文章