2011年4月7日

將 Ubuntu Linux 搬移到新硬碟

已經使用一段時間的Ubuntu,通常有相當多個人化的設定,但以硬碟容量倍增、價格下降的趨勢,大約兩年左右換上一顆新硬碟,把舊硬碟拿來養動物或備份資料,這樣不但可以一直保有充足的容量,也可以減少硬碟因老化故障造成資料毀損的機率。

日前INTEL推出新的320系列SSD,目前40GB版本的報價已經不到$3,000元,同樣的入門款等級,讀寫效能比起前一代提升了許多。雖然40GB並不夠一般儲存的需求,但安裝Ubuntu Linux的桌上型電腦,可以將根目錄磁區「/」設定在容量比較小但速度快的SSD硬碟,而家目錄「/home」則設定在大容量2TB以上的傳統硬碟。

在Ubuntu Linux Desktop的根目錄下,通常是 /usr 子目錄會佔用比較大的容量,因為應用程式主要的檔案都會放在這裡。但即使裝了大量的應用程式,大約30~40GB的分割區大小就已足夠應付大多需求。因為正常用途的作業系統不會每天都大量新增移除軟體,而應用程式在第一次執行,需要的檔案從硬碟讀出後,只要記憶體容量充足(目前的桌上型電腦裝滿16GB記憶體並不需要花費太多),系統就會在記憶體配置緩衝區,不會每次都從磁碟讀取。一般使用者編輯的圖片、文件,或網路下載的影片、音樂,都會保存在家目錄,所以家目錄的讀寫通常比根目錄頻繁。因此將根目錄存放在SSD硬碟,家目錄存放在傳統硬碟,對SSD讀寫次數有壽命限制的問題,就不用太操心了。

當然上面只將系統分配成根目錄及家目錄的作法,是適用一般個人電腦用途,對於伺服器就需要不同的配置,例如伺服器常將網頁、記錄檔及資料庫檔案放在/var,就要依照進階的使用需求去做規劃。

由於Ubuntu的APT套件庫做得相當好,每年4月、10月新版發行的時候,通常可以順利無痛升級,而不需要重灌,所以即使要安裝新硬碟,把速度比較快的新硬碟當作主要開機硬碟,以及儲存作業系統資料,這時候可以選擇用資料搬移的方式。

搬資料不是COPY過去就好了嗎?

其實只完成COPY磁碟資料的動作,並不夠完整,因為啟動Linux作業系統需要GRUB(或LILO)開機程式,所以需要把開機程式重新安裝一份到新硬碟的主要開機記錄區(MBR),這樣子才能讓新硬碟獨立完成開機作業。

由於Ubuntu Linux的LiveCD功能很強,所以我們並不需要藉助其他軟體,單靠LiveCD就能完成開機磁碟資料搬移的工作。

假設主機已經安裝好新硬碟,就可以開始以下搬移步驟。

首先,需要先製作一張LiveCD,建議使用和目前系統相同版本的ISO檔,例如ubuntu-10.10-desktop-amd64.iso。但由於做環保愛地球的訴求,我們並不鼓勵使用者真的把ISO燒成光碟,而是拿一支舊的USB隨身碟,製作成LiveUSB(目前大多數主機板可以使用USB隨身碟開機)。

以下的示範畫面,以Ubuntu 10.10 Desktop AMD64版本為例。

在Ubuntu系統製作LiveUSB的方式,可以使用內建的usb-creator,先看一下是否已安裝:
dpkg -l |grep usb-creator

如果還沒裝,則先使用apt-get立即裝上(usb-creator-gtk是GNOME使用的版本,KDE愛用者可以改成usb-creator-kde)。
sudo apt-get update && sudo apt-get install usb-creator-gtk

打開「系統 / 管理 / 製作開機碟」,選擇來源光碟映像檔及目標隨身碟,就可以點「製作開機碟」。

製作好的LiveUSB不用拔除,重新開機,在BIOS設定中,調整硬碟的開機順序,將USB隨身碟調為最優先。在Welcome畫面中,選擇語言「中文(繁體)」再點選「試用Ubuntu」。


使用磁碟公用程式「System / Administration / Disk Utility」,將新硬碟整個磁碟格式化成「Master Boot Record」,再建立分割區(partition),分割區的格式可以跟舊系統的根目錄「/」分割區一致,通常是ext4或ext3。


2012-08-24 Update

Use GParted (LiveUSB) with newer version and choose "MiB" for "Align to" option. It's better for SSD 4kb alignment.


再來需要把磁碟代碼記住,例如舊的硬碟的分割區是 /dev/sda1,新硬碟是 /dev/sdb1。

打開終端機程式「Applications / Accessories / Terminal」,依序執行以下指令,請自行依實際狀況修改分割區代碼。第一行「sudo su -」會切換成超級使用者root,所以後續的指令必須很小心操作,否則會造成系統毀損。
sudo su -
mkdir /media/old
mkdir /media/new
mount /dev/sda1 /media/old
mount /dev/sdb1 /media/new
rsync -ax /media/old/ /media/new/

最後的rsync是複製資料的指令,這會花上一些時間,可能要幾分鐘到幾十分鐘,視舊磁碟儲存的資料容量而定。如果想知道進度,可以再打開一個終端機程式,使用 df -h 指令,查看新硬碟已使用容量即可知道已完成複製多少。

資料複製完成後,再來是重新安裝GRUB開機程式。首先我們需要將目前的Linux運作環境,從LiveUSB開機後的系統,用chroot指令轉移到新硬碟上面的系統。依序執行以下的步驟。
sudo su -
mount -o bind /proc /media/new/proc
mount -o bind /dev /media/new/dev
chroot /media/new

接下來再執行的其他指令,就等同於在新硬碟的Linux系統上操作,首先重新安裝GRUB開機程式。
grub-install --root-directory=/ /dev/sdb --recheck
grub-mkdevicemap
update-grub2

上面的指令,會將GRUB開機程式安裝到/dev/sdb(新硬碟)的MBR。

有些文件只講到這裡,而忽略了分割區掛載的設定,這樣開機後仍會將舊硬碟的分割區掛載成根目錄「/」路徑。所以我們還要再修改 /etc/fstab 的設定才行。由於目前的Linux設定檔開始改用UUID取代分割區代碼(/dev/sdX),所以要先查詢分割區的UUID。
ls /dev/disk/by-uuid/ -al | grep sdb1

顯示結果的一長串英數字就是UUID,可能長這樣「55E14BD4473131DF」也可能是長這樣「9fdbd623-299c-45a7-9adb-6e07e82080a7」。

再來,打開 /etc/fstab 將根目錄分割區「/」的UUID設定成新硬碟分割區的UUID。
vim /etc/fstab

如果不習慣使用VIM,可以改成圖形介面的文字編輯器。
gedit /etc/fstab

儲存設定後,重新開機。

由於我們把GRUB開機程式安裝到新硬碟的MBR,而新硬碟對主機板的硬碟控制器,可能是位於第二顆以後的順序;在預設情況下,BIOS的開機硬碟會優先以位於第一顆順序的硬碟開始找MBR,如果不修改,還是會用舊硬碟開機。

所以重新開機時,除了移除剛才用來開機的LiveUSB隨身碟,還要再次調整開機硬碟順序,將新硬碟的優先順序移到舊硬碟前面,這樣BIOS開機程序在尋找MBR時,才會讀到新硬碟MBR安裝的GRUB開機程式。

我們將新的GRUB開機程式安裝到新硬碟的MBR,而不去覆蓋舊硬碟的MBR,所以即使前面的過程失敗,仍然可以讓BIOS設定優先以舊硬碟開機。

7 則留言:

  1. 請問一下,如果我是把ubuntu 10.04裝在隨身碟,因為容量不太夠,所以要移到新的隨身碟中,手續也是那麼複雜嗎?還是說ghost過去就可以了?

    回覆刪除
  2. 如果開機的MBR在隨身碟,一般情況是clone(ghost)一份,再調整partition大小即可。

    回覆刪除
  3. 如果開機的MBR在隨身碟,一般情況是clone(ghost)一份,再調整partition大小即可。

    回覆刪除
  4. 剛才再查了一下資料,應該沒辦法只用ghost,還是要依照你的方式來做才可以...

    回覆刪除
  5. 再請問一下,dd 的指令,應該就可以完整的複製MBR吧?所以我只要修改/etc/fstab UUID的部分,這樣對嗎?

    回覆刪除
  6. 前512 block size就是MBR區,也可以用dd複製MBR,..
    dd if=/dev/??? of=/dev/??? bs=512 count=1

    回覆刪除
  7. 請問可以直接dd if=/dev/?? of=/dev/?? 整個複製嗎?
    這樣可以正常開機嗎?

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!