創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2017年9月14日 星期四

修復GPT硬碟Windows 10的EFI bootloader

在某部UEFI[1]的電腦使用GPT[2]硬碟,裝正體中文版Windows 10 Home 64位元 , 自行做磁碟分割,不使用MSR與修復磁區,三個分割區:EFI、OS、資料磁區。

在系統安裝好後用可支援GTP的磁碟克隆軟體把EFI[3]與OS磁區備份下來,之後因某種因素必須更換硬碟,新的硬碟分割方式同上,從備份檔將系統還原到新硬碟的EFI與OS磁區後重開機時出現類似BOOT ERROR 0xc00000e之類的錯誤訊息而無法開機。

我最初以reinstall windows 10 efi bootloader的方向做了些網路搜尋,看了幾篇談fix/repair UEFI Boot/bootloader的文章,大意就是使用安裝光碟開機,進入修復模式,利用幾個指令diskpart、bootrec與bcdboot來修復EFI啟動檔;或用啟動修復的功能 。這幾篇都提到了重點,但說明都不是很清楚,除了其中一篇[5]較為可靠之外,其它幾篇看起來還是抄襲而來的,令人懷疑作者是否實際操作過,事後發現其中的錯誤,更肯定了我的懷疑沒錯。試著查了bcdboot /?,但說明文字也不多。 自己實際照著操作了一下,發現沒用,平白浪費不少時間。試了啟動修復的功能也無用,後來想到應該是磁碟分割與Windows安裝的預設分割法不同有關。

之後有一次再試著還原 時也發現備份軟體不讓我把系統還原到另一顆硬碟的磁區 ,我開始懷疑是否搞錯方向。之後再以“UEFI 換硬碟”為關鍵字,看到 一篇[6]寫的較明確的。看了一下其中內容,發現與之前查到的那幾篇大同小異,但主要的不同是bcdboot指令的使用。當下決定從網路上找bcdboot指令正確完整的說明[9],這才搞清楚真正的用法,實際試一下馬上就成功了。

以下會把自己的作法整理一下並做說明,但先聲明幾點 :
  • [6]的討論串中有人提到備份/還原時,以整個硬碟來做就不會有開不了機的問題,關於這點,自己沒實測過,但認為應該是正確的。這裡的情形則是當初以磁區方式備份,就只能以磁區還原,且新硬碟也有資料磁區,若不想動到其中資料時,也不適合用碟對碟方式的還原,只能磁區對磁區。所以重複強調一下,本文談的是磁區對磁區還原之後,修復啟動問題的作法。若能用碟對碟的還原,正常是可以免除本文所遇到的問題。
  • 本文談的只適用於Windows 10的版本。
以下就開始說明我的作法。以UEFI開機必須使用GPT磁碟機,新硬碟可先以DiskGenius建立好GPT磁碟分割,這部分非關本文主旨就略過。這裡假定已換上新硬碟,也做完了還原EFI與OS磁區的動作,再來就是修復啟動的工作。

必備項目:
  1. Windows 10安裝媒體,即DVD或USB 。
  2. 前述分割好並已還原EFI與OS磁區的新GPT硬碟。
  3. 記得關閉BIOS中的Secure Boot。

簡單說明

Windows Boot Manager[4]放置在EFI磁區,必須要能夠存取到EFI磁區,才能修復其中的boot record,並重建BCD (Boot Configuration Data)[4]。

工作步驟

1. 進入修復模式

機器中裝好新硬碟,此時建議只裝這顆硬碟 ,以避免弄錯。以開機媒體開機,進入修復電腦的環境,使用命令提示字元,這裡就不附上畫面了。

以下命令列指令的字母不區分大小寫,但要注意某些參數可能有區分。

2. 指定EFI磁區的磁碟機代號

利用diskpart[7]來指定EFI磁區的磁碟機代號。DiskPart命令列選項可見參考,這裡不細談。diskpart中的指令可簡省,只要它可以辨識的話 ,如select volume可簡省為sel vol。

執行diskpart


diskpart

列出磁碟

若照建議只裝一顆,就只顯示編號0磁碟,也沒必要執行這條指令了。

list disk

選定磁碟

要裝的硬碟通常是編號0,這裡就假定是0。

select disk 0

列出分割區


list vol

選定分割區

這裡要確實認好EFI磁區的編號,假定是3。

select vol 3

指定磁碟區代號給EFI磁區

必須先確定這個代號不是目前正在使用的,假定是k:。

assign letter=k:

離開

離開diskpart,才能更動EFI磁區。

exit

3. 修理boot record


cd /d k:\EFI\Microsoft\Boot\
bootrec /FixBoot
cd的/d參數可同時變更工作目錄,詳情請見cd /?。bootrec的使用可見參考[8]。

4. 重建BCD

如果覺得有必要的話,可先將舊的改名。

ren BCD BCD.old
bcdboot c:\Windows /l zh-TW
bcdboot.exe的命令列選項可見參考[9],這裡就不過多解釋。

在只一顆硬碟的情形下, /s參數預設就是這顆硬碟,故可以不用加此參數。 /f參數必須與/s一起用,故在這裡也用不著。

若真要用這二參數,在這裡的情況下的用法是:

bcdboot c:\Windows /l zh-TW /s k: /f ALL
這與上述省略/s與/f的方式是大約相當的,因省略會套用預設值。

假定在另一種情況,想要寫到USB碟或其它硬碟,其磁碟代號為U:,則是:

bcdboot c:\Windows /l zh-TW /s u: /f ALL

5. 結束工作,重開機

執行完後離開。

exit
重開機,建議移除外接的開機裝置,若操作無誤就可正常開機了。

可能的變通

  • 上述指定磁碟機代號也可用其它工具做到,像DiskGenius。
  • 若能把bootrec.exe工具加入自訂的Win10 PE中 ,也可以在PE中使用。要注意PE與所用系統的版本的位元數要一致。
  • BOOTICE也可以用來修復UEFI引導[10],但這功能自己沒實測過。BOOTICE有不少功能,僅用過其中少數幾樣而已,不算熟悉,最近曾嘗試使用UEFI頁籤上的功能,但出了點問題,這是題外話了。

參考

  1. https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
  2. https://en.wikipedia.org/wiki/GUID_Partition_Table
  3. https://en.wikipedia.org/wiki/EFI_system_partition
  4. https://en.wikipedia.org/wiki/Windows_Vista_startup_process
  5. http://www.dell.com/support/article/tw/en/twdhs1/sln300987/how-to-repair-the-efi-bootloader-on-a-gpt-hdd-for-windows-7--8--81-and-10-on-your-dell-pc?lang=en
  6. http://www.pcdvd.com.tw/showthread.php?t=1044157
  7. https://technet.microsoft.com/zh-tw/library/cc766465(v=ws.10).aspx
  8. https://support.microsoft.com/en-us/help/927392/use-bootrec-exe-in-the-windows-re-to-troubleshoot-startup-issues
  9. https://msdn.microsoft.com/zh-tw/library/hh824874.aspx
  10. http://www.itread01.com/articles/1490515023.html

沒有留言:

張貼留言