最近在進行一些實驗環境的配置,最終通過雙系統實現了多系統的管理,而不僅限於虛擬機的方式。以此方式成功安裝了Windows8.1 Pro和Windows 10,原文在此。
在此基礎上進一步安裝了 Ubuntu16.04 ,通過將Ubuntu系統的 iso 文件刻錄至U盤中,並在啟動時選擇從U盤啟動系統,則可進入系統的安裝界面,選擇對應的用於安裝系統的分區即可進行安裝。安裝過程較為簡單且資料充足,這里主要討論的是關於如何在使用Windows自帶的引導程序時增加對Ubuntu16.04的引導的問題。
被網上各種各樣的碎片文章和內容淹沒,所以在此記錄了解到的信息,介紹啟動引導的基本原理,並給出了一個不甚完美的解決方法(解決方法在最文章最后)。
查找的一些有用的資料:Windows8貼吧中一篇Windows引導過程簡介,關於linux開機引導過程linux下的開機啟動流程,修改BCD配置文件的bcdedit使用指導和其他,有關UEFI的問題的UEFI啟動解析,Ubuntu論壇中的置頂問題。
一些小知識點的總結(資料來源:Dual boot with Windows):
(1)不同的Windows系統支持不同的固件啟動模式和磁盤分區方式。且Windows基於固件啟動模式強制規定了對應的磁盤分區方式,即UEFI模式只能對應GPT分區,而Legacy BIOS模式只能對應MBR分區(也稱為msdos格式)。
(2)絕大多數的基於某種固件啟動類型的linux啟動加載器(boot loader)是無法引導或鏈式加載基於其他種類固件啟動類型的啟動加載器的。如若linux采用的是UEFI+MBR的啟動方式,則其啟動加載器無法加載基於BIOS+MBR或者UEFI+GPT啟動模式的Windows系統。以上限制的特殊情況參見鏈接資源的Bootloader UEFI vs BIOS limitations部分;
引導方式的選擇
在安裝引導的過程中有兩種選項:linux下通過GRUB引導和Windows下通過自帶啟動器引導。
前者操作簡單,可以在linux的安裝過程中進行設置,問題在於若linux只是當前系統下的一個輔助操作系統而不是主要使用系統,則開機過程會較為緩慢,而且若后續linux系統出現問題或被刪除,會影響其他Windows系統的引導,存在潛在的問題(當然若是使用linux為主要系統,則使用其默認的引導是划算的)。
筆者最后成功的方式是建立兩個系統引導程序,通過BIOS設置讀取引導程序的順序,若選擇Linux引導則引導Linux系統,若選擇Windows引導程序則進入Windows系統。
引導原理的介紹
Windows下的系統引導方式隨着系統版本的變化有着差異,前面鏈接的資料有一定介紹。這里筆者的設置環境為 Win8.1 中文版。
現有的Windows引導方式主要有兩種:Legacy + MBR 和 UEFI + GPT 方式。Legacy BIOS無法識別GPT分區表格式,所以也沒有LegacyBIOS+GPT組合方式;UEFI BIOS可同時識別MBR分區和GPT分區,所以UEFI下,MBR和GPT磁盤都可用於啟動操作系統。不過由於Windows限制,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文件生成開機選項菜單;
解決方案
針對上述的引導流程記錄,可以知道不論是傳統的Legacy+MBR或者是UEFI+GPT格式,主要過程都是通過特定的啟動管理器讀取配置文件從而生成系統選擇界面,並在選擇系統后對特定系統文件進行加載,故而一般的解決方案為在配置文件中加入其他系統的引導信息,從而可以根據該信息找到其他系統。
網上的解決方法有:
1.使用Ubuntu下的Boot-repair進行啟動修復,該操作可以借助安裝有Linux安裝程序的U盤來進行,具體可見Ubuntu幫助。但該方法是使用grub即Llinux系統對Windows系統進行引導。
2.使用Windows自帶的引導程序對linux進行引導,即將Ubuntu的相關引導信息加入Windows引導程序的配置文件中(一般是修改boot.ini文件),從而通過Windows的引導程序進行引導。這種方法對於Windows XP和Windows 7更為有效,因為這兩個系統的引導程序和配置文件都位於活動分區中,對其的修改更簡單,而之后的Windows引導程序好像不再使用boot.ini作為配置文件了,引導的設置更加復雜了。具體引導設置可以參考這里。具體的操作流程包括將Linux的啟動扇區作為一個文件拷貝至Windows的活動分區,並在boot.ini中設置一個指向該啟動扇區文件的項目,從而使得引導程序可以根據該設置去引導Linux系統。
借助安裝有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系統的活動分區,修改相關的boot.ini文件即可。
該種方法筆者做過嘗試但並未成功。個人認為這應該是最符合自身需求的方式,但失敗原因不詳,望能得到指點。(好像有結論說該種方式只能在Legacy BIOS模式系統中使用)
3.通過Windows8.1自帶的工具bcdedit來進行開機啟動設置。該工具在Windows NT之后的系統中提供。可通過bcdedit工具修改Win8.1下的BCD配置文件 和 設置對應的引導文件路徑,這樣Windows引導程序可以根據配置文件內容生成對應的引導菜單,引導程序也可根據設置路徑信息找到對應的系統程序。bcdedit的操作指令在文章開始的鏈接中有介紹。或者可以直接通過圖形界面工具easyBCD進行配置。
若自行手動配置,則需要新建一個啟動引導項,給出相應的引導文件所在分區和路徑、引導描述等參數。該種方式對於Windows系統引導其他Windows系統,如Win8.1引導Win10啟動是有效的。但貌似在Windows8.1中引導Linux系統無法成功(最大的問題在於無法設置對應的path路徑)。圖示為筆者設備雙系統Win10的相關信息。

4.Ubuntu12.04以及后續版本引入了對EFI模式的支持,所以可以將Ubuntu的引導程序GRUB安裝在設備的EFI分區中(原系統Win8.1在安裝時會划分,可以在磁盤管理中定位),此操作會在EFI分區中生成引導Ubuntu的文件,從而可以引導Ubuntu,原帖。但該貼的內容仍舊是通過Linux系統來引導Windows系統。筆者這里並沒有使用Linux系統來引導Windows系統,而是讓兩個系統的引導程序相互獨立,想要使用另一個系統時,則通過BIOS修改引導程序的使用順序。
首先將Ubuntu安裝至EFI分區,其中的目錄內容會發生改變,在EFI文件夾下新增了ubuntu的引導程序。
linux下的啟動分區即EFI分區掛載在/boot/efi下(可以通過df指令查看)

可以看到原EFI目錄中新增了ubuntu目錄

目錄中的內容如圖所示,其中的grubx64.efi和shimx64.efi均可進行Ubuntu系統的引導。其中前者無法在開啟安全啟動選項下進行啟動。

此方法的實際原理是Ubuntu和Windows使用兩個不同的引導系統,通過BIOS可以設置使用引導程序的順序。當默認首先使用bootx64.efi作為引導程序時,則會引導Windows系統,而首先使用grubx64.efi作為引導程序時,則會引導Linux系統。這樣的兩個系統之間無法進行相互引導,但也保證了兩個系統本身的情況不會相互干擾。設備開機時總是會默認載入BIOS中設置的第一順序的引導程序對應的操作系統。這種方法相當於將Linux啟動引導安裝在EFI分區,從而多出一個啟動文件grubx64.efi。通過選擇grubx64.efi/bootx64.efi來對不同的系統進行引導。
在之前的方法失敗后,筆者退而求其次的選擇了該方法並成功安裝。
