PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。既然是通过网络传输,就需要IP地址;也就是说在其启动过程中,客户端请求服务器分配IP地址,之后PXE Client使用TFTP Client 通过TFTP(Trivial File Transfer Protocol)协议下载启动安装程序所需的文件。
简单地说PXE网络安装,客户机通过支持PXE的网卡向网络中发送请求DHCP信息的广播请求IP地址等信息,DHCP服务器给客户端提供IP地址和其它信息(TFTP服务器、启动文件等),之后请求并下载安装需要的文件。在这个过程中需要一台服务器来提供启动文件、安装文件、以及安装过程中的自动应答文件等。下图中介绍了Linux中自动安装系统的详细工作过程:
第一步:PXE Client向DHCP发送请求
首先,将支持PXE的网络接口卡(NIC)的客户端的BIOS设置成为网络启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向网络中的DHCP服务器索取IP地址等信息。
第二步:DHCP服务器提供信息
DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
第三步:PXE客户端请求下载启动文件
客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件linux包括:(lpxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img);windows包括(lpxelinux.0、pxelinux.cfg/default、wi2k3.sif、w2k3l、startrom.0、ntdetect.2k3)等文件。
第四步:Boot Server响应客户端请求并传送文件
当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROM 由 TFTP 通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动不同操作系统安装程序的引导内核。
第五步:请求下载自动应答文件
客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP,SMB),则会在这个时候初始化网络,并定位安装源位置。这是由于PXE获取的是安装用的内核以及安装程序等,而安装程序要获取的是安装系统所需的二进制包以及配置文件。由于它们需要的内容不同造成PXE模块和安装程序是相对独立的,PXE的网络配置并不能传递给安装程序。从而进行两次获取IP地址过程。
如果需要无人职守的安装方法,接着会读取该文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
第六步:客户端安装操作系统
将ks.cfg文件下载回来后,通过该文件找到OS Server,并按照该文件的配置请求下载安装过程需要的软件包。
OS Server和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。安装完成后,将提示重新引导计算机。这个时候注意,在重新引导的过程中一定要将BIOS修改回从硬盘启动,不然的话又会重复的自动安装操作系统。
在上面介绍中PXE client是需要安装Linux的计算机,TFTP Server、DHCP Server和NFS Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核都放置在Linux Server上TFTP服务器的根目录下。而Linux根文件系统存放于NFS Server的共享目录中。
PXE client在工作过程中,需要三个二进制文件:bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。
一、配置过程
配置PXE安装,要进行如下步骤:
① 配置DHCP,用于给客户端提供IP地址及其它信息
② 配置TFTP服务器,用于提供客户端PXE引导所必须的文件
③ 配置NFS服务器,用于存放安装树
④ 配置Kickstart,用于自动应答安装
⑤ 使用PXE功能引导客户机
以下配置过程中运用个人的安装过程。
1.DHCP的安装与配置
配置dhcpd.conf
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
ddns-update-style interim;
ignore client-updates;
default-lease-time 1200;
max-lease-time 9200;
option subnet-mask 255.255.0.0;
option broadcast-address 192.168.255.255;
option routers 192.168.3.57;
option domain-name-servers 202.101.98.55;
option domain-name "mydomain.org";
subnet 192.168.0.0 netmask 255.255.0.0 {
range 192.168.230.10 192.168.230.100;给客户端非配的地址池
}
host q10 {
hardware ethernet 00:00:F0:6B:38:5B;
fixed-address 192.168.234.122;
}
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
option PXE.mtftp-ip 0.0.0.0;
filename "pxelinux.0"; #pxelinux启动文件位置
next-server 192.168.3.57; #TFTP Server的IP地址
}
2.安装配置TFTP服务器
配置tftp服务
tftp 服务由xinetd服务管理。编辑/etc/xinetd.d/tftp 文件,将'disable = yes' 改为:disable = no。
3.PXE引导配置(bootstrap)
cp /usr/lib/syslinux/pxelinux.0 /tftpboot/
cp /media/rhel5/p_w_picpaths/pxeboot/{vmlinuz,initrd.img} /tftpboot/
从安装盘上拷贝boot.msg ,general.msg, options.msg, param.msg, rescue.msg 到/tftpboot
接下来创建/tftpboot/pxelinux.cfg/ 目录,该目录用于存放客户端的配置文件。
mkdir /tftpboot/pxelinux.cfg
cp /media/rhel5/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
查看default文件内容,以下内容根据原文件略加修改
default
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label win2k3
kernel startrom.0
label CenOS5
kernel vmlinuz
append ks=nfs:192.168.3.57:/opt/cenOS5/ks.cfg initrd=initrd.img
根据不同的版本号,设置一个label 并且是全自动安装
label CenOS4
kernel vmlinuz
append ks=nfs:192.168.3.57:/opt/cenOS4/ks.cfg initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label ks
kernel vmlinuz
append ks initrd=initrd.img
label local
localboot 1
label memtest86
kernel memtest
append –
3、以下是为客户端安装Linux系统配置的服务
3.1、安装配置NFS服务器
安装介质存储在服务器上的一个目录中,可以使用各种网络协议访问它,比如 HTTP,FTP,和NFS。也就是我们前面提到的OS Server。这里使用 NFS 服务来提供安装介质,只需要将系统光盘内容拷贝放到共享目录下即可。
创建共享目录,并将光盘内容拷贝到共享目录中:
[root@qiuri Server]#mkdir /mnt/install
[root@qiuri Server]#cp /media/rhel5/* /mnt/install
安装NFS并将共享目录发布出去
[root@qiuri Server]# vi /etc/exports
/mnt/install *(ro,sync)
~
"/etc/exports" 1L, 25C written
重启服务使配置生效。
[root@qiuri Server]# service portmap restart
停止 portmap: [确定]
启动 portmap: [确定]
[root@qiuri Server]# service nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
检查目录/mnt/install是否被正确共享:
[root@qiuri Server]# showmount -e locahost
Export list for localhost:
/mnt/install *
[root@qiuri Server]# chkconfig --level 35 nfs on
3.2、配置Kickstart安装
通常,我们在安装操作系统的过程需要大量的人机交互过程,减少交互过程,为了提高安装效率Red Hat Linux 开始支持一个称为 kickstart 的功能。使用这种方法,只需事先定义好一个Kickstart自动应答配置文件(通常存放在安装服务器上),并让安装程序知道该配置文件的位置,在安装过程中安装程序就可以自己从该文件中读取安装配置,这样就避免了繁琐的人机交互,实现无人值守的自动化安装。
我们可以通过多种方法生成Kickstart配置文件,无论使用哪种方法无非就是创建一个应答文件,当你安装好一台Red Hat Linux机器,Red Hat Linux 安装程序都会创建一个 kickstart 配置文件,记录你的真实安装配置。如果你希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件。 该文件位于/root/anaconda-ks.cfg。
这里我直接使用该文件,拷贝本文件到/mnt/install下。这个路径可以修改,当用到无人安装的时候可以通过/tftpboot/pxelinux.cfg/default里面的修改。
install
nfs --server=192.168.1.1 --dir=/mnt/install #这个选项告诉安装程序:到服务器192.168.1.1的NFS共享目录 /mnt/install下寻找安装介质
key 2515dd4e215225dd
注意:关闭服务器端防火墙和SELINUX,配置完成。
总结:在安装过程中总共用到以下几个文件:initrd.img,vmlinuz,ks.cfg,boot.msg,general.msg,options.msg,param.msg,rescue.msg,pxelinux.0, pxelinux.cfg/default。
4、以下是为客户端安装Linux系统配置的服务
Windows网络安装的大致步骤如下:
1. 目标计算机从网卡PXE Boot ROM启动(当然,你也可以用PXELinux或PXEGrub来实现类似的启动功能)。
2. 目标计算机从DHCP/BOOTP服务器获得网络地址,并获得TFTP服务器的IP地址和启动文件信息。
3. 目标计算机向TFTP服务器获得启动文件startrom.com/startrom.n12
4. startrom.com获取ntldr(由setupldr.exe改名而来),并将控制权传递给它。
5. setupldr.exe获取ntdetect.com和winnt.sif,winnt.sif应该包含启动相关信息。
从这个时候起,有两种启动方法,即ramdisk和网络启动,对于Ramdisk,启动分区为\Device\Ramdisk{xxxx...},你可以参考本文后的引用2。对于网络启动,你需要在winnt.sif中设定SetupSourceDevice参数。
6. setupldr.exe通过ntdetect.com获得网卡的Vendor ID和Device ID, 并将它发送到Binl服务端口(4011)。
7. Binl服务查找“数据库”,获得需要加载的驱动名称和服务名,返回给setupldr.exe
8. Setupldr.exe按照正常顺序加载驱动,不过在最后,它会试着去加载前面给出网卡驱动和网络设备相关驱动,你可以从TFTP服务器的log里看到这些。有意思的是,txtsetup.sif并没有网络设备相关驱动的信息,我想可能是直接写在setupldr.exe里了。
9. 控制权移交给kernel,kernel会试着去mount启动分区,要注意的是,你建好的共享必须提供匿名访问,否则会停住不动。
10. 开始文本模式安装,setupdd复制文件到硬盘。完成后重新启动。
11. 开始GUI阶段安装,要注意的是,之前应该在Winnt.sif中指定OriSrc和OriTyp,至于是不是必须的,我不好说,因为并没有试验过。
12. 安装结束。实际上,你可以在winnt.sif中加入相关信息,以便实现无人值守安装。
4.1.架设SAMBA服务器.
SAMBA服务器的安装和配置很简单.需要注意的是samba的配置文件需要做如下调整:
[global]
null passwords = true
security = share
workgroup = workgroup
[REMINST]
browseable = yes
read only = no
path = /tftpboot 共享文件夹
guest ok = yes
1.把WinXP光盘上的i386目录复制到某一个目录下,我的拷贝位置为:/tftpboot/win2003
2.进入/tftpboot/win2003/i386目录,解开driver.cab文件。默认windows的drivers.cab里面集成了大量驱动,如果你的网卡驱动不在winxp自带的包里,需要手动复制网卡驱动盘中的文件到这里.
#cabextract driver.cab
4.2.TFTP部分
yum install tftp-server
vi /etc/xinetd.d/tftp
===============================================
server_args = -m /tftpboot/rules -s /tftpboot
disable = no
vi /tftpboot/rules
ri ^[a-z]: # Remove “drive letters”
rg \\ / # Convert backslashes to slashes
rg \# @ # Convert hash marks to @ signs
rg /../ /..no../ # Convert /../ to /..no../
rg A a
rg B b
rg C c
rg D d
rg E e
rg F f
rg G g
rg H h
rg I i
rg J j
rg K k
rg L l
rg M m
rg N n
rg O o
rg P p
rg Q q
rg R r
rg S s
rg T t
rg U u
rg V v
rg W w
rg X x
rg Y y
rg Z z
r ^/(.*) \1
4.3. 由于在Linux下,TFTPD对大小写很敏感,刚才的rules也把所有对文件和目录的请求都改成了小写,所以这里也要把所有文件名都改成小写的。用如下命令来修改:
#find ./ -depth | perl -ne 'chomp;m</[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "mv",$d.$f,$d.$_ if $f ne $_'
4.4. 下面我们把windows启动的几个文件都复制到tftpboot目录下
在I386文件夹下查找到三个文件:
i386/STARTROM.N1_;i386/SETUPLDR.EX_;ntdetect.com
cabextract startrom.n1_ startrom.n12
cabextract setupldr.ex_ setupldr.exe
sed -i -e 's/NTLDR/w2k3l/gi' startrom.n12
mv startrom.n12 startrom.0
sed -i -e 's/winnt\.sif/wi2k3\.sif/gi' setupldr.exe
sed -i -e 's/ntdetect\.com/ntdetect\.2k3/gi' setupldr.exe
mv setupldr.exe w2k3l
mv ntdetect.com ntdetect.2k3
创建wi2k3.sif文件:vim wi2k3.sif
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\192.168.3.57\REMINST\win2003\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1
[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\192.168.3.58\REMINST\win2003"
[UserData]
ComputerName = test
; if needed
;ProductID=
OriSrc = "\\你的服务器名称\你的共享名称\win2003\i386"
表示你的共享路径了,"你的服务器名称"可以输入你当前计算名称或者当前计算的固定IP地址,“你的共享名称”就是你建立的共享名称了,本例中我就以tftp为共享名称了。
SetupSourceDevice = "\Device\LanmanRedirector\你的服务器名称\你的共享名称\win2003"
这行的说明跟上述的一致了
到此,总共产生四个文件:startrom.0, w2k3l, wi2k3.sif ,ntdetect.2k3全部放到/tftpboot目录下.
4.5.接下来安装Binl Server
#tar zxf ris-linux-0.3.tar.gz
#cd ris-linux-0.3
缓存驱动
#./infparser.py /tftpboot/winxp/i386/inf
Inf文件夹从安装的操作系统下拷贝一份,
#./binlsrv.py
注意不要关闭binlsrv.py这个进程
总结:安装WINDOWS2003总共用如下几个文件:startrom.0, w2k3l, wi2k3.sif ,ntdetect.2k3