本文介紹了利用Etherboot + NFS-ROOT + tmpfs實現可擴展Linux網絡啓動的方法。
啓動過程
linux網絡啓動過程可劃分爲兩個階段:
第一階段:下載內核
在這一階段中,客戶端必須有一段小小的網絡啓動自舉代碼。
在Linux中,這一段自舉代碼能夠由netboot或etherboot來生成。
自舉代碼要實現的兩個核心功能是:
網卡驅動功能:驅動客戶端的網卡,以便經過網絡收發數據。
交互引導功能:經過必定的用戶界面與用戶交互;
使用適當的網絡協議從服務器獲取信息和下載數據;
引導內核。
這一階段的流程是:
1. 客戶機開機並實現bios自檢後,把控制權交給etherboot。
2. etherboot利用DHCP協議,經過廣播找到DHCP服務器,並取得TFTP服務器的IP和映象文件名等信息。
3. etherboot顯示菜單,讓用戶選擇啓動參數和內核。
4. etherboot使用TFTP協議,從TFTP服務器下載映象文件。
5. etherboot從映象文件中解出linux內核,並把控制權交給內核。
第二階段:引導系統
1. linux內核啓動,並取得本身的ip及其它網絡配置信息。
2. linux內核mount上服務器提供的NFS根分區,並進行系統的初始化。
這種無盤系統,具備以下優勢:
建立和維護簡單而方便,擴展性和伸縮性好,通用性和適用範圍廣。
簡單步驟以下(假設您已具備Linux無盤啓動的初步知識):
一、在一臺普通的機子上安裝一個debian/woody系統,進行初步的系統配置。
二、將此係統完整的拷貝到服務器的目錄/croot下。
三、在服務器上配置運行nfsd。將/croot經過NFS共享:
#/etc/exports
/croot *(ro,no_root_squash)
四、在服務器上配置運行dhcpd,tftpd。
五、缺省的/etc,/var等目錄,客戶端須要擁有寫入權,所以須要在客戶端內存創建虛擬的文件系統。
把/croot下的etc/,var/,root/等目錄精簡併打包,放在/croot/nfsboot/目錄下。
系統啓動時下面的腳本會創建若干tmpfs文件系統,並把這些壓縮包解開還原到其中去。
六、在/croot/etc/init.d/下新建nfsboot.sh腳本文件,並創建連接
ln -s /croot/etc/init.d/nfsboot.sh /croot/etc/rcS.d/S03nfsboot.sh
使之能在系統啓動的初期自動執行。
七、編譯客戶端內核,分別使用etherboot及mknbi製做啓動軟盤及映像文件。
參考資料:
在198上你能找到所有的配置參考資料.好比:
ftp://202.38.73.198/diskless/src/ etherboot及mknbi源代碼
ftp://202.38.73.198/diskless/boot/ 啓動無盤客戶端用
ftp://202.38.73.198/diskless/p_w_picpath/ 這是我已作好的.nbi文件。
ftp://202.38.73.198/diskless/config/ 各類配置文件樣板,僅供參考。
ftp://202.38.73.198/diskless/etherboot/ 已編譯好的各類etherboot啓動文件
(NFS) 202.38.73.198:/croot NFS-ROOT,整個系統都給你了噢。
(NFS) 202.38.73.198:/croot/etc/init.d/nfsboot.sh 網絡啓動初始化腳本,呵呵,本系統運行的關鍵之處。
(NFS) 202.38.73.198:/croot/nfsboot/ 已打包的精簡版本/etc,/var等目錄
以上目錄亦可用http訪問。
附錄:
A. 編譯內核(2.4.x)時須要選上的options
__________________________________________________________________
# File systems
# Virtual memory file system support
CONFIG_TMPFS=y
# /dev file system support
CONFIG_DEVFS_FS=y
# Automatically mount devfs at boot time
CONFIG_DEVFS_MOUNT=y
# Networking options
# Kernel level IP autoconfiguration
CONFIG_IP_PNP=y
# DHCP support
CONFIG_IP_PNP_DHCP=y
# Network File Systems
# NFS file system support
CONFIG_NFS_FS=y
# Provide NFSv3 client support
CONFIG_NFS_V3=y
# Root file system on NFS
CONFIG_ROOT_NFS=y
__________________________________________________________________
B. 製作網絡啓動映像文件的簡單腳本
__________________________________________________________________
#!/bin/sh
IMAGE=nc
mknbi-linux --output=$IMAGE.nbi --rootdir=rom --ip=rom vmlinuz \
&& cp $IMAGE.nbi /tftpboot/ \
&& echo success
__________________________________________________________________
C. 開設TFTP服務
很簡單,我用的是atftpd.
D. 開設DHCP服務
配置文件中添加以下內容,以支持無盤客戶端的啓動:
(其中的一部分請酌情修改)
__________________________________________________________________
# diskless options to support etherboot clients
# TODO: insert the following text into your dhcpd.conf
# Define options for Etherboot
option etherboot-magic code 128 = string;
option etherboot-cmdline code 129 = string;
option etherboot-motdline1 code 184 = string;
option etherboot-motdline2 code 185 = string;
option etherboot-motdline3 code 186 = string;
option etherboot-motdline4 code 187 = string;
option etherboot-motdline5 code 188 = string;
option etherboot-motdline6 code 189 = string;
option etherboot-motdline7 code 190 = string;
option etherboot-motdline8 code 191 = string;
option etherboot-menuparam code 160 = string;
option etherboot-menuline1 code 192 = string;
option etherboot-menuline2 code 193 = string;
option etherboot-menuline3 code 194 = string;
option etherboot-menuline4 code 195 = string;
option etherboot-menuline5 code 196 = string;
option etherboot-menuline6 code 197 = string;
option etherboot-menuline7 code 198 = string;
option etherboot-menuline8 code 199 = string;
option etherboot-menuline9 code 200 = string;
option etherboot-menuline10 code 201 = string;
option etherboot-menuline11 code 202 = string;
option etherboot-menuline12 code 203 = string;
option etherboot-menuline13 code 204 = string;
option etherboot-menuline14 code 205 = string;
option etherboot-menuline15 code 206 = string;
option etherboot-menuline16 code 207 = string;
class "Etherboot" {
match if substring (option vendor-class-identifier, 0, 9) = "Etherboot";
option etherboot-magic = E4:45:74:68:00:00;
option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
option root-path "202.38.73.198:/croot,flags=hard,nolock,intr,v3";
option etherboot-cmdline "ramdisk_size=204800";
option etherboot-menuparam "timeout=10:default=192";
option etherboot-motdline1 "Linux Remote Boot Service";
option etherboot-menuline1 "Linux WorkStation:::pc.nbi:";
option etherboot-menuline2 "Network Computer:::nc.nbi:";
option etherboot-menuline3 "Debian 2.2 Installation Disk:::debian.nbi:";
option etherboot-menuline4 "Redhat 7.3 Installation Disk:::redhat.nbi:";
option etherboot-menuline5 "Mandrake 8.2 Installation Disk:::mandrake.nbi:";
option etherboot-menuline6 "SuSE 8.0 Installation Disk:::suse.nbi:";
option etherboot-menuline7 "IBM Disk Manager:::dm.nbi:";
option etherboot-menuline8 "Windows 98 bootdisk:::win98.nbi:";
}
__________________________________________________________________
E. 配置NFS-ROOT,開設NFS服務
在/etc/exports文件中添加以下內容:
__________________________________________________________________
#/etc/exports
/croot 10.0.0.0/255.255.255.0(ro,no_root_squash)
__________________________________________________________________
F. 編寫啓動腳本
請自行修改腳本內容以適合本身的須要,
並將之連接到/etc/rcS.d/目錄中,以保證在系統初始化時被執行。
__________________________________________________________________
#!/bin/sh
# nfsboot.sh : boot from nfs-root.
# by WFG 2001.9.30
# setup dirs and packages
cd /
mount -n -t tmpfs tmpfs /tmp
mount -n -t tmpfs tmpfs /var
tar zxf /nfsboot/var.tgz
mount -n -t tmpfs tmpfs /etc
tar zxf /nfsboot/etc.tgz
mount -f /
mount -f /etc
mount -f /var
mount -f /tmp
mount -t tmpfs tmpfs /root
tar zxf /nfsboot/root.tgz
mount -t tmpfs tmpfs /home
mount -t proc proc /proc
chmod 755 /etc /var /home
chmod 700 /root
__________________________________________________________________
G. 測試運行
轉載自:http://blog.chinaunix.net/uid-7747097-id-2562073.html