其实网络上已经有了网络安装xp的方法,所以本文重点在于实现过程中重要环节可能出现的问题。Windows server已经提供了网络安装服务,来部署xp或2003的网络安装,可这要在域模式下来实现。经过一些人的努力,实现了工作组模试的网络安装。通过网络安装windows,无疑是非常方便的批量装机方法,不用光驱,不用光盘,只要是可以从网络启动的电脑就可以从网络上安装xp或2003。这要在一些老电脑的独立网卡上还要装一个启动模块,也不贵一两块钱一个。如今新机子的集成网卡已经内置网络启动功能了。
要求:
  1、DHCP服务器,负责分配IP
  2、TFTP服务器,负责传输文件到客户端
  3、BINL实现工作组模式网络安装的关键,此服务实现了从网络加载客户端网卡的驱动,主要靠NCQ,NCR,RQU,RSU四种报文实现。
  4、win2k、winxp、win2k3光盘或镜像文件
其实要同时实现DHCP+TFTP,在windows环境下用tftpd32.exe这个工具就OK了。而BINL这个东东要用国外某位高人的作品binlsrv。安装工作过程大概如下:Client端由网络启动,发现DHCP服务器并获得IP、tftp 服务器地址、启动文件名即startrom.n12Client 从tftp服各器下载startrom.n12文件并执行,startrom.n12会向tftp服务器请求ntldr(由setupldr.exe改名而来)并执行它,ntldr再加载ntdetect.com bootfont.bin 和winnt.sif,ntldr通过winnt.sif文件中的setupsourcedevice参数来决定接下来要从哪里加载文件,\Device \LanmanRedirector\表示从网络加载。它会向tftp服务器的\folder\i386\目录请求预安装环境所需文件,这里的 folder和上而setupsourcedevice中的folder是一样的,所以这也就规定了 tftp的跟目录是在共享目录之下,否则就会出上面那个错误提示。预安装环境加载驱动前会向binlsrv 服务器发送Client端网卡驱动编号,binlsrv服务端查找驱动数据库,将匹配client端网卡的驱动文件名发给client端,安装程序加载 tcp/ip驱动时,会从tftp服务器的xp安装源文件所在目录下载。然后安装程序继续安装过程,这时已经可以支持tcp/ip,可脱离pxe,安装源文件不再从tftp下载,而从”文件共享服务器”的共享目录下载,最终完成安装。
现在,知道大致工作流程,就开工了。先建立一个共享文件夹来放需要的工具,我就取名为"tftp"吧,再在tftp里面建立三个文件夹分别为win2k,winxp,win2k3,这样做便于管理,分别从win2k,winxp,win2k3光盘或者镜像中复制I386文件夹到对应的系统中,比如说从XP光盘中复制I386文件夹到winxp中,对应就OK了,3个系统的I386都要,因为我们要选择性安装系统。
接着,就是要用到符合微软PXE启动的几个文件:
  1、startrom.n12
  2、setupldr.exe
  3、ntdetect.com
  4、winnt.sif
  startrom.n12,setupldr.exe,ntdetect.com这三个文件可以在I386的文件夹中找到,理论上应该是通用的,但为了区分一下,就分别从各自的I386中找吧,而winnt.sif这个文件就靠自己编写,随便建一个空白文本文挡输入参数就OK.
对于startrom.n12,不能直接找到,搜索I386中的"STARTROM.N1_"这个文件,用winrar或者其他解压缩工具打开就会发现startrom.n12了。
  setupldr.exe同样不能直接找到,搜索I386中的"SETUPLDR.EX_"这个文件,同样用winrar或者其他解压缩工具打开,提取里面的setupldr.exe文件
  ntdetect.com可以在I386中直接找到.

好了,现在找到要用到的文件,由于从三个I386提取出所需要的文件的名称是一致的,我们要修改名字跟里面的东东达到选择性启动安装。
现在,我们就从XP光盘中的I386文件中提取出需要的3个文件开始改起吧,记得要修改的话,在windows下,我就用UE吧。对于XP系统的步骤就简单说明吧:
1、复制I386文件夹到刚刚建的winxp目录下
2、用Winrar解压"STARTROM.N1_"文件得到"startrom.n12"文件,
3、用UE替换"startrom.n12"文件中所有"NTLDR"为"XPLDR",
4、移动修改后的"startrom.n12"到tftp目录下并改名为"winxp.0",
5、用winrar解压"SETUPLDR.EX_"文件得到"setupldr.exe"
6、用UE替换"setupldr.exe"里面的全部"winnt.sif"为"winxp.sif","ntdetect.com"为"ntdetect.wxp"
7、移动修改过的"setupldr.exe"到tftp目录并改名为"XPLDR"
8、复制I386中的"NTDETECT.COM"到tftp目录并名为"ntdetect.wxp"
9、对于winnt.sif这个文件,由于上面我们已经用UE将"setupldr.exe"中的winnt.sif替换为winxp.sif,所以我们建立的文件为"winxp.sif",用记事本新建一个文件,保存为"winxp.sif",输入以下参数:
=====================我是分割线,不要复制我=========================
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\你的服务器名称\你的共享名称\winxp\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1
[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\你的服务器名称\你的共享名称\winxp"
[UserData]
ComputerName = *
; if needed
;ProductID
=========================我是分割线,不要复制我======================
简单说明一下参数意义:
OriSrc = "\\你的服务器名称\你的共享名称\winxp\i386"
表示你的共享路径了,"你的服务器名称"可以输入你当前计算名称或者当前计算的固定IP地址,“你的共享名称”就是你建立的共享名称了,本例中我就以tftp为共享名称了。
SetupSourceDevice = "\Device\LanmanRedirector\你的服务器名称\你的共享名称\winxp"
这行的说明跟上述的一致了。
[UserData]
ComputerName = *
; if needed
;ProductID
这些是安装系统时要求你输入的内容,比如ProductID这行,注意,前面有个红色的分号,表示这行不用了,当你需要时可以将分号去掉并输入对应的序列号,输入序列号后,在安装过程中就不用输入了。
具体winnt.sif说明请看上网搜索相干资料,
附上我的winxp.sif文件内容:
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\wake\tftp\winxp\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1
[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\wake\tftp\winxp"
[UserData]
ComputerName = *
; if needed
;ProductID
到了这里,XP的PXE修改就完毕了,将winxp.0、ntdetect.wxp、winxp.sif、XPLDR复制到tftp文件夹下。
win2k3的与XP一样修改,不过修改内容的名字有区别,容易管理。大致上就这样:
1、复制win2k3中的I386文件夹到刚刚建立的win2k3文件夹中
2、用Winrar解压"STARTROM.N1_"文件得到"startrom.n12"文件,
3、用UE替换"startrom.n12"文件中所有"NTLDR"为"w2k3l",
4、移动修改后的"startrom.n12"到tftp目录下并改名为"w2k3.0",
5、用winrar解压"SETUPLDR.EX_"文件得到"setupldr.exe"
6、用UE替换"setupldr.exe"里面的全部"winnt.sif"为"wi2k3.sif","ntdetect.com"为"ntdetect.2k3"
7、移动修改过的"setupldr.exe"到tftp目录并改名为"w2k3l"
8、复制I386中的"NTDETECT.COM"到tftp目录并名为"ntdetect.w2k3"
9、我的wi2k3.sif文件内容如下:
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\wake\tftp\win2k3\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1
[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\wake\tftp\win2k3"
[UserData]
ComputerName = test
; if needed
;ProductID=
至此,win2k3的PXE启动文件修复完毕,将w2k3.0、ntdetect.2k3、w2k3l、wi2k3.sif复制到tftp文件夹下。
由于上述的修改都是对于"winnt"的,而win2000就是winnt的一种吧.所以,有好多地方不用修改,直接可以用,但名字要与其他两个系统所提取出的区分开。大致流程如下:
1、复制win2000中I386文件夹到刚刚建立的win2k中
2、用Winrar解压"STARTROM.N1_"文件得到"startrom.n12"文件,
3、用UE替换"startrom.n12"文件中所有"NTLDR"为"w2kld",
4、移动修改后的"startrom.n12"到tftp目录下并改名为"w2k.0",
5、用winrar解压"SETUPLDR.EX_"文件得到"setupldr.exe"
6、移动修改过的"setupldr.exe"到tftp目录并改名为"w2kld"
8、复制I386中的"NTDETECT.COM"到tftp目录并名为"pxelinux.0ntdetect.com"
9、注意,这次winnt.sif要改名为"pxelinux.0winnt.sif",我的内容如下:
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\wake\tftp\win2k\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1
[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\wake\tftp\win2k"
[UserData]
ComputerName = *
; if needed
;ProductID=
现在解释一下为什么要取“pxelinux.0winnt.sif”和"pxelinux.0ntdetect.com"这两个名字。前面的前缀"pxelinux.0"取自于启动文件“pxelinux.0”,由于我们要实现选择性安装不同的操作系统,能做到这样的,据我知道只有pxelinux,而pxelinux来自于syslinux,后面再详细说明。而win2000的PXE启动时所需用的winnt.sif文件在响应时有BUG,可以自己试试不改动的情况,你会发现启动不了的,只有从第一个启动文件,即“pxelinux.0”将它的名字以前缀形式加入到"winnt.sif"中可以避免这个BUG,但“winnt.sif”名字修改为“pxelinux.0winnt.sif”时,ntdetect.com也接着要对应修改名字为“pxelinux.0ntdetect.com”。所以实际上win2k从PXE启动所需要的文件分别为:w2k.0、pxelinux.0ntdetect.com、pxelinux.0winnt.sif、W2KLD这几个文件。
好了,现在tftp文件目录如下:

win2k中就放有一个I386文件夹,这个文件夹来自于win2000光盘中的I386
win2k3的I386文件夹来自于光盘win2k3的I386文件夹
winxp的I386文件夹来自于光盘winxp中的I386文件夹
现在就是要做启动菜单了,上面之前说过要用到syslinux中的pxelinux,所以,请到相关网站先下载syslinux,里面有我们需要的pxelinux及其他工具,具体自己看英文说明。好了,我就用syslinux3.73版,从core文件夹中找到pxelinux.0文件,从com32\menu下找到vesamenu.c32文件,从com32\modules下找到chain.c32文件,将这三个文件复制到tftp文件夹下面,并新建一个名字为“pxelinux.cfg”的文件夹,pxelinux.cfg文件夹负责存放pxelinux.0的配置文件。而vesamenu.c32是菜单所需要的文件,chain.c32是从硬盘启动选项中的kenerl文件,作用相当与winxp.0、w2k3.0、w2k.0这三个文件,可以忽略不要,但为了做稍为多小小功能(从硬盘启动),就顺便要吧。然后再到pxelinux.cfg这个文件夹下,用记事本建立一个无后缀,名字为"default"的空白文件,该文件内容为:
DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE PXE Boot Install Menu By wake
MENU BACKGROUND splash.png
TIMEOUT 200
LABEL hdd
MENU LABEL ^0----Boot From HARDDISK
kernel chain.c32
APPEND hd0 1
LABEL winxp
MENU LABEL ^1----Boot for Install Windows XP   From NetWork
kernel winxp.0
LABEL win2k
MENU LABEL ^2----Boot for Install Windows 2000 From NetWork
kernel w2k.0
LABEL win2k3
MENU LABEL ^3----Boot for Install Windows 2003 From NetWork
kernel w2k3.0

简单说明一下,第一行,DEFAULT vesamenu.c32,必须的,因为要用到菜单功能,必须有这个vesamenu.c32文件,具体可以看syslinux中vesamenu.c32所在目录的vesamenu.c文件说明。
MENU TITLE PXE Boot Install Menu By wake表示菜单的标题了,可以取自己喜欢的英文名称。
MENU BACKGROUND splash.png  表示菜单后面的背景文件,我这里就放一个名称为splash.png文件。
TIMEOUT 200 多少毫秒后超时,可以设大一点。
LABEL hdd 用来区分其他kernel的,方便自己管理
MENU LABEL ^0----Boot From HARDDISK 选项菜单的名称,^0表示按数字”0“可以直接跳到该选项
kernel chain.c32 启动时的内核,这个就是从硬盘启动所需要的东西了
APPEND hd0 1 这里表示从第一个硬盘中的第一个分区启动,根据实际进行修改。
接着的文件就差不多了,不做多解释。
现在我们再配置TFTP这个文件,我的配置就这样了:

由于我的网卡的IP地址是192.168.1.25,所以WINS/DNS服务器就用我的IP地址吧,默认路由也设置为192.168.1.25,启动文件就是pxelinux.0了,还有,请先关闭你所在网络中的DHCP服务器吧,避免IP冲突了。现在DHCP、TFTP服务器架设完毕。接下来的任务就是binl这个东东了,具体是干什么的,前面已经说明清楚了。我这里在windows环境中就用binlsrv.exe这个由国外高手编写的东东了。由于binlsrv.exe需要从“驱动数据库”中找客户端网卡对应的驱动文件,将匹配客户端网卡的驱动文件名发给客户端,而“驱动数据库”文件我们没有,怎样办呢?这时要用到ris-linux点击可以下载,(官方的连接不知道为什么失效,自己上传已经下载好的。)运行ris-linux压缩包里的infparser.py生成网卡驱动信息文件nics.txt,需要安装Python,首先从已经安装好的 Windows XP系统目录下把inf文件夹(一般情况下为C:\Windows\inf)复制一份,放到存放infparser.py的目录下,然后运行:

infparser.py inf

如果成功运行的话会生成nics.txt跟devlist.cache两个文件,这里要用到的是nics.txt,将它拷入存放binlsrv.exe的目录下即可。或者你可以用的nics.txt文件:
====================我是分割线,不要复制我呀=============================================
021b 8138 RTL8139.SYS rtl8139
021b 8139 RTL8139.SYS rtl8139
0e11 ae32 netflx3.sys netflx3
0e11 ae34 netflx3.sys netflx3
0e11 ae35 netflx3.sys netflx3
0e11 ae40 netflx3.sys netflx3
0e11 ae43 netflx3.sys netflx3
0e11 b011 netflx3.sys netflx3
0e11 b012 netflx3.sys netflx3
0e11 b030 netflx3.sys netflx3
0e11 f130 netflx3.sys netflx3
0e11 f150 netflx3.sys netflx3
100b 0020 FA312nd5.sys FA312
100b 0022 DP83820.sys dp83820
1011 0002 dc21x4.sys DC21x4
1011 0009 dc21x4.sys DC21x4
1011 000f DEFPA.sys DEFPA
1011 0014 dc21x4.sys DC21x4
1011 0019 dc21x4.sys DC21x4
1011 1065 b1cbase.sys b1cbase
1014 003e IBMTRP.SYS IBMTRP
1022 2000 pcntpci5.sys PCnet
1022 2001 pcntn5hl.sys PCnetHL
102f 0020 tbatm155.sys tbatm155
1039 0900 sisnic.sys SISNIC
1050 0840 W840ND.sys W840ND
1050 0940 w940nd.sys w89c940
107e 0008 ip5515.sys ip5515
108d 0001 mdgndis5.sys MadgeTRN
108d 0004 mdgndis5.sys MadgeTRN
108d 0005 mdgndis5.sys MadgeTRN
108d 0007 mdgndis5.sys MadgeTRN
108d 0008 mdgndis5.sys MadgeTRN
10b6 0002 mdgndis5.sys MadgeTRN
10b6 0003 cpqtrnd5.sys CPQTRND5
10b6 0006 mdgndis5.sys MadgeTRN
10b6 0007 mdgndis5.sys MadgeTRN
10b6 0009 mdgndis5.sys MadgeTRN
10b6 000a mdgndis5.sys MadgeTRN
10b6 000b mdgndis5.sys MadgeTRN
10b7 0001 el985n51.sys el985nd5
10b7 1f1f NetWlan5.sys NetWlan5
10b7 4500 el90xbc5.sys EL90XBC
10b7 5057 el575nd5.sys el575nd5
10b7 5157 el575nd5.sys el575nd5
10b7 5257 el575nd5.sys el575nd5
10b7 6055 EL556ND5.sys EL556ND5
10b7 6056 EL556ND5.sys EL556ND5
10b7 6560 el656nd5.sys el656nd5
10b7 6562 el656nd5.sys el656nd5
10b7 6564 el656cd5.sys el656cd5
10b7 7646 el90xbc5.sys EL90XBC
10b7 9000 el90xnd5.sys EL90X
10b7 9001 el90xnd5.sys EL90X
10b7 9004 el90xbc5.sys EL90XBC
10b7 9005 el90xbc5.sys EL90XBC
10b7 9006 el90xbc5.sys EL90XBC
10b7 900a el90xbc5.sys EL90XBC
10b7 9050 el90xnd5.sys EL90X
10b7 9051 el90xnd5.sys EL90X
10b7 9055 el90xbc5.sys EL90XBC
10b7 9058 el90xbc5.sys EL90XBC
10b7 905a el90xbc5.sys EL90XBC
10b7 9200 el90xbc5.sys EL90XBC
10b7 9800 el98xn5.sys EL98x
10b7 9805 el98xn5.sys EL98x
10b7 9902 EL99XN51.SYS EL99X
10b7 9903 EL99XN51.SYS EL99X
10b7 9904 EL99XN51.SYS EL99X
10b7 9908 EL99XN51.SYS EL99X
10b7 9909 EL99XN51.SYS EL99X
10b7 990a EL99XN51.SYS EL99X
10b8 0005 smcpwr2n.sys Smcpwr2n
10b8 0006 otc06x5.sys OtcethCB
10b9 5261 ALI5261.SYS ALI5261
10d9 0531 mxnic.sys mxnic
10ec 8029 RTL8029.SYS rtl8029
10ec 8139 RTL8139.SYS rtl8139
1106 3043 fetnd5.sys FETNDIS
1106 3065 fetnd5.sys FETNDIS
1113 1211 RTL8139.SYS rtl8139
1113 1216 AN983.sys AN983
1127 0300 PCA200E.sys PCA200E
1127 0400 FOREHE.sys FOREHE
1133 e001 Diwan.sys DiWan
1133 e002 Diwan.sys DiWan
1133 e003 Diwan.sys DiWan
1133 e004 Diwan.sys DiWan
1133 e005 Diwan.sys DiWan
1133 e00b Diwan.sys DiWan
1133 e00c Diwan.sys DiWan
1133 e010 diwan.sys Diwan
1133 e012 diwan.sys Diwan
1133 e014 diwan.sys Diwan
1133 e015 diwan.sys Diwan
1133 e019 diwan.sys Diwan
1148 4000 SkFpWin.SYS SkFpWin
1148 4300 sk98xwin.SYS sk98xwin
114f 001d DIGIDXB.SYS DIGIDXB
114f 0023 DIGIDXB.SYS DIGIDXB
114f 0024 DIGIDXB.SYS DIGIDXB
115d 0003 cben5.sys CBEN5
1186 1002 DLH5XND5.sys DLH5X
1186 1300 RTL8139.SYS rtl8139
11ad 0002 lne100tx.sys lne100tx
11ad c115 lne100.SYS pnicII
11f6 1401 w940nd.sys w89c940
11f6 2011 W840ND.sys W840ND
1244 0700 b1cbase.sys b1cbase
1244 0a00 fpcibase.sys fpcibase
1244 0e00 fpcibase.sys fpcibase
1244 1200 b1cbase.sys b1cbase
1266 1910 RTL8029.SYS rtl8029
126c 1f1f NetWlan5.sys NetWlan5
1282 9102 DM9PCI5.SYS DM9102
12ae 0001 el985n51.sys el985nd5
12ae 0002 el985n51.sys el985nd5
1317 1985 AN983.sys AN983
1317 9511 AN983.sys AN983
1317 9513 AN983.sys AN983
13d1 ab02 tdk100b.sys CB102
13d1 ab03 cb102.sys CB102
13f0 0201 DLH5XND5.sys DLH5X
14b9 0340 pcx500.sys PCX500
14b9 0350 pcx500.sys PCX500
14b9 4800 pcx500.sys PCX500
14e4 1644 b57xp64.sys b57nd
14e4 1645 b57xp64.sys b57nd
14e4 1647 b57xp64.sys b57nd
14e4 4401 bcm4sbxp.sys bcm4sbxp
14f1 1803 cnxt1803.sys cnxt1803
1516 0800 RTL8139.SYS rtl8139
1516 0803 RTL8139.SYS rtl8139
1516 0891 RTL8139.SYS rtl8139
1562 0001 NetWlan5.sys NetWlan5
4a14 5000 RTL8029.SYS rtl8029
5401 0101 NetWlan5.sys NetWlan5
8086 1000 n1000nt5.sys N1000
8086 1001 e1000645.sys E1000
8086 1004 n1000645.sys N1000
8086 1030 D100IB5.SYS D100IB
8086 1031 e100b325.sys E100B
8086 1032 e100b325.sys E100B
8086 1033 e100b325.sys E100B
8086 1034 e100b325.sys E100B
8086 1035 e100b325.sys E100B
8086 1036 e100b325.sys E100B
8086 1038 e100b325.sys E100B
8086 1042 NetWlan5.sys NetWlan5
8086 1229 e100b645.sys E100B
8086 2449 e100b325.sys E100B
8e2e 3000 w940nd.sys w89c940
9004 6915 adptsf50.sys ADPTSF
e159 0001 tjisdn.sys TJISDN
==========================我是分割线,不要复制我呀================================
这样,binl服务架设完毕。好了,差不多了,由于有些网卡驱动只能在对应系统中的I386文件夹中的"DRIVER.CAB"找到,把里面的文件解压缩到I386当前文件夹下吧,否则会提示找不到驱动的错误。我用虚拟机测试就有这样的错误:


记住,先考虑用对应I386中的drive.cab文件中的驱动,如果没有的话,再在其他I386中的drive.cab中找。

最后一步了:将tftp共享出去,先测试可不可以匿名访问,如果不可以的话,请设置好,最后的文件目录如图所示:

成功了!当然,你可以下载我做好的PXEwindows