硬碟規畫: 阿貴的備份策略


本篇假設讀者已有 徒手安裝 grub 的經驗。

我沒有用特殊的備份軟體, 只有一個很簡單的備份策略。 個人創作的資料, 因為量很小 (絕大多數都是 .txt .php .svg 之類文字格式), 只要全部放在兩三個固定的目錄底下, 可以每天壓縮備份很多次。 這部分另文討論。 系統部分, 就只是簡單地把整個 Linux 作業系統壓縮起來。 這就是本篇要討論的議題。

切割和可開機的最小安裝

首先規畫硬碟。 用 fdisk 切割硬碟時, 將最前面的空間設為第一分割主分割區, 留至少 1G 的空間將用來存放開機管理員 grub 及 ttylinux、 dsl、 slax 等等小型救援系統。 接著切第二分割主分割區, 留足夠的空間給 Windows。 第三個分割設成延伸分割, 並切成很多個小的邏輯分割, 每一個 4G 到 12G 不等, 將來可以存放很多不同版本的 Linux; 以及一個很大的資料分割, 將來存放光碟映象檔及系統備份檔。

接下來 把 grub 與 ttylinux 裝入第一分割, 這顆硬碟就可以開機了。 注意: 那一篇講義以隨身碟為例, 並假設 grub 要裝在第四分割; 但這一篇講義談的是硬碟, 如果硬碟容量太大 grub 放太後面的話, 怕有些 BIOS 會看不見, 所以假設 grub 要裝在最前面的第一分割。 當然, 你若不介意的話, 把最前面的空間配給第四分割並把 grub 放這裡也可以; 只是這樣的話每次進 fdisk 它都會抱怨一下。

ubuntu 的安裝與備份

然後比方說要安裝 ubuntu 8.04.1。 在第...個問題時, 請選 「手動分割」, 例如要裝到 /dev/sdz8 。 在最後一個問題時, 請選 「進階」, 並將 grub 改安裝到 (hd25,7)。 這裡唯一的目的就是不要讓 ubuntu 把我們裝好的 grub 蓋掉, 只要不是它內定的 (hd25), 它的 grub 就不會搶到控制權, 裝在那裡其實都無所謂。 裝完之後, 不要馬上重開機。 把這視窗關掉, 進入 live cd。 手動掛載 /dev/sdz8 及 /dev/sdz1 (前面說的要放 grub 的第一分割主分割區), 把前者的 /boot/grub/menu.lst 裡面的 default 那個選項, 複製到後者的 /boot/grub/menu.lst 選單裡面。

重開機之後, 選單新出現一項 ubuntu 8.04.1, 幸運的話, 就成功進入。 先不急著大幅度整修或安裝套件。 通常我會將 /etc/fstab 裡面的 "UUID=..." 改成簡單的 "/dev/sdz..."; 不過少數時候這樣改過就無法開機。 若改過此處, 務必重開機, 再簡單測試一次。 又, 建議將 /home 獨立出來, 另掛一個分割, 例如拿 /dev/sdz6 來存放使用者資料。 將來我們不備份使用者資料; 使用者必須另外自行備份。 如果沒問題, 就 (再度) 重開機, 回到舊系統或 live cd 或 live usb 開機, 總之就是不要進入剛裝好的 ubuntu 8.04.1。

在另一個系統下, fsck -f /dev/sdz8 檢查檔案系統。 如果沒問題, 就把它掛載起來, 並備份:

        mount /dev/sdz8 /media/sdz8
        cd /media/sdz8
        tar czf /備份路徑/ubuntu-8.04.1-a.tgz .

然後馬上將備份還原到另一分割, 例如 sdz9:

        mount /dev/sdz9 /media/sdz9
        cd /media/sdz9
        tar xzf /備份路徑/ubuntu-8.04.1-a.tgz

修改兩處: /media/sdz9/etc/fstab 裡面提到 / 那一句, 當然要把 /dev/sdz8 改成 /dev/sdz9; 另外 /media/sdz4/boot/grub/menu.lst 裡面則要將 ubuntu-8.04.1 的那筆記錄複製一份, 一樣把所有的 /dev/sdz8 改成 /dev/sdz9。 至於新的 "UUID=..." 要填什麼呢? tune2fs -l /dev/sdz9 | grep -i uuid 把這兩份取不同的名字吧, 例如一份叫做 workspace, 另一份叫做 pristine。 重新開機, 測試一下 /dev/sdz9 這個還原是否正常。

現在您的電腦有兩套 ubuntu 8.04.1。 平常使用 workspace 這一份; 臨時出問題, 立即重開機, 切到 pristine, 至少可以繼續工作。 然後記得把死掉的 workspace 的 /var 目錄備份出來, 以便日後檢查原因, 還有把 /etc 也備份出來, 因為裡面可能有一些手動修改過的設定。 再重新格式化, 重新還原, 並同樣如上述修改 fstab 與 menu.lst 。 最後把這兩個分割的名字對調: 因為現在 workspace 與 pristine 的角色已經反過來了。 這一切動作, 都是在系統 (原先叫做 pristine, 後來改名為 workspace 的那一份安裝) 正常運作時進行的, 不耽誤救援時間。

套件管理

再進一步, 平日工作可以隨時記下新安裝的套件名稱, 例如放在一個檔案叫做 pkgs.txt 裡面。 那麼可以趁上述重新還原的時候, 順便 chroot /media/sdz? (詳見 「換個環境工作」) 切換到新還原的分割, 並且 apt-get install $(cat pkgs.txt) 把這段時日新增的套件一口氣裝上。 記得按 ctrl-d 跳離 chroot。 當然若是設定檔花了工夫修改, 就還要回備份的 /etc 挖回來。 最後, 測試正常之後, 可以再備份一次, 例如叫做 /備份路徑/ubuntu-8.04.1-b.tgz。 如此一來, 這段期間亂做, 不值得留下的動作, 全部遺忘; 但新增的套件卻都進了新的備份; 這個新的備份, 彷彿是當初剛裝好就知道以後會想用那些套件, 立即安裝的一樣, 沒有歷史的包袱。

此外, 注意到 /var/cache/apt 底下存放了很多下載的 *.deb 套件。 如果把這個目錄放在別的分割區 (例如 /home 分割), 改用一個 symbolic link 指向真正的目錄, 那麼就不需要把這些東西一起備份起來, 會省下不少空間。 不要小看這些, 因為這些本身就是壓縮檔, 再用 tar czf 壓縮, 也小不了多少, 如果不另外放, 會佔掉不少空間。 有時候, 我把這個目錄放在外接硬碟。 這樣如果先前在 A 機器已經下載過一些額外的套件, 當我在 B 機器上又想安裝時, 就不必再等 adsl 慢慢下載一次了。 只要一下 apt-get install $(cat pkgs.txt) 它自然就從 /var/cache/apt 所指到的隨身碟碟目錄快取安裝。 (實際上我會把搬遷到 /home 底下的 /var/cache/apt 目錄跟隨身碟碟上的 /var/cache/apt 目錄互相更新/備份。)

結論

我曾試過: 在 A 機器的備份, 拿到 B 機器還原, 居然經常都大致上可以用。 (fstab 及 menu.lst 當然要改) 我在北中南連辦公室共有至少四部電腦, 對於我這種人來說, 每次升級換系統, 可以省下三次麻煩的安裝設定, 是一件非常快樂的事。