Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515106
  • 博文数量: 484
  • 博客积分: 10145
  • 博客等级: 上将
  • 技术积分: 5805
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 18:34
文章分类

全部博文(484)

文章存档

2011年(52)

2010年(107)

2009年(287)

2008年(38)

我的朋友

分类: LINUX

2009-06-13 14:08:28

原创 PXE服务器架设收藏

http://blog.csdn.net/inject2006/archive/2008/05/20/2463076.aspx

1、PXE启动服务器的架设


简单说来,PXE服务器就是DHCP服务器+TFTP服务器。网络启动过程大概是这样的(可能并不严谨):客户端发送动态获得IP地址的广播包到网络上,DHCP服务器在收到该广播包后,发送给客户端分配IP地址的回应包,客户端收到回应包后设置自己的IP地址,然后从DHCP服务器获得启动服务器的IP地址(DHCP服务器066选项,这就是TFTP服务器的IP地址)及启动文件名(DHCP服务器067选项,这里的启动文件名就是pxelinux.0或者支持pxe的grub4dos的grldr,当然,也可以是startrom.n12或者使用3com Image Edit创建的pxe启动菜单文件,总之,它应该是一种由pxe启动规范规定的固定格式的可执行文件),然后客户端到联系启动服务器(TFTP服务器)获得启动文件并执行,这样基本上就完成了pxe启动过程。


在Unix或者Linux系统下,DHCP服务器和TFTP服务器一般都是分开设置的,两台服务器甚至可以在两台不同的机器上,其实Windows下的设置也是一样的,但在Windows下,我们可以通过使用HaneWin DHCP服务器软件或TFTPD32一个软件就搞定(我个人推荐使用HaneWin DHCP服务器软件,但TFTPD32设置起来更简单一些,就是效率有些低),详细的设置方法请自己摸索,你只要知道,在设置PXE服务器时,要设置好DHCP和TFTP两个服务器,其中DHCP服务器要设置启动服务器名(066选项)和启动文件名(067选项)。



2、PXE启动PE的原理


首先声明,这里讲的方法不见得适应于所有的PE,基本上基于无忧启动论坛老九(lxl1638)所制作的PE(例如老毛桃定制的版本)都应该是可以的,这些PE都是基于RAMDisk方式启动的,我试验时,深山红叶的PE是不能这样启动的。


通过PXE启动PE需要这么几个文件:


1)startrom.n12:这个文件从Windows 2003 SP1/SP2光盘中来,这个文件实际上也是一个符合pxe启动规范的启动文件,可以直接作为pxe服务器的启动文件来直接运行,当然,它也可以通过pxelinux的kernel命令来运行,我不知道grub4dos是否识别它的文件格式,如果能够识别,原理上它也可以使用grub4dos的kernel命令来执行,否则就使用chainloader --force命令来执行。


在Windows 2003 sp1/sp2的光盘中,还有一个startom.com文件,它的作用跟startom.n12是相同的,只是启动时需要按一个F12键才能继续,而startrom.n12则去掉了F12这个提示。


2)ntldr:这个文件是从Windows 2003 SP1/SP2光盘中的setupldr.exe改名而来,它的作用应该相当于从本地硬盘启动PE的setupldr.bin,但两者并不相同,但它决不是我们平常所使用的ntldr。这个文件必须放到TFTP服务器的根目录。


3)ntdetect.com:这个就是XP或2003所使用的c:\下的ntdetect.com。这个文件也必须放到TFTP服务器的根目录。


4)winnt.sif:这个是PE的启动配置文件(用来指定PE的系统目录及PE映像文件所在路径及启动选项)。这个文件也必须放到TFTP服务器的根目录。通过pxe启动的PE支持3种映像文件格式,例如,ISO、IMG或者SDI。其实,SDI格式相当于IMG格式,只是SDI格式在IMG文件前加了一个文件头。一般我们都使用ISO或IMG格式,但这两种格式的启动选项是有所不同的,ISO格式要在启动选项中增加一个/rdexportascd,而SDI格式还要增加一个/rdoffset选项。下面是Winnt.sif的示例:

[Copy to clipboard] [ - ]
CODE:
[SetupData]
BootDevice = "ramdisk(0)"
BootPath = "\I386\SYSTEM32\"
OsLoadOptions = "/minint /fastdetect /rdpath=\netpe.c\winpe.img"
;OsLoadOptions = "/minint /fastdetect /rdexportascd /rdpath=WINPE.ISO"

另外,winnt.sif文件中还要注意的就是BootPath选项,默认它指向"\I386\SYSTEM32"目录,但老毛桃的PE将I386目录修改成了WXPE,那么这里要作对应的修改,同时还要修改2)中的ntldr文件,将其中所有的I386替换为WXPE。只是修改winnt.sif是没有用的。后面我们讲通过PXE启动多个PE时还要讲更多的hack PE启动文件的方法。


5)PE映像文件(IMG或者ISO或者SDI格式,例如WinPE.IMG):这里特别要注意的就是PE的映像文件一定不能使用cab压缩格式,如果你用老毛桃的PE,一定要将它光盘根目录下的WinPE.IS_解压缩成winpe.iso然后放到这里使用。这样,IMG格式的PE就比较有优势了,因为IMG格式是硬盘分区映像格式,你可以对这个分区使用NTFS文件系统并加上NTFS压缩,基本上压缩率也接近cab压缩格式,这样img文件就没有必要使用cab压缩但仍然具有cab的压缩率,而且img格式可以直接使用Virtual Disk Manager(VDM)挂载并进行编辑,修改起来比较方便。另外,这个PE映像文件没有必要放在TFTP服务器的根目录下,例如上面的winnt.sif中就将winpe.img放在了TFTP服务器的/netpe.c/目录下。


PXE启动PE的过程大致是(可能也不是很严谨):startrom.n12获得执行后,在TFTP服务器根目录下寻找ntldr(setupldr.exe),找到后加载ntldr并执行,而ntldr则在TFTP服务器的根目录下查找winnt.sif,根据winnt.sif的内容从TFTP服务器上下载PE的映像文件并根据选项进行PE的加载,在PE的加载过程中可能会用到ntdetect.com。


3、让PXE服务器支持同时启动多个PE的设置方法

通过上面的讲述,我们已经明白了通过PXE启动PE的一个概况,由于PE通过PXE启动时,要求NTLDR(setupldr.exe)、winnt.sif和ntdetect.com必须放在TFTP服务器的根目录,那么要想让PXE服务器支持同时启动多个PE,必须对文件名进行hack,其中ntdetect.com是PE启动时共用的,没有必要进行修改,但ntldr和winnt.sif由于只跟一个PE有关,所以文件名必须进行更改。假设我们要启动的第二个PE的映像文件名为netpe.iso,该映像文件放在TFTP根目录下的netpe目录下,ISO中的I386目录被改成了WXPE,由于该PE通过pxe启动时不能再使用ntldr和winnt.sif,那么这两个文件我们对应改成:netpe和netpe.sif,详细的hack过程如下:

1)startrom.n12:这个文件没有必要放到TFTP服务器的根目录下,可以将它跟PE映像文件放到同一个目录下,文件名可以起成netperom.0,由于它启动时要查找TFTP服务器根目录下的ntldr,所以必须使用十六进制编辑器(UltraEdit)打开它进行修改,将该文件中的所有ntldr字符串查找替换成netpe。

2)将原来的ntldr(setupldr.exe)改名为netpe并放到TFTP服务器的根目录下,用UE打开并将所有的winnt.sif字符串替换为netpe.sif,同时将所有的I386字符串替换为WXPE。

3)新建一个文件,名为netpe.sif,放到TFTP服务器根目录下,内容如下:

[Copy to clipboard] [ - ]
CODE:
[SetupData]
BootDevice = "ramdisk(0)"
BootPath = "\WXPE\SYSTEM32\"
OsLoadOptions = "/minint /fastdetect /rdexportascd /rdpath=\NETPE\NETPE.ISO"

4)修改pxelinux的启动菜单文件(pxelinux.cfg/default),加入一个条目,内容如下:

LABEL netpe
MENU LABEL WinPE with Network Support for PXE boot
kernel /netpe/netperom.0

如果使用pxegrub,那么应该是类似这样的:
title WinPE with Network Support for PXE boot
pxe keep
chainloader --force /netpe/netperom.0

由于我暂时没有尝试过使用pxegrub加载PE,大概应该是上面这个样子,也可以试试使用grub4dos的kernel /netpe/netperom.0加载这个启动文件(估计不成)。
阅读(261) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~