本文介绍了利用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