1. 程式人生 > >Windows下設置Ubuntu引導項

Windows下設置Ubuntu引導項

關於 系統 安裝過程 結構 優化 上進 org 方式 comm

  最近在進行一些實驗環境的配置,最終通過雙系統實現了多系統的管理,而不僅限於虛擬機的方式。以此方式成功安裝了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安裝程序的U盤,選擇試用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引導項