摘要:在Windows Server 2003启动过程中,会出现各种各样的问题,本文介绍了操作系统启动过程的几个阶段,收集了一些经常出现的错误,并结合 Windows 操作系统启动过程,针对这些错误提出了解决方法。

当诊断一个系统启动错误时,判断系统是在哪一阶段出现错误非常关键,系统启动过程根据 CPU 架构不同略微有些差异,下面我们简单介绍一下 x86-based 系统启动过程的几个阶段:

1. Pre-Boot Sequence
2. Boot Sequence
3. Kernel Load Sequence
4. Kernel Initialization Sequence
5. Logon Sequence
6. Plug and Play detection

阶段 1: Pre-Boot Sequence
在计算机加电后开始准备启动操作系统之前,有一个 Pre-Boot Sequence 的过程,主要是计算机的 BIOS 中配置的设备引导顺序寻找启动设备,Pre-Boot Sequence 可以分下以下步骤:
(1)系统加电自检:主要监测主板、CPU,内存及其他计算机所使用的硬件设备的信息;
(2)找到合适的启动设备并加载MBR,MBR中有分区表和主引导代码,通过主引导代码定位到活动分区;
(3)通过 MBR 找到活动分区后,从活动分区中加载 BOOT SECTOR 到内存并执行其中的代码;
(4)通过 BOOT SECTOR  找到 NTLDR 文件,加载 NTLDR 到内存中并执行;

可能出现的问题及解决方法:

(1)MBR 损坏
现象 - 分区表不正确

现象 - 主引导代码损坏


现象 - NTDETECT.COM 搜集硬件信息失败

原因:

由于病毒或者其他人为的误编辑导致引导硬盘的 MBR 损害;

解决方法:

利用Windows PE系统引导计算机后,使用 WinHex 工具对引导磁盘的 MBR 进行修复操作; 

(2)硬件配置不正确
现象:主板报错;
原因:关键的硬件损害或者配置不正确,如内存条损坏;
解决方法:要通过进一步硬件故障检测,针对不同硬件故障做不同处理;

(3)找不到活动分区
现象:按照设备启动顺序遍历后,最后停在如下界面:

原因:可能是通过 fdisk 工具编辑磁盘分区表后没有指定活动分区;
解决方法:利用Windows PE系统引导计算机后,使用 WinHex 工具对引导磁盘的 MBR 的分区表进行编辑,指定正确的分区表条目的属性为活动分区,然后重新引导操作系统;

(4)NTLDR 文件缺失或损坏

现象:如下图所示,输出错误信息“NTLDR is missing”;

 

原因:NTLDR 文件被病毒删除或损害,或者文件系统损坏,导致了 NTLDR 文件的损坏;
解决方法:可以通过系统恢复或者 Windows Server 2003 引导盘 NTLDR 文件;

(2)BIOS 配置不正确
现象:

原因:
解决方法:根据实际情况调整 BIOS 配置;

阶段 2: Boot Sequence

当 Pre-Boot Sequence 的阶段完成后,开始进入 Boot Sequence 阶段。可以分下以下步骤:
(1)NTLDR 将 CPU 工作模式从 Real-Mode 切换至 Protected-Mode,然后启动文件系统驱动用于 支持计算机上的文件系统;
(2)NTLDR 读取 BOOT.INI 文件内容,用于创建初始化引导选项,如果选择的是 Windows Server 2003, Windows NT 之外的操作系统,BOOTSECT.DOS 文件被读入内存,用于加载其他的操作系统,Windows Server 2003 引导过程中断;
(3)当系统初始化引导选项被选中后,根据该引导项对应的磁盘号和分区号定位启动卷;
(4)从启动卷中找到 NTDETECT.COM 文件,NTDETECT.COM 检测系统基本的硬件配置信息并且把配置信息写入注册表中的 HKEY_LOCAL_MACHINE 键,NTDETECT.COM 识别的硬件包括并不仅限于 串口、并口、键盘、鼠标、软盘、SCSI 适配器 和 显卡;
(5)将控制权交给 NTOSKRNL.EXE,进入下一阶段;

可能出现的问题及解决方法:

(1)启动文件缺失或损坏
现象:
原因:NTLDR,BOOT.INI,BOOTSECT.DOC,NTDETECT.COM 或 NTOSKRNL.EXE中的一个缺失或损坏,导致操作系统无法正常启动,一般情况下,通过错误信息能准确的判断是那个文件缺失或损坏;
解决方法:可以通过系统恢复自动修复;

(2)BOOT.INI 配置不正确
现象:

原因:人为误编辑 BOOT.INI 文件或者修改了磁盘配置;
解决方法:利用Windows PE系统引导计算机后,检查 BOOT.INI 文件内容,并根据实际情况重新配置;

(3)硬件无法识别或者配置不正确
现象:界面错误信息指向 NTDETECT.COM
原因:
解决方法:需要进一步排查具体原因,可以通过逐个移除新加硬件和相应驱动程序来定位;

关于此阶段中一些重要的启动文件说明:

BOOT.INI 
用于在系统启动过程中创建系统选择菜单,每个系统项在文件中都有对应的条目与之对应,记录了该系统的启动分区。BOOT.INI 文件一般为位于根目录,具有系统属性和隐藏属性。
BOOTSECT.DOS
一个选项配置文件,在部署了多操作系统的环境中,如果选择引导的是 Windows Server 2003, Windows NT 之外的操作系统,这个文件会被加载。BOOTSECT.DOS 文件位于根目录下,具有系统属性和隐藏属性。
NTDETECT.COM
用于检测操作系统已经安装的硬件设备,并且将这些硬件设备的信息添加到注册表。NTDETECT.COM 文件位于系统分区的根目录下,具有系统属性、隐藏属性和只读属性。
NTOSKRNL.EXE
用于加载 Windows Server 2003 操作系统,NTOSKRNL.EXE 文件位于 %windir%/system32。

阶段 3: Kernel Load Sequence

当 Boot Sequence 的阶段完成后,NTDETECT.COM 搜集的所有信息都传递给了 NTOSKRNL.EXE,Kernel Load Sequence 可以分下以下步骤:
(1)NTOSKRNL.EXE 加载并初始化;
(2)初始化执行子系统,启动类型为 System-Start 的设备驱动程序;
备注:这里说的执行子系统,是指 Process And Thread Manager、Virtual Memory Manager、I/O Manager、Object Manager、Runtime Libraries 以及其他需要工作在内核态的服务。
(3)为运行原生应用程序准备系统环境;
备注:这里说的原生应用程序,需要解释一下,Windows 操作系统提供两种类型的 API,一种是我们通常所说的 Windows API,所有的 Windows 程序都需要依赖 Windows API,另一种是 Native API,一些 Windows 组件如内核驱动程序 和 系统进程(如csrss.exe)依赖 Native API 。
(4)运行 SMSS.EXE

关于此阶段中一些重要的启动文件说明:
NTOSKRNL.EXE 在这一阶段的作用非常关键,它主要用于完成以下功能:
(1)加载 HAL.DLL (Hardware Abstraction Layer,是一个 Kernel-Mode 库),用于提供低级别的硬件交互接口,Windows 组件和第三方的设备驱动程序依赖 HAL 与底层硬件设备通信;
(2)加载操作系统Control Set,Control Set 用于控制系统配置信息(如列出需要被加载的设备驱动程序);
(3)加载低级别的设备驱动程序(如磁盘驱动程序 disk.sys);

可能出现的问题及解决方法:
现象:

原因:硬件设备驱动程序不匹配,或者安装了有 BUG 的安全、加密、过滤、第三方磁盘管理软件、存储管理软件;
解决方法:知道是做了什么变更后出现的就比较好解决,回退操作,也可以借组于系统的 “最后一次正确配置”的高级选项;

阶段 4: Kernel Initialization Sequence
Kernel Initialization Sequence 主要创建 HKEY_LOCAL_MACHINE/HARDWARE 注册表项,运行高优先级的子系统和服务,可以分下以下步骤:
(1)一旦 Kernel 成功加载后,会创建 HKEY_LOCAL_MACHINE/HARDWARE 注册表项,这个注册表项用于指定系统启动时的硬件设备的配置信息;
(2)初始化随 Kernel 加载的设备驱动程序;
(3)运行高优先级的子系统和服务;
备注:高优先级的子系统包括并不仅限于 POSIX Subsystem,OS/2 Subsystem。

可能出现的问题解决方法:知道是做了什么变更后出现的就比较好解决,回退操作,也可以借组于系统的 “最后一次正确配置”的高级选项;

阶段 5: Logon Sequence
smss.exe(Session Manager System)是 Logon Sequence 中的一个非常关键的角色,可以分下以下步骤:
(1)创建系统环境变量;
(2)启动 Win32 Subsystem 的 Kernel-Mode 部分(win32k.sys)和 User-Mode 部分(csrss.exe);
(3)启动在注册表项 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/SubSystems 中列出的子系统;
(4)smss.exe 运行 winlogon.exe(Windows Logon Manager);
备注:附上对 winlogon.exe 程序功能的说明:
winlogon.exe is a system service that enables logging on and off of users. It is also responsible for loading user profile.
It invokes GINA( Graphical Identification and Authentication) which displays login prompt. The GINA accepts the user login credentials and passes it back to Winlogon.
Winlogon then Starts Lsass.exe (the Local Security Authority) and passes login credentials to LSA. LSA determine which user account databases is to be used for authentication eg: Local SAM or Active Directory in case you are in a windows domain.
(5)用户权限验证通过后, smss.exe 运行 Service.exe(Services Subsystem,SCM);
(6)Service.exe 遍历 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services,启动类型为“自动运行”的服务。

可能出现的问题及解决方法:
(1)登陆失败
现象:
原因:用户权限信息验证不通过;
解决方法:尝试找回权限信息,注意是否是域控导致,终极解决方案就是利用 PE 进入系统后用工具重置密码;

(2)服务启动失败
现象:
原因:原因太多,不一一枚举,cmd 输入 eventvwr.msc 打开 System Log 查看具体详情;
解决方法:根据  System Log 记录对症下药;

阶段 6: Plug and Play Device Detection
Plug And Play Device Detection 是一个系统自动检测新增 PnP 设备并为 PnP 设备自动查找驱动程序尝试使之能够正常功能的过程,可以分下以下步骤:
(1)检测启动过程中新增的设备,自动为设备分配系统资源;
(2)如果设备是 PnP 并且可以从对应的 Driver.cab 文件中找到对应的驱动程序,则提取驱动程序并自动安装;

可能出现的问题及解决方法:
PnP 设备无法正常工作
现象:
原因:驱动程序不匹配;
解决方法:找到匹配的驱动程序并安装;