服務器端:RHEL5(靜態IP 192.168.1.101)
源Gentoo系統:服務器上的Gentoo系統就來自於它,編譯內核也是在這台機器上執行的
無盤客戶端:網卡是 AMD PCnet32 支持PXE啟動。系統是位於RHEL5上的Gentoo,通過PXE啟動
實驗主要有幾下幾個步驟:
- 編譯Gentoo內核
- 配置DHCP服務器
- 配置TFTP服務器
- 配置NFS
- PXE啟動Gentoo
1. 編譯Gentoo內核
1) 配置內核選項
我使用的是2.6.30的內核,make menuconfig 后要配置以下幾個選項(注意都要選為built-in,不能是module):
Network support
Network options
TCP/IP networking
IP kernel level autoconfiguration
IP: DHCP support
File systems
Network File Systems
NFS client support
NFS client support for NFS version 3
NFS client support for the NFSv3 ACL protocol extension
Root file system on NFS
Device Drivers
Network device support
Ethernet (10 or 100Mbit) --->
選擇無盤客戶端機器的網卡驅動(查看系統配置可以用lspci)
2) 編譯內核
(內核2.6)# make && make modules_install
3) 安裝內核
新編譯的內核在 arch/i386/boot/bzImage,稍后會被傳到服務器上的 /tftpboot 目錄下
2. 在RHEL5上配置DHCP服務器
DHCP 服務器用來給無盤客戶機分配IP地址,並告訴他服務器上 bootloader 文件的路徑。我的 /etc/dhcpd.conf 如下:
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
#
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.128 192.168.1.254;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
filename "pxelinux.0";
next-server 192.168.1.101;
}
注意這里的filename是個相對路徑,相對於 /tftpboot,所以filename如果指定成為"/tftpboot/pxelinux.0"會有問題
方便起見,我這里將DHCP在runlevel 3 4 5中都設為自動啟動。或者也可以手動啟動,運行
# service dhcpd start
3. 配置TFTP服務器
1) 安裝TFTP
Redhat自帶TFTP的RPM包,直接安裝即可。要設成開機啟動,需要改一下 /etc/xined.d/tftp 配置文件,將disable設成no
server_args = -s /tftpboot 是tftp服務器的根目錄,我這里使用默認的 /tftpboot。之后的bootloader,bootloader的配置文件以及Gentoo內核都將放在這個目錄下
2) 安裝pxelinux.0及其配置
pxelinux.0是一個bootloader,類似於grub,通過它來load kernel,我們可以在它的配置文件中指定內核的位置和內核的啟動參數
安裝及配置都在 /tftpboot 目錄下操作,配置好的 /tftpboot 目錄結構如下:
kernel-2.6.30-gentoo-r8
pxelinux.0
pxelinux.cfg/default
kernel-2.6.30-gentoo-r8是編譯好的Gentoo內核
pxelinux.0是syslinux的一個文件,可以從 syslinux-/core/pxelinux.0 拷過來,syslinux可以從 這里獲得
pxelinux.cfg/default是pxelinux的配置文件
Pxelinux會以IP地址的16進制表示來搜索配置文件,如果沒找到去除最低一位繼續找。如果所有匹配都失敗,就使用default文件。
舉例來說:
192.168.0.15 16進制表示是 C0A8000F.
它會搜索下面的配置文件,最先找到的會被使用。
pxelinux.cfg/C0A8000F
pxelinux.cfg/C0A8000
pxelinux.cfg/C0A800
pxelinux.cfg/C0A80
pxelinux.cfg/C0A8
pxelinux.cfg/C0A
pxelinux.cfg/C0
pxelinux.cfg/C
pxelinux.cfg/default
我的default文件內容如下:
label linux
kernel ../kernel-2.6.30-gentoo-r8
append root=/dev/nfs ip=dhcp nfsroot=192.168.1.101:/nfsroot rw
關於 pxelinux.cfg/default 的詳細配置信息可以參考syslinux的文檔。這里
第一行label后面必須是linux,跟其他的名字會找不到。用DEFAULT不受此限制
第二行指定了kernel的位置
第三行指定了一系列啟動參數
root=/dev/ nfs -- 指定root filesystem的掛載方式是 NFS
ip=dhcp -- 指定kernel通過DHCP獲取IP地址
nfsroot=192.168.1.101:/nfsroot -- 指定root filesystem位於服務器上的/nfsroot
rw -- 指定以可讀寫的方式掛載root filesystem
/nfsroot目錄是 NFS server export的目錄,可以在server上配置 NFS的時候指定
這 里還碰到了一點問題,我一開始在啟動選項里沒有加rw,啟動的時候會報錯readonly filesystem。kernel啟動的時候默認是以ro的方式掛載root,但按理說執行INIT腳本的時候會再一次以rw方式mount的,不知道 為什么這一步沒有執行,最后還是在kernel的啟動選項里加了rw。
4. 配置 NFS
1) 啟動並配置 NFS
RHEL5在系統服務里自帶了 NFS。為方便起見,我在run level 3 4 5里都添加了 nfs為自啟動
編輯/etc/exports文件
我的exports文件如下:
/nfsroot 192.168.1.0/24(rw,no_root_squash)
/nfsroot -- 指定要export的目錄
192.168.1.0/24 -- 指定網絡上可以mount該目錄的IP range
(rw,no_root_squash) - rw指定可讀寫的權限,no_root_squash保證client上的root用戶 NFS mount后對該目錄具有root權限(因為無盤客戶端啟動的時候是以root用戶進行 NFS mount,如果沒有該選項,root用戶 NFS mount后會被映射成nobody用戶)
這里還需要注意的是,在192.168.1.0/24和(rw,no_root_squash)之間不能有空格。這個也費了我很大功夫troubleshoot,一開始mount后怎么都是只讀,后來發現原來這中間不可以有空格。
2) 拷貝Gentoo的根目錄到RHEL5上
配好 NFS后就可以把Gentoo的文件系統tar+scp到服務器RHEL5上的/nfsroot了
這里有兩點要注意的:
i) /dev/console必須存在,不然會出現錯誤"unable to open initial console",可以通過下面的命令創建/dev/console
# mknod /nfsroot/dev/console c 5 1
ii) /proc目錄必須存在
3) 修改無盤客戶端的/etc/fstab文件
我的文件內容如下所示:
192.168.1.101:/nfsroot/ / nfs noatime,rw 0 1
none /proc proc defaults 0 0
4) 去掉舊網卡信息
由於我的無盤客戶端和源Gentoo系統是不同的機器,所以要將源Gentoo系統的舊網卡信息刪除
修改文件192.168.1.101:/nfsroot/etc/udev/rules.d/70-persistent-net.rules,刪除和舊的MAC地址有關的信息。
5) 配置無盤客戶端的網絡
修改文件192.168.1.101:/nfsroot/etc/conf.d/net,添加
config_eth0=( "noop" )
這是告訴系統直接用kernel啟動時拿到的IP地址。如果這里配的是DHCP或是靜態的地址,啟動的時候會停在Starting eth0
5. PXE啟動Gento
好了,令人興奮的時刻到了!PXE啟動無盤客戶機,不久后出現提示login,大功告成!