看到很多贴子中提到,安装 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 的安装程序,就不会再有任何错误了。这在一些网友的相关解决方法中也有提及,在本文分析过原因之后,这样的做法也就顺理成章了。
我之前写过一篇关于这个问题产生根源的推断,是错误的。特此研究了磁盘结构,查了 Windows 启动过程的资料,得出如上分析和结论。希望能给大家个参考。谢谢