windows7的啟動過程的常識:
電腦加電後,首先是啟動BIOS程序,BIOS自檢完畢後,找到硬盤上的主引導記錄MBR,MBR讀取DPT(分區表),從中找出活動的主分區,然後讀取 活動主分區的PBR(分區引導記錄,也叫dbr,究竟該叫什麼,網絡上爭論未休,我們姑且叫它pbr吧),PBR再搜尋分區內的啟動管理器文件 BOOTMGR,在BOOTMGR被找到後,控制權就交給了BOOTMGR。BOOTMGR讀取\boot\bcd文件(BCD=Boot Configuration Data ,也就是“啟動配置數據”,簡單地說,windwows7下的bcd文件就相當於xp下的boot.ini文件),如果存在著多個操作系統並且選擇操作系 統的等待時間不為0的話,這時就會在顯示器上顯示操作系統的選擇界面。在我們選擇啟動WINDOWS7後,BOOTMGR就會去啟動盤尋找 WINDOWS\system32\winload.exe,然後通過winload.exe加載windows7內核,從而啟動整個windows7系 統。
可以把這個過程簡單地概括為:BIOS-->MBR-->DPT-->pbr--> Bootmgr-->bcd-->Winload.exe-->內核加載 -->整個windows7系統
本文就來說一說MBR-->DPT-->pbr--> Bootmgr-->bcd這一段可能出現的故障的解決。
mbr出現問題,主要是mbr代碼被改寫,因為被改寫的代碼不同,所以出錯信息也各不相同。比如我們裝了windows7與ubuntu雙系 統,ubuntu改寫了mbr,在我們把ubuntu所在的分區格式化後,既進不了windows7,也進不了ubuntu,開機的時候會出現如圖的錯誤 提示:
[圖一]
解決的辦法就是重寫mbr。對於重寫mbr,我們所熟知的是在dos下用fdisk /mbr命令進行重寫。fdisk /mbr所重寫的mbr與xp是兼容的,但是,與windows7已經不那麼兼容了。實踐表明:用fdisk /mbr命令重寫windows7的mbr後,需要重建bcd,否則不能正常啟動windows7。有網友指出,這裡面的原因是fdisk /mbr命令改寫了mbr中的硬盤簽名。一般的分區工具都是可以重寫mbr的,比如diskgenius,它所重寫的mbr與windows7是兼容的。 也可以用bootrec /fixmbr命令重寫。要運行 Bootrec.exe 工具,必須啟動 Windows RE。為此,請按照下列步驟操作:
插入windows 7安裝光盤,從光盤啟動電腦,在光盤啟動完成後,按下shift+f10鍵,調出cmd命令提示符。在cmd命令提示符中輸入:bootrec /fixmbr
回車。這樣也就重寫了mbr。
[圖二]
分區表存在問題,對於這個問題,限於篇幅,不做詳細探討。
系統盤不是活動的主分區,這種情形只要用分區工具(比如diskgenius)把系統盤設為活動的主分區即可。
pbr出現問題,主要是pbr代碼被改寫,因為被改寫的代碼不同,所以出錯信息也不相同。比如WINDOWS7系統的活動分區,卻被寫入了適合於XP的 pbr,這樣開機的時候就會出現如圖的提示:
[圖三]
簡單的解決辦法就是用bootrec /fixboot命令重寫pbr:
插入windows7安裝光盤,從光盤啟動,在光盤啟動完成後,按下shift+f10鍵,調出cmd命令提示符。在命令提示符中輸入:bootrec /fixboot
回車。這樣也就重建了活動分區的pbr。
這裡面還有一個常用的命令也要提一下,這就是bootsect:
插入windows7安裝光盤,從光盤啟動,在光盤啟動完成後,按下shift+f10鍵,調出cmd命令提示符。在cmd命令提示符中輸 入:bootsect /nt60 sys /mbr
回車。這個命令會改寫活動分區的pbr,並同時會改寫mbr,使得mbr和pbr適合於windows7和vista。
bootsect.exe程序位於windows7安裝光盤的boot目錄下,可以把這個文件提取出來,在xp下的命令行可以運行這個程序,也可以在 winpe下的命令行運行這個程序,因而這個程序在使用時很方便。而bootrec.exe命令的使用就沒這麼方便了。所以BOOTSECT命令被應用得 更為廣泛一些。
另外有一個要點需要指出,vista的安裝光盤裡面的boot文件夾也存在著這個小工具,但vista的bootsect命令沒有/mbr參數,因而它只 能改寫pbr,而不能改寫mbr,這是必須要注意的。實踐表明:把一個硬盤的mbr清零,然後運行windows7的bootsect命令,確實可以發現 mbr被恢復正常。這也就表明了windows7的bootsect命令的確能夠重寫mbr。
另外,bootsect命令也可以重寫xp的mbr和pbr,而這也是bootrec命令所做不到的。xp的恢復控制台用fixmbr命令改寫mbr,用 fixboot命令改寫pbr。
如果是引導文件的問題,一般可以用bcdboot命令重新寫入引導文件:
插入windows7安裝光盤,從光盤啟動,在光盤啟動完成後,按下shift+f10鍵,調出cmd命令提示符。在命令提示符中輸入:
bcdboot x:\windows /s x:
注意,這前一個x:是windows7的windows文件夾所在的盤,一般是c:,如果你的不是c盤,請改為對應的盤符。這後一個x:是活動主分區的盤 符所在,一般也是c盤。所以這個命令一般的寫法是:
bcdboot c:\windows /s c:
但需要注意,在windows re環境下所看到的盤符與你在windows7下所看到的盤符未必一樣。所以需要首先用dir /a命令確認各盤是否正確。
比如:
cd /d c:
dir /a
這兩個命令的作用是,首先進入c:盤的根目錄,然後顯示c盤根目錄下的所有文件和文件夾,根據所顯示的文件或者文件夾,可以判斷這個盤具體是你在 windows7下所看到的哪一個盤。
windows7的引導文件主要是bootmgr和boot文件夾裡面的文件,而boot文件夾裡面的文件主要是bcd文件。bcdboot命令會在指定 的分區內重新寫入全部windows7的引導文件。
如果只是bcd文件有問題,則可以用bootrec命令重建bcd:
插入windows7安裝光盤,從光盤啟動,在光盤啟動完成後,按下shift+f10鍵,調出cmd命令提示符。在命令提示符中輸入:
bootrec /RebuildBcd
這個命令如果搜到沒有寫入bcd的windows7或者vista的操作系統,會提示你是否寫入,按提示輸入Y也就會寫入了的。
或者用bcdedit命令手動改寫bcd,但操作要復雜得多。
具體案例分析:
案例一:怪事,系統盤不是活動的主分區
在網上看到一則求助,windows7系統運行正常,只是在磁盤管理中所看到的則是:系統盤不是活動的主分區。
[圖四]
我們在安裝了一鍵還原精靈裝機版後,在開機的時候按下F11鍵可以啟動一鍵還原程序。但我們在格式化系統盤後,在開機的時候仍是可以這樣操作的。而所謂的 pbr是高級格式化的時候產生的。這表明了,一鍵還原精靈的啟動代碼不是寫入了活動分區的pbr(如果是的話,在格式化的時候已經被清除了),而是寫入了 MBR。通過在MBR中設定首先讀取一鍵還原精靈的隱藏分區,然後才讀取活動的主分區。那麼,現在我們所遇到的這種情形是不是也通過改寫mbr而指向特定 的分區?
假設mbr沒有問題,那麼問題就可能出在pbr(也就是所謂的dbr),win7的pbr中寫入的代碼應該是去找bootmgr,但如果這個代碼中規定了 要找的是另外的一個特殊的文件,而再通過這個文件去啟動另一個分區中的bootmgr,這樣就能實現把另一個不是活動的主分區變為系統盤的目的。
通過上面的分析,我們可以得到結論:問題不是出在mbr,就是出在pbr,解決的辦法就是先試著重建mbr,如果不能解決,那就可以肯定問題出在pbr, 只要重建pbr就能解決問題的。
於是首先重建mbr,問題依舊,然後再重建pbr,問題果然得到解決。
案例二:
開機的時候出現:
BOOTMGR is missing
press ctrl+alt+del to restart.
翻譯成漢語就是:bootmgr缺失,按Ctrl + Alt + Del重新啟動
這是很常見的故障。既然是bootmgr缺失,我們一般只要用bcdboot命令重建引導文件即可。
這種情形產生的原因,一般可能有:bootmgr文件確實沒有了,這是最為常見的。一種則是由磁盤錯誤導致的,這種情形下,在winpe下運行一下 chkdsk /f命令也可能解決。有朋友使用 Diskeeper 對MFT碎片進行整理,開機的時候也出現了這個提示。估計可能是用DISKEEPER進行的MFT磁盤整理後,這或者是diskeeper的一個bug, 因而不建議用diskeeper進行mft碎片整理。
一位網友因為好奇。把C盤設成了活動的(active partition )。是這樣設置活動的:對計算機點右鍵-管理-硬盤管理。右鍵點C盤,設置為活動的。靠。怎麼回事啊。
重啟後居然無法啟動!顯示bootmgr is missing,Ctrl+Alt+Delete to restart。然後還是如此。
這是從網上找到的一個案例,分析可以得出結論。他所裝的windows7應該存在著一個隱藏的“系統保留”分區,這個隱藏的系統保留分區才是真正的活動主 分區,而他的c盤則應該不是活動的。他把c盤設為活動,這也就意味著取消了“系統保留”分區的活動狀態。但引導文件是在“系統保留”分區,而不是在c 盤,c盤變成了活動的主分區,mbr就會啟動c盤的pbr,而c盤的pbr又會去c盤找bootmgr,但c盤沒有bootmgr,所以出錯也就是必然的 了。解決的辦法其實只要簡單地再把系統保留分區設為活動即可。
這位朋友制造了問題,但好象並沒能最後解決問題。真所謂會者不難,難者不會。
案例三:開機的時候出現:
BOOTMGR is compressed
Press Ctrl+Alt+Del to restart
翻譯成漢語就是:
bootmgr被壓縮,按Ctrl + Alt + Del重新啟動
這種情形產生的原因是因為對系統盤進行了壓縮。奇怪的是,對於這種情形,我們用bcdboot命令重建引導文件卻並不能解決。
但是,我們可以運行命令:compact /u /a /f /i /s c:\*
這樣可以使得問題得到解決。compact程序位於windows\system32文件夾下,所以我們要先用CD命令進入windows \system32目錄。這裡是假設c:盤是bootmgr所在的盤,如果不是,要改為對應的盤符。
網上有朋友用這個命令的時候並沒有解決問題,原因則在於,這位朋友所運行的命令是:compact /u /a /f /i /s c:\
沒有後面這個*,所以命令並沒有實現運行者的目的。從命令本身所提供的幫助說明來看,這個*似乎是沒有必要的,但實際操作表明,這個*是必須的。
這個命令會把已經壓縮的C盤文件完全解壓,真所謂解鈴還須系鈴人。
注意,只運行命令:compact /u /a /f /i c:\bootmgr
並不能解決問題。
有網友發現,運行“Bootrec.exe /fixmbr、Bootrec /fixboot"然後重啟,這樣可以解決問題。測試表明,其實只需要運行Bootrec /fixboot這一個命令即可。這是另類的解決的辦法。猜想可能是,對驅動壓縮後,PBR中的BPB表並沒有隨之修改,所以BPB表中所記錄的分區信息 與實際的分區信息不一致。運行Bootrec /fixboot命令後重寫了bpb,這樣就使得二者變為了一致。
實踐表明:用bootsect命令也能實現對這個問題的解決。
有網友發貼,說是裝了xp與vista雙系統,啟動vista系統出現了BOOTMGR is compressed ,於是他在xp下取消了系統盤的壓縮狀態。但這位網友的話未必可信,因為如果ntldr也被壓縮了的話,則xp啟動的時候會出現:
ntldr is compressed
Press Ctrl+Alt+Del to restart
除非這位朋友只壓縮了bootmgr,而沒有壓縮ntldr,但這一般不太可能。這種壓縮一般是對整個盤進行壓縮的時候產生的,如果壓縮指定文件的話,一 般不會有人去壓縮bootmgr和ntldr的。實踐表明,在windows7下,即便指定對整個的系統盤進行壓縮,一般也不能壓縮bootmgr的,會 提示拒絕訪問,但是,在開機的時候仍會出現出錯提示:bootmgr is compressed
案例四:
先裝的windows7,後裝的linux,在linux系統出問題後,既進不了linux,也進不了windows7,這裡面的原因是mbr和活動分區 的pbr被改寫。只要重建mbr和活動分區的pbr,也就可以進入windows7了。最簡單的辦法是用bootsect命令解決:
bootsect /nt60 sys /mbr
案例五:
先裝的windows7,後裝的xp,沒有了windows7的啟動項:
這個需要三步解決問題:
一、用bcdboot命令重建windows7的引導文件。
二、用bootsect命令恢復windows7的mbr和pbr
三、進入windows7後,用bcdedit命令添加xp的啟動項