Skip to content

Categories:

在没有光驱软驱的笔记本上安装windows2000/xp的问题.

前天down到IBM OEM XP SP2的iso,想看看这个版本在我的机器上跑起来能不能正常update,二来试一下如何在没有光驱软驱的情况下安装win2k/xp到一个全新的硬盘.
昨天把硬盘放在USB盒里面挂到台式机上分区格式化拷贝安装文件,然后找了个DOS的img文件,用vmware传了个dos引导文件过去,然后卸下硬盘装到小黑里面,进入dos正常拷贝文件开始安装,在第一次reboot后出现"NTLDR is missing pls press any key to restart".以为是ntloader的几个文件可能有问题,又放到USB盒里挂在台式机上检查,看起来似乎一切正常.
没有办法了,上网搜索,找到的都是说可能是启动文件有问题,和我这个情况不太一样.最后在nb网看到可能的原因,原文是这么说的:

看到很多贴子中提到,安装Windows2000出现NTLDR is missing错误。
出现这个错误有各种各样的情况,但共性就是这些硬盘普遍都是在作为台式机外接硬盘时分区及格式化的。
我装各种系统都是选用启动盘+本机分区的方法,在DOS下,Windows各版本下升级或者全新安装NT/2000/XP次数很多,从未出现过ntldr丢失的问题。

因此,ntldr丢失,以及其他安装2000过程中产生的问题,与外接硬盘的分区过程有关。而且,这个问题有时出现,有时不出现。听起来令人费解。

为此我查了硬盘分区的有关资料和Windows出错信息的资料。找到了这个问题。这个问题不在于主硬盘引导记录,也不在于分区表。在硬盘的每个逻辑分区的0磁道内,有一个BPB块(BIOS Parameter Block “BIOS参数块”)。这个BPB块描述逻辑盘结构组成,包含隐藏扇区数目(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录表项最大值等。但是,在不同的机器和运行环境中,尤其是在外挂硬盘的情况下,是不一样的。下面就是FAT32 BPB的结构:

A_BF_BPB STRUC
A_BF_BPB_BytesPerSector DW ?
A_BF_BPB_SectorsPerCluster DB ?
A_BF_BPB_ReservedSectors DW ?
A_BF_BPB_NumberOfFATs DB ?
A_BF_BPB_RootEntries DW ?
A_BF_BPB_TotalSectors DW ?
A_BF_BPB_MediaDescriptor DB ?
A_BF_BPB_SectorsPerFAT DW ?
A_BF_BPB_SectorsPerTrack DW ?
A_BF_BPB_Heads DW ?
A_BF_BPB_HiddenSectors DW ?
A_BF_BPB_HiddenSectorsHigh DW ?
A_BF_BPB_BigTotalSectors DW ?
A_BF_BPB_BigTotalSectorsHigh DW ?
A_BF_BPB_BigSectorsPerFat DW ?
A_BF_BPB_BigSectorsPerFatHi DW ?
A_BF_BPB_ExtFlags DW ?
A_BF_BPB_FS_Version DW ?
A_BF_BPB_RootDirStrtClus DW ?
A_BF_BPB_RootDirStrtClusHi DW ?
A_BF_BPB_FSInfoSec DW ?
A_BF_BPB_BkUpBootSec DW ?
A_BF_BPB_Reserved DW 6 DUP (?)
A_BF_BPB ENDS

其中加黑的行就是我分析可能产生问题的项。前四个值在某些异源性安装条件下,会不准确。最后这个Flags标志项含有多个唯一性的标志,如起始簇号(A_BF_BPB_RootDirStrtClus)等;在不同的环境中,系统会写入不相同值。当改变环境后,这些项与物理磁盘实际的值不匹配时,Windows 2000 和 XP 就会产生错误,无法加载该FAT32分区,因为BPB信息不准确,从而最终报告 NTLDR is missing。实际上是因为这个值的不匹配,影响了下一步NTLDR的加载。

有趣的是,来回挪动Windows95/98/me从来不会出现这个问题,因为Win95/98/me忽略了对这个结构中某些值的检查,即便是无效的也仍然会继续启动程序。所以这个BPB值的错误问题,根据微软描述,只存在于用FAT32分区,使用int13h扩展启动方式(目前绝大多数硬盘都是此类)安装Windows2000/xp的情况下。同理,根据微软的问题报告,当用异源的Windows98/me克隆(如不同磁盘ghost恢复来的win98)升级Win2k/xp的时候,也会遇到同样的 ntldr is missing 问题。产生这个问题的原因是BPB的HEADS字段,错误的磁头数导致WINDOWS NT不能继续启动过程,而Win95/98/me同样忽略这个检查。

说了这么多大家应该明白问题的根源了。在不同的运行环境下(尤其是不同型号的硬盘控制器,反映出来就是不同型号或者品牌的电脑),起始簇的物理位置,标号不同,或者物理磁盘统计信息的不同,就造成了硬盘BPB信息在不同电脑上的不准确,从而导致了Windows 2000/XP 启动过程失败,NTLDR is missing。

这里也提供几个解决办法:

1。首先考虑要在本机上进行分区。只有这样才能写入正确的和匹配的BPB值,不会使得Windows NT Loader 无法定位。在其他机器,尤其是其他型号硬盘控制器下接驳分区,大多数情况下,会导致写入不同的BPB值。

2。应急情况下(安装/运行过程中出现 NTLDR is missing),可以考虑用一张含有sys.com文件的磁盘或U盘启动机器,然后输入 sys c: 传递系统。注意,如我在前文所说,format c: /s 并不引起BPB信息的重写,因此是无效的。sys命令在传递系统的同时,会引起写入新BPB值的操作。当然此时,NTLDR也被覆盖了,系统变成了Windows 98/me。用sys执行过后(也就是bpb更新后),再运行 win2k/xp的安装程序,就不会再有任何错误了。这在一些网友的相关解决方法中也有提及,在本文分析过原因之后,这样的做法也就顺理成章了。

作者提出的办法对我不太适用,因为我根本没有软驱可用,下面是我的解决办法:
1.在台式机上分区格式化拷贝安装文件
2.传dos引导到移动硬盘.(我用的是98下系统制作的那个启动软盘的image文件)同时复制启动软盘上所有文件到移动硬盘的启动分区.
3.修改硬盘上的setramd.bat,其中有一行:a:findramd修改为:c:findramd,因为我们现在是从硬盘C引导了.
4.安装硬盘到NB,启动.
5.启动完成后,会虚拟出一个ram disk,假设是E,转到E判运行:SYS C:
6.运行SMARTDRV
7.进入I386运行WINNT开始安装

Posted in 技术.


0 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.



Some HTML is OK

or, reply to this post via trackback.