標籤:系統版本 starting view tle 選擇 路徑 磁碟分割 目錄 檔案結構
最近在進行一些實驗環境的配置,最終通過雙系統實現了多系統的管理,而不僅限於虛擬機器的方式。以此方式成功安裝了Windows8.1 Pro和Windows 10,原文在此。
在此基礎上進一步安裝Ubuntu16.04。鑒於現如今對於安裝系統的最佳化已經較為成熟,安裝過程較為簡單或資料充足,所以主要的問題集中在使用Windows內建的引導過程增加對Ubuntu16.04的引導。
被網上各種各樣的片段文章和內容淹沒,所以在此記錄瞭解到的資訊,介紹啟動引導的基本原理,並給出解決問題的方法(解決方案在最文章最後)。
尋找的一些有用的資料:Windows8貼吧中一篇Windows引導過程簡介,關於linux開機引導過程linux下的開機啟動流程,修改BCD設定檔的bcdedit使用指導和其他,有關UEFI的問題的UEFI啟動解析,Ubuntu論壇中的置頂問題。
1.引導方式的選擇
在安裝引導的過程中有兩種選項:linux下通過GRUB引導和Windows下通過內建啟動器引導。
前者操作簡單,可以在linux的安裝過程中進行設定,問題在於若linux只是當前系統下的一個輔助作業系統而不是主要使用系統,則開機過程會較為緩慢,而且若後續linux系統出現問題或被刪除,會影響其他Windows系統的引導,存在潛在的問題(當然若是使用linux為主要系統,則使用其預設的引導是划算的)。
這裡選擇的是通過Windows內建的啟動器對安裝在建立分區的linux系統進行引導。
2.引導原理的介紹
Windows下的系統引導方式隨著系統版本的變化有著差異,前面連結的資料有一定介紹。這裡筆者的設定環境為 Win8.1 中文版。
現有的Windows引導方式主要有兩種:Legacy + MBR 和 UEFI + GPT 方式。Legacy BIOS無法識別GPT分區表格式,所以也沒有LegacyBIOS+GPT組合方式;UEFI BIOS可同時識別MBR分區和GPT分區,所以UEFI下,MBR和GPT磁碟都可用於啟動作業系統。不過由於微軟式節流,UEFI下使用Windows安裝程式安裝作業系統是只能將系統安裝在GPT磁碟中。現對其引導原理進行一定介紹。
名詞解釋:
MBR : Master Boot Record,主引導記錄。主要構成為引導載入某一作業系統。
主開機磁區 : 包含MBR的扇區,一般也簡稱MBR,一般位於存放裝置的第一個扇區。包含主引導記錄(446bytes)、磁碟分割表(16bytes*4)和結束標誌(0x55aa)。引自百度百科。
使用中的磁碟分割 : 是電腦系統磁碟分割,啟動作業系統的檔案都裝在這個分區,Windows 系統下一般被預設為C盤。
電腦開機後,開始啟動BIOS,開始BIOS自檢,通過自檢後,bios找到硬碟上的主引導記錄MBR。
WinXP:
讀取並運行主引導記錄(Master Boot Record,MBR) --> 讀入使用中的磁碟分割的開機磁區 --> NTLDR裝入並初始化,將系統有實模式轉化為平滑模式 --> 運行一個迷你檔案系統驅動(支援FAT和NTFS格式) --> NTLDR讀入boot.ini檔案,根據其內容產生開機選項,對開機系統進行選擇,並載入所選擇系統的負載檔案。來自百度百科和Blog。
Win7:
讀取MBR中的硬碟分區表DPT --> 尋找使用中的磁碟分割,找到其中的引導記錄PBR --> PBR搜尋活動區中的啟動管理器bootmgr(相當於xp裡的ntldr) --> Bootmgr尋找使用中的磁碟分割中的boot檔案夾中的BCD檔案(啟動配置資料,相當於xp裡的boot.ini檔案) ->根據BCD檔案在顯示器上顯示多作業系統選擇畫面 --> 根據選擇的系統尋找對應的盤裡的windows\system32\winload.exe檔案,並且將控制權交給winload.exe
以上兩個系統均是傳統的Legacy+MBR的引導方式,主要流程為 Legacy BIOS -->讀取主開機磁區 --> 找到使用中的磁碟分割,並載入引導程式NTLDR/Bootmgr --> 根據設定檔boot.ini/BCD產生多系統引導的菜單 --> 根據選擇的系統和設定檔中儲存的路徑載入對應的系統。(即所謂的鏈式裝載,主引導記錄是為了找到系統所在的分區,即使用中的磁碟分割)
對於UEFI的啟動,UEFI+GPT的主要流程為 開機通電自檢 --> 根據引導順序掃描存放裝置,讀取FAT格式的EFI系統磁碟分割 -->執行開機檔案(筆者為Bootx64.efi)--> 在此扇區中載入啟動啟動管理器和讀取配置的BCD檔案 --> 進行作業系統的選擇和對應檔案的載入。
主要特點:
1.沒有讀取MBR
2.系統引導所需要的引導程式與設定檔放置在額外劃分出來的FAT格式的磁碟分割上。
3.裝置通過上述分區中的bootmgfw.efi檔案來匯入BCD檔案,使用者選擇系統後 BCD檔案根據自身的配置內容載入系統引導檔案winload.efi(對Windows而言)。
藉助linux強大的檔案系統操作功能,可以方便的查看系統EFI分區的結構。通過掛載EFI系統磁碟分割到指定檔案夾,可以進行查看。
圖示為筆者華碩筆記本Win8.1中文版的EFI分區(或稱ESP分區,即EFI System Partition )檔案結構圖
分析:
1.Bootx64.efi是電腦預設的啟動方式(Bios中指定)。即電腦總是通過Bootx64.efi來進行開機引導。這裡的Bootx64.efi只是一個檔案名稱,任何有效efi檔案均可以改為此名並用作引導;
2.Bootmgr.efi是Windows預設的啟動方式。即Windows總是通過Bootmgr.efi來進行引導。當Bootx64.efi指向Bootmgr.efi時(或者說在這種情況下,Bootx64.efi檔案實際是由Bootmgr.efi改名而來),就啟動了Windows的引導流程,並通過BCD檔案產生開機選項菜單;
3.解決方案
針對上述的引導流程記錄,可以知道不論是傳統的Legacy+MBR或者是UEFI+GPT格式,主要過程都是通過特定的啟動管理器讀取設定檔從而產生系統選擇介面,並在選擇系統後對特定系統檔案進行載入。
網上的解決方案有:
1.使用Ubuntu下的Boot-repair進行啟動修復,具體可見Ubuntu協助。但該方法是使用grub對系統進行引導。
2.使用Windows內建的引導程式對linux進行引導,即將Ubuntu的相關引導資訊加入存放在EFI分區中的設定檔中,從而通過Windows的引導程式進行引導。方法主要需要解決兩個問題:修改Win8.1下的BCD設定檔 和 獲得對應的引導檔案路徑。在Windows NT之後Windows提供了內建的工具bcdedit以供進行開機啟動設定作業,部分操作指令在文章開始的連結中有介紹。或者可以直接通過圖形介面工具easyBCD進行配置。
若自行手動設定,則需要建立一個啟動引導項,對相應的引導檔案所在分區和路徑、引導描述等進行設定。圖示為筆者裝置雙系統Win10的相關資訊。
對於linux而言,無論使用easyBCD或者bcdedit,均需要建立一個 實模式開機磁區 的啟動項,並給出相應的引導檔案路徑。若使用easyBCD,可以通過圖形介面自動產生引導。若使用bcdedit,則需要自行組建組態檔案。藉助安裝有linux安裝程式的隨身碟,選擇試用linux,找到安裝linux啟動模組的裝置名稱,如/dev/sda8等,使用dd命令獲得所需的檔案。
dd if=/dev/sdax of=ubuntu.mbr bs=512 count=1 //指令從指定檔案/dev/sdax讀取資料,讀取512個位元組,並輸出到ubuntu.mbr檔案中,從而得到linux啟動的mbr
再將該檔案放置到預設開機Windows系統的使用中的磁碟分割,使用bcdedit進行相關資訊的設定即可。
上述的easyBCD或bcdedit的方式,筆者均做過嘗試但並未成功。個人認為這應該是最符合自身需求的方式,但失敗原因不詳,望能得到指點。
3.Ubuntu12.04以及後續版本引入了對EFI模式的支援,所以可以將Ubuntu的引導程式GRUB安裝在裝置的EFI分區中(原系統Win8.1在安裝時會劃分,可以在磁碟管理中定位),此操作會在EFI分區中產生引導Ubuntu的檔案,從而可以引導Ubuntu,原帖。
在筆者將Ubuntu安裝至EFI分區後,其中的目錄內容發生了改變,在EFI檔案夾下新增了ubuntu的引導程式。
此方法的問題在於Ubuntu和Windows使用兩個不同的引導系統,實際是相當於設定預設的開機引導bootx64.efi/grubx64.efi從而啟動相應的作業系統。這樣兩個系統之間無法進行相互引導,只能在BIOS中設定引導順序,選擇某一個系統。這種方法相當於將Linux啟動引導安裝在EFI分區,從而多出一個開機檔案grubx64.efi。通過選擇grubx64.efi/bootx64.efi對不同的系統進行引導。
在第二種方法失敗後,筆者退而求其次的選擇了第三種方法並成功安裝。
Windows下設定Ubuntu引導項