最近經常有學生詢問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的啟動故障
方法: 從網上下載修復的小工具,如BCDautofix。
雙擊BCDautofix.exe 如圖所示:
然後重新啟動計算機:
出現:
進入系統後發現 bootmgr、BCD等信息都已經回來了!
至此修復成功!不行了,堅持不住了,我去睡覺了!。。。。。。。。。。。。
本文出自 “杜飛” 博客,轉載請與作者聯系!