最近經(jīng)常有學生詢問Win2008的啟動相關(guān)問題以及早期Windows版本與vista或win2008并存時的啟動問題,現(xiàn)在可以說正是處于操作系統(tǒng)新舊版本的過濾時期,這類問題會在一定時間內(nèi)越來越多,所以本人就寫了這篇文章來談論一下新版操作系統(tǒng)的啟動原理以及如何解決新舊兩種操作系統(tǒng)并存時的故障。
我們還是先來看一下WinXP/2003的啟動過程,這個啟動過程其實還是挺復雜的,我在此畫了一個草圖:
當然這個圖并沒有把整個啟動過程中所涉及到的細節(jié)都描述出來,但主要部分已經(jīng)有了,我們在此不進行詳細描述,例如:系統(tǒng)自檢成功后讀取MBR中的前446個字節(jié)的引導信息等,這些不是咱們今天討論的重點,我們只說說較為重要的幾點:
其中最為重要一步就是NTLDR:這個程序位于C盤根目錄下如圖所示:
NTLDR:全稱為NTOS Loader,操作系統(tǒng)加載程序。它的主要作用是解析Boot.ini文件,通過讀取Boot.ini文件,使系統(tǒng)在啟動過程中出現(xiàn)選擇菜單,由用戶選擇希望啟動的操作系統(tǒng)。除了NTLDR我們可以看到在C盤根目錄下還有一個boot.ini文件,這個文件在xp/2003中也是相當有分量的一個家伙!
BOOT.INI:簡稱為啟動菜單文件,這個文件中存放了我們當前機器中操作的配置信息,安裝了幾個操作系統(tǒng)?分別位于哪個分區(qū)?給用戶的選擇提示是什么?默認選擇時間是多長?等等。
NTLDR除了讀取BOOT.INI文件中的啟動配置信息之外還會加載并執(zhí)行C盤根目錄下的NTDETECT.COM文件,收集系統(tǒng)的硬件信息,NTDETECT.COM文件會調(diào)用BIOS中的內(nèi)容來得到基本的硬件信息返回NTLDR以供操作系統(tǒng)使用,并將此信息保存到注冊表中。
如果上述操作沒有問題就會再現(xiàn)我們比較熟悉的進度條了!
然后就是加載Windows的內(nèi)核文件:NTOS,全稱為:NTOSKRNL.EXE文件以及它所依賴的模板文件,如圖所示:
再往下就會將程序的執(zhí)行權(quán)交給NTOSKRNL.EXE,下面的工作就由NTOSKRNL.EXE負責了!NTOSKRNL.EXE程序會通過調(diào)用一系統(tǒng)的函數(shù),這也是整個啟動過程中最復雜的地方,也是最容易出現(xiàn)問題的地方,如果這一部分沒有問題,那么就會生成系統(tǒng)的第一個進程:SMSS
SMSS:會話管理子系統(tǒng) Session Manager SubSystem 這是第一個用戶態(tài)的進程。會執(zhí)行一些注冊表中某些表鍵中所定義的操作:如bootexecute、pendingfilerenameoperations、paging file等創(chuàng)建會創(chuàng)建出 CSRSS系統(tǒng)服務器進程和Winlogon登錄進程。
CSRSS:Client/Server Runtime Server Subsystem作用:客戶端服務子系統(tǒng),用以控制Windows圖形相關(guān)子系統(tǒng),是用戶模式Win32子系統(tǒng)的一部分。csrss代表客戶/服務器運行子系統(tǒng)而且是一個基本的子系統(tǒng)必須一直運行。csrss用于維持Windows的控制。
Winlogon:Windows登錄進程,主要作用是啟動LSASS進程(Local Security Authority Subsystem Service);如果是XP還會啟動Logonui進程,如果是Win2003就不會生成logonui;出現(xiàn)登錄提示框,提示用戶輸入用戶名和密碼,然后將些信息交給LSASS進行驗證,如果通過就會創(chuàng)建一個訪問令牌,最后由userinit程序執(zhí)行用戶登錄和初始化腳本,至此,出現(xiàn)桌面后,我們的啟動工作就完成了。但在winlogon對用戶進行驗證的同時還會啟動services相關(guān)系統(tǒng)服務。
Winlogon的過程其實還是很復雜的,因為中間涉及到用戶的認證和授權(quán)的問題,在此還是想簡單說一說,我們登錄系統(tǒng)的方式主要交互式登錄、系統(tǒng)登錄、網(wǎng)絡登錄、服務登錄和批處理登錄。用到最多的有交互式登錄、系統(tǒng)登錄、網(wǎng)絡登錄和服務服務,當然用戶最熟悉的肯定是交互式登錄,也就是人坐在電腦前,與你的愛機直接面對面的“交流”!那么咱們就把交互式登錄的過程大體說一下:
首先Winlogon作為登錄進程首先出現(xiàn),準備一個用戶登錄的環(huán)境。然后開始加載一個DLL文件:MSGINA.DLL,此文件作用是在屏幕上出現(xiàn)一個“Ctrl+Alt+Del”的界面,提示用戶輸入用戶名和口令, 然后將收到的信息交給下一個進程:LSASS進程,進行用戶身份的認證,當然這里又會有很多問題:工作組用戶的認證、單域用戶的認證、不同域用戶的認證等等,但不論是哪一種情況,都必須由LSASS進程負責認證。其中會涉及到一個服務:Netlogon,此服務主要是驗證NTLM的登錄、認證。如果是域的環(huán)境會幫助客戶機更新主機的DNS記錄以及定位域控制器,這也就是我們在聯(lián)系域控制器不成功時為什么重新啟動netlogon這個服務的原因!我們拋開過舊的操作系統(tǒng)不談,那么工作組環(huán)境一般使用的認證協(xié)議為:NTLM協(xié)議,如果是域環(huán)境使用的認證協(xié)議為:Kerberos V5協(xié)議。
NTLM:使用的是挑戰(zhàn)/響應模式,過程如下:
首先是客戶端發(fā)出一個連接請求,請求對方對自己的身份進行認證。但沒有傳具體口令。
服務器端會給隨機發(fā)送一個8字節(jié)的挑戰(zhàn)信息,如:1234567812345678,然后將這個挑戰(zhàn)信息和當前session關(guān)連起來。
客戶端收到挑戰(zhàn)信息后進行如下工作:a.根據(jù)自己的明文口令經(jīng)過md4哈希后得到一個16字節(jié)的口令散列值;b.然后利用剛才得到的散列值將準備登錄的服務器名或者是域名等信息再次進行md5加密得到第二次的hash散列值;c.然后再利用第二次的散列值把8個字節(jié)的挑戰(zhàn)信息再次進行md5加密,又得到一個16字節(jié)散列值;d.最后將這個值作為響應傳給服務器。
最后服務器端怎么做,才知道你是不是一個合法用戶呢?因為服務器是有你的口令明文的,利用你的口令明文也做相同的操作,如果結(jié)果匹配,就認為對方是一個合法的用戶!
Kerberos V5主要是對用戶的身份進行驗證并為用戶頒發(fā)用于訪問網(wǎng)絡服務的票證,適合于域等開放環(huán)境。認證過程是一個很復雜的過程,在此我只能是簡單說說而已。
首先:客戶端通過DNS定位KDC服務器
其次:客戶端用戶使用密碼或者是其他方式如智能卡向KDC請求票證授予票證(Ticket-Granting Ticket, TGT),這個請求在登錄時會自動完成。要獲取特定服務的其他票證,需要票證授予票證。票證授予票證類似于護照。與護照一樣,票證授予票證可標識您的身份并允許您獲取多個“簽證”,此處的“簽證”(票證)不是用于出國,而是用于遠程計算機或網(wǎng)絡服務。
然后:KDC對用戶的身份進行驗證,如果沒有問題可創(chuàng)建票證授予票證,并采用加密形式將其發(fā)送回客戶機。
再次:客戶機使用其口令來解密票證授予票證(TGT),得到有效的TGT后,客戶端使用該TGT票證訪問授票服務(TGS)。
再次:TGS接著向客戶端頒發(fā)服務票證。
最后:客戶端向所請求的網(wǎng)絡服務出示服務票證。服務票證向此服務證明用戶的身份。同時也向該用戶證明服務的身份。
Winlogon進程
Msgina.dll文件
Netlogon服務
以上只是用草草幾句話把Winxp/2003的啟動過程作了一個大體的介紹,從其中我可以看到NTLDR和boot.ini起了重要的作用,這也是和Vista/Win2008的不同之處。下面咱們就來看看Vista/2008的啟動過程。
我們知道在XP/2003中進行操作系統(tǒng)加載的文件是NTLDR,然后再讀取boot.ini文件但這兩個文件已經(jīng)到了壽終正寢的時候了!在VISTA以后的操作系統(tǒng)中我們再也見不到親愛的NTLDR和Boot.ini了!嗚。。。。。。
Vista/2008的啟動流程,如圖所示:
在這個圖中,大家可以看到從系統(tǒng)啟動到BIOS到MBR這一部分內(nèi)容基本上和早期版本操作系統(tǒng)是一樣的,不用多說,那么這個PBR是什么東西呢?
PBR:分區(qū)引導記錄 Partition Boot Record
由Vista 在安裝格式時生成的一段代碼,由這段代碼去找Bootmgr程序,并將程序的執(zhí)行權(quán)交給Bootmgr。那么這個Bootmgr又是個什么東西?
Bootmgr:啟動管理器,相當于XP/2003時期的Ntldr,這個程序可以完成操作系統(tǒng)加載,最主要的作用就是讀取BCD中的數(shù)據(jù),我們知道在XP/2003中啟動配置信息都存放在boot.ini文件中,但到了VISTA/2008以后,啟動配置信息就放到了BCD中了!
BCD:Boot Configure Data 引導配置數(shù)據(jù),它的作用就是用于存放當前機器上的操作系統(tǒng)信息,安裝了多少操作系統(tǒng),每個操作系統(tǒng)所在分區(qū)等等。
當Bootmgr成功從BCD中讀取出引導信息后就會顯示啟動菜單供用戶選擇,然后Bootmgr會將程序的執(zhí)行權(quán)交給Winload.exe
Winload.exe它的的作用是將核心的系統(tǒng)文件加載到內(nèi)存并加載基本的驅(qū)動程序,還有一個新功能就是支持bitlocker在此不做討論。winload.exe執(zhí)行成功后,就將執(zhí)行權(quán)交給了系統(tǒng)的內(nèi)核文件Ntoskrnl。
以上是簡單把vista/2008的啟動過程大體說了一下,而我們今天的重點講的是BCD這個東西,這是和XP/2003區(qū)別最大的地方了!
剛才我們已經(jīng)說了BCD保存著啟動的相關(guān)配置信息,它取代了boot.ini文件,而且存儲格式也變化了相當大的變化,以至于我們都不認識它了,它是按照注冊表的格式進行保存的,是一個二進制文件,啟動成功后也確實要被加載到注冊表中,因此也有人說Vista/2008的啟動信息存放于注冊表中。下面咱們就來認識認識此文件:
BCD文件位于活動分區(qū)下的boot文件夾內(nèi),如圖所示:
那么這個BCD文件是一個二進制文件,我們就不能像boot.ini文件那樣對它直接修改了,必須借此一些工具才可以如:控制面板中的系統(tǒng)、msconfig工具、bcdedit.exe工具、wmi開發(fā)接口。但在此功能較強的應該是bcdedit.exe和WMI開發(fā)接口,但大家最常用的應該是Bcdedit.exe,這個工具也同一般的外部命令一樣位于windows下的system32文件夾下,如圖所示:
如果我們直接在命令行下執(zhí)行bcdedit.exe就是顯示操作系統(tǒng)配置條目,如圖:
那么如果我們使用 bcdedit.exe /? 這就是顯示使用方法:
下面給出bcdedit.exe的常用參數(shù):
/createstore 新建空的啟動配置數(shù)據(jù)存儲。
/copy 復制存儲中的項。
/create 在存儲中新建項。
/delete 刪除存儲中的項。
/deletevalue 刪除存儲中的項選項。
/set 設置存儲中的項選項值。
下面咱們就以一個實例來講解一下雙啟動的故障修復
參考圖形:
環(huán)境描述:先在C盤安裝了一個Win2003,然后又在D盤安裝了一個Win2008。
分析:那么C盤現(xiàn)在是系統(tǒng)分區(qū),如果用Win2003啟動的話,那么啟動分區(qū)就是C盤,否則就是D盤。雖然2008現(xiàn)在安裝在D盤,但還是要向系統(tǒng)分區(qū)也就是C盤修改了三個地方:PBR、Bootmgr、BCD。只要安裝了Vista或是2008就一定會向系統(tǒng)分區(qū)中修改這三個地方。
故障產(chǎn)生:現(xiàn)在C盤的Win2003因為某種原因需要重新安裝,那么原來的三個信息PBR、Bootmgr、BCD都沒有了,因此D盤的2008不能啟動了。
解決方法:只要還原C盤的PBR以及Bootmgr和BCD文件即可!
方法:使用Win2008的安裝光盤進行命令行修復模式或者是第三方的小工具!
然后輸入命令:bootsect sys /nt60 就會重建PBR的相關(guān)信息!
實現(xiàn)過程:利用Win2008安裝光秀的命令行修復模式
現(xiàn)在我把C盤的Win2003重新安裝一遍。(當然大家用Ghost也可以)安裝成功后就直接進入WIN2003,Win2008無法啟動!
進入Win2003之后,我們來查看系統(tǒng)分區(qū)下的相關(guān)文件:
發(fā)現(xiàn)只有Ntldr,不見bootmgr和boot文件夾當然也沒有BCD信息了!下面我們開始修復:
方法:
把載入Win2008的安裝光盤。然后啟動,如圖所示:
點擊:修復計算機,出現(xiàn)下圖:
顯示當前沒有找到要修復的操作系統(tǒng),點擊:下一步
點示:命令提示符,出現(xiàn)下圖:
出現(xiàn)命令行提示符,但大家注意了這里的盤符是X盤,這是為什么呢?原來這只是一個虛擬出來的盤符,大家可千萬不要在此輸入修復命令,一定不成功的!我們要切換到真正光盤所在的盤符:
下面我們的操作就在此提示符下進行:
在上圖中所用到的命令我已經(jīng)使用紅框做了標記,
其中幾個復制命令是為了生成bootmgr以及BCD,bootsect.exe /nt60 SYS是為了更新Win2008的PBR。
最后EXIT退出!
重新啟動,不必再手動選擇從光盤啟動系統(tǒng)也會自動從光盤啟動,再進入“修復計算機模式”會自動出現(xiàn)下圖所示:
選擇“修復并重新啟動”。重啟修復正常后進入Win2008系統(tǒng)。但不能啟動Win2003,這是因為BCD中沒有Win2003的配置信息,如圖所示:
在Win2008系統(tǒng)下用bcdedit.exe 修復雙啟動菜單,在BCD中加入Win2003的配置信息,相關(guān)命令如下:
a. 創(chuàng)建基于ntldr的OS加載器項: /d為用戶選擇時的提示內(nèi)容,可以隨意輸入
bcdedit /create {ntldr} /d “Windows Server 2003”
b. 設置OS所在分區(qū)
bcdedit /set {ntldr} device partition=D: (D: 為XP的系統(tǒng)所在分區(qū))
c. 設置OS所使用的ntldr文件位置
bcdedit /set {ntldr} path \ntldr
d. 使此OS項加入到bootmgr界面中
Bcdedit /displayorder {ntldr} –addlast
e. 生成此項的描述信息:
Bcdedit /set {ntldr} description “Windows 2003”
具體操作如圖所示:
再次查看就有我們新建的啟動項了:
我們可以重新啟動計算機,進行測試:
至此,修復操作終于結(jié)束了!我的天呀!累死我了!
注意:如果某個節(jié)點我們不需要了,也可以刪除節(jié)點,如:bcdedit –delete {ntldr} -f
那么如果你手頭沒有Win2008的安裝光盤,也可以借助第三方工具來修復和Win2008相關(guān)的信息。我在此從網(wǎng)上下載了一個修復工具:BCDautofix,操作起來更為簡單!
實現(xiàn)過程:借助第三方工具修復Win2008的啟動故障
方法: 從網(wǎng)上下載修復的小工具,如BCDautofix。
雙擊BCDautofix.exe 如圖所示:
然后重新啟動計算機:
出現(xiàn):
進入系統(tǒng)后發(fā)現(xiàn) bootmgr、BCD等信息都已經(jīng)回來了!
至此修復成功!不行了,堅持不住了,我去睡覺了!。。。。。。。。。。。。
本文出自 “杜飛” 博客,轉(zhuǎn)載請與作者聯(lián)系!