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中自动安装系统的详细工作过程:

201108121016306892.jpg
       第一步: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