複製 Linux 系統

English Version


如果你想複製一個硬碟的內容,我建議使用 clonezilla-live。 clonezilla (再生龍) 可以把全部硬碟的內容複製到一個備份裝置,如隨身碟,為一個映像檔案。然後將這個映像檔案複製到另一個硬碟就可以了。 這新硬碟的內容跟原來硬碟的內容完全是一樣的。

如你只想改編分割區的大小,我建議使用 gparted-live (gnome 分割區編輯器)。雖然 gparted 很穩而安全,但是我還是建議你用 clonezilla 備份你的整個硬碟的內容以防萬一。如果在使用 gparted 時發生任何問題,你仍然可以恢復原來硬碟的內容。

最近我有機會使用這兩個軟體,太佩服了。我有四個 Fedora 20 伺服器。很久以前,在 /boot 分割區我分配 100M。當時,我想應該是綽綽有餘。但是 Linux 核心的 大小越來越變大,然後原來的啟動程式 grub 被升級為 grub2,100M 實在不夠用了。我很不喜歡重新安裝 Fedora 20,因為需要大量的工作。但是,同時,我也怕操縱 分割區,因為這是一個非常危險的工作。你一不小心的話,你很容易破壞硬碟裡所有資料。 實在沒有別的選擇,我決定使用再生龍和 gparted。

用再生龍備份整個硬碟之後,我有一點放心因為即使用 gparted 時如發生一些狀況,我仍然可以使用 clonezilla 恢復整個硬碟的內容。

我的硬碟被分割為三個分割區︰/dev/sda1 為 /boot,/dev/sha2 為 / (根目錄) 和 /dev/sda3 為 swap。首先我把 / (根目錄) 分割區變小一點。 然後,我把 /boot 分割區變大。gparted 花很長的時間完成這工作。但是,當工作完成後,緊張的等待時間一切都是值得的。

2014/07/08


兩年以前你用 20GB 的硬碟安裝了一台 Linux server。當時,你覺得 20GB 的空間相當大,十年之內一定不會有問題。

但是,在使用這 Linux server 兩年的期間裡,因實際的需要,你不斷的增加與更新使用者所需要的網路服務軟体。 你公司的員工人數越來越多,使用者的帳號也繼續不斷的在增加。 兩年前你給每一位使用者 20MB 硬碟空間,當時評估 20MB 為一個使用者的私人資料應該很夠,沒有想到,兩年之後 20MB 的硬碟空間實在不夠用了。

以現在的需求,20GB 的硬碟空間實在太小了。你想換一個比較大容量的硬碟。你如何去做?

你可能想到一種可行的解決構想,就是將 20GB 的整個硬碟,純粹給 server 使用,另外加一個容量在 40GB 以上的 新硬碟,專門給使用者儲存私人的資料,應該是沒有問題了。做法是將所有使用者所使用的硬碟空間搬移到新的硬碟。 將 /home 複製到新硬碟不是很難的事。

但是你要好好估計一下。你的 Linux server 服務項目,會因需要陸續的增加與更新,兩年之後,是否 20GB 給 server 使用,夠用嗎?想來想去,將整個 Linux 系統搬移到一個大容量的硬碟是最好的辦法。

如何搬?

你第一個反應可能是:在新 40GB 的硬碟安裝一個新的 Linux 系統。然後將舊硬碟的所有使用者帳號和資料複製到 新硬碟就應該能解決這個問題了。這樣你不需要在新的 Linux 系統重新建立所有使用者的帳號。

這樣的想法,事實上不夠周到。沒有錯,重新安裝一個 Linux 系統是很簡單。也不需要很多的時間。不到二十分鐘就 可以安裝一個新的 Linux 系統了。然後從舊硬碟的使用者帳號和資料複製到新硬碟也只不過需要幾分鐘的時間。

但是你可能沒有想到一個很重要的事。在這兩年的時間內,因了軟体的 bug 或安全的漏洞你已經更新了幾種軟体、 更新了多少次?核心﹝kernel﹞應該也更新了三、四次,不是嗎?

你要重新安裝一個 Linux 系統,你安裝的是舊版本的軟体。你必須一個一個的更新這些軟体。但是你還記得你更新的 是那一些軟体嗎?如果一個軟体更新了四次,你不能將舊版的軟体直接用第四個更新版來更新。可能第二更新版更改了一 些設定值而第三和第四更新版已假設了這些更改,如果你從舊版的軟体直接更新到第四更新版就會發生問題。意思是說, 你要從第一更新版開始一個一個的更新以致到第四更新版。不能跳過去。

這樣做是很花時間的。如果你曾將所有的更新都紀錄下來,它對你會有很大的幫助。但是一個一個的更新所有需要更新 的軟体,仍然會花相當多的時間。

你現在的 Linux 系統不是已經很穩嗎?你對現在這個系統不是很滿意嗎?如果可以把這 Linux 系統複製到新的硬碟那 該有多好!

在 Windows,我不敢說,但是在 Linux 我可以很確定的說一定可以把 Linux 系統從一個硬碟複製到另一個不同容量的硬碟。

現在我要談的就是這個主題。但是在討論之前,我必須列出有關討論的一些資訊。


註解:

kernel-2.6.20 到來時,所有的硬碟裝置名稱為 /dev/sdx。以前 ide 硬碟裝置名稱為 /dev/dhx,SCSI 硬碟裝置名稱為 /dev/sdx。 以下是以前舊的硬碟裝置名稱:

EIDE0 primary/dev/hda
EIDE0 secondary/dev/hdb
EIDE1 primary/dev/hdc
EIDE1 secondary/dev/hdd

在新裝置名稱規矩,第一個硬碟裝置名稱為 /dev/sda,第二個硬碟 (不管是接在哪裡是) 裝置名稱為 /dev/sdb,等。

想看看所有連接的硬碟裝置:

fdisk   -l

20GB,分割為:

sda1 : 50MB /boot partition
sda2 : 19.5GB / (root) partition
sda3 : 512MB swap partition

40GB,分割為:

sda1 : 50MB /boot partition
sda2 : 39.5GB / (root) partition
sda3 : 512MB swap partition

請注意,雖然舊和新硬碟的 partition 結構可以不一樣,但是會比較麻煩。你必須編輯新硬碟的 /etc/fstab 來反映出新的 分割區,複製的方式也有一點不一樣,也要設為新分割區的掛點。最好還是保持同樣的 partition 結構。Partition 的大小不 一樣沒有關係。

將 Linux 系統從一個硬碟複製到另一個硬碟之方法如下:

  1. 先關機電腦,然後連接新硬碟。
  2. 啟動 Linux。登入為 root。
  3. 我們做這種工作算是蠻低階的工作。最好是在 single user mode﹝一人模式﹞進行這種工作。下以下指令進入 single user mode。

    init 1
  4. 我們使用 fdisk 來分割新硬碟。請注意新硬碟的分割結構應該與舊硬碟相同。執行 fdisk:
  5. fdisk /dev/sdb

    我們分割時會用到以下指令:

    m:   顯示指令目錄
    p:    列出硬碟分割表
    n:    建立新分割區
    a:    切換可啟動旗標
    t:     改變分割系統編號
    w:   將分割表儲存﹝寫入﹞到硬碟
    q:    離開 fdisk

    現在把新硬碟分割為:

    /dev/sdb1      50MB       為 Linux,編號 83
    /dev/sdb2      39.5GB     為 Linux,編號 83
    /dev/sdb3      512MB      為 linux swap,編號 82
  6. 分割之後就必須格式化﹝format﹞新硬碟才可以使用。我們使用 ext3 檔案系統格式化與舊硬碟相同。
  7. mke2fs    -j   /dev/sdb1
    mke2fs    -j   /dev/sdb2
  8. 格式化 swap
  9. mkswap    /dev/sdb3
  10. 格式化之後,我們可以開始將舊硬碟的內容複製到新硬碟。我們現在建立新硬碟的掛點﹝mount point﹞, 然後掛﹝mount﹞新硬碟。
  11. mkdir    /new
    mount    /dev/sdb2   /new
    mkdir    /new/boot
    mount    /dev/sdb1   /new/boot
  12. 新硬碟掛好了我們就可以開始複製的工作。請注意,不要複製以下檔案或目錄:
  13. /boot 的複製方式是有一點不一樣因為 /boot 事實上是一個獨立的分割區﹝sdb1﹞掛在 /new/boot。 在上面我們以掛了,我們只 /boot 下所有檔案和目錄複製過去。

    cp    -a    /boot/*    /new/boot/

    在標準 RedHat/Fedora 的安裝,以下檔案和目錄必須複製到新硬碟:

    cp    -a    /aquota.user    /new/
    cp    -a    /bin    /new/
    cp    -a    /dev    /new/
    cp    -a    /etc    /new/
    cp    -a    /home    /new/
    cp    -a    /initrd    /new/
    cp    -a    /lib    /new/
    cp    -a    /mnt    /new/
    cp    -a    /root    /new/
    cp    -a    /sbin    /new/
    cp    -a    /tmp    /new/
    cp    -a    /usr    /new/
    cp    -a    /var    /new/

    在你的 Linux 系統,可能還有其它的檔案和目錄必須複製到新硬碟。你可以下「ls   -l   /」指令看看。

    我們用 cp 的 -a 參數主要的目的是複製檔案和目錄時保持檔案/目錄的屬性和擁有者的定義。這樣,除了硬碟的 大小不同,新硬碟就是舊硬碟的映像。

  14. 從 Red Hat 7.2 開始,使用的標準啟動載入程式﹝bootstrap loader﹞已經是 GRUB 而不是 LILO。使新硬碟可以 啟動,現在我們必須將 GRUB 安裝到新硬碟的 MBR﹝Master Boot Record﹞。
  15. cd    /new
    chroot    /new
    grub
    root (hd1,0)     # hd1:第二硬碟,0:第一分割區。
    setup (hd1)     # 在第二硬碟的 MBR 安裝 grub。
    quit                 # 離開 grub。
    exit     # 離開 chroot。

    很大的可能,在 /etc/fstab 和 /boot/grub/grub.conf 分割區的掛點已經使用 LABEL 而不用裝置名稱。如果這樣 就需要命名新硬碟的分割區。

    e2label     /dev/sdb2     /
    e2label     /dev/sdb1     /boot
    mkswap   -L   swap   /dev/sdb3
  16. 現在可以關機了。
  17. halt
  18. 電源關掉之後,將舊硬碟拿掉。新硬碟連接到舊硬碟的位置。接好了就把電源打開。
  19. 現在應該可以正常的啟動 Linux 系統了。現在這 Linux 系統,除了硬碟空間比較大,與舊硬碟是完全一樣。

蔡由世神父
2002/07/07
更新:2008/12/04