鳥哥的 Linux 私房菜

第二章、安裝伺服器與 kickstart 大量部署用戶端電腦

最近更新日期:2013/04/24

上一章我們將區域網路內的線路處理妥當並且將伺服器設定成可分享區域網路對 Internet 的連線後,再來當然就是要管理內部的用戶端電腦的設定了。 用還原卡管理用戶端電腦是很簡易的方式,不過確有很多教學方面的問題等待克服。如果不用還原卡,要怎麼處理用戶端的電腦內作業系統的安裝與還原呢?用原版光碟嗎?

以正常的 DVD 光碟片安裝一兩台 Linux 系統似乎是沒啥大問題,但如果有好幾間電腦教室,裡頭有幾十部總共數百部的主機要你裝 Linux 系統的話,那使用 DVD 光碟來裝也太花時間了吧?此時,選擇透過網路來進行安裝就是一項可以思考的方向!同時,如果以鳥哥上班的單位為例,電腦教室的 PC 需要有多重作業系統的環境下,如何準備一個可以裸機安裝的功能, 就是一個相當重要的任務了!這篇文章就在討論如何從網路進行這些動作囉!

1. 使用 PXE 環境建置區域網路安裝伺服器系統

一般來說,不論是哪種作業系統,只要是使用 DVD 釋出作業系統軟體的,通常安裝的程序是這樣的:

  1. 透過 BIOS 開機,並調整成可以讓光碟優先開機的模式;
  2. 以光碟內的作業系統核心開機,驅動系統的硬體裝置;
  3. 上一步的作業系統直接呼叫安裝程式來進行安裝選項;
  4. 進入安裝模式與使用者互動選取用戶需要的軟體操作環境;
  5. 系統開始安裝軟體至硬碟上,安裝完畢通常需重新開機才能結束安裝程序;
  6. 重新開機後,會進入首次使用的設定畫面,簡單設定後,即可開始登入系統使用。

程序是很簡單,不過,如果用戶端的數量一多起來,上述的第四、五步驟通常會佔用相當大的人力!因為安裝程式需要與使用者互動啊!此外,如果用戶端的數量很大! 那麼我們如果想要同時進行以減少等待的時間時,就得要燒錄多片 DVD,雖然不貴,不過很覺得浪費~另外,現在的網路速度要比 DVD 速度快的多 (Gigabit 網卡至少可以到達 100Mbytes/s 的速度,16X DVD 只能到達大約 25Mbytes/s 以下), 如果將 DVD 的資料複製到網路上,透過網路來安裝,不是更快嗎?是的!沒錯~但是,這時候就需要 PXE 的協助了!

1.1 什麼是 PXE 與 PXE 的運作模式 (註1)

對於現在的主機硬體系統來說,不論你想在上頭幹嘛,首先你總是得要透過開機管理程式 (boot loader) 載入系統核心 (kernel) 之後,才能夠順利的開始運作系統。 同理,使用 DVD 原版光碟安裝時,BIOS 選擇光碟機開機,光碟片裡面就得要含有開機管理程式與簡易的核心,開始驅動整個系統硬體後,才能夠進入下一步安裝軟體的控制中。

現在,我們想要透過網路開機來進入本機系統,等開機之後,接下來愛幹嘛就幹嘛,當然也就包括進行網路安裝的行為啊!那跟上面講的就一樣了,既然我是想要透過網路開機, 那麼必要的 (1)開機管理程式與 (2)作業系統核心就得要放在網路上給用戶端的主機系統下載使用才行。 問題來了,既然我的主機系統還沒有安裝任何作業系統,那怎麼 (1)取得網路 (2)下載開機管理程式與核心呢?這時就得要透過 Intel 發佈的 PXE 機制了。

所謂的 PXE 是『 Preboot Execution Environment 』的縮寫,字面上的意思是:『開機前的執行環境』之意。根據 Intel 所發佈的文件來看 (註1),要達成這個 PXE 必須要有兩個環節,(1)一個是用戶端的網路卡必須要支援 PXE 用戶端功能,並且開機時選擇網路卡開機,這樣系統才會以網路卡進入 PXE 用戶端的程序;(2)一個是 PXE 伺服器必須要提供至少含有 DHCP 以及 TFTP 的服務才行!且其中:

  • DHCP 服務必須要能夠提供用戶端的網路參數之外,還得要告知用戶端 TFTP 所在的位置為何才行;
  • TFTP 則是提供用戶端 boot loader 及 kernel file 下載點的重要服務

上述兩個服務僅能讓 PXE 用戶端開機而已,開機的定義只是讓硬體開始執行罷了!我們都知道,開機完成後還得要提供各式各樣的軟體之後,才能夠順利的載入可讓一般用戶操作的基本作業系統。 因此,通常 PXE server 還必須要能夠提供用戶端所需程式與軟體資料的來源才行!所以,通常還得要加上 NFS/FTP/HTTP (通常是選擇一樣即可) 等資料提供的通訊協定後, 才算是比較完整的 PXE 伺服器囉。

在本章末了的參考文獻中,PXE 已經講得非常詳細!我們這裡僅簡單的使用底下的圖示來解釋一下 PXE 的整體運作流程:

PXE 的運作流程
圖 1.1-1、PXE 的 server/client 相關的運作流程示意圖
(圖改自 Intel Preboot Execution Environment specification V2.1)

從上圖中我們再次的歸納幾個重點:

  • 整個 PXE 的運作流程,幾乎都是使用 UDP 封包來達成的!
  • PXE 用戶端的網路卡必須要支援 PXE 功能,才能在開機時發出 DHCP 要求相關資料;
  • DHCP 除了得要回傳正確的區網參數外,還要額外告知 TFTP 與相關開機管理程式資訊;
  • TFTP 需要提供 (1)開機管理程式與 (2)Linux 的開機核心與相關檔案 (initrd 等檔案)

那什麼時候需要有安裝光碟內的軟體支援安裝呢?那就得要外帶核心參數才行囉!也就是說,我們至少得要設定底下這幾個服務才行: (1)TFTP (2)DHCP (3)NFS/HTTP/FTP! 其中 TFTP 與 DHCP 為必須,則安裝的軟體來源則是可選擇的!底下我們就一項一項服務來設定吧!



1.2 透過 DHCP 服務取得 TFTP IP 位址與 boot loader 檔名所在

圖 1.1-1 的資料上面,可以發現 DHCP 主要僅是提供用戶端網路參數與 TFTP 的位址,以及 boot loader 的檔名而已。 同時,我們僅針對內網來告知 TFTP 的相關位置,所以,我們可以編輯 /etc/dhcp/dhcpd.conf 在 subnet 的區塊內加入兩個參數即可。

首先,由於我們這個區網還不算太大,所以,鳥哥是將 DHCP 與 TFTP 綁在同一個主機上頭,因此 DHCP 與 TFTP 的 IP 都是延續前一章的 192.168.42.254 這一個。那 boot loader 呢? 在 CentOS 裡面有提供一個檔名為『 pxelinux.0 』的專門給 PXE client 下載的 PXE boot loader!這個檔案我們即將放置於 TFTP 的根目錄下,所以,DHCP 的簡單設定就變成如下模樣:

[root@centos ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style       none;
default-lease-time      259200;
max-lease-time          518400;
option routers          192.168.42.254;
option broadcast-address        192.168.42.255;
option domain-name-servers      192.168.42.254;
subnet 192.168.42.0 netmask 255.255.255.0 {
        range 192.168.42.101 192.168.42.200;
        option subnet-mask      255.255.255.0;
        option domain-name      "i4502.dic.ksu";
                                           <==上面的資料是前一章的內容!
        next-server     192.168.42.254;    <==就是 TFTP 的位址所在處
        filename        "pxelinux.0";      <==告知得從 TFTP 根目錄下載的 boot loader 檔名

....(中間省略)....
}                                          <==別忘記最後的這玩意!

[root@centos ~]# /etc/init.d/dhcpd restart

再重新啟動過 DHCP 之後,這樣針對這個內網的 TFTP 設定就生效了。不過,請特別留意喔!如果你沒有繼續接著底下的 TFTP 來設定的話,那麼未來你的用戶端如果設定網路卡開機, 就會發現到如下的錯誤訊息~雖然這個錯誤訊息並不會影響到用戶端的操作,反正過了逾時等待時間後,系統就會自動的進入下一個開機裝置來開機。但是,有這個錯誤訊息就很討厭就是了。

PXE 的運作流程
圖 1.2-1、僅設定 DHCP 提供 TFTP 但 TFTP 尚未建置完成時的用戶端錯誤訊息示意

從上面的訊息你可以發現,用戶端這個 PXE 已經抓到 DHCP 提供的網路參數,取得的 IP 為 192.168.42.158,但是當他連線到 TFTP 想去下載 pxelinux.0 時, 卻抓不到程式!所以就造成等待逾時。雖然沒什麼,不過多一段等待時間就很討厭~因此,繼續接著底下的 TFTP 來設定吧!



1.3 透過 TFTP 提供用戶下載開機管理程式與核心檔案

圖 1.1-1 的流程當中,我們知道開機過程所需要的開機管理程式與核心相關開機檔案,主要都是透過 TFTP 這個服務來給予的! 這個服務在 CentOS 上面已經有相關的軟體主動提供了!設定很簡單。但是,那個開機管理程式與核心檔案在哪裡啊?呵呵!底下我們就分別來說一說各別的設定囉!

  • TFTP 的主程式設定,重點在 TFTP 要將資料放在那個目錄內:

TFTP 的安裝很簡單~直接使用 yum 來處理即可。不過,如同 FTP 服務一樣,你總是得要告訴用戶端,我的 TFTP 資料的『根目錄』在哪裡才行! 這樣接下來才有辦法取得完整的絕對路徑相關資料啊。另外要注意,TFTP 其實是由 xinetd 這個 super daemon 所管理的,因此設定好 TFTP 之後, 你要啟動的是 xinetd 才對喔!

另外,預設的 TFTP 服務的根目錄是放在 /var/lib/tftpboot/ 底下,由於未來我們的安裝伺服器有很多資料都會放置在這個檔案系統中,為了統一管理, 所以鳥哥習慣上都會將所有需要的資料統一放置於某個目錄中!那未來如果有需要加速檔案系統或者擴大檔案系統時,就比較方便處理~在本章的案例中, 鳥哥是將所有的資料統一放置於 /install/ 目錄下的!那這個 TFTP 的根目錄我們就將他放置於 /install/tftpboot 底下囉!

# 先安裝所需要的 TFTP 伺服器軟體:
[root@centos ~]# yum install tftp-server tftp
# 事實上,只要安裝 tftp-server 即可。不過這裡鳥哥連用戶端的 tftp 也一口氣裝好算了。

# 開始設定 TFTP 的設定檔~主要是 TFTP 的根目錄所在啦!
[root@centos ~]# vim /etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /install/tftpboot  <== 重點在這裡!改成這樣即可
        disable                 = yes
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

[root@centos ~]# mkdir -p /install/tftpboot
[root@centos ~]# chcon --reference /var/lib/tftpboot /install/tftpboot
[root@centos ~]# chcon --reference /var /install
[root@centos ~]# ll -dZ /install/tftpboot
drwxr-xr-x. root root system_u:object_r:tftpdir_rw_t:s0 /install/tftpboot/
# 如果你沒有關掉 SELinux 的話,那這裡就得要這樣做才行!注意上面特殊字體部分!

# 啟動 TFTP 並觀察之:
[root@centos ~]# /etc/init.d/xinetd restart
[root@centos ~]# chkconfig xinetd on
[root@centos ~]# chkconfig tftp on
[root@centos ~]# netstat -tulnp | grep xinetd
Proto Recv-Q Send-Q Local Address   Foreign Address  State    PID/Program name
udp        0      0 0.0.0.0:69      0.0.0.0:*                 2238/xinetd
# 你要注意的是埠口 69 以及 xinetd 這個啟動的服務名稱才對!

接下來你得要知道的是,所有透過 TFTP 提供的資料,在本章的案例中,都必須要放置於 /install/tftpboot/ 目錄下才行喔!不要放錯地方了!要注意!要注意!

  • 使用 syslinux 提供的 boot loader 與選單相關展示檔案:

如果要使用 PXE 的開機管理程式與開機選單的話,那就得要安裝 CentOS 內建提供的 syslinux 軟體,從裡面撈出兩個檔案即可。當然啦,這兩個檔案得要放置在 TFTP 的根目錄下才好! 整個實作的過程如下:

[root@centos ~]# yum install syslinux  <==底下的檔案是由這軟體所提供!
[root@centos ~]# cp /usr/share/syslinux/menu.c32  /usr/share/syslinux/vesamenu.c32 \
> /usr/share/syslinux/pxelinux.0 /install/tftpboot/
[root@centos ~]# mkdir /install/tftpboot/pxelinux.cfg
[root@centos ~]# ll /install/tftpboot/
-rw-r--r--. 1 root root  60928 2013-04-02 18:10 menu.c32      <==提供類選單模式的功能
-rw-r--r--. 1 root root  26828 2013-04-02 18:10 pxelinux.0    <==就是開機管理程式!
drwxr-xr-x. 2 root root   4096 2013-04-02 18:11 pxelinux.cfg  <==開機的選單設定在這裡!
-rw-r--r--. 1 root root 162860 2013-04-02 18:41 vesamenu.c32  <==圖形化介面選單

上面的 memu.c32, vesamenu.c32 及 pxelinux.0 幾個檔案還好理解,反正就是提供『選單介面』以及『開機管理程式』的咚咚。那麼那個 pxelinux.cfg 是啥鬼?其實那是個目錄,可以放置『預設的開機選單』,也能夠『針對每部不同的用戶端主機提供設定的開機選單』!非常有趣吧!一般來說,還沒有特定的用戶端時,可以在 pxelinux.cfg 目錄內,建立一個名為 default 的檔案,那個檔案的功能就類似 grub 的 menu.lst 啦!提供一個選單的設定!

那如果沒有 menu.c32 或 vesamenu.c32 時,選單會以醜醜的純文字模式一行一行顯示。如果加上了 menu.c32 或 vesamenu.c32 時,就會有類似反白光棒的效果出現,那就可以使用『上下鍵』來操作光棒, 而不需要看著螢幕去輸入數字鍵來選擇開機選單囉!鳥哥覺得這樣比較好啦!包括在未來的設定檔以及相關的參數設定上面。這部分設定完畢後,再來則是核心檔案囉!

  • 利用原版安裝光碟取得 Linux 安裝軟體核心檔案:

我們需要安裝 Linux 系統,所以得要從原版光碟裡面將核心檔案撈出來~這裡鳥哥以 64 位元版本的 CentOS 6.4 為範例來說明,鳥哥預計將核心檔案放置於 /install/tftpboot/kernel/centos6.4/ 目錄下,且鳥哥已經將原版光碟的映像檔捉下來放置於 /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso 了,因此捉到核心檔案的方法如下:

# 將原版光碟暫時掛載在 /mnt 底下來抓資料用:
[root@centos ~]# mount -o loop /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /mnt
[root@centos ~]# mkdir -p /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/vmlinuz /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/initrd.img /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/isolinux.cfg /install/tftpboot/pxelinux.cfg/demo
[root@centos ~]# umount /mnt

其實僅需要兩個檔案即可,不過鳥哥建議可以抓原版光碟裡面的選單設定檔來作為修改的依據!這樣以後比較好改!上面三個檔案的意義是:

  • vmlinuz:就是安裝軟體的核心檔案 (kernel file);
  • initrd.img:就是開機過程中所需要的核心模組參數;
  • isolinux.cfg --> demo:作為未來 PXE 所需要的開機選單之參考!
  • 設定開機選單:

既然 PXE 用戶端是透過網路卡來向 TFTP 取得開機管理程式與核心檔案的,那麼 pxelinux.0 這個開機管理程式又可以去抓預設的開機選單設定檔 (pxelinux.cfg/default 內容), 這也就是說,其實有很多種不同的方案來讓開機管理程式進行開機的!包括本機硬碟開機以及網路下載核心開機。

我們這裡預計有兩個開機選項, 一個是透過本機硬碟開機 (local boot) 一個則是透過剛剛我們所下載的核心檔案來開機,以進入安裝模式。那設定該如何處理呢?建立 pxelinux.cfg/ 目錄下的 default 即可! 而且我們會使用 vesamenu.c32 來將選單顯示成為類圖形光棒喔!注意相關語法!

[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
UI vesamenu.c32        <== 使用 vesamenu.c32 這個類圖形的介面程式
TIMEOUT 300            <== 單位 0.1 秒,所以這個設定可等待 30 秒來進入預設開機
DISPLAY ./boot.msg     <== 提供一些額外的資訊,讓使用者更瞭解選單意義!
MENU TITLE Welcome to VBird's PXE Server System
                       <== 上面這行只是提供一個大標題而已!
LABEL local            <== 第一個選單的項目
  MENU LABEL Boot from local drive
  MENU DEFAULT         <== 此選單為預設項目 (等待逾時就進入此開機)
  localboot 0          <== 本機磁碟開機的特定項目!

LABEL network1
  MENU LABEL Boot from PXE Server for Install CentOS 6.4
  kernel ./kernel/centos6.4/vmlinuz            <== 核心所在的檔名
  append initrd=./kernel/centos6.4/initrd.img  <== 就是核心外帶參數啊!
# 上述設定中,大寫的文件部分要特別注意!那是使用 vesamenu.c32 的關鍵字!
# 至於後面的部分,那就是每個設定項目的內容囉!

[root@centos ~]# vim /install/tftpboot/boot.msg
Welcome to VBird's PXE Server System.

The 1st menu can let you system goto hard disk menu.
The 2nd menu can goto interactive installation step.

這個檔案有很多種不同的設定模式,包括使用 menu.c32 以及 vesamenu.c32 的設定項目也不太相同。鳥哥這邊是以 vesamenu.c32 為範例的喔! 同時,在開始寫這設定值之前,請務必回到上面幾個小段落瞧一瞧,因為檔案放置的地點在每本書或每個範例裡面都不一樣!能不能透過 TFTP 讀到你正確想讀的檔案, 在這個設定檔當中才是重點項目喔!那就來說說上面大寫字體的關鍵字部分的意義:

  • UI vesamenu.c32:代表預設使用 vesamenu.c32 這一個類圖形介面來作為開機選單的顯示依據。要注意, vesamenu.c32 在本範例中是放置於 tftp 的根目錄,就是在 /install/tftpboot/ 目錄下喔!

  • TIMEOUT 300:進入選單後,會等待多少時間讓使用者互動的挑選開機項目。這個單位比較特殊,是 0.1 秒,很多朋友都會忘記單位!要注意喔!

  • DISPLAY ./boot.msg:將額外的資訊以純文字檔的形式寫入 boot.msg 當中!這個資訊可有可無~如果你有很多相關的選單介紹要說明的話, 就寫入本檔案中。如果這個資訊檔案不存在,系統就會用預設的按下 [Tab] 按鈕顯示特殊訊息的資訊告知用戶。鳥哥這邊是將 boot.msg 放在 tftp 的根目錄下!

  • MENU TITLE ...:在後面接的純文字資料將會顯示於使用者視窗中的最上方的大標題!

  • LABEL local:LABEL 後面接 boot loader 認識的選單項目,所以,第一個選單的實際內容其實是『 local 』才對!也就是說,如果沒有 vesamenu.c32 的輔助, 你想要進入這個選單的話,就得要用鍵盤輸入『 local 』才會進入到此選單的設定來開機!底下第二個 LABEL 的意義也是一樣的。

  • MENU LABEL:跟上面一個有相關性,LABEL 是 boot loader 認識的選單名稱,但我們想要讓使用者更清楚這個選單的意義, 因此透過這個 MENU LABEL 來寫入更多的資料。這個項目也會在光棒中顯示出來,所以字數也不宜太多就是了。

  • MENU DEFAULT:就是預設值,預設光棒反白會在那個選單上面的意思~我們使用的預設值是 local 這一個 LABEL!

  • localboot 0:這個是使用本機開機的一個特殊用法,如果要用本機的設備開機,不論是光碟、硬碟、軟碟,都使用這個設定項目就對了。

  • kernel:後面接你放在 TFTP 上面的 Linux 核心檔案,檔名是相對於 TFTP 的根目錄,所以記得你的核心檔案放在哪裡。 鳥哥比較喜歡分門別類的放置檔案,因此檔名包括目錄名稱,就會比較長一些~在本範例中的完整檔名其實是 /install/tftp/kernel/centos6.4/vmlinuz 呦!

  • append:外加的核心參數,重點是 initrd.img 這一個核心模組檔案!沒有他,就無法開機了啦!

關於這個設定檔的內容,鳥哥建議前往你系統中的 /usr/share/doc/syslinux-${version}/menu.txt 檔名去瞧一瞧,裡面寫得非常仔細!尤其是你還可以使用 chain.c32 去載入不同的 boot sector 開機!這就等於透過網路去指揮你的系統進行某個多重作業系統開機!而不用在現場敲鍵盤!非常有幫助!不過我們這裡沒有這方面的需求, 因此沒有仔細介紹。反正,記得去瞧瞧就是了。



1.4 用戶端開機測試與透過網際網路安裝 CentOS

一切都整理妥當之後,接下來你就可以開始在用戶端的 BIOS 設定網路開機,然後來測試一下你的 PXE 環境設定正確否了!只不過,每一家主機的 BIOS 設定都不相同, 鳥哥沒有辦法全部測試給你看~同時,新的 BIOS 甚至已經支援滑鼠設定了!好厲害好厲害~鳥哥還是使用舊舊的電腦來顯示給大家瞧瞧~相關的設定位置應該都差不多啦!

  • 啟動內建網卡的網路開機功能:如果你的主機板有內建網卡 (一般都內建了啦!),那你得要啟用他的網路開機功能,這樣才能夠在開機順序中找到網卡開機的選項! 這個項目一般預設都是關閉的~所以得要手動去啟動他才行!如下所示為選擇的順序:
    BIOS 調整網路開機
    圖 1.4-1、BIOS 調整網路開機的示意圖
    在上圖中依序選擇進階 (Advanced),再選擇內建裝置設定 (Onboard Devices Configuration),就可以得到如下的畫面來設定要不要啟用網路開機的功能了!
    BIOS 調整網路開機
    圖 1.4-2、BIOS 調整網路開機的示意圖 (續)
    如上所示,找最重要的關鍵字『 LAN 』這個區網的網卡設定值,記得要選擇『 Enabled 』的項目才行。這樣就設定好網路卡開機的項目了!很簡單吧!

  • 啟用其他周邊設備的網路開機功能:在某些時刻,你可能需要透過『外接的擴充卡』來進行網路開機!舉例來說,如果你有多個網路介面, 其中幾個是由 PCI-E 擴充插槽的 Gb 網卡所提供的,那就有可能得要設定一下電源管理模組,讓這些網路擴充卡可以發揮網路開機的功能!詳細的設定如下:
    BIOS 調整網路開機
    圖 1.4-3、BIOS 調整網路開機的示意圖 (續)
    鳥哥選擇的這個主機是三、四年前的產品,該時段電源管理還是使用 APM (Advanced Power Manager) 模組,現今很多主機板都使用 APCI (Advanced Configuration and Power Interface) 來管理了!所以,如果你的主機板是比較新的,那在如上圖的 『Power』 選項中,就點選 ACPI 之類的相關字眼即可。點選上圖圈選的 APM 之後,會出現如下畫面:
    BIOS 調整網路開機
    圖 1.4-4、BIOS 調整網路開機的示意圖 (續)
    鳥哥的這個主機上面有安插較舊的 PCI Gb 網卡以及較新的 PCI-E 網卡,所以這邊鳥哥將這兩個介面的電源供應都勾選,讓這幾個網路卡可以支援網路開機就是了。 如上所示,將重要的關鍵字 PCI 與 PCIE 勾選起來就對了!

  • 調整第一個可開機裝置為網路卡:既然要讓網路卡開機,就得要讓網路開作為第一個開機裝置才行!由於系統大多預設使用硬碟開機在前, 所以這裡沒有設定時,你的系統是不會進入網路卡開機的項目的。同時注意,某些時刻,上述的網路卡設定完成後,得要儲存 BIOS 且重新 reboot 過後, 這裡才會出現網路卡裝置的選項喔!假設你剛剛的項目都已經儲存且重新啟動系統了,那再進入 BIOS 後,選擇如下的『Boot』就會出現如下畫面:
    BIOS 調整網路開機
    圖 1.4-5、BIOS 調整網路開機的示意圖 (續)
    如上圖所示,點選了開機順序項目後,就會出現可以開機的裝置項目,記得第一個選擇網路裝置即可。在鳥哥的這個主機的案例中,我們使用的網卡裝置為 GE (Gigabit Ethernet) 的項目, 所以將他選擇在第一項即可!之後儲存 BIOS,並重新開機吧!
    BIOS 調整網路開機
    圖 1.4-6、BIOS 調整網路開機的示意圖 (續)

完成上述的項目之後,重新開機後,如果一切順利,你的系統在開機時就會進入如下的畫面當中:

用戶端進入 PXE 的選單圖示之示意圖
圖 1.4-7、用戶端進入 PXE 的選單圖示之示意圖,左側使用 menu.c32 右側使用 vesamemu.c32

如上圖所示,鳥哥測試過兩種介面,分別使用了 menu.c32 以及 vesamenu.c32 來測試顯示的畫面,結果就像上圖,使用 vesamenu.c32 看起來解析度似乎比較好,只是, 預設的配色好像不怎麼樣,可能得要自己去參考說明文件配色一下比較好。使用 menu.c32 的話,就是明顯的顏色對比,但是比較呆板一些的畫面。隨人喜好去調整吧。

由於預設有 30 秒的選擇時間,因此畫面下方會開始讀秒,如果按了上/下按鍵,反白的部分就不會在 default 值預設的光棒處了!如果你在需要的選單上面,按下了『Tab』按鈕, 此時系統就會跳出類似 grub 的互動介面給你修改參數就是!由於我們還沒有安裝系統在硬碟上,因此,鳥哥選擇了第二個項目,亦即是『Boot from PXE Server for Install CentOS 6.4』的項目。 按下之後就會開始進入安裝的偵測畫面中。

硬體偵測完畢,並且讓你:

  • 挑選語系 (直接選 English 即可)
  • 挑選鍵盤格式 (預設的 us 即可)

之後,就開始選擇 CentOS 軟體所在的儲存媒體了!如下圖所示:

進入安裝過程,使用網路上的 CentOS 媒體來源 (URL)
圖 1.4-8、進入安裝過程,使用網路上的 CentOS 媒體來源 (URL)

由於我們尚未製作軟體安裝伺服器,因此,我們直接使用國家高速網路中心的 FTP 所提供的軟體來源來安裝!因此,此時請選擇『 URL 』的項目。因為使用 URL 必須要有網路, 因此,安裝程式會要求我們設定 IP !請注意,這個安裝過程使用的網路參數與 PXE 取得的網路參數無關!所以這裡得要重新輸入一次網路參數。因為我們有使用 DHCP 服務啊! 所以如下勾選動態設定就好了:

替安裝程式設定網路參數
圖 1.4-9、替安裝程式設定網路參數

然後輸入你查到的網址,如下所示 (使用國高的 FTP):

裸機安裝
圖 1.4-10、直接連上國家高速網路中心去線上裸機安裝囉!

如果一切都沒有問題,這個時候就會開始進入安裝畫面,開始進行裸機的線上安裝!你也不用在用戶端燒錄光碟機,非常簡單方便吧!只是有個問題,你得要讓你的機器連上 Internet 去安裝軟體~ 那你也知道網際網路的速度要比你區域網路的速度慢很多~如果同時有很多台用戶端電腦要安裝系統,那就糗大了!因此,這時在區網內架設一個軟體安裝伺服器就顯的很重要了! 底下就來聊一聊怎麼建這個安裝伺服器吧!



1.5 透過 NFS、HTTP、FTP 等協定提供軟體安裝伺服器

架設安裝伺服器實在是非常的簡單,尤其是 CentOS 這個版本!你只要下載 CentOS 6.x 的第一片 DVD,將裡頭的資料以 NFS, HTTP, FTP 等方式分享出去,那你的主機就變成安裝伺服器了!就這麼簡單!鳥哥個人比較偏好使用 NFS 來分享,這是因為未來的應用中,我們可能需要網路磁碟機, NFS 是一個可以直接作為 Linux 網路磁碟機的服務,所以就用它比較簡單!如果你喜歡其他的協定來分享也沒有關係啊!我們可以使用同一個目錄來分享呢! 假設我們 DVD1 放置於 /install/iso/ 目錄內了,預計要分享的 CentOS 6.4 原版 DVD 目錄放在 /install/nfs_share/centos6.4/ 中, 簡單的處理如下:

# 1. 先將 DVD 的資料給他放置於所需要的目錄中,當然直接使用掛載最快!
[root@centos ~]# mkdir -p /install/nfs_share/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /install/nfs_share/centos6.4 iso9660 defaults,loop 0 0
# 特別要注意的是檔案系統與參數,記得光碟使用 iso9660 且需要加上 loop

[root@centos ~]# mount -a
[root@centos ~]# df
檔案系統     1K-區段      已用  可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
             4251346   4251346      0 100% /install/nfs_share/centos6.4
# 這樣就掛載結束,比複製來複製去要簡單的多喔!

# 2. 製作 NFS 分享,要注意對內 port 有規範喔!
[root@centos ~]# yum -y install nfs-utils
[root@centos ~]# vim /etc/exports
/install/nfs_share/  192.168.42.0/24(ro,async,nohide,crossmnt)  localhost(ro,async,nohide,crossmnt)
# NFS 的設定是很簡單,不過,要注意由於 server 上面有兩個掛載點在分享的目錄上,
# 所以得要加上 nohide 與 crossmnt 這兩個參數才行!且後續的服務要開比較多就是了~

[root@centos ~]# vim /etc/sysconfig/nfs
RQUOTAD_PORT=901
LOCKD_TCPPORT=902
LOCKD_UDPPORT=902
MOUNTD_PORT=903
STATD_PORT=904
# 找到上面這幾個設定值,我們得要設定好固定的 port 來開放防火牆給用戶處理!

[root@centos ~]# vim /etc/idmapd.conf
[General]
Domain = i4502.dic.ksu
[Mapping]
Nobody-User = nfsnobody
Nobody-Group = nfsnobody
# 找到上面幾個設定值,我們這裡假設 ID 對應的無此帳號使用 nfsnobody 設定!

[root@centos ~]# /etc/init.d/rpcbind restart
[root@centos ~]# /etc/init.d/nfs restart
[root@centos ~]# /etc/init.d/rpcidmapd restart
[root@centos ~]# /etc/init.d/nfslock restart
[root@centos ~]# chkconfig rpcbind on
[root@centos ~]# chkconfig nfs on
[root@centos ~]# chkconfig rpcidmapd on
[root@centos ~]# chkconfig nfslock on
[root@centos ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100011    2   udp    901  rquotad
    100011    2   tcp    901  rquotad
    100005    3   udp    903  mountd
    100005    3   tcp    903  mountd
    100003    4   tcp   2049  nfs
    100003    4   udp   2049  nfs
    100021    4   udp    902  nlockmgr
    100021    4   tcp    902  nlockmgr
    100024    1   udp    904  status
    100024    1   tcp    904  status
# 要注意喔,我們得要啟動的 port 有 111, 2049,901~904 這幾個!防火牆要開!

[root@centos ~]# showmount -e localhost
Export list for localhost:
/install/nfs_share 192.168.42.0/24,localhost
# OK!看到上面這些東西,就是搞定囉!讚!

# 3. 然後我們也來開放 www 服務提供這個安裝伺服器吧!簡單作法如下:
[root@centos ~]# yum install httpd
[root@centos ~]# /etc/init.d/httpd start
[root@centos ~]# chkconfig httpd on
[root@centos ~]# mkdir -p /var/www/html/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /var/www/html/install/centos6.4 iso9660 defaults,loop 0 0

[root@centos ~]# mount -a
[root@centos ~]# df
檔案系統      1K-區段      已用  可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
              4251346   4251346      0 100% /var/www/html/install/centos6.4
# 同樣的,用掛載的應該會比較快速些~

# 4. 如果還想要提供 FTP 的處理呢?那還是簡單的這樣做即可:
[root@centos ~]# yum install vsftpd
[root@centos ~]# /etc/init.d/vsftpd start
[root@centos ~]# chkconfig vsftpd on
[root@centos ~]# mkdir -p /var/ftp/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso  /var/ftp/install/centos6.4 iso9660  \
	defaults,loop,context=system_u:object_r:public_content_t:s0 0 0
# 上面是同一行,比較重要的是參數的部分多了 context 喔!因為我們這個系統有使用 SELinux,
# 為了要避免掛載的檔案系統出現 FTP 的 SELinux 錯誤,因此這裡得要加上此參數才行!

[root@centos ~]# mount -a
[root@centos ~]# df
檔案系統     1K-區段      已用     可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
             4251346   4251346         0 100% /var/ftp/install/centos6.4
# 超級簡單的這樣就搞定了!

很神奇的,這樣就搞定了三個服務的安裝伺服器功能!如果你想要開始測試使用內網的 http, ftp 來安裝的話,請回到圖 1.4-10 的畫面當中,在 URL 的空格上面,分別填入兩個不同的網址試看看:

  • WWW: http://192.168.42.254/install/centos6.4
  • FTP: ftp://192.168.42.254/install/centos6.4

上面兩個網址鳥哥都測試過,透過上面的設定,這個網址是可以直接就進入安裝模式當中沒問題~那如果是 NFS 呢?你得要先回去圖 1.4-8 的畫面中點選『 NFS directory 』的項目,然後在出現如下的畫面中,才輸入我們詳細的 NFS 分享的 CentOS 6.4 光碟內容的所在目錄:

裸機安裝
圖 1.5-1、使用 NFS 作為安裝伺服器的設定方式

因為畫面的關係,所以你看不到全部的輸入資料。請注意,CentOS directory 項目要填寫:『/install/nfs_share/centos6.4』才行喔! 接下來,請自行使用底下的方式來完整的安裝好一套 Linux 在你的系統上。鳥哥這裡使用的是 30GB 的測試硬碟來安裝的,底下僅列出不是自動設定的項目,需要調整的地方:

  • 設定時區的部分,請選擇『 Asia/Taipei 』項目,並且取消『 System clock uses UTC 』的項目;
  • 建立用戶自訂的分割『 Create Custom Layout 』,僅使用 3GB 去掛載於根目錄即可,其他都保留不動;
  • 使用『 Basic Server 』作為軟體安裝的標準即可。

接下來系統就會使用你想不到的速度安裝好一套 CentOS Linux 了!非常簡單吧!這個網路安裝的流程!



2. 用 kickstart 大量部署用戶端 Linux CentOS 系統

完成上面各小節的設定後,你區網內的用戶端電腦應該都能夠透過網路來安裝 CentOS 了!只是,比較傷腦筋的地方在於,你還是得要手動一部一部電腦去開機,然後一步一步去選擇需要的安裝選項後, 最終按下安裝,系統才會自動的幫你安裝妥當。有沒有可能讓系統自己幫我安裝而不用選擇呢?可以啊!那就透過 kickstart 這個機制吧!

2.1 kickstart 可用參數

我們在上個小節的最後一段當中,有請你自行安裝了一個超小型的 CentOS 系統吧!那麼請你進入該系統去,瞧一瞧 root 家目錄有沒有一個名為 anaconda-ks.cfg 的檔案呢? 請打開該檔案來瞧一瞧內容如何!

[root@client ~]# cat /root/anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
install
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted $6$qznCBKF/YnJdX9rB$OeSGN1c6JNCZ/GtqJTvKrN0t/pRkkUlhEXdc...
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
#clearpart --none
#part / --fstype=ext4 --size=3000
repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100

%packages
@base
@console-internet
@core
@debugging
....(中間省略)....
krb5-workstation
perl-DBD-SQLite
%end

看過這個檔案內容,有沒有覺得好像很熟悉啊!那是啥?沒錯!這就是剛剛你使用安裝程式進行設定項目選擇時,將你選擇的內容記憶起來的資料!透過這個檔案, 你可以知道最初安裝時是如何設定這個系統的。也由於這個系統還記錄了 root 編碼過的密碼,所以,很重要啊!不要隨便外流喔!現在讓我們想一想, 既然這個檔案已經記錄了我們所需要進行的各項步驟,那我透過這個檔案不就可以預先選擇好,然後交給安裝程式去自動執行即可嗎?沒錯啊!就是這樣!

既然知道了這個未來的功能了,那我們當然就得要先來瞭解一下這個 kickstart 檔案的內容才好啊!其實這個檔案大致將所有的動作分為三大部分來設計,分別是:

  • command (指令項目區段):就是上面檔案中最開頭的部分,亦即是我們主要設定系統的項目!這包括軟體來源、安裝模式(升級或全新安裝)、鍵盤格式、網路設定、 防火牆設定、使用者身份認證設定、時區、SELinux 啟動、開機管理程式與磁碟分割等最重要的項目部分了。

  • %packages (軟體安裝區段):CentOS 提供的軟體非常多,還有所謂的軟體群組呢!同時還支援第三方協力軟體的來源。因此,kickstart 可以在這個階段來處理各式軟體的安裝。

  • %pre %post (安裝前、安裝後設定區段):有時候,安裝前後我總是得要針對系統作個設定或測試什麼的,舉例來說,假設我在系統安裝完畢後,想要直接進行開機選單的增加或修改, 然後再進行開機的動作直接生效,我就不用還得要一部一部機器的登入去修改了。還有包括想要直接加入 ssh 金鑰的設定控制等項目,寫在 %post 裡頭的話, 會變的很方便喔!

接下來就讓我們稍微談一談每個區段的重要設定項目吧!

  • command 一般指令項目區段:

這部分的重點項目有底下幾個常見的設定值,至於全部的完整資訊,可以參考文末的參考文獻去看更完整的資料喔!

  • install 或 upgrade (安裝模式,二選一)
    如果你想要全新安裝一套 Linux 的話,就選『 install 』,如果你是要升級原本的舊系統,那就選擇『 upgrade 』。在本案例中,我們是想要使用裸機安裝 (沒有預設系統), 所當然是選擇 install 即可。

  • text, graphical (使用純文字或圖形介面安裝顯示)
    一般來說,現在的系統只要記憶體超過 1GB 以上,通常 CentOS 就會主動提供圖形介面來讓使用者進入安裝畫面,記憶體小於 1GB 時,恐怕系統就只會提供純文字介面讓使用者安裝。 老實說,如果是大量自動安裝 CentOS Linux 的話,使用純文字介面的速度會比圖形介面要來的快些,而且也不用去偵測一堆有的沒有的硬體設備 (滑鼠、螢幕、鍵盤...)。 因此,鳥哥通常會在 install 後面再加一行『 text 』來強制進如文字介面的自動安裝,環境比較單純就是了!

  • cdrom, harddrive, nfs, url (原版軟體位置,擇一即可)
    使用光碟安裝就選擇 cdrom,使用硬碟安裝就用 harddrive,我們這裡使用網路安裝啊!所以鳥哥這裡只介紹 nfs 以及 url(網址) 兩種方式的來源撰寫方式。 此外,也要記得,這個設定值得要接在 install 後面設定比較好喔:

    • url:以本章的 http/ftp 協定而言,應該要寫成如下的模樣來告知 kickstart 去哪裡讀取軟體:
      url --url http://192.168.42.254/install/centos6.4
      url --url ftp://192.168.42.254/install/centos6.4

    • nfs:以本章的 NFS 分享目錄來說,就應該要寫成:
      nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4

  • lang (系統語系設定)
    你可以選擇系統的語系,一般來說,我們都會選擇台灣的中文語系啊!只是,在純文字模式底下,中文是沒有辦法被顯示出來的,因此,安裝過程中會使用英文顯示, 等安裝完成後,在可以見到中文的環境中就能使用中文語系了!另外,基本上我們建議使用萬國碼 (unicode),因此,建議的設定為:
    lang zh_TW.UTF-8

  • keyboard (系統鍵盤按鍵格式)
    選擇鍵盤格式啊!也算重要吧!一般台灣使用美式鍵盤,所以這樣設定即可:
    keyboard us

  • network (網路參數設定)
    一般來說,使用 kickstart 就是為了要方便設定,因此,除非要對應固定的網卡來客制化設定,否則,一般大家都是使用 dhcp 來設定即可。 所需要設定的項目包括哪一張網卡要啟動 (--device)?開機時要不要啟動 (--onboot)?使用什麼方式設定 IP 等等 (--bootproto dhcp/static)。 我們以 eth0 的 dhcp 方式設定如下示意:
    network --onboot yes --device eth0 --bootproto dhcp

    如果想要使用固定 IP 的設定,那可能就得要這樣做了:
    network --onboot yes --device eth0 --bootproto static --ip 192.168.42.201 --netmask 255.255.255.0 --gateway 192.168.42.254 --nameserver 192.168.42.254

  • rootpw (設定 root 密碼)
    設定 root 密碼是很重要的!也因為 root 密碼不希望直接以明碼的方式設定在此檔案內,因此,我們得要經過編碼才行。 但是加密的密碼怎麼來?最簡單的方式,使用 grub-crypt 來處理即可。這個指令預設使用 sha512 加密格式,如果要使用其他加密格式, 請自行 man 一下該指令囉。
    [root@centos ~]# grub-crypt
    Password:         <==輸入一次密碼
    Retype password:  <==再輸入一次密碼
    $6$fPCvnGklAR4Qbxhp$RfFL4.wwZml.mWbej6HHYWTAE6ZLRV8/d...  <==這就是加密過的密碼!
    
    取得密碼後,使用如下的方式設定即可:
    rootpw --iscrypted $6$fPCvnGklAR4Qbxhp$RfFL4....

  • firewall (防火牆設置)
    一般來說,我們用戶端使用的系統,防火牆一定要啟動之外,如果是內網的 Linux 系統的話,只要啟動能夠讓網路管理員可以遠端操控的 ssh 即可。 當然啦,如果你開心的話,在區網內將防火牆取消也沒關係,反正是用戶端而且是緊急狀態下才會使用的系統啊!由於我們後續還會自己手動設定防火牆, 因此這部分可以先啟用 ssh 即可。相關設定如下:
    # 不要在這部電腦使用防火牆系統,直接放行所有連線功能:
    firewall  --disabled
    
    # 僅放行 ssh 的連線功能:
    firewall  --service=ssh     <==啟用的服務,可以是 ssh, telnet, smtp, http, ftp 等等
    firewall  --port=22:tcp     <==啟用的埠口,也可以使用 2049:udp 之類的模式!
    # 上面兩個取任何一個都可以!鳥哥個人是比較喜歡使用號碼的 port number 來顯示!
    
    # 讓 eth1 變成信任網域,且放行 port 22, 25, 80 等埠口:
    firewall  --port=22:tcp,25:tcp,80:tcp   --trust eth1
    # 如果有多個網卡,可以指定某張網卡變成信任裝置,這樣直接放行所有的進出封包在 eth1 上頭~
    # 但不包括其他 eth0, eth2...介面,僅有 eth1 是信任的意思。
    

  • authconfig (放行使用者登入的身份認證模組)
    一般來說,通常 Linux 主機要讓使用者登入時,只參考 /etc/passwd, /etc/shadow 等檔案資料,若有該帳號的相關資訊,並且使用者密碼輸入正確,那就可以登入系統了。 不過,登入時,到底加密的密碼驗證機制是透過什麼方式的演算法,就可以在這個項目上詳細的說明了。一般來說,目前已經使用 sha1 的 512bits 複雜演算法的方式來取代較簡單的 md5 編碼。因此你會看到如下的設定值:
    # CentOS 預設的身份驗證設定值:使用 sha1 512bits 演算法
    authconfig  --enableshadow  --passalgo=sha512   <==較佳的預設值!
    
    # 如果想要使用舊的 md5 編碼來取代新的 sha1 編碼,可以這樣做看看:
    authconfig  --enableshadow  --enablemd5
    

  • selinux (SELinux 相關模組)
    在區網內的用戶端系統,你是可以將 SELinux 暫時關閉的!不過,從 CentOS 6.0 以後,鳥哥習慣了有 SELinux 的日子!至少得要啟動在 permissive 的寬容模式才好。 因此鳥哥這裡建議可以改成這樣:
    selinux  --permissive
    # 主要的模式有:  --enforcing  --disabled  --permissive 喔!
    

  • timezone (設定系統所在區域的時區)
    時間是很重要的,所以得要選擇時區。鳥哥近年來所安裝的系統,為了適合所有學生與課程的安排,都得要處理成多重作業系統安裝。因此,不太適合會將 BIOS 時鐘調整為格林威治時間的 UTC, 因此,建議將 --utc 拿掉比較妥當!所以這裡選擇的台灣時區就變成:
    timezone  Asia/Taipei         <==建議改成這樣
    timezone  --utc  Asia/Taipei  <==以前預設的時區模式
    # 更多系統支援的時區列於 /usr/share/zoneinfo/ 目錄下,請自行參考喔!
    

  • bootloader (開機管理程式的安裝與設定)
    開機管理程式 grub 可以安裝於 MBR 也可以安裝於 Boot sector (或 superblock) 內,同時,也得給予開機選單內核心項目的核心參數才行!預設的情況以及可以修改的部分如下所示:
    # 原本預設的 bootloader 安裝於 MBR 以及預設 CentOS 6.x 的核心參數如下:
    bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
    # grub 安裝於 MBR, 安裝於 vda 那顆硬碟上,且增加核心參數為 crashkernel=auto rhgb quiet
    
    # 先找 vda 安裝,如果找不到,就找 sda 安裝,再找不到,就找 hda  安裝在 MBR 內:
    bootloader --location=mbr --driveorder=vda,sda,hda --append="crashkernel=auto rhgb quiet"
    

  • halt, reboot, poweroff, shutdown
    安裝完畢之後,需要安裝程式幫你的系統進行什麼行為的意思。一般來說,如果是 kickstart 的環境中,這個值沒有設定的話,就會直接進入 『reboot』重新開機的階段。 如果你想要系統安裝完畢後自動關機,那就使用 『poweroff』 即可,使用 shutdown 跟 poweroff 類似。那如果你想要讓安裝完畢後等待使用者按任意鍵才繼續, 就像一般手動挑選設定來安裝 Linux 的最後一步,要你按下一步才會重新開機的模式時,那就使用 『halt』 停止即可。

  • zerombr (是否初始化尚未分割或有問題的分割表)
    如果我們的硬碟是全新的,此時硬碟內的第一個磁區會是空空如也,那麼我們的安裝程式可能會判斷這個分割表是其他作業系統所提供的,為了擔心不小心誤刪資料, 因此系統都會詢問你:『要不要初始化』!這對 kickstart 來說,可能會造成些許困擾~因此,如果要強制初始化的話,可以加上 『zerombr』 來進行初始化即可。

  • clearpart (是否清除分割表,這個重要!)
    既然要安裝在系統上,就得要進行分割才行。不過,如果你的分割表不想要被破壞,那麼就得要使用 clearpart --none 才行!不過我們這裡使用裸機安裝嘛!所以當然得要重新分割。 因此,clearpart 就得要寫成 --all 了!那如果你有很多顆硬碟呢?然後僅有一顆要進行重新分割,此時就得要使用『 --drives 』來說明哪顆硬碟要被分割囉。所以可以這樣做:
    # 所有硬碟的分割表通通被清除!
    clearpart  --all
    
    # 僅清除 vda 硬碟的分割表,其他的硬碟不要清除分割表!
    clearpart  --drives=vda  --all
    
  • part (詳細的分割參數)
    分割表清理完畢,再來就是進行分割了。假設我們要進行如下的分割:
    • 根目錄為主要分割,使用 5GB 硬碟
    • /home 為主分割,使用所有剩餘硬碟容量
    • /usr 使用 10GB
    • /var 使用 20GB
    • /tmp 使用 1GB
    • swap 使用 1GB
    那相關的設定值就會變成如下模樣:
    part  /      --fstype=ext4  --size=5000   --ondisk=vda  --asprimary
    part  /home  --fstype=ext4  --grow        --ondisk=vda  --asprimary
    part  /usr   --fstype=ext4  --size=10000  --ondisk=vda
    part  /var   --fstype=ext4  --size=20000  --ondisk=vda
    part  /tmp   --fstype=ext4  --size=1000   --ondisk=vda
    part  swap   --fstype=swap  --size=1000
    # 如果僅有一顆硬碟,那麼 --ondisk 可以省略喔!
    # 使用 --size 來規範該分割的大小,單位是 MB 囉!
    # 使用 --grow 就可以讓系統自動去判斷最大可用容量,然後通通丟給該分割!
    # 使用 --asprimary  就會將該分割強制列在主要分割類型中!
    
    我們這裡只講簡單的分割類型,更複雜的 LVM 或軟體磁碟陣列的類型,一般鳥哥是建議安裝好之後手動去調整。如果你想要安裝時就使用這些 LVM 或 RAID 的類型時, 那就請自行參考文末的參考文獻囉!

  • services (預設開機啟動或關閉的服務)
    預設安裝好 CentOS Linux 之後,會有很多服務就啟動了。如果你想要讓某些服務開機關閉或啟動,那就使用這個項目來處理。 例如,如果你不想要開機啟動 cups, kdump, acpid, portreserve 這四個服務,那你可以使用如下的方式來取消開機啟動喔!
    services  --disabled  cups,kdump,acpid,portreserve
    

  • repo (額外的 yum 軟體倉庫)
    用過 CentOS 的 yum 後,大概你會知道,CentOs 的軟體會依據不同的用途而分門別類,預設提供的就有三大軟體倉儲系統,包括 OS (原有軟體)、updates (升級 patch 軟體) 以及 extras (額外軟體) 等。所以,如果你在安裝過程中還需要額外的非原版光碟的軟體倉儲時,就可以使用這個 repo 來給予。 在預設的環境底下,就寫入與安裝來源相同的資料即可。老實說,這個 repo 也可以不寫沒關係的!
    repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100
    # --name 接這個 yum 軟體倉儲的名稱,可以自訂一個名字即可
    # --baseurl 就是軟體來源~上述為 NFS 的寫法,如果是 url 的寫法,就直接 --baseurl=http://xxx 即可
    # --cost 這個來源的權重比例
    

上面鳥哥僅列出常見的 kickstart 選項,還有很多其他選項,就請自行參閱相關的文獻資料囉!接下來讓我們來看一看軟體安裝區段能有什麼特殊的功能吧!

  • %packages 軟體安裝區段

玩過 yum 就會知道,一般我們在安裝軟體時,可以獨立安裝某一個特定軟體 (yum install package),也可以安裝整個軟體群組 (yum groupinstall grouppackage)! 那我怎麼知道有哪些軟體群組可以使用呢?這時就得要查詢原版光碟內的 repodata/*comps.xml 檔案了!舉例來說,請到目前你伺服器內的 /install/nfs_share/centos6.4/repodata/*comps.xml 檔案內,使用關鍵字 『group』 去查詢一下,就會看到很多安裝過程中會出現的軟體群組了! 以我們在上一小節談到的安裝內容 (basic server) 來說,相關的軟體與軟體群組有這些:

%packages
@base                          <==前面加個 @ 的,代表是軟體群組喔!
@console-internet
@core
@debugging
@directory-client
@hardware-monitoring
@chinese-support               <==中文語系支援!這個重要!
....(中間省略)....
pax                            <==直接寫軟體名稱的,就是單一軟體而已!
oddjob
sgpio
device-mapper-persistent-data
....(底下省略)....

一般來說,所有的軟體都可以在後續才安裝!不過,如果你想要一安裝完畢就能夠看到圖形介面以及所有相關的其他語系顯示畫面,那就得要安裝額外的語系支援。 同樣可以到 *comps.xml 檔案內找到相關的軟體群組來安裝。舉例來說,如果你想要安裝法語語系,那就得要加個:『 @french-support 』在你的 %packages 區段內囉!

  • %pre, %post 安裝前、安裝後的額外動作區段

假設你的 kickstart 是要給不同的機器設備共同使用的,但我們知道所有的設備其實硬碟數量與大小都不相同。那能不能在開始解析 kickstart 之前,先偵測系統的磁碟設備, 根據偵測的結果製作出分割表的規劃後,才進行 kickstart 的解析,最後才開始安裝呢?是可以的!那就是將所需要偵測與作出分割資訊的檔案透過 bash shell 去檢測, 然後在 kickstart 內使用『 %include somefile 』的方式將該資料彙整進來即可~這時就得要將該動作放置於 %pre 的區段內了!

不過 %pre 的用途比較少,因為安裝前大概只要注意到硬體偵測,以釐清我們想要安裝的模式為何而已。如果是安裝後到重新開機前的行為,那就熱鬧多了! 因為我們可能會增加 ssh 的金鑰、額外掛載與設定某些特定的腳本程式到 /etc/rc.d/rc.local、額外進行其他 partition 的完整復原等等。舉例來說,如果我想要安裝完畢之後, 讓 root 加入 ssh 金鑰,這樣我才能夠不用密碼登入此機器時,那可以這樣處理:

%post
#!/bin/sh
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EA...== root@i4502.dic.ksu" >> /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys

當然啦,上面那個金鑰的內容 (echo 後面雙引號的內容) 你就得要自己貼上去了~



2.2 一個電腦教室內簡易主控系統的範例

談完了大致的 kickstart 參數後,那怎麼用在我們想要處理的批次安裝電腦教室內的所有電腦主機呢?最簡單的方式就是,拿上一個小節做完的 anaconda-ks.cfg 來改即可! 簡單快速又方便!現在鳥哥想要使用底下的方式來處理批次安裝:

  • 透過純文字的方法全新安裝一套 CentOS 系統
  • 我要透過區域網路內的 NFS 伺服器來取得安裝軟體來源
  • 網路預設使用 dhcp 服務來啟動,且開機就會驅動網卡
  • root 密碼是要給予加密過的資料
  • 防火牆預設放行 22, 25, 80, 111 等埠口
  • 認證設定保持原有的狀態即可 (sha512)
  • 將 SELinux 啟動於寬容模式下
  • 安裝完畢後進行重新開機的動作
  • 僅作出一個 3GB 大小的根目錄來安裝這個小型控制系統即可
  • 關閉 cups, kdump, acpid, portreserve 等服務
  • 安裝的軟體主要為 basic server 類型,因此保留上一小節安裝後的原有的項目即可
  • 安裝完畢後加入 root 的 ssh 金鑰!

鳥哥預計將這個 kickstart 放置於 /install/nfs_share/kickstart/ 目錄內,且取名為 pcroom_raw.ks 檔案。在這個檔案開始處理前,我們有兩個東西需要先取得, 一個是 root 密碼,一個則是金鑰中公鑰的內容。我們可以簡單的透過底下的方式來取得相關的資訊:

# 1. 取得 root 密碼:
[root@centos ~]# grub-crypt
Password:
Retype password:
$6$ZXrlk3POd9J1kqa4$PmTaai.UlWf.exaXFP.aqmn6C4gdQvP9NpExsJmcJIDAKD8VEZArkVtfr/KDnScY41tZGJxwix0ZvEbsmjLea0
# 上面這一串就是我們要的資料啦!

# 2. 取得金鑰的公鑰資料:
[root@centos ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  <==輸入 Enter
Enter passphrase (empty for no passphrase):               <==輸入 Enter
Enter same passphrase again:                              <==輸入 Enter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.  <==這就是我們要的!
The key fingerprint is:
51:ee:b0:29:e5:3a:01:eb:57:33:f3:73:34:12:0b:26 root@server.i4502.dic.ksu

[root@centos ~]# cat /root/.ssh/id_rsa.pub
# 輸出的內容就是我們要的資訊!!

好了,那就讓我們來調整一下這次我們所需要的 kickstart 檔案內容吧!

[root@centos ~]# mkdir /install/nfs_share/kickstart
[root@centos ~]# vim /install/nfs_share/kickstart/pcroom_raw.ks
install
text
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang zh_TW.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted 剛剛你用 grub-crypt 作出的密碼參數
firewall --port=22:tcp,25:tcp,80:tcp,111:tcp,111:udp,9000:udp,9001:udp
authconfig --enableshadow --passalgo=sha512
selinux --permissive
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
reboot

zerombr
clearpart --all
part / --fstype=ext4 --size=3000

services  --disabled cups,kdump,acpid,portreserve

repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100

%packages
@base
@console-internet
@core
@debugging
@directory-client
@hardware-monitoring
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@server-policy
pax
oddjob
sgpio
device-mapper-persistent-data
samba-winbind
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite

%post
#!/bin/sh
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "剛剛你製作出的 id_rsa.pub 檔案的內容" >> /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys

[root@centos ~]# chmod 644 pcroom_raw.ks

瞭解了 kickstart 的參數後,這個小節的相關參數修改與製作就顯的簡單多了!接下來,就讓我們準備來大量安裝系統吧!



2.3 搭配 PXE 使用的方式

我們得要告知用戶端在取得 PXE 的環境後,還能夠自動下載這個 kickstart 設定檔,這樣用戶端電腦才會自己安裝而不會進入詢問模式。這時得要修改 pxelinux.cfg/default 內容了! 我們現在增加另外一個選單,這個選單可以讓系統自動的以剛剛的 kickstart 方式來自我裸機安裝~這樣做就可以了!

[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL kickstart1
  MENU LABEL Boot from PXE Server for AUTO Install CentOS 6.4 raw
  kernel ./kernel/centos6.4/vmlinuz
  append initrd=./kernel/centos6.4/initrd.img ks=nfs:192.168.42.254:/install/nfs_share/kickstart/pcroom_raw.ks

重點是上面特殊字體的部分!可以是 nfs 也可以是 http:// 的格式!看你的資料要放哪裡就是了。鳥哥偷懶一下,就直接擺內網原本要分享出去的位置而已。 好了,接下來請到內網的用戶端開機一下,使用網路開機喔!看看能不能進入第三個選單,然後讓系統自己安裝去!

在 PXE 當中增加一個選單!
圖 2.3-1、在 PXE 當中新增一個可以自己安裝的選單!

以純文字模式安裝這套新系統的圖示
圖 2.3-2、以純文字模式安裝這套新系統的圖示

在鳥哥的測試中,很快的啦!幾分鐘就安裝好了這樣的一套系統~相當的簡單快速!不用挑選!好開心啊!另外,這一套系統如果搞定了之後,拜託注意一下, 請回到第一章 2.3 小節的 DHCP 伺服器部分,參考一下 getmac.sh 的內容, 根據該功能重新設定一下你的 DHCP 伺服器設定檔,讓你的用戶端 IP 能夠與座位搭配上喔!




3. 以 Demo 機製作映像檔進行大量用戶端系統的還原

如果你跟鳥哥一樣有特殊的作業系統環境需求,那麼可能得要花點功夫來思考一下怎麼進行作業系統的初期安裝才好!安裝好了之後,再將該 partition 所在的環境給他完整的備份, 然後丟給其他電腦來作為復原的機制!這樣就成功啦!這過程是挺複雜的~底下我們就來玩一玩~

3.1 Demo 機多重作業系統的規劃與安裝

在鳥哥工作的資訊傳播系單位中,因為系上老師們使用的軟體都不一樣,很多老師還是需要 Windows 上面的重要軟體。因此,鳥哥得要將電腦系統安裝成多重作業系統。 在這樣的情況下,我們系上需要安裝 (1)第一套 Linux 管理系統 (2)windows 7 系統 (3)上課用 CentOS 桌面系統,這還沒有提到資料共用的 windows D 槽~ 好了,假設我們已經使用 kickstart 安裝好了第一套 Linux 管理系統,那接下來 Windows 系統怎麼安裝呢?當然你得要調整用戶端 BIOS 變成光碟機開機,放入 Windows 7 的原版光碟, 接下來請自行安裝你的 Windows 系統吧!

  • Demo 機的分割注意狀況:目標磁碟總是比來源磁碟大才好

因為 Demo 機未來安裝的系統都是要做為備份的來源,因此安裝在上頭的資料當然就得要能夠復原給其他用戶端電腦。一般來說,目標的磁碟總是要比來源的磁碟大才好。 例如,原本 Demo 機器的 Windows 佔用了 20GB 的話。那麼你的其他用戶端電腦,除非系統與磁碟是一模一樣的,否則的話,最好能夠加大到類似 20.1GB 之類的容量,那未來在復原時比較不會出問題。 這是鳥哥過去的經驗啦,提供給您參考囉!

另外,安裝過 Windows 7 的朋友都知道,Windows 會自己搞一個額外的 100MB 分割來儲存資訊。不過,鳥哥不是很喜歡多這個分割在。但是這個分割是 windows 正常安裝所產生的, 以正常手段是很難避免掉!所以,為了避免這個問題,鳥哥習慣上都會先自己在 Linux 控制系統上面使用 fdisk 或 parted 手動建立足夠的分割,然後再強迫 Windows 安裝到固定的分割槽中, 這樣就不會多出那個怪異的 100MB 分割槽了。

現在,鳥哥假設我這裡預計要安裝的 Windows 會佔用 20.1GB 的容量,剩餘的容量都給 Linux 使用。不過如前所述,Demo 機器的容量要檢小一些。因此,底下我們要處理的方式中, Windows 的 /dev/vda2 僅擁有 20GB,剩餘的容量中,除了給 Linux Desktop 用之外,還會有 100MB 留在最面沒有使用到!底下是鳥哥的測試機分割示意:

# 1. 先看看剩下多少容量吧!
[root@centos ~]# parted /dev/vda unit MB print
Model: Virtio Block Device (virtblk)
磁碟 /dev/vda:31527MB   <==此硬碟的最大可用容量
磁區大小 (邏輯/物理):512B/512B
分割區:msdos

編號  起始點   結束點   大小     類型     檔案系統  旗標
 1    1.05MB   3147MB   3146MB   primary  ext4   <==此硬碟的 /dev/vda1 起始/結束磁柱

# 2. 建立的新分割為 NTFS 檔案系統,且起始為 3147MB 結束為 3147+20480*1.024=24118.5=24120
#    請注意,parted 顯示的 MB 為十進位的 1000 倍而不是我們常用的 1024 倍!
[root@centos ~]# parted /dev/vda mkpart primary NTFS 3147MB 24120MB
[root@centos ~]# parted /dev/vda unit MB print
編號  起始點  結束點   大小     類型     檔案系統  旗標
 1    1.05MB  3147MB   3146MB   primary  ext4
 2    3147MB  24120MB  20974MB  primary  ntfs           <==注意大小的地方即可!

# 3. Linux Desktop 容量應該在 24120MB ~ (31527-100) = 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 24120MB 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 31427MB 31527MB
[root@centos ~]# parted /dev/vda unit MB print
編號  起始點   結束點   大小     類型     檔案系統  旗標
 1    1.05MB   3147MB   3146MB   primary  ext4
 2    3147MB   24120MB  20974MB  primary  ntfs
 3    24120MB  31427MB  7306MB   primary
 4    31427MB  31527MB  99.7MB   primary

請注意,鳥哥是特別留下 100MB 在最後面,這個不見得用的到!如果每部機器的磁碟都一模一樣的話,那就無所謂~如果不一樣大的話,那麼等一下用戶端的電腦就得要先作個手腳~ 讓他們的 /dev/vda2, /dev/vda3 稍大一下,這樣在復原時比較不會出問題啦!

  • 安裝第二個系統,Windows 7 為例:

請先確認你的光碟機放了 Windows 7 的原版光碟,並且調整了 BIOS,之後直接進入安裝程式,因為我們先作了分割了,因此,你就會看到如下的畫面, 直接按下箭頭點選處安裝到 /dev/vda2 即可!

Demo 機多重作業系統
圖 3.1-1、安裝多重作業系統中,安裝在先分割好的 partition 上的獨立 Windows 7 示意圖

安裝好了 Windows 7 之後,鳥哥建議可以關閉某些不必要的服務,以及更改一些可能會發生問題的設定,並增加一個可以自動修訂主機名稱的軟體後, 再開始進行 Windows update。等到更新完畢後,再安裝你所需要的所有軟體。等到軟體都處理妥當了,這時才開始進行後續的備份與大量復原的動作吧!底下是鳥哥建議可以進行的工作:

  • 固定虛擬記憶體的分頁大小:
    在 Linux裡面我們稱為 swap 而在 Windows 裡面就被稱為分頁檔,這個分頁檔通常是實體記憶體的 1~2 倍大。由於這個值會依據你的系統而變,所以大小常常不固定,這會造成系統的些許困擾 (佔用太多備份的儲存容量)。所以鳥哥通常不喜歡這個值讓系統管理,都會自己設定固定值啦!。
    於是,鳥哥都會主動的將他設定為差不多 1~2GB 左右。在本案例中,我們將他設定為 1024MB 吧!調整的方法為『我的電腦右鍵』 --> 『內容』 --> 『進階系統設定』 --> 『效能』 --> 『進階』 --> 『虛擬記憶體』 --> 『變更』 (填好數值記得要按下箭頭 9 的 "設定" 才好!)
    Demo 機 Windows 分頁
    圖 3.1-2、設定 Windows 7 的分頁大小,將它的數值固定起來

  • 取消磁碟重組:
    由於我們會將整個檔案系統都予以備份,因此,似乎也沒有必要進行磁碟重組啦!所以,個人建議是可以拿掉磁碟重組的排程。 作法很簡單:『開始功能表』 --> 『所有程式』 --> 『附屬應用程式』 --> 『系統工具』 --> 『磁碟重組工具』 --> 『設定排程』請取消
    Demo 機 Windows 磁碟重組取消
    圖 3.1-3、設定 Windows 7 磁碟重組,將磁碟重組排程取消了!

  • 取消電腦的系統還原功能:
    既然現在系統已經有了可以備份的資料,本機的系統還原如果還打開,可能會造成未來整個系統備份時,會將備份的備份資料也備份下去 (繞口令?)~ 這樣會造成些許檔案系統容量的浪費啦!所以鳥哥是暫時關閉它的!使用方法是: 『我的電腦右鍵選內容』 --> 『進階系統設定』 --> 『系統保護』 --> 『設定』 --> 選擇【關閉系統保護】並且【刪除所有還原點】
    Demo 機取消 Windows 還原功能
    圖 3.1-4、取消 Demo 機上的 Windows 7 的還原功能

  • 刪除不再需要使用的硬碟資料:
    既然要備份了,最好將系統的垃圾檔案通通清光比較好吧!所以囉,來刪除系統認定的垃圾檔案,方法如下: 『開始功能表』 --> 『所有程式』 --> 『附屬應用程式』 --> 『系統工具』 --> 『磁碟清理』 --> 『確定(勾選暫存檔案)』
    Demo 機刪除一些暫存檔
    圖 3.1-5、刪除掉 Demo 機上面的 Windows 7 的暫存檔

  • 安裝台灣國家高速網路中心開發的 DRBL-Winroll 軟體:
    由於 Windows 必須有特殊的單一主機名稱、單一的 IP 與相關設定,這樣才能夠順利的運作網路系統。我們的 IP 主要依據 DHCP 以及主機網卡而定, 所以 IP 不會有問題,有問題的地方在於主機名稱啦!因為是完整備份,當這個備份挪到其他機器時,當然所有的資料也會相同~這就產生了主機名稱衝突的問題。 為了解決這個問題,國高有提供一個自動更新主機名稱的 winroll 軟體,完整的下載與說明可以參考: http://drbl-winroll.nchc.org.tw/ 的說明。假設你已經下載且執行了, 那就一直按下一步,直到出現一些關鍵字時,你再仔細的調整調整如下:
    • 是否安裝『自動主機名稱』時,請勾選『Y』
    • 選擇你想要的主機名稱樣式,有[1]ip, [2]Mac address, [3]由本地端檔案決定,鳥哥建議選擇 [2],因為網路卡不會變啊! 所以,當其他主機使用了這個 Demo 機的備份還原,那他開機進 windows 後,會自動重新開機一次,之後就能夠順利運作了!所以,選擇 [2] 吧!
    • 是否也啟動自動工作群組名稱:也選擇 y 吧
    • 那工作群組的樣式:[1]固定字串, [2]IP/Netmask, [3]由 DNS 指定。鳥哥個人建議使用 [1] 固定字串啦!自己選擇工作群組!
    • 選擇網路模式:有 [1]DHCP, [2]由本地端檔案決定與 [3]忽略。因為我們會自己去設定網卡的相關設定值,所以這裡建議選擇 [3] 忽略, 不要讓 winroll 管理。
    • 是否配置 sshd 服務:因為 windows 是一般用途,似乎沒有什麼必要安裝 sshd 的,所以,這裡建議可以選擇 N 啦!
    其它的通通選擇預設值,這樣系統就會自動的將所有其他需要的設定搞定!就這麼簡單啊! ^_^

  • 啟動 windows, update, update, update
    管理過大量 windows 的朋友都知道,最累人的時刻就是 update 的時候!如果全部的系統同時 update 的話,更可怕!還會吃掉很多網路頻寬! 所以,如果能夠在建置備份檔時,就先更新好 windows 系統的話,那就太棒了!所以,請依貴公司的授權,將 windows 7 啟動,然後開始更新吧! 可能得要更新好幾次啊!

  • 解決用映像檔復原 Windows 7 產生的開機需原版光碟修復問題:
    如果你真的玩過使用映像檔來復原 windows 7,而且沒有使用 Windows 他們家的 Syspre 這套軟體來重新檢測硬體的話,那麼復原完畢之後,你會常常看到螢幕上出現要你放入原版光碟, 然後進行開機修復的動作。雖然只是需要放入原版光碟而已,不過,如果有一整間教室全部的電腦都需要復原,那可能就會讓你抓狂了吧我想!
    Tips鳥哥的圖示 之前鳥哥管電腦教室的學生跑來跟鳥哥說, 他需要好多好多片 DVD 來復原才行。後來,我們為了這個問題,還購買了六支 8GB 的 USB 放入 windows 原版資料,用 USB 復原比 DVD 快,真是好蠢...

    查了許多文件,終於發現可能是 Windows 自我管理系統的 BCD 資料出了點問題 (註4),因此需要搞定 Windows 的註冊機碼以及 BCD 的問題之後, 才有可能解決這方面的窘境~鳥哥測試過這個方法,還真的可行!頓時給它開心了起來~因為,可以節省好多人力與時間!底下就來說說鳥哥的處理方法吧:
    • 先拿掉不必要的掛載裝置參數:
      與 Linux 一樣,Windows 過去曾經使用過的磁碟裝置也稱之為『掛載裝置』,這個之前掛載過的參數被記錄在 Windows 的登錄檔中 (regiser),我們得要將它刪掉比較好。 先在開始底下的執行按下『 regedit 』,就會出現如下的畫面,然後找到『 電腦\HKEY LOCAL MACHINE\SYSTEM\MountedDevices 』這個機碼,將裡面的數值通通清除! 清除過後再重新開機進入 Windows 即可。
      Windows 7 的 MountedDevices 機碼
      圖 3.1-6、刪除掉 Demo 機上面的 Windows 7 的 MountedDevices 機碼

    • 處理分割表當中,具『啟動』旗標的分割槽裝置行為:
      Windows 的一些啟動資訊會記錄在分割表當中列為『啟動 (boot)』旗標的分割槽中,一般來說,Windows 所在的那個分割槽系統會自動將它列為『啟動』就是了, 所以無須修改。但如果你是使用映像檔還原的方式,那就得要檢查看看才行 (參考下一小節 partclone 還原的方式)。我們得要透過 bcdedit 去編輯這個分割槽內的啟動資訊, 處理的方法很簡單,就是需要使用管理員身份啟動命令提示字元,然後輸入如下動作:
      調整 Demo 機上面的 Windows 7 的啟動詞區參數
      圖 3.1-7、調整 Demo 機上面的 Windows 7 的啟動詞區參數

      你比較需要注意的是,這個動作在每次準備關機壓制映像檔之前,都需要重作一次!所以,如果你需要使用原映像檔資料內容修改, 改完後,要壓制成新的映像檔,那就得要重新 bcdedit 一次之後才關機!否則可能會失敗的!

  • 最後,安裝好你所需要的軟體,再次對該軟體更新!若有重新開機過,再次進行 bcdedit 步驟!完成!關機!

整個 windows 7 的安裝大概就是這樣,重點在那個分割的動作啦!然後,由於未來這部 Demo 機的 windows 會被拿來作為範本並還原在其它的主機上, 所以,最好對這個系統做個比較完整的設定與更新,然後才關機後準備備份的動作。不要忘記了,我們還有個 CentOS Linux 要安裝喔!

  • 安裝第三套作業系統,以 CentOS 為例:

安裝好了 Windows 7 之後,你會發現一件事情,那就是:『你再也進不了第一套 Linux 控制系統』了!這是因為 Windows 7 會主動的將它的 boot loader 安裝於硬碟的 MBR 當中,但它的 boot loader 又不允許提供 Linux 系列的 boot loader 的控制權移交,因此,你才再也進不了 Linux。沒關係啦!反正我們還可以再安裝一套 Linux 嘛!

那如何安裝這套 Linux 呢?要不要原版光碟啊?不用啦!我們不是在 PXE 的階段就作好了可以讓使用者自由挑選安裝內容的選單嗎?回到圖 2.3-1 去瞧一瞧,直接使用第二個選單來開機就能進入互動的安裝模式了。然後就開始依據正常程序安裝系統,你唯一比較需要注意的地方是:

  • 考慮台灣地區慣用語系,進入視窗模式前,請選擇『Chiense(Traditional)』的語系!
  • 區網內我們還是使用 NFS 的方式來安裝好了!
  • 記得網路設定時,通常先取消 IPv6 而保留 IPv4 的設定即可
  • 要注意 NFS 輸入的格式 (刮號內為本例設定) (NFS server name: 192.168.42.254) (CentOS directory /install/nfs_share/centos6.4)
  • 選擇時區時,請取消 UTC 的系統時鐘設定!
  • 進入分割時,請務必要選擇:『建立自動分割格式』才行!
  • 進入分割後,點選 vda3 之後,直接勾選『格式化』且選擇掛載點為 / 即可!
    Demo 機 Linux 的分割
    圖 3.1-8、Demo 機 Linux 的分割
  • 最後軟體安裝務必選擇『Desktop』項目才對喔!

如果一切順利的話,你的系統會很快速的就安裝完畢且進入 Linux Desktop 中沒問題~不過,此時你卻只能使用這套 Linux 與 Windows 來操作系統而已, 還是無法回到原本的 Linux 控制系統!那怎辦?沒關係,我們先來處理一下 Linux desktop (第三套系統) 的問題,處理完畢後,再來搞定 Linux manager (第一套系統) 的問題~

  • 調整網路卡的相關參數:
    由於現在的 Linux 大多會設定很多獨特的標誌在設定檔中,例如 CentOS 6.x 就會依據每張網卡的卡號 (MAC) 來填寫到對應的設定檔中。但是,由於這個系統未來會被做為種子給其他系統使用, 因此,我們必須要將這些特定的標誌給拿掉才好!請登入這個 Linux Desktop 系統,然後將底下與網卡相關的設定檔打開稍微處理一下即可!
    # 刪除系統偵測到的網卡 MAC 與網卡代號對應值
    [root@centos ~]# vim /etc/udev/rules.d/70-persistent-net.rules
    # PCI device 0x1af4:0x1000 (virtio-pci)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:ae:67:07",
     ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    # 上面刪除線的內容是同一行~只要出現的任何 SUBSYSTEM 開頭的,通通刪除!
    # 讓系統下次開機時,重新針對網路卡進行硬體自動檢測!
    
    # 讓網路設定檔中,關於網卡與網卡 UUID 的設定值拿掉~
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE="eth0"
    BOOTPROTO="dhcp"
    HWADDR="52:54:00:AE:67:07"
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    TYPE="Ethernet"
    UUID="93fa7379-4e1b-4893-a480-0e405cd8e165"
    # 將上面兩個設定值,HWADDR 與 UUID 拿掉!
    

  • 加入 ssh 的金鑰:
    如果你想要使用遠端的方式來操控這部系統,那麼就得要加入 ssh 的金鑰囉!這部份請到伺服器架設篇瞧一瞧,不再囉唆了!

  • 修改系統的選單:
    因為預設選單僅有本 Linux desktop 系統以及 windows 7 可以使用,而且預設 windows 7 的選單名稱為 Other,很難看啊!所以這裡我們稍微修改一下相關的選單模式吧!
    [root@centos ~]# vim /boot/grub/menu.lst
    default=0
    timeout=30
    splashimage=(hd0,2)/boot/grub/splash.xpm.gz
    hiddenmenu
    title CentOS (2.6.32-358.el6.x86_64)
            root (hd0,2)
            kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/vda3 .....(後面省略)..
            initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
    title Windows 7
            rootnoverify (hd0,1)
            chainloader +1
    title MBR
            root (hd0)
            chainloader +1
    # 如上所示,增加選單等待時間之外,也增加回到 MBR 的選單功能!
    # 此外,由於這個映像檔要被複製,因此 root 不建議使用 UUID,應變為原本的 /dev/vda3 較佳。
    

  • 救援 Linux manager 控制系統的選單功能,將 MBR 重新安裝為第一套 Linux 控制系統:
    我們最重要的還是得要透過本機的第一套安裝好的 Linux 來管理才對!但我們已經無法進入該系統了耶!怎辦?沒關係,我們可以透過底下的方式來重新取得第一套 Linux, 並且重新設定好選單,同時更新 MBR 的 boot loader 內容!整體過程還算簡單!
    # 1. 先掛載原有的 Linux 控制系統,並且將根目錄切為該系統去!
    [root@centos ~]# df
    檔案系統               1K-區段      已用     可用 已用% 掛載點
    /dev/vda3              7119768   3435780   3322320  51% /        <==有 7G 為 desktop 系統
    tmpfs                   510212        76    510136   1% /dev/shm
    
    [root@centos ~]# mount /dev/vda1 /mnt  <==除根目錄外,底下的記憶體與裝置也需要掛載
    [root@centos ~]# mount --bind /proc /mnt/proc
    [root@centos ~]# mount --bind /dev /mnt/dev
    [root@centos ~]# chroot /mnt
    [root@centos /]# df  <==你會看到,突然變成了根目錄了!
    檔案系統               1K-區段      已用     可用 已用% 掛載點
    /dev/vda1              3023760   1730868   1139292  61% /        <==整個根目錄變成為 vda1
    sysfs                  3023760   1730868   1139292  61% /sys
    
    # 2. 設定好選單項目,預設為 Windows --> Linux desktop --> Linux manager
    [root@centos /]# vim /boot/grub/menu.lst
    default=0
    timeout=30                                        <==等待 30 秒比較夠用
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    #hiddenmenu                                       <==不要隱藏,直接讓使用者挑選
    title Windows 7                                   <==第 0 個是 Windows 7
            rootnoverify (hd0,1)
            chainloader +1
    title CentOS Linux for Desktop System (Linux OS)  <==第 1 個依舊直接交給該系統的 loader
            root (hd0,2)
            chainloader +1                            <==就是這裡!是該系統自己的 loader
    title This system restore/backup manager          <==最後一個才是管理系統本身
            root (hd0,0)
            kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/vda1 .....(後面省略)..
            initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
    # 是要特別注意上頭核心參數的 root 部分啦!因為這個選單也要複製給所有用戶端機器使用!
    
    # 3. 將此設定寫入 MBR 當中去!
    [root@centos /]# grub
        GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
    
     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename.]
    grub> root (hd0,0)
    root (hd0,0)
     Filesystem type is ext2fs, partition type 0x83
    grub> setup (hd0)
    setup (hd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
    succeeded
     Running "install /boot/grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/boot/grub/stage2 
     /boot/grub/grub.conf"... succeeded
    Done.
    grub> quit
    quit
    
    # 4. 回原本的 Desktop 系統,並重新將自己的 grub 安裝於自己 filesystem 的 boot sector 內!
    [root@centos /]# exit
    [root@centos ~]# grub  <==回到原本的 Linux desktop 中
    grub> root (hd0,2)
    grub> setup (hd0,2)  <==以 Linux desktop 的設定,再次安裝於自己的 boot sector 內!
    grub> quit
    # 在某些特殊的情境下,partition 內的 boot sector 並不會安裝 grub 開機管理程式,
    # 為了避免困擾,建議還是重新安裝一次在原 desktop 系統中較好!
    
    經過上面的步驟之後,你就可以重新開機,當 (1)透過 PXE 選擇本機開機後,就會 (2)進入如下的開機選單中:
    Demo 機本機磁碟開機的選單模式狀態
    圖 3.1-9、Demo 機本機磁碟開機的選單模式狀態

    接下來就可以測試看看三個選單是否都 OK 可以順利進入個別的作業系統當中囉!

  • 取消所有 root 曾經下達過的指令
    鳥哥想要作的這個系統是未來要考試與練習用的,所以不希望這個系統上面做過的動作被學生們知道。如果上述的動作做完之後,重新開機且順利進入 Linux desktop 系統後, 此時,你可以在剩下唯一的一個 bash 終端機時,下達:『 history -c; history -w 』指令,將所有歷史命令通通清除光光!之後就直接 poweroff 關機準備使用即可。

在一切都搞定之後,接下來要幹嘛?當然就是將 Demo 機的 /dev/vda2, /dev/vda3 內的檔案系統複製起來啦!那如何複製呢? 就得要透過 server 端提供的 NFS 檔案系統空間,然後再以 partclone 指令處理即可!繼續來參考下一小節的內容吧!



3.2 透過 partclone 備份 Demo 機的原始來源與還原

我們的 Demo 機的第一套 Linux 控制系統內的檔案容量很小,全部的檔案系統只給 3GB 而已,根本沒有空間可以儲存 /dev/vda2, /dev/vda3 的資料。 因此得要透過區網內的 server 提供的網路磁碟來進行備份。最簡單的網路磁碟當然就是 NFS 啦!另外,我們也知道備份整個 partition 最簡單的方式是 dd 這個指令~只是,dd 會連同沒有使用到的磁區也備份下來,而且也沒有進行任何檔案系統壓縮,因此備份檔會非常非常大!

以本案例來說,鳥哥的 windows 灌完只用了 13GB 而 Linux 更小,只有 3GB 左右而已,因此總共用的磁碟也不過 16GB。但如果使用的是 dd 指令備份, 那麼全部的備份資料將會保留原有 partition 的大小,亦即是 20+7=27GB,這比用到的資料還要大太多了吧!

為了減少儲存備份的檔案系統壓力,也為了加快檔案系統的復原 (越大的備份代表越久的復原時間),我們這裡使用的是國家高速網路中心推出的, 修改 partimage 讓備份支援 ext4/NTFS 等檔案系統的 partclone 軟體啦(註3)!這個軟體功能相當強大,而且國高也有針對 CentOS 推出 yum 軟體倉儲, 你只要設定好 yum 就能夠直接線上安裝 partclone 了!好輕鬆呢!

接下來,我們將分 server 與 client 需要進行的動作來做介紹喔!下達指令之前,務必瞭解該指令段是給哪個系統使用的! 不要做錯地方了喔! ^_^

  • Server 端的簡易設定:

Server 端要進行的項目中,其實不需要安裝 partclone 啦!只是為了管理上的方便,所以建議還是得安裝一下比較好!另外,鳥哥預計要讓用戶端上傳備份資料的地方, 主要是放置於 /install/client_img/ 目錄,該目錄最好要權限全開比較好!那就讓我們來玩一玩吧!

# 1. 先設定好 DRBL 官方網站提供的 yum repository 的網址,並安裝所需要的 partclone 與 ntfsprogs
[root@centos ~]# vim  /etc/yum.repos.d/drbl.repo
[drbl]
name = Diskless Remote Boot in Linux
baseurl = http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/
gpgcheck = 0
enabled = 1
# 記得,這個檔案是自己建立的!所以是全新檔案啦!

[root@centos ~]# yum install partclone ntfsprogs

# 2. 分享 /install/client_img/ 目錄使用 NFS 出去
[root@centos ~]# mkdir  /install/client_img
[root@centos ~]# vim  /etc/exports
/install/client_img  192.168.42.0/24(rw,async,no_root_squash)  localhost(rw,async,no_root_squash)

[root@centos ~]# /etc/init.d/nfs reload
[root@centos ~]# showmount -e localhost
Export list for localhost:
/install/client_img 192.168.42.0/24,localhost  <==多這玩意兒就對了!
/install/nfs_share  192.168.42.0/24,localhost

Server 做到這步就成功了!很簡單吧!

  • Client 端的軟體安裝與備份至 Server 端:

Client 端的設定中,第一步驟與 server 一樣,就是安裝好 partclone, ntfsprogs 即可!非常簡單!不過你需要注意的是,你要進入的是:『Linux 控制系統, 也就是第一套用 kickstart 安裝的系統』才對喔!因為我們是透過這個 Linux 來掌控整部主機的嘛!

# 1. 先設定好 DRBL 官方網站提供的 yum repository 的網址,並安裝所需要的 partclone 與 ntfsprogs
[root@centos ~]# vim  /etc/yum.repos.d/drbl.repo
[drbl]
name = Diskless Remote Boot in Linux
baseurl = http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/
gpgcheck = 0
enabled = 1

[root@centos ~]# yum install partclone ntfsprogs

# 2. 掛載來自 Server 的 /install/client_img 目錄到本系統中
[root@centos ~]# mkdir -p  /install/client_img
[root@centos ~]# mount -t nfs 192.168.42.254:/install/client_img /install/client_img
[root@centos ~]# df
檔案系統     1K-區段      已用     可用 已用% 掛載點
192.168.42.254:/install/client_img
            15481856   4456704  10238720  31% /install/client_img  <==要看到他!

# 3. 使用 partclone 完整備份 /dev/vda2 到 Server 上面去!
[root@centos ~]# partclone.[fs] -c -s [裝置] -o [file]   <==這個是備份
[root@centos ~]# partclone.[fs] -r -s [file] -o [裝置]   <==這個是還原
選項與參數:
-c   :為複製 (clone) 的意思,所以要備份得要加上 -c 參數才行喔!
-r   :為還原 (restore) 的意思,還原映像檔到裝置上,就得使用這玩意兒!
-s   :為來源 (source) 的意思,備份時為裝置,還原時為來源印象檔。
       如果與標準輸入/輸出有關而非檔案/裝置時,那就寫『 - 』即可!
-o   :為目標 (output) 的意思,是要將來源複製到哪裡去的意思~一般是檔案!
-d   :為除錯 (debug) 的意思,可以輸出的訊息比較多,方便使用者除錯
-C   :為略過檢測 (no check) 的意思,某些特殊情況下,你可能要略過檢測~
       這個項目就可以幫助你略過檢測了!

# 將 windows 7 的 partition 完整備份後,並且進行壓縮,直接放置於 server 上
[root@centos ~]# partclone.ntfs -c -s /dev/vda2 -o -  |  \
> gzip > /install/client_img/windows7.img.gz
Partclone v0.2.59 http://partclone.org
開始備份 裝置 (/dev/vda2) 到 印象檔 (-)
Reading Super Block
經過:00:00:01, 剩餘: 00:00:00, 完成:100.00%
全部時間:00:00:01, 100.00% completed! 
done!         <==上面在讀取整體檔案系統資訊,主要是 superblock 內的資料
檔案系統: NTFS
Device size:   21.0 GB = 5120135 Blocks  <==檢測檔案系統資料量~
Space in use:  14.3 GB = 3502594 Blocks
Free Space:     6.6 GB = 1617541 Blocks
裝置區塊大小: 4096 Byte
經過:00:11:04, 剩餘: 00:00:00, 完成:100.00%, 速率:  1.30GB/min
current block:    5120135, total block:    5120135, Complete: 100.00% <==備份過程展示
全部時間:00:11:04, 平均速率:   1.3GB/min, 100.00% completed!
Syncing... OK!
備份 裝置 (/dev/vda2) 到 印象檔 (-) 完成

[root@centos ~]# ll -h /install/client_img/
-rw-r--r--. 1 root root 4.9G 2013-04-21 12:33 windows7.img.gz   <==容量是否小一些!

[root@centos ~]# partclone.ext4 -c -s /dev/vda3 -o -  | \
> gzip > /install/client_img/linux_desktop.img.gz
# 繼續備份下一個 /dev/vda3 的 Linux desktop 囉!

[root@centos ~]# cp /boot/grub/menu.lst /install/client_img/
# 同時備份其他系統也會更動到的開機選單的部分即可!

需要注意的是,partclone 支援很多的檔案系統讓我們選擇備份,只是他並不是提供類似『 mkfs -t [檔案系統類型] 』的指令模式, 而是直接製作許多指令檔讓我們來執行~因此,你不能使用 partclone.ntfs 來備份 Linux 系統,也不能使用 partclone.ext4 來備份 windows 系統。 所以,要操作這個動作之前,還得先要瞭解你的作業系統的檔案系統類型才行哩!

另外,partclone 本身並不提供壓縮功能,所以,你必須要透過資料流重導向的方式,將資料丟到螢幕中,再交給 gzip 進行壓縮~ 所以才會有上面的範例中,那麼複雜的指令輸入情況!還原也一樣,先必須要透過 gzip 解壓縮後,才能夠交給 partclone 來還原! 做完這些動作後,我們的 Demo 機就可以功成身退了!

  • Client 端直接還原來自 Server 端的映象檔資料:

與備份一樣,還原也是很簡單的!只是,你得要留意的是,必須要先執行磁碟分割,分割完畢之後,才能夠依據映象檔來復原。 分割槽的容量要不要一模一樣大呢?其實,只要比映象檔內的分割參數要大就好了。舉例來說,我們剛剛備份的 windows 7 裡面的 Device size 顯示為 21GB, 那麼你預計要將這個備份資料復原的分割槽,就要比這個值大!否則就會出現還原失敗的情況。由於每顆硬碟的容量都不一樣大, 因此,你得要先在新機器上面做好分割後,才能夠復原。

好,假設你已經使用之前做好的 kickstart 在另一部新機器上安裝好了第一套 Linux 了,請進入該系統,然後一步一步來處理另外兩個 Windows/Linux 作業系統的復原吧!(我這裡假設你已經安裝好了 partclone 了喔!不再重複 yum 階段!)

# 1. 先觀察分割表,之後依據 Demo 機的分割表來進行本機分割吧!
[root@centos ~]# parted /dev/vda unit MB print
Model: Virtio Block Device (virtblk)
磁碟 /dev/vda:31527MB
磁區大小 (邏輯/物理):512B/512B
分割區:msdos

編號  起始點  結束點  大小    類型     檔案系統  旗標
 1    1.05MB  3147MB  3146MB  primary  ext4      啟動
# 目前僅有自己的分割,沒有底下兩個額外的 Windows/Linux 分割!

[root@centos ~]# parted /dev/vda mkpart primary NTFS 3147MB 24120MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 24120MB 31427MB
[root@centos ~]# parted /dev/vda unit MB print
編號  起始點   結束點   大小     類型     檔案系統  旗標
 1    1.05MB   3147MB   3146MB   primary  ext4      啟動  <==啟動的位置不對
 2    3147MB   24120MB  20974MB  primary  NTFS
 3    24120MB  31427MB  7306MB   primary  ext4
# 利用本章製作的 Demo 機器之前的分割表來重複一次!因為鳥哥的機器一模一樣,
# 所以這裡暫時跟原有的 Demo 機的分割參數一個模樣喔!

[root@centos ~]# parted /dev/vda set 2 boot on
[root@centos ~]# parted /dev/vda unit MB print
編號  起始點   結束點   大小     類型     檔案系統  旗標
 1    1.05MB   3147MB   3146MB   primary  ext4
 2    3147MB   24120MB  20974MB  primary  NTFS      啟動  <==OK!正確了!
 3    24120MB  31427MB  7306MB   primary  ext4

[root@centos ~]# reboot
# 重新開機讓 partition 生效,然後才能繼續後續的處理流程!

# 2. 開始復原系統
[root@centos ~]# mkdir -p /install/client_img
[root@centos ~]# mount -t nfs 192.168.42.254:/install/client_img /install/client_img
[root@centos ~]# gzip -d /install/client_img/windows7.img.gz -c | \
> partclone.ntfs -r -s - -o /dev/vda2
開始還原 印象檔 (-) 到 裝置 (/dev/vda2)
Reading Super Block
Calculating bitmap... Please wait... done!
檔案系統: NTFS
Device size:   21.0 GB = 5120135 Blocks
Space in use:  14.3 GB = 3502594 Blocks
Free Space:     6.6 GB = 1617541 Blocks
裝置區塊大小: 4096 Byte
經過:00:03:46, 剩餘: 00:00:00, 完成:100.00%, 速率:  3.81GB/min
current block:    5120135, total block:    5120135, Complete: 100.00%
全部時間:00:03:46, 平均速率:   3.8GB/min, 100.00% completed!
Syncing... OK!
還原 印象檔 (-) 到 裝置 (/dev/vda2) 完成
Cloned successfully.
# 從解壓縮的資料中讀取 partclone 映象檔,並將之復原到 /dev/vda2 !無須格式化!

[root@centos ~]# gzip -d /install/client_img/linux_desktop.img.gz -c | \
> partclone.ext4 -r -s - -o /dev/vda3

# 3. 開始處理 grub 選單內容
[root@centos ~]# cp /install/client_img/menu.lst /boot/grub/menu.lst

# 4. 處理彈性縮放檔案系統的動作: (optional)
[root@centos ~]# partclone.ntfsfixboot -w /dev/vda2
[root@centos ~]# ntfsresize /dev/vda2
[root@centos ~]# resize2fs /dev/vda3
# partclone.ntfsfixboot 可以修復 NTFS 檔案系統開機磁區可能會出現的錯誤;
# ntfsresize 可以讓該檔案系統放大到該裝置最大可用容量!(但是 windows 開機會要求磁碟檢查)
# resize2fs  則是彈性處理 ext4 的檔案系統囉!

一般來說,備份會花比較多時間,還原的速度比較快!所以,同樣是針對 windows7 來比較,備份需要花去我們 11 分鐘的時間, 還原僅需一半的時間即可處理完畢!相當有趣吧!還不需要預先格式化呢!還不快點來學習 partclone 嗎?! ^_^

接下來,就請您在這部新機器上面重新開機,看看你的開機選單有沒有出現三個,並且嘗試登入其他兩個作業系統試看看囉!

Tips鳥哥的圖示 再次強調,由於 Windows 7 會在開機的時候判斷你的機器硬體設備有沒有改變過,因此,很有可能在你下在使用新的用戶端電腦進入 windows 7 時, 它會要求你得要放入原版光碟來進行『修復』的動作!如果出現這個問題,且使用本章 Demo 機製作的方式中的 bcdedit 指令還是沒有辦法處理成功時, 那只能拿出原版的 windows 7 DVD 來一步一步進行修復的動作囉!



3.3 透過 kickstart 完整復原整個系統

想想看,我們在完成了 kickstart 以及 Demo 機的安裝之後,在其他用戶端上面做了什麼事?大概只有這些:

  • 以 kickstart 的網路安裝方法安裝好第一套管理 Linux ;
  • 進入該管理 Linux 系統,進行 parted 的磁碟分割;
  • 分割完畢並重新開機之後,安裝好 partclone 等軟體,並掛載來自 NFS server 的目錄;
  • 將來自 NFS server 的映像檔 partclone 到本機的 /dev/vda2, /dev/vda3 中;
  • 處理開機選單等事宜

既然只進行這些動作而已,那為何不能將這些動作寫入 kickstart 設定檔中呢?恩!你問了一個好問題!我們當然可以將這些動作寫入 kickstart 設定檔當中的 %post 之後,這樣系統就能夠一鍵安裝了!開心得不得了嗎?呵呵!那就讓我們來玩玩看,試看看能不能這樣做吧!

# 先在 PXE server 上面進行改寫 kickstart 設定檔的動作啊!
[root@centos ~]# cd /install/nfs_share/kickstart
[root@centos kickstart]# cp pcroom_raw.ks pcroom_one_touch.ks
[root@centos kickstart]# vim pcroom_one_touch.ks
....(前面省略)....
repo --name="DRBL" --baseurl=http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/ --cost=200
# 加入了 DRBL 的 yum 軟體倉儲!

%packages
....(中間省略)....
partclone
ntfsprogs
# 加入了 DRBL 的 partclone, ntfsprogs 等軟體的自動安裝!

%post
#!/bin/sh
....(中間省略)....
chown root.root /root/.ssh/authorized_keys

parted /dev/vda mkpart primary NTFS 3147MB 24120MB
parted /dev/vda mkpart primary ext2 24120MB 31427MB
parted /dev/vda set 2 boot on
echo "
#!/bin/bash
echo 'Prepare to mount NFS server'
mkdir -p /install/client_img
mount -t nfs 192.168.42.254:/install/client_img /install/client_img
echo 'Restore windows7'
gzip -d /install/client_img/windows7.img.gz -c | partclone.ntfs -r -s - -o /dev/vda2
echo 'Restore Linux Desktop'
gzip -d /install/client_img/linux_desktop.img.gz -c | partclone.ext4 -r -s - -o /dev/vda3
echo 'Restore boot menu'
cp /install/client_img/menu.lst /boot/grub/menu.lst
echo 'remove partclone procedure'
sed -i 's/^.*sh \/root\/partclone.sh.*$//g' /etc/rc.d/rc.local
rm /root/partclone.sh
sleep 10s
poweroff
" > /root/partclone.sh
echo "sh /root/partclone.sh" >> /etc/rc.d/rc.local
# 上面就是在進行各項復原的動作!

# 2. 再增加一個 PXE 的選單,可以一鍵安裝到底!
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL kickstart2
  MENU LABEL Boot from PXE Server for AUTO Install CentOS 6.4 One touch
  kernel ./kernel/centos6.4/vmlinuz
  append initrd=./kernel/centos6.4/initrd.img ks=nfs:192.168.42.254:/install/nfs_share/kickstart/pcroom_one_touch.ks

上述的動作中,最重要的當然就是 kickstart 的修改了!因為新的 CentOS 6.x 以後,不知道是加了什麼系統保護的機制,因此 partprobe 這個強迫核心重新抓取分割表的功能遺失了~ 所以,我們在 %post 當中進行過分割,但是卻無法順利的使用該分割來工作。所以,只好加上一些腳本在 Linux 的啟動程序中,讓 kickstart 安裝好 Linux 之後, 立刻自動的去處理第一支腳本程式 (/root/partclone.sh),處理完畢後自我刪除且除掉 /etc/rc.d/rc.local 的腳本指向即可。

在上面的 kickstart 檔案中,鳥哥強迫讓系統安裝完畢後自動關機 (poweroff),如果你有其他特殊的需求,想要在安裝完畢後繼續留在原 Linux 控制系統中工作時, 那可以將 poweroff 與 sleep 10s 刪除,這樣就不會讓你的系統安裝完畢後自動關機囉!接下來打開你的用戶端電腦,用網路開機,選擇最後一個 PXE 選單, 你不用再理它!它會自動安裝、還原之後,自己關機!開心的不得了啊! ^_^



3.4 以 multicast 實作完整復原

完成上述的功能之後,你的用戶端只要使用網路開機,然後點選 PXE 的最後一個選單,那就可以安心的去睡覺了!反正系統會自動關機嘛! 只是,如果是很急的情況底下,你想要復原全部電腦教室的 60 部主機時,那就有點頭疼了~因為全部的系統同時去抓來自 Server 的 NFS 提供的映像檔時, 太多用戶端了!會吃掉很多頻寬,所以速度快不了~那怎辦?

想像一個情況,我能不能只從 Server 抓一次資料,然後將資料同時廣播給所有用戶,這樣不就能夠節省好多頻寬了嗎?因為只送出一次資料而已嘛! 不像每部主機單獨來的時候,都得要再次的將資料送出。可以達到嗎?嘿嘿!是可以的,可以透過所謂的『 Multicast (群播)』的功能喔!(註5)

所謂的 multicast 主要是透過 switch 的 MAC 學習功能,然後將來自 Server 的一份資料,透過 switch 的 multicast 支援,將這份資料主動複製成多份, 然後丟給需要的用戶端電腦。因為需要 switch 的協助,所以,你的 switch 必須要支援 multicast 的相關能力才行。不過,由於某些 switch/hub 可能沒有支援 multicast, 因此,後來該項功能也可以使用 broadcast (廣播) 傳給所有人,而僅有需要的用戶會抓下來。

會不會很難啊這個功能?其實不會呢!我們可以直接透過 udpcast (註5) 這套軟體來實施即可!這套軟體還剛剛好 DRBL 的 yum 軟體倉儲有提供呢! 所以,直接使用 yum 來安裝即可。安裝好了之後,每部系統都要開啟在 Linux 控制系統中,然後這樣處理即可:

# 1. 先安裝 udpcast 這套軟體,記得,要在 yum 裡頭加入 DRBL 的官網才行,Server/client 都要裝
[root@centos ~]# yum install udpcast

# 2. 不論 switch 有沒有支援,我們使用 broadcast 即可!這是在 server 端下達的指令:
[root@centos ~]# udp-sender    --interface eth1 \
> -f /install/client_img/linux_desktop.img.gz  \
> --min-receivers 3  \
> --nokbd --broadcast --fec 8x8/128
stripes=8 redund=8 stripesize=128
Udp-sender 20110710
Using full duplex mode
Using mcast address 232.168.42.254
UDP sender for /install/client_img/linux_desktop.img.gz at 192.168.42.254 on eth1
Broadcasting control to 192.168.42.255
New connection from 192.168.42.3  (#0) 00000009  <==有順利接上用戶端,就會顯示!
New connection from 192.168.42.4  (#1) 00000009
New connection from 192.168.42.5  (#2) 00000009
# 請注意,預設 udpcast 會用到 9000~9001 兩個 udp 的埠口,所以要確認你的 server 已放行~
# 同時檢查一下用戶端!用戶端也要放行才可以呦! (如果有參考第一章與本章就 OK!)

# 3. 在用戶端下達此一指令來接收並且還原系統!
[root@centos ~]# udp-receiver --nokbd | \
> gzip -d -c | partclone.ext4 -r -s - -o /dev/vda3
Udp-receiver 20110710
UDP receiver for (stdout) at 192.168.42.3 on eth0
received message, cap=00000009
Connected as #0 to 192.168.42.254       <==真的連接上了呦!
Listening to multicast on 232.168.42.254
Partclone v0.2.59 http://partclone.org  <==收下檔案立刻解壓縮還原!
開始還原 印象檔 (-) 到 裝置 (/dev/vda3)
Calculating bitmap... Please wait... done!
檔案系統: EXTFS
Device size:    7.3 GB = 1783808 Blocks
Space in use:   3.7 GB = 892278 Blocks
Free Space:     3.7 GB = 891530 Blocks
裝置區塊大小: 4096 Byte
經過:00:01:38, 剩餘: 00:00:00, 完成:100.00%, 速率:  2.24GB/min
current block:    1783808, total block:    1783808, Complete: 100.00%
全部時間:00:01:38, 平均速率:   2.2GB/min, 100.00% completed!
Syncing... OK!
還原 印象檔 (-) 到 裝置 (/dev/vda3) 完成
Cloned successfully.
# 因為 udpcast 僅發送檔案而已,所以用戶端接收檔案,還得解壓縮與還原才行!

你會發現,全部的用戶端系統是同步在進行還原!所有的數據會一模一樣!鳥哥上面僅使用到 3 部系統來示範而已,而且使用較簡便的 Linux desktop 示範而已, 真的使用到整間電腦教室時,那種時間的節省,才教你開心吶!!

Tips鳥哥的圖示 說真的,Multicast 真的很好用!大量批次還原時,可以同時還原,還原的速度會節省非常非常多!只是,鳥哥沒有很研究 udp-sender 的參數,所以時間參數恐怕沒有設定的很好, 因為,每次大量復原超過 30 部以上的用戶端系統時,很容易因為一台用戶端電腦的網路問題,導致整批 multicast 的失敗!要注意,這個 multicast 是全系統同步, 有任何一部失敗時,會導致整個還原失敗而得重來一次~所以,練習的時候,可以先少台主機測試,搞定了之後,再來玩大批還原吧!



3.5 其他注意事項與進階使用說明:

或許你有發現一件事,既然我們用了網路 PXE 的選單,這已經是第一層選單,然後,還得要通過第二層的本機開機選單,才能夠進入我們所需要的環境中。 兩層選單ㄟ!好麻煩~有沒有可能直接在 PXE 裡面就作好了直接進入到某個特定作業系統的選單?這樣就可以直接透過第一層 PXE 選單即可,不用轉來轉去啦! 可以做到嗎?是可以的!只是,還得要額外提供一個 chain.c32 的選單轉遞模組才行。

現在我們上面這個示範機裡面總共有:

  • Windows 7
  • Linux Desktop
  • Linux Management system

這三個選單我們將它加入於 PXE 的 default 檔案中,然後直接透過 chain.c32 去轉遞開機管理功能,這樣設定一下,看看能不能生效吧!

# 1. 先將 chain.c32 放置於 tftp 的根目錄中:
[root@centos ~]# cp /usr/share/syslinux/chain.c32 /install/tftpboot/
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL local
  MENU LABEL Boot from local drive
  MENU DEFAULT
  localboot 0

LABEL local1
  MENU LABEL Boot from local drive to Windows 7
  kernel chain.c32  <==使用 chain.c32 來作為開機管理程式
  append hd0 2      <==使用第一顆硬碟的第二個分割槽開機!

LABEL local2
  MENU LABEL Boot from local drive to Linux Desktop
  kernel chain.c32
  append hd0 3

LABEL local3
  MENU LABEL Boot from local drive to Linux Management
  kernel chain.c32
  append hd0 1

LABEL network1
....(後面省略)....

上述的設定中,比較需要注意的是『 append hd0 2 』這個設定值,這個設定值的意思是,使用第一顆 (從 0 開始編號) 的第 2 個分割槽 (從 1 開始編號, hd0 2 組合起來,就是 Linux 的 /dev/sda2 或本案例中的 /dev/vda2 的意思) 來進行開機。如此一來,你就會多出三個選單,所以再次重新開機之後,你就會看到如下的畫面:

本章最終的選單情況
圖 3.5-1、本章最終的 PxE 選單情況

這樣就搞定了單層選單!太棒了吧!呵呵!

  • 為何需要安裝第一套 Linux 管理系統?

既然現在這麼簡單的透過 PXE 可以製作選單,也可以直接透過 kickstart 來進行批次的每部主機個別的還原,那為何還需要安裝第一套 Linux 管理系統呢? 不知道你有沒有過這樣的疑問呢?這是因為要預防萬一啦!多一個 Linux 管理系統有許多的好處,包括這部系統會具有比較大的自由度!要管理系統比較安全, 此外,最大的重點是,你的這部用戶端電腦可以不必在此教室內使用,方便移動機器!

會這麼做的原因是,由於電腦教室所在的環境中,常常會因為某些不明的原因導致跳電,這一跳電,很多『機會』會讓 Server 就此掛點! 而如果單純使用 PXE 而沒有用戶端自己的選單管理時,恐怕到時候某些特定的作業系統會無法進入,這會對上課環境造成些許的困擾啦!

此外,以鳥哥所在的資訊傳播系而言,我們系上在畢業專題展時,常常需要將教室的個人電腦帶往展場去展出。如果沒有選單模式時,比較不能符合專題組的需求 (每個專題組要使用的作業系統都不相同)。所以,在較複雜的環境,而且需要有移機的需求時,安裝一套 Linux 管理系統,對我們後續的處理還是有很多好處的! 因此,如果你也有相關的需求,那鳥哥真的強烈的建議你要有這個 Linux 管理系統的安裝比較好喔!



4. 參考資料與延伸閱讀


2013/04/01:開始來撰寫有關安裝伺服器的總總吧!!
2013/04/24:經過多次測試,找到相關的資料,文內的各個語法與腳本都測試妥當!只是與前一篇有相關性~要注意使用!
2013/04/24以來統計人數
計數器
   http://linux.vbird.org is designed by VBird during 2001-2015.