[關閉]
@ghosert 2014-11-02T14:46:29.000000Z 字數 9040 閱讀 14136

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

Ubuntu


Ubuntu系統備份恢復升級策略

繼續上篇的內容,在最初使用開發者系統的時候,無論是構建Ubuntu系統基礎設施,還是安裝配置各種軟件都是一個費心勞力的過程:由于開發者系統是一個需要付出腦力成本換取高效率的系統,它因此被設計成一個高可定制又極度自由的系統,暫且不說你可以自由地從編譯源碼的方式配置安裝整個操作系統,即便是大多數的常用軟件例如:vi,emacs等等通過變更配置文件都可以玩出無數的操作方式,用戶需要花費時間去變更嘗試這些配置,使得操作這些軟件的方式最符合自己的習慣,達到高效的目的。因此經過一段時間調配,每一個Linux用戶都會有一個自己專屬的高效系統,有1000個用戶就會有1000個專屬高效系統,每一個系統上安裝的軟件和配置方法都各不一樣,并且每一個用戶在打造這個專屬系統的過程中都會耗費大量的精力和時間。丟失自己的專屬系統,就意味著時間精力的丟失,對于一個長期使用Linux的用戶更是如此:用戶已經在這個系統上積累太多軟件和操作習慣,如果因為系統崩潰而需要從頭開始配置一個全新的系統,在事前又沒有任何備份措施,那剩下的簡直就是一場災難。這也是有經驗的Linux用戶很注意備份的原因。介于此,筆者在本章節結合自己的一些經驗來介紹一下Ubuntu系統的備份恢復以及升級策略:

  1. 腳本恢復策略 --- 完全格式化更新
  2. 腳本恢復策略 --- 沿用/home分區數據
  3. tar包全盤備份恢復策略
  4. 遷徙wubi系統到物理分區
  5. Ubuntu系統升級策略

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

腳本恢復策略 --- 完全格式化更新

我們前面介紹過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,在其中添加以下內容:

  1. mkdir ~/BACKUP_SYSTEM
  2. sudo tar --exclude /proc --exclude /mnt --exclude /tmp --exclude /media --exclude /home/jiawzhang/Downloads --exclude /home/jiawzhang/Templates --exclude '/home/jiawzhang/VirtualBox VMs' --exclude /home/jiawzhang/BACKUP_SYSTEM -jpcvf ~/BACKUP_SYSTEM/Ubuntu-12.04-20121114-home-pc.tar.bz2 /

這兩條命令首先在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 大小的壓縮包內。如果你想時刻了解壓縮的進度,可以開啟另一個終端,運行以下命令:

  1. watch -d -n 5 ls -alh ~/BACKUP_SYSTEM/

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

2. 全盤恢復

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

  1. sudo su -

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

  1. sudo gparted

打開Linux下的分區軟件gparted,如果提示需要安裝,則運行

  1. sudo apt-get install gparted

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

  1. mkdir /tmp/root
  2. mkdir /tmp/root2
  3. mount /dev/sda1 /tmp/root
  4. mount /dev/sda2 /tmp/root2
  5. cd /tmp/root2/jiawzhang/BACKUP_SYSTEM/
  6. sudo tar -jpxvf UBUNTU-2012-02-05.tar.bz2 -C /tmp/root

使用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以外的所有數據,然后運行

  1. cp /tmp/root/home/. /tmp/root2/ -r
  2. rm /tmp/root/home -rf

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

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

仍舊在 live ubuntu 模式下運行:

  1. $ sudo add-apt-repository ppa:yannubuntu/boot-repair
  2. $ sudo apt-get update
  3. $ sudo apt-get install -y boot-repair
  4. $ sudo boot-repair

下載運行啟動修復軟件 boot-repair,啟動后點擊默認推薦方式即可。如果想了解這個軟件具體做了哪些工作,可以在這里參看手工修復的步驟。不過由于筆者并未驗證其正確性,不能保證一定可用。

  1. $ ls -al /dev/disk/by-uuid

再次查看各個分區的 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 這個文件的內容片段:

  1. # / was on /dev/sda1 during installation
  2. UUID=f381f8cd-ca11-4227-b9ce-8de330bf0e9f / ext4 errors=remount-ro 0 1
  3. # /home was on /dev/sda2 during installation
  4. UUID=b4b376c7-9ef0-48dc-9f50-28decd899190 /home ext4 defaults 0 2
  5. # swap was on /dev/sda3 during installation
  6. UUID=d770aa08-a3f3-4469-a682-f161cff16135 none swap sw 0 0

另外如果你加裝第二塊硬盤以后也可以通過 'ls -al /dev/disk/by-uuid' 查看新硬盤的 uuid,幷新建這塊硬盤分區對應的掛載目錄以后,將這些信息一并寫入 /etc/fstab,這樣,系統在啟動以后就會自動加載你的新硬盤分區。

這些目錄就是我們當初做備份時加在 --exclude 參數后面的目錄。

  1. mkdir /tmp/root/proc /tmp/root/mnt /tmp/root/tmp /tmp/root/media
  2. chmod 777 /tmp/root/tmp

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

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

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

遷徙wubi系統到物理分區

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

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

點擊下載Wubi移植腳本后解壓運行

  1. sudo zxvf wubi-move.tar.gz
  2. sudo bash wubi-move.sh /dev/sda5 /dev/sda6

如果有獨立的/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版本的升級和全部軟件的更新。

未完待續......

添加新批注
在作者公開此批注前,只有你和作者可見。
回復批注
湖北快三遗漏