win2003与win2008启动原理及双启动的原理
最近经常有学生询问Win2008的启动相关问题以及早期Windows版本与vista或win2008并存时的启动问题,现在可以说正是处于操作系统新旧版本的过滤时期,这类问题会在一定时间内越来越多,所以本人就写了这篇文章来谈论一下新版操作系统的启动原理以及如何解决新旧两种操作系统并存时的故障。
我们还是先来看一下WinXP/2003的启动过程,这个启动过程其实还是挺复杂的,我在此画了一个草图:
当然这个图并没有把整个启动过程中所涉及到的细节都描述出来,但主要部分已经有了,我们在此不进行详细描述,例如:系统自检成功后读取MBR中的前446个字节的引导信息等,这些不是咱们今天讨论的重点,我们只说说较为重要的几点:
其中最为重要一步就是NTLDR:这个程序位于C盘根目录下如图所示:
NTLDR:全称为NTOS Loader,操作系统加载程序。它的主要作用是解析Boot.ini文件,通过读取Boot.ini文件,使系统在启动过程中出现选择菜单,由用户选择希望启动的操作系统。除了NTLDR我们可以看到在C盘根目录下还有一个boot.ini文件,这个文件在xp/2003中也是相当有分量的一个家伙!
BOOT.INI:简称为启动菜单文件,这个文件中存放了我们当前机器中操作的配置信息,安装了几个操作系统?分别位于哪个分区?给用户的选择提示是什么?默认选择时间是多长?等等。
NTLDR除了读取BOOT.INI文件中的启动配置信息之外还会加载并执行C盘根目录下的NTDETECT.COM文件,收集系统的硬件信息,NTDETECT.COM文件会调用BIOS中的内容来得到基本的硬件信息返回NTLDR以供操作系统使用,并将此信息保存到注册表中。
如果上述操作没有问题就会再现我们比较熟悉的进度条了!
然后就是加载Windows的内核文件:NTOS,全称为:NTOSKRNL.EXE文件以及它所依赖的模板文件,如图所示:
再往下就会将程序的执行权交给NTOSKRNL.EXE,下面的工作就由NTOSKRNL.EXE负责了!NTOSKRNL.EXE程序会通过调用一系统的函数,这也是整个启动过程中最复杂的地方,也是最容易出现问题的地方,如果这一部分没有问题,那么就会生成系统的第一个进程:SMSS
SMSS:会话管理子系统 Session Manager SubSystem 这是第一个用户态的进程。会执行一些注册表中某些表键中所定义的操作:如bootexecute、pendingfilerenameoperations、paging file等创建会创建出 CSRSS系统服务器进程和Winlogon登录进程。
CSRSS:Client/Server Runtime Server Subsystem作用:客户端服务子系统,用以控制Windows图形相关子系统,是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss用于维持Windows的控制。
Winlogon:Windows登录进程,主要作用是启动LSASS进程(Local Security Authority Subsystem Service);如果是XP还会启动Logonui进程,如果是Win2003就不会生成logonui;出现登录提示框,提示用户输入用户名和密码,然后将些信息交给LSASS进行验证,如果通过就会创建一个访问令牌,最后由userinit程序执行用户登录和初始化脚本,至此,出现桌面后,我们的启动工作就完成了。但在winlogon对用户进行验证的同时还会启动services相关系统服务。
Winlogon的过程其实还是很复杂的,因为中间涉及到用户的认证和授权的问题,在此还是想简单说一说,我们登录系统的方式主要交互式登录、系统登录、网络登录、服务登录和批处理登录。用到最多的有交互式登录、系统登录、网络登录和服务服务,当然用户最熟悉的肯定是交互式登录,也就是人坐在电脑前,与你的爱机直接面对面的“交流”!那么咱们就把交互式登录的过程大体说一下:
首先Winlogon作为登录进程首先出现,准备一个用户登录的环境。然后开始加载一个DLL文件:MSGINA.DLL,此文件作用是在屏幕上出现一个“Ctrl+Alt+Del”的界面,提示用户输入用户名和口令, 然后将收到的信息交给下一个进程:LSASS进程,进行用户身份的认证,当然这里又会有很多问题:工作组用户的认证、单域用户的认证、不同域用户的认证等等,但不论是哪一种情况,都必须由LSASS进程负责认证。其中会涉及到一个服务:Netlogon,此服务主要是验证NTLM的登录、认证。如果是域的环境会帮助客户机更新主机的DNS记录以及定位域控制器,这也就是我们在联系域控制器不成功时为什么重新启动netlogon这个服务的原因!我们抛开过旧的操作系统不谈,那么工作组环境一般使用的认证协议为:NTLM协议,如果是域环境使用的认证协议为:Kerberos V5协议。
NTLM:使用的是挑战/响应模式,过程如下:
首先是客户端发出一个连接请求,请求对方对自己的身份进行认证。但没有传具体口令。
服务器端会给随机发送一个8字节的挑战信息,如:1234567812345678,然后将这个挑战信息和当前session关连起来。
客户端收到挑战信息后进行如下工作:a.根据自己的明文口令经过md4哈希后得到一个16字节的口令散列值;b.然后利用刚才得到的散列值将准备登录的服务器名或者是域名等信息再次进行md5加密得到第二次的hash散列值;c.然后再利用第二次的散列值把8个字节的挑战信息再次进行md5加密,又得到一个16字节散列值;d.最后将这个值作为响应传给服务器。
最后服务器端怎么做,才知道你是不是一个合法用户呢?因为服务器是有你的口令明文的,利用你的口令明文也做相同的操作,如果结果匹配,就认为对方是一个合法的用户!
Kerberos V5主要是对用户的身份进行验证并为用户颁发用于访问网络服务的票证,适合于域等开放环境。认证过程是一个很复杂的过程,在此我只能是简单说说而已。
首先:客户端通过DNS定位KDC服务器
其次:客户端用户使用密码或者是其他方式如智能卡向KDC请求票证授予票证(Ticket-Granting Ticket, TGT),这个请求在登录时会自动完成。要获取特定服务的其他票证,需要票证授予票证。票证授予票证类似于护照。与护照一样,票证授予票证可标识您的身份并允许您获取多个“签证”,此处的“签证”(票证)不是用于出国,而是用于远程计算机或网络服务。
然后:KDC对用户的身份进行验证,如果没有问题可创建票证授予票证,并采用加密形式将其发送回客户机。
再次:客户机使用其口令来解密票证授予票证(TGT),得到有效的TGT后,客户端使用该TGT票证访问授票服务(TGS)。
再次:TGS接着向客户端颁发服务票证。
最后:客户端向所请求的网络服务出示服务票证。服务票证向此服务证明用户的身份。同时也向该用户证明服务的身份。
Winlogon进程
Msgina.dll文件
Netlogon服务
以上只是用草草几句话把Winxp/2003的启动过程作了一个大体的介绍,从其中我可以看到NTLDR和boot.ini起了重要的作用,这也是和Vista/Win2008的不同之处。下面咱们就来看看Vista/2008的启动过程。
我们知道在XP/2003中进行操作系统加载的文件是NTLDR,然后再读取boot.ini文件但这两个文件已经到了寿终正寝的时候了!在VISTA以后的操作系统中我们再也见不到亲爱的NTLDR和Boot.ini了!呜。。。。。。
Vista/2008的启动流程,如图所示:
在这个图中,大家可以看到从系统启动到BIOS到MBR这一部分内容基本上和早期版本操作系统是一样的,不用多说,那么这个PBR是什么东西呢?
PBR:分区引导记录 Partition Boot Record
由Vista 在安装格式时生成的一段代码,由这段代码去找Bootmgr程序,并将程序的执行权交给Bootmgr。那么这个Bootmgr又是个什么东西?
Bootmgr:启动管理器,相当于XP/2003时期的Ntldr,这个程序可以完成操作系统加载,最主要的作用就是读取BCD中的数据,我们知道在XP/2003中启动配置信息都存放在boot.ini文件中,但到了VISTA/2008以后,启动配置信息就放到了BCD中了!
BCD:Boot Configure Data 引导配置数据,它的作用就是用于存放当前机器上的操作系统信息,安装了多少操作系统,每个操作系统所在分区等等。
当Bootmgr成功从BCD中读取出引导信息后就会显示启动菜单供用户选择,然后Bootmgr会将程序的执行权交给Winload.exe
Winload.exe它的的作用是将核心的系统文件加载到内存并加载基本的驱动程序,还有一个新功能就是支持bitlocker在此不做讨论。winload.exe执行成功后,就将执行权交给了系统的内核文件Ntoskrnl。
以上是简单把vista/2008的启动过程大体说了一下,而我们今天的重点讲的是BCD这个东西,这是和XP/2003区别最大的地方了!
刚才我们已经说了BCD保存着启动的相关配置信息,它取代了boot.ini文件,而且存储格式也变化了相当大的变化,以至于我们都不认识它了,它是按照注册表的格式进行保存的,是一个二进制文件,启动成功后也确实要被加载到注册表中,因此也有人说Vista/2008的启动信息存放于注册表中。下面咱们就来认识认识此文件:
BCD文件位于活动分区下的boot文件夹内,如图所示:
那么这个BCD文件是一个二进制文件,我们就不能像boot.ini文件那样对它直接修改了,必须借此一些工具才可以如:控制面板中的系统、msconfig工具、bcdedit.exe工具、wmi开发接口。但在此功能较强的应该是bcdedit.exe和WMI开发接口,但大家最常用的应该是Bcdedit.exe,这个工具也同一般的外部命令一样位于windows下的system32文件夹下,如图所示:
如果我们直接在命令行下执行bcdedit.exe就是显示操作系统配置条目,如图:
那么如果我们使用 bcdedit.exe /? 这就是显示使用方法:
下面给出bcdedit.exe的常用参数:
/createstore 新建空的启动配置数据存储。
/copy 复制存储中的项。
/create 在存储中新建项。
/delete 删除存储中的项。
/deletevalue 删除存储中的项选项。
/set 设置存储中的项选项值。
下面咱们就以一个实例来讲解一下双启动的故障修复
参考图形:
环境描述:先在C盘安装了一个Win2003,然后又在D盘安装了一个Win2008。
分析:那么C盘现在是系统分区,如果用Win2003启动的话,那么启动分区就是C盘,否则就是D盘。虽然2008现在安装在D盘,但还是要向系统分区也就是C盘修改了三个地方:PBR、Bootmgr、BCD。只要安装了Vista或是2008就一定会向系统分区中修改这三个地方。
故障产生:现在C盘的Win2003因为某种原因需要重新安装,那么原来的三个信息PBR、Bootmgr、BCD都没有了,因此D盘的2008不能启动了。
解决方法:只要还原C盘的PBR以及Bootmgr和BCD文件即可!
方法:使用Win2008的安装光盘进行命令行修复模式或者是第三方的小工具!
然后输入命令:bootsect sys /nt60 就会重建PBR的相关信息!
实现过程:利用Win2008安装光秀的命令行修复模式
现在我把C盘的Win2003重新安装一遍。(当然大家用Ghost也可以)安装成功后就直接进入WIN2003,Win2008无法启动!
进入Win2003之后,我们来查看系统分区下的相关文件:
发现只有Ntldr,不见bootmgr和boot文件夹当然也没有BCD信息了!下面我们开始修复:
方法:
把载入Win2008的安装光盘。然后启动,如图所示:
点击:修复计算机,出现下图:
显示当前没有找到要修复的操作系统,点击:下一步
点示:命令提示符,出现下图:
出现命令行提示符,但大家注意了这里的盘符是X盘,这是为什么呢?原来这只是一个虚拟出来的盘符,大家可千万不要在此输入修复命令,一定不成功的!我们要切换到真正光盘所在的盘符:
下面我们的操作就在此提示符下进行:
在上图中所用到的命令我已经使用红框做了标记,
其中几个复制命令是为了生成bootmgr以及BCD,bootsect.exe /nt60 SYS是为了更新Win2008的PBR。
最后EXIT退出!
重新启动,不必再手动选择从光盘启动系统也会自动从光盘启动,再进入“修复计算机模式”会自动出现下图所示:
选择“修复并重新启动”。重启修复正常后进入Win2008系统。但不能启动Win2003,这是因为BCD中没有Win2003的配置信息,如图所示:
在Win2008系统下用bcdedit.exe 修复双启动菜单,在BCD中加入Win2003的配置信息,相关命令如下:
a. 创建基于ntldr的OS加载器项: /d为用户选择时的提示内容,可以随意输入
bcdedit /create {ntldr} /d “Windows Server 2003”
b. 设置OS所在分区
bcdedit /set {ntldr} device partition=D: (D: 为XP的系统所在分区)
c. 设置OS所使用的ntldr文件位置
bcdedit /set {ntldr} path \ntldr
d. 使此OS项加入到bootmgr界面中
Bcdedit /displayorder {ntldr} –addlast
e. 生成此项的描述信息:
Bcdedit /set {ntldr} description “Windows 2003”
具体操作如图所示:
再次查看就有我们新建的启动项了:
我们可以重新启动计算机,进行测试:
至此,修复操作终于结束了!我的天呀!累死我了!
注意:如果某个节点我们不需要了,也可以删除节点,如:bcdedit –delete {ntldr} -f
那么如果你手头没有Win2008的安装光盘,也可以借助第三方工具来修复和Win2008相关的信息。我在此从网上下载了一个修复工具:BCDautofix,操作起来更为简单!
实现过程:借助第三方工具修复Win2008的启动故障
方法: 从网上下载修复的小工具,如BCDdautofix。
双击BCDautofix.exe 如图所示:
然后重新启动计算机:
出现:
进入系统后发现 bootmgr、BCD等信息都已经回来了!
转载于:https://blog.51cto.com/liying/967639