字体:  

通过PXE安装WINDOWS XP配置手记(Linux)

ELM 发表于: 2007-7-08 16:43 来源: 榆树社区

首先需要说明的是:这篇文章是事后写的,因为我在调试的时候没有习惯记录遇到的错误和解决的方法,这个时候正在努力的解决问题呢,也不知道是否能解决,所以没有办法记录,首先需要感谢的是伟大的Google,在我遇到困难的时候,我就求助与它,虽然内容不是它提供,但是它能让我在最快的时间内找到我所需要的答案,其次感谢我所参考的那些文章的作者,由于有些知识是以前积累的,具体参考谁的我也不记得了,呵呵,总之感谢他们的帮助。

这次参考的文章:
http://jnlin.org/2007/01/23/149/
http://oss.netfarm.it/guides/ris-linux.php
http://blog.yalin.tw/2007/06/pxe-in-freebsd-windows-xp.html

感谢作者给我这么大的帮助。

本文是在以上作者文章的指引下独立完成的,希望大家尊重本人的劳动成果,转载著名保留一下信息,谢谢

作者: 温占考 (Zhankao WEN)
出处: 榆树社区 http://www.wenzk.net http://wenzk.cublog.cn
时间: 2007/07/08 16:30


因为以前搞过通过PXE安装Linux和用PXE来启动Planetlab的机器,所以对于PXE并不是很陌生,一下简要介绍一下如何架设的,所有操作均在FC4下的,对于windows下的,我没有兴趣去弄。

安装tftp server:

CODE:

#yum install tftp-server tftp经过这个操作后,你的机器安装了tftp server和tftp clinet这么两个包,安装tftp clinet是为了更好的测试tftp server是否work,直接tftp localhost,可以免去防火墙配置错误导致tftp不正常工作。

tftpd的配置文件,由于Linux对大小写敏感,所以稍微修改了一下tftp的配置:

CODE:

service tftp
{
        disable = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -m /tftpboot/rules -s /tftpboot
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
增加了/tftpboot/rules文件,这个文件主要作用是,把请求tftp的所有路径和文件名改成小写。这个文件的内容为:

CODE:

#cat /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
这个文件大概能看懂,从前人文章中拔出来的,嘿嘿。

呵呵,tftpd就搞定了,重新启动xinetd就OK了,reload也可以的,看自己习惯了。

下面配置DHCPD,增加配置:

CODE:

allow booting;
allow bootp;

next-server 192.168.1.222;
filename "pxelinux.0";
一般说来增加这么几句就OK了,next-server后面的ip改成你实际的TFTP server的IP或者域名,filename后面是pxelinux.0文件,在syslinux软件包中可以找到,具体可以上http://syslinux.zytor.com/找寻更多的信息。

创建必要的文件:
把 pxelinux.0 rules 复制到 /tftpboot目录下,创建/tftpboot/pxelinux.cfg目录,在该目录下创建:
default文件,内容为视情况修改:

CODE:

DEFAULT HD0
PROMPT 1
TIMEOUT 300
#ONTIMEOUT BOOT_PXE

LABEL winpe
MENU LABEL ^1----Boot for WinPE tools
kernel winpe.0

LABEL wxp
MENU LABEL ^1----Boot for Install WindowsXP
kernel winxp.0

LABEL dos
MENU LABEL ^2----Boot for Dos Tools
kernel memdisk
append initrd=dos/dostools.img

LABEL ghost
MENU LABEL ^3----Boot for Ghost 8.3
kernel memdisk
append initrd=dos/ghost83.img

LABEL pqmagic
MENU LABEL ^4----Boot for PQMagic 8.05
kernel memdisk
append initrd=dos/pm805.img

LABEL HD0
MENU LABEL ^0----Boot from the first HD
kernel chain.c32
append hd0

# eof: pxelinux.cfg/default
记得把dhcpd重新启动一下。

到这里,PXE启动倒是没有什么问题了,只是启动WinXP的一些准备工作还没有做。

把WinXP光盘上的i386目录复制到/tftpboot/winxp目录下,参考http://blog.yalin.tw/2007/06/pxe-in-freebsd-windows-xp.html文章把一个正在运行的WinXP SP2下的WINDOWS\inf目录复制到/tftpboot/winxp/i386目录下,具体干什么,有什么用我也不了解,等下似乎要用到。

进入/tftpboot/winxp/i386目录,解开driver.cab文件。

CODE:

#cabextract driver.cab一开始我没有做这步操作,安装过程中提示:找不到pcntpci5.sys文件,因为我用的是虚拟机,这个就是虚拟机网卡的驱动,看tftp请求的是:
15:25:55.474381 IP 192.168.1.117.55711 > 192.168.1.222.tftp:  54 RRQ "\winxp\i386\pcntpci5.sy_" octet blksize 1432 tsize 0
15:25:55.480476 IP 192.168.1.117.55712 > 192.168.1.222.tftp:  54 RRQ "\winxp\i386\pcntpci5.sys" octet blksize 1432 tsize 0

既然要的是这个文件,索性就把driver.cab文件直接解开到i386目录。

由于我这里是在Linux下,TFTPD对大小写很敏感,刚才的rules也把所有对文件和目录的请求都改成了小写,所以这里也要把所有文件名都改成小写的。

先进入/tftpboot/winxp目录,执行:

CODE:

find ./ -depth | perl -ne 'chomp;m</[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "echo",$d.$f,$d.$_ if $f ne $_'如果有显示,表明有这些明中是有大写字母的,然后运行:

CODE:

find ./ -depth | perl -ne 'chomp;m</[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "mv",$d.$f,$d.$_ if $f ne $_'OK,这下就把所有文件都改成小写了。

下面的操作参考http://oss.netfarm.it/guides/ris-linux.php而来:
提取XP PXE启动所需要的文件并适当的修改以适应能安装多个操作系统。

Setting up a Windows XP Source:

QUOTE:

- Copy i386 directory from the installation media to a subdir called winxp
  in the ris working directory

- Extract the pxe loader:
  cabextract <Source dir>/i386/STARTROM.N1_

- Modify the name of the loader from NTLDR to XPLDR:
  sed -i -e 's/NTLDR/XPLDR/gi' startrom.n12

- Move the modified pxe loader to tftpd root, and call it winxp.0

- Extract the setuploader, using cabextract:
  cabextract <Source dir>/i386/SETUPLDR.EX_

- Modify the name of the response file from winnt.sif to winxp.sif
  sed -i -e 's/winnt\.sif/winxp\.sif/gi' setupldr.exe

- Modify the name of ntdetect from ntdetect.com to ntdetect.wxp
  sed -i -e 's/ntdetect\.com/ntdetect\.wxp/gi' setupldr.exe

- Move the modified setuploader to tftpd root, and call it XPLDR

- Copy <Source dir>/i386/NTDETECT.COM to tftpd root
  and call it ntdetect.wxp
Create a response file called winxp.sif as follows:

CODE:

[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\YOUR_SERVER_NAME\YOUR_SHARE_NAME\winxp\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1

[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\YOUR_SERVER_NAME\YOUR_SERVER_SHARE\winxp"

[UserData]
ComputerName = *
; if needed
;ProductID=
上面文件的YOUR_SERVER_NAME改成你的samba的机器的IP或者机器名,YOUR_SERVER_SHARE改成你的tftpboot的共享名。

samba的配置(视情况而修改):

CODE:

[reminst]
path = /tftpboot
browsable = true
read only = yes
writable = no
guest ok = yes
samba的其他部分配置可以参考samba的配置。配置完毕后重新启动samba。

接下来就是搞定Binl Server了,具体干吗的我也不知道,安装的时候似乎要用到。

CODE:

wget [url]http://oss.netfarm.it/guides/ris-linux-0.2.tar.gz[/url]
tar zxf [url]http://oss.netfarm.it/guides/ris-linux-0.2.tar.gz[/url]
cd ris-linux-0.2

Run infparser.py
./infparser.py /where/is/winxp/i386/inf

Run ./binlsrv.py
注意不要关闭binlsrv.py这个进程。

配置到这里几乎全部工作都完成了,应该可以通过PXE安装WinXP了。

其他情况具体问题具体分析,随机应变。

最新回复

ELM at 2007-7-08 16:45:20
安装过程中binlsrv.py的输出:

Recv NCQ len = 48
NCQ Driver request
[R] Mac address 00:0c:29:91:aa:72
[R] Vid: 0x1022
[R] Pid: 0x2000
[R] rev_u1 = 0x2
[R] rev_u2 = 0x0
[R] rev_u3 = 0x0
[R] rev    = 0x10
[R] rev2   = 0x88
[R] subsys = 0x20001022
[R] Source path: \\192.168.1.222\reminst\winxp
Checking PCI\VEN_1022&DEV_2000&SUBSYS_20001022
Checking PCI\VEN_1022&DEV_2000
Found PCI\VEN_1022&DEV_2000 in netamd2.inf
[S] Packet len = 0xc5 (197)
[S] Result code: 0x0
[S] type: 0x2
[S] base offset = 0x24 (36)
[S] drv_off = 0x50 (80)
[S] srv_off: 0x6a (106) -> 98 from start
[S] plen: 0x57 (87)
[S] p_off: 0x76 (118) -> 110 from start
[S] hid: PCI\VEN_1022&DEV_2000 - Len 0x15 (21)
[S] drv: pcntpci5.sys - Len 0xc (12)
[S] srv: PCnet - Len 0x5 (5)
[S] Description (REG_EXPAND_SZ [2]) = AMD PCNET Family PCI Ethernet Adapter
[S] Characteristics (REG_SZ [1]) = 132
[S] BusType (REG_SZ [1]) = 5
[S] Total Params: 3
ELM at 2007-7-08 16:51:13
PXE启动,找寻配置文件:


PXE boot.JPG



PXE菜单,按照这个文件下来的看不到这个菜单


PXE Menu.JPG



安装过程截图:


setup_1.JPG




setup_2.JPG




setup_3.JPG




setup_4.JPG

ELM at 2007-7-08 18:08:35
LABEL winpe
MENU LABEL ^1----Boot for WinPE tools
#MENU MASTER PASSWD $4$XOCQYz6h$mhJRnadW8cGyZWwarI4ngh7pBtU$
#MENU PASSWD $4$XOCQYz6h$mhJRnadW8cGyZWwarI4ngh7pBtU$
kernel winpe.0

生成密钥串的脚本

CODE:

#!/usr/bin/perl

use bytes;
use Digest::SHA1;
use MIME::Base64;

sub random_bytes($) {
    my($n) = @_;
    my($v, $i);

    if ( open(RANDOM, '<', '/dev/random') ||
         open(RANDOM, '<', '/dev/urandom') ) {
        read(RANDOM, $v, $n);
    } else {
        # No real RNG available...
        srand($$ ^ time);
        $v = '';
        for ( $i = 0 ; $i < $n ; $i++ ) {
            $v .= ord(int(rand() * 256));
        }
    }

    return $v;
}


($pass, $salt) = @ARGV;

unless (defined($salt)) {
    $salt = MIME::Base64::encode(random_bytes(6), '');
}
$pass = Digest::SHA1::sha1_base64($salt, $pass);

print '$4$', $salt, '$', $pass, "\$\n";
ELM at 2007-7-09 00:08:08
手工下载符合操作系统版本的驱动,解开后把inf文件放到i386/inf目录下
把驱动所需要的sys文件放到i36目录下。

重新运行
./infparser.py /where/is/winxp/i386/inf
重新启动
./binlsrv.py
即可。
ELM at 2007-7-09 00:28:42
复制inf目录和解开driver.cab文件的作用主要就是让系统能通过Binl Server查找到当前的网卡的驱动

所以可以直接把WINPE里面的网卡驱动包解开,把inf文件放到i386/inf目录,sys文件放到i386/目录下即可。
ELM at 2007-7-09 18:25:33

CODE:

#cat /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
我想飞飞 at 2007-7-16 14:23:39
我的是suse的系统,大概按照你的上面的步骤进行配置的,不过在刚开机,键入“wxp”后,出现一片灰色的屏幕,左上角有光标在闪烁,然后就没动静了。请问该怎么办?

[ 本帖最后由 我想飞飞 于  13:08 编辑 ]
ELM at 2007-7-18 16:48:22
你可以在server端使用tcpdump,或者把tftpd的debug信息打开,看下载到哪个文件出错的,然后一步一步排查

有可能是否写文件没有找到
我想飞飞 at 2007-7-19 09:20:55
不好意思,我的问题现在又变了,呵呵。在开机键入“wxp”选择安装winxp后,出现tftp failed。

netdetect.wxp,winnt.sif,ntldr,xpldr,winxp.sif,winxp.0,rules都有了。请问是什么问题呢?

另外,我一直没搞清tftp和tftp-hpa是什么关系,为什么这里要用tftp-hpa而不直接用tftp呢?我怎么才能知道我是不是已经安装了tftp-hpa?

我的tftp配置文件如下:

service tftp
{
        socket_type     = dgram
        protocol        = udp
        wait            = yes
        user            = root
        server          = /usr/sbin/in.tftpd
        server_args     = -m /tftpboot/rules -s /tftpboot/
        disable         = no
}
ELM at 2007-7-23 10:11:55
我用的这个是Fedora自带的tftpserver,用其他的tftp server我就不敢确定rules是否一样,如果不一样那自然不能正常工作了,看看如何把tftp-hpa的debug信息打开,看看client要去取什么文件
我想飞飞 at 2007-8-03 11:17:03
换了一台主机,用了linux的fedora版本,上面的tftp failed问题没有了

目前正在复制文件夹,是不是因为远程安装的缘故,所以复制文件到WINDOWS文件夹时速度特别慢。要复制一两个小时。

[ 本帖最后由 我想飞飞 于 2007/8/3 16:46 编辑 ]
ELM at 2007-8-05 12:23:23
呵呵,可能吧
不过我这边感觉速度还行哦,检查检查其他方面的问题
我想飞飞 at 2007-8-09 08:42:04
用交叉线将主机和客户机直接相连,速度就快很多了,呵呵,传送文件大概几分钟就搞定。
另外,有两个疑问,看看您能否解答:

一。复制完文件到客户机WINDOWS文件夹后,要从硬盘启动安装,但是一启动,就在黑屏上出现如下字样:

因以下文件的损坏或丢失,windows无法启动:
System32/drivers/ntfs.sys
您可以通过使用原始启动软盘或CD-ROM来启动windows安装程序,以便修复这个文件。
在第一屏时选择“r”,开始修复。

我照做了进行修复,但是不行。后来在晚上找到如下资料,照做了,就ok了:

症状
启动运行 Windows XP Service Pack 2 (SP2) 的计算机时,可能会收到以下错误信息:

Windows could not start because the following file is missing:
\system32\drivers\ntfs.sys
回到顶端
原因
如果执行了以下步骤,则可能会出现此问题:
1.        安装了 Windows XP Service Pack 2 (SP2)。
2.        安装了以下文章描述的 Windows XP SP1 累积更新:
826939 Update Rollup 1 for Windows XP 现已发布

3.        安装 826939 累积更新之后,启用了超线程,或在计算机中添加了第二个处理器。
出现此问题是因为 Windows XP 的 826939 累积更新 1 是在 Windows XP SP2 之前发布的。不应在安装 Windows XP SP2 之后安装此累积更新。

解决方案
要解决此问题,请按照下列步骤操作:
1.        将 Windows XP 启动盘插入软盘驱动器,或将 Windows XP 光盘插入 CD 驱动器,然后重新启动计算机。
2.        在出现提示后,单击以选中从 CD 驱动器启动计算机所需的所有选项。
3.        出现“欢迎使用安装程序”屏幕时,按 R 键启动故障恢复控制台。
4.        如果您使用的是双启动或多启动计算机,请从故障恢复控制台中选择要访问的安装。
5.        在出现提示时,键入管理员密码。如果管理员密码为空,则按 Enter 键。
6.        在故障恢复控制台的命令提示符处,键入下列命令行。在每行之后按 Enter 键。
cd system32
ren ntkrnlpa.exe ntkrnlpa.old
ren ntoskrnl.exe ntoskrnl.old
cd "c:\windows\driver cache\i386"
expand sp2.cab -F:ntkrpamp.exe c:\windows\system32
expand sp2.cab -F:ntkrnlmp.exe c:\windows\system32
cd c:\windows\system32
ren ntkrpamp.exe ntkrnlpa.exe
ren ntkrnlmp.exe ntoskrnl.exe
7.        键入 exit 退出故障恢复控制台。计算机将重新启动。
但是上述问题,在我从光驱安装xp时并没有出现,是一样的安装盘。


二。 在从硬盘启动开始安装xp的过程中,执行到34分钟“正在安装设备”的时候死机,进度条停在大约3/4的位置,硬盘灯也不亮了。不知道为什么。按照网上的说法,硬盘上该拔的插件都拔掉了,USB的设备也没有,还是不行。应该可以排除硬件问题,因为我从光驱安装一点问题都没有,一切正常。

对于需要的源文件,应该就是安装盘上的i386文件夹和正在运行的xp sp2下的inf文件夹吧。我怕缺少了什么导致这些原因。
请教。盼解答。谢谢:)

[ 本帖最后由 我想飞飞 于 2007/8/9 09:55 编辑 ]
我想飞飞 at 2007-8-09 14:03:51
上面的两个问题已解决,在i386里面,将sp1.cab和sp2.cab都cabextract后就不会出现那两个问题了。呵呵。
ELM at 2007-8-12 15:42:08
多谢兄弟补充:)
我想飞飞 at 2007-8-13 08:47:39
哈。是mm拉
我想飞飞 at 2007-8-22 16:55:34
又来打扰。因为要将安装步骤写成shell脚本,我又实验了一次安装,结果出现问题:

在客户端启动选择安装xp以后,有setup is inspecting your computer hardware字样,接着就出现:

INF file txtsetup.sif is corrupt or missing, status 21. Setup cannot
continue. Press any key to exit.

有资料说是应答文件winxp.sif中的路径设置有问题,我的winxp.sif文件如下:
[data]
floppyless = "1"
msdosinitiated = "1"
; Needed for second stage
OriSrc = "\\localhost.localdomain\reminst\winxp\i386"
OriTyp = "4"
LocalSourceOnCD = 1
DisableAdminAccountOnDomainJoin = 1

[SetupData]
OsLoadOptions = "/fastdetect"
; Needed for first stage
SetupSourceDevice = "\Device\LanmanRedirector\localhost.localdomain\reminst\winxp"

[UserData]
ComputerName = *
ProductID=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

上次安装也出现这样的问题,本来server-name那里我输入的是ip地址,出现上述问题,我换成主机名以后就ok了。但是这次换成主机名也还是不行。

请问你安装的时候出现过这种问题么?我该怎么办呢?谢谢。
ELM at 2007-8-24 12:57:03
我这里是直接用IP地址的,你用localhost.loaldomain就不对了吧

在win下似乎没有这么写的,再说安装机器本身也没有开samba服务呀
我想飞飞 at 2007-8-27 15:07:00
按照3楼你贴的那些图,我的到这个图的时候一直停在那,没有动静了:



[ 本帖最后由 我想飞飞 于 2007/8/27 15:08 编辑 ]
ELM at 2007-8-27 15:22:00
我觉得还是你的samba的问题

我经过抓包分析发现,到这个步骤的时候开始不使用tftp服务了,使用samba服务来获取文件了

所以检查你的samba的配置以及日志,看是否有问题