[已解决]如何通过PXE服务器启动WinPE?(顶楼新增总结)
解决方案总结 by Climbing on 2007.5.28
这个求助帖子发布的时间已经很早了,据我所知,这大概是当时第一个讨论有关通过PXE启动PE的帖子,而且在大家的努力下成功的找到了解决方案,当时, grub4dos还不支持pxe启动方式。随着grub4dos对pxe启动方式的支持,这个问题又重新提到了桌面上来,而我发现很多人通过pxe启动 WinPE失败,并不是因为启动方法有问题,而是不了解pxe启动PE的过程,所以有必要在这里总结一下(其实下面的讨论都包括了大部分的基础设置,但可能比较分散也没有条理,所以这里只是将讨论内容条理化)。
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选项)。
下面提供一个我在给下属单位讲课时所写的pxe服务器设置讲义(比较简略,但有截图,你如果理解了上述原理,应该不难搞定):
http://nufans.net/upload/winpe/PXE_Server_Setup.rar
[attach]1543[/attach]
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加载这个启动文件(估计不成)。
基本上,上面所讲的就包括了有关PXE启动PE的所有内容,下面提供一个我的TFTP服务器目录结构(包括pxelinux.cfg/default)下载包,供大家参考:
http://nufans.net/upload/winpe/PXE_WinPE_Climbing.rar
[attach]1544[/attach]
==========================================
下面是原来帖子的内容:
==========================================
我们知道,一个具有基本系统维护功能的WinPE,哪怕是经过压缩之后,也要20来M,通过光驱启动总是有些太慢,而且,如果目标机器没有光驱也是很麻烦的事情。
现在机器没有安装网卡的已经很少见了,而且使用TFTPD32软件制作一台PXE启动服务器也是很简单的事情,在我自己的网络上,我一直通过PXE服务器启动我经常用到的各种系统维护工具,例如DOS下的网络启动盘,网络克隆,杀毒软件的DOS杀毒盘等。但唯独不能启动WinPE一直是一个遗憾。因此,我最近一直想找到一种方法解决这个问题。
目前的思路:
一、通过给新版的grub4dos增加网络启动补丁。
1、我们知道,已经可以通过Grub启动基于SDI的WinPE,这是由fujianabc兄解决的,具体解决方案在本论坛中有帖子详细说明。
2、基于grub 0.95的grub4dos曾经在Gandalf的努力下实现过通过TFTP服务器的网络启动功能,但那个版本的grub不支持sdi的启动方式。
因此,只要将新版的grub4dos再加上网络启动补丁,这个问题就可以得到完美的解决。
二、通过grub启动WinPE的硬盘映像。
我们可以将WinPE安装到硬盘,然后通过grub的网络功能将硬盘映像从PXE服务器取过来并仿真成硬盘运行。但这个仿真硬盘映像好像还是新版grub4dos才具有的功能。
所以,问题又归结到让新版的Grub4DOS支持网络启动。
暂时我能想到的就是这两种方法,请各位集思广益,找到一种可行的解决办法。
转自: http://www.znpc.net/bbs/viewthread.php?tid=1394
查看全部回复
我也来说两句