【教程】在UEFI啓動方式下,經過GRUB2引導,直接從硬盤ISO文件安裝Windows10和Ubuntu雙系統

本文爲做者原創,容許轉載,但必須註明原文地址: http://www.javashuo.com/article/p-olaxbege-e.htmlhtml

動機

最近在自學MIT6.828 Operating System Engineering, 這門課程的代碼是針對Linux系統(Ubuntu)的。linux

我有一臺WIN10平板電腦,基本信息以下:git

  • 型號是酷比魔方KNOTE8
  • 處理器是Intel Core m3-7Y30 CPU @1.00GHz 1.61GHz
  • RAM 8.00GB

學習編程,必需要動手練習。爲了讓MIT6.828的課程的代碼跑起來,我前後:編程

  • 先裝了一個虛擬機 Virtual Box, 這個虛擬機是免費的,可是速度太慢了。個人平板電腦是支持觸屏的,但Virtual Box對觸屏支持不好。速度慢+體驗差,因此我決定放棄虛擬機。
  • 在WIN10上安裝Cywin,模擬Linux環境。結果編譯MIT6.828中的代碼時一直報錯缺乏一些依賴的庫。這個問題很難修復,因此就放棄了。
  • 爲了速度快+體驗好,我決定裝WIN10+Ubuntu雙系統。

手邊只有一個平板電腦,沒有U盤,光盤,因此計劃是直接從硬盤安裝Ubuntu操做系統。ubuntu

網上有相關資料,但很零散,因此我就寫一篇完整的,但願能夠幫助有一樣需求的人,能夠少走一些彎路。windows

適用

下面介紹的WIN10+Ubuntu雙系統安裝教程適用於下面狀況:app

1. 電腦中已經有一個Windows操做系統 框架

     雖然我本身是WIN10操做系統,但對WIN8, WIN7應該也適用。less

2. 你電腦硬盤的分區是 GPT分區,非MBR分區。ide

    若是不知道如何查看電腦硬盤是GPT分區仍是MBR分區,參照[2]

    若是你硬盤分區格式是MBR,恭喜你,你能夠經過EasyBCD輕鬆地安裝雙系統,建議你到百度搜索相關教程。EasyBCD是免費的哦

3. 電腦的啓動方式是 UEFI,而非傳統的BIOS模式

     若是你的電腦是傳統的BIOS啓動方式,恭喜你,你能夠經過EasyBCD輕鬆地安裝雙系統.

4. 你想直接經過硬盤安裝 (你電腦不支持,或者你不想經過U盤、光盤安裝)

若是上面的條件你都知足,那麼下面的教程應該適合你。


安裝概覽

我怎麼折騰的過程就不分享了,直接上成功的經驗吧。

在開始具體一步步操做以前,先大概介紹一下安裝的過程。

1. 壓縮磁盤,獲得一個可安裝Ubuntu的free space分區(黑色)

2. 在free space分區中新建一個200M左右的分區(本後面將此分區起名爲 MY_UEFI),用於存放Grub 2啓動文件

3. 準備Ubuntu鏡像安裝文件 (文件類型位iso, 好比 ubuntu-16.04.5-desktop-i386.iso)。本教程假設鏡像文件在C盤根目錄

4. 下載Grub 2,生成能被EFI識別、加載的Grub 2鏡像文件 (使用Grub 2自帶的工具 grub-mkimage.exe生成鏡像文件)

5. 在盤MY_UEFI的根目錄創一個EFI文件夾,拷貝步驟4建立的相關文件到EFI文件夾。

6. 重啓系統,按快捷鍵進入啓動選項,進入 Grub 2界面,在Grub 2命令行中得到鏡像文件所在的gpt分區。 (注: C盤不必定就對應gpt1哦,最好在grub命令行獲得每一個磁盤分區的gpt號。固然也能夠瞎猜,一個個試)

7. 得到iso文件所在磁盤分區的gpt號以後,重啓系統,進入Windows系統。添加Ubuntu鏡像文件做爲一個入口點到Grub 2的啓動配置文件中

8. 重啓系統,進入Grub 2,啓動Ubuntu並安裝

10. 安裝完成Ubuntu後,若是Ubuntu最後安裝Grub 2失敗,須要從新進入Windows,修改Grub 2的 配置文件,使它能正常引導新安裝的Ubuntu系統啓動。

若是一切順利,就能夠開始享受Ubuntu啦!


重要提醒:


安裝雙系統有風險,操做不當可能致使原來系統、重要數據被擦除,電腦不能啓動成磚頭。因此建議多看,有很大把握再慢慢操做,必定要慢!!


下面就是我冒然操做致使個人KNOTE 8成磚頭的教訓。

能被UEFI啓動的Grub 2鏡像文件是由`grub-mkimage.exe`生成的,`grub-mkimage.exe`的格式是 `grub-mkimage.exe [OPTION...] [OPTION]... [MODULES]`,我隨意改了《【Grub2】UEFI添加grub2引導》[9]中的命令,把

`grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true`

中的後半部分[MODULES]

`part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true`

都刪掉了,致使Grub 2識別不了硬盤格式等,直接進入Grub rescue模式後,我只有按電源鍵強制關機重啓,而後電腦就像抽了同樣,在開機時按ESC、F七、DEL鍵都沒反應,直接再次進入Grub rescue模式,此時的電腦就成磚頭了,就像下圖(我把BIOS設置中的QIEUT BOOT關閉了,因此就不顯示酷比魔方圖標,而是顯示Megatrends信息)。

176352697338243996

若是你遇到一樣問題,建議你經過Type-C接口外接鍵盤試試,或者拆開機器,取下固態硬盤開機後開機,讓UEFI程序重置一下,接着插入固態硬盤,機器又能正常啓動進入Windows了。

我是經過後一種方式解決的,同時附上固態硬盤的位置:

image


建議:保持 Windows Boot Manager 爲第一個默認啓動選項,至少在KNOTE8上這樣設置。

在經過Grub 2安裝Ubuntu成功前,不要經過EasyUEFI工具、BIOS等將Grub 2設置爲第一個默認入口至,少在酷比魔方KNOTE8上不要這樣設置。


具體安裝步驟


1. 關閉電源選項中的 啓用快速啓動(推薦),以下圖

image


2. 壓縮磁盤

2.1 打開 文件資源管理器,鼠標右擊 此電腦,鼠標點擊 管理

image

2.2 在彈出的 計算機管理 界面中,點擊左邊列表中的 存儲->磁盤管理

選擇一個剩餘空間比較多的磁盤,鼠標右擊,點擊 壓縮卷,以下圖

image

2.3 在 可用壓縮空間量(MB)(E) 中輸入你想爲 Ubuntu 系統分配的磁盤空間, 而後點擊 壓縮

42308456071251900

4.4 獲得一個 未利用 分區(黑色)

image

第一步就算完成了

3.  新建一個分區存放Grub 2的啓動文件

在free space分區中新建一個200M左右的分區(本後面將此分區叫作 MY_UEFI),後面用於存放Grub 2啓動文件。單獨存放啓動文件,避免損壞。損壞可能電腦就不能啓動了。

3.1 鼠標右擊步驟2建立的 未分配空間

image

3.2 在 簡單卷大小(MB)(S) 中輸入要爲Grub 2啓動文件分配的大小,本教程設置爲 200 MB

 image

3.3 本教程中把 這個分區取名爲 MY_UEFI

 image

4. 準備 Ubuntu 鏡像安裝文件

能夠去Ubuntu官網[7]下載。

我下載了一個32位16.0.4LTS版本。

5. 下載Grub 2,生成能引導Grub 2啓動的EFI文件

5.1 能夠經過Grub 2官網[8]下載,能夠經過ftp或者git下載。

下載到本地後,進入Grub 2文件夾,個人在 C:\grub\grub-2.02-for-windows

下面的操做步驟參考自 《【Grub2】UEFI添加grub2引導》[9],下面以64位電腦爲例(不是要安裝的操做系統的位數)。若是下面64位的方法不行,能夠參考[9]中方法按32位生成一個啓動文件試試。

5.2 打開 CMD 命令行,經過下面命令切換到 Grub 2所在文件夾

cd /D C:\grub\grub-2.02-for-windows


5.3 生成配置文件

在grub-2.02-for-windows當前目錄下新建一個配置文件,由於是64的,因此配置文件命名爲x86_64-eif.cfg(能夠先建立一個 txt 文件,而後把後綴從txt改成cfg便可)。文件內容以下:

search --file /EFI/grub/x64.cfg --set root
set prefix=($root)/EFI/grub configfile ($root)/EFI/grub/x64.cfg

第一行: # The line start with # is one comment # 查找含有 /EFI/grub/x64.cfg的分區,並將分區號賦給root

第二行: 設置變量 prefix

第三行: 加載一個配置文件,讀取配置文件中的 entry point(操做系統入口),並在啓動目錄中顯示。x64.cfg就是咱們的啓動目錄配置文件,待會兒咱們會建立

若是對上面每行的命令想深刻了解,能夠到Grub 2[10]官網查看官方文檔。

5.4 生成引導Grub 2啓動的EFI文件

grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true

`grub-mkimage.exe`的做用是生產一個可啓動的GRUB鏡像文件,這個鏡像文件就是UEFI能夠啓動的OS Loader。

`grub-mkimage.exe`的語法是:

grub-mkimage.exe [OPTION...] [OPTION]... [MODULES]

上述命令行中的前半部分 `grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi` 是Grub 2的[OPTION],好比 `-o ./bootx64.efi` 中的 `-o`後面接的就是生成的Grub 2的EFI啓動文件。

上述命令的後半部分’(從`part_gpt `到結尾的`true`),都是咱們將要用到的Grub 2的模塊。這些模塊存放在文件夾`x86_64-efi`下面,好比第一個`part_gpt`就對應文件夾`x86_64-efi`下面的`part_gpt.mod`。

注意:不要隨意刪除後部分中的模塊!! 好比,若是刪除 `gpt_part`模塊,Grub 2就不能識別GPT分區,而後報錯,Grub 2就會進入 Grub rescue模式。若是啓動模式設置有問題,就算重啓也會卡在Grub rescue模式,換句話說,電腦就成磚頭了!!

若是對上述命令不懂,能夠輸入 `grub-mkimage.exe –help` 查看幫助文檔,和Grub 2的官方文檔。

5.5 在C盤根目錄建立一個文件夾 EFI,最終的文件夾結構以下。

/EFI
├───boot
    │  bootx64.efi
|
|
└───grub
    │  x64.cfg
    │  unicode.pf2 ├───locale ├───themes └───x86_64-efi

將5.4中生成的bootx64.efi文件拷貝指boot目錄下。

同時將`grub-2.02-for-windows`自帶的文件夾 locale, theme和x86_64-efi和文件unicode.pf2拷貝到grub文件夾中。

5.6 建立Grub 2入口配置文件(啓動列表)

如今的入口文件只是一個框架,等咱們在Grub 2命令行中查到Windows和Ubuntu ISO文件所在的gpt分區號,在回來添加。

在grub文件夾夾中建立 x64.cfg文件,文件內容以下。

if loadfont /boot/grub/unicode.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
fi

#default select menu index
set default=0
 
#timeout
set timeout_style=menu
set timeout=5

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "-------------------" --class ubuntu --class os{
    set root='(hd0,gpt1)'
}
 
menuentry "reboot" --class windows --class os{
    insmod reboot
    reboot
}
 
menuentry "halt" --class windows --class os{
    insmod halt
    halt
}


5.7 重啓系統,在出現啓動畫面時按F7(不一樣廠商的快捷鍵可能會有差別)進入啓動選項,以下圖

「Windows Boot Manager」是windows的啓動選項;「UEFI OS」是咱們新加的Grub 2的啓動選項。

158724770980841175

5.8 選擇「UEFI OS」,進入Grub 2界面, 以下圖

屏幕底部的提示,按`e`能夠編輯啓動選項,按`c`進入Grub 2 命令行(Command line).

在配置Grub 2入口配置文件(x64.cfg),配置文件中須要指定操做系統所在的GPT分區號 (格式爲 (hd0, gpt1))。一樣是C盤,在Windows,Grub2,Linux下的GPT編號可能都不同,因此最好在Grub 2中查看gpt分區號。

因此按`c`,進入命令行格式

6981421880931732


5.9 進入命令行後,輸入 `ls –a -h`查看分區信息

在本例子中,個人C盤(名稱是`Windows`)在(hd0,gpt3),個人Grub 2啓動文件(名稱是 `MY_UEFI`)在(hd0,gpt4)。

此時最好拍個照,後面會用到。

373233861513389173


5.10 輸入 `reboot`重啓,正常啓動,進入Windows系統


6. 在Grub2入口配置文件x64.cfg中新加一個啓動項:Ubuntu ISO鏡像文件


下面是新加的啓動項:

# install Ubuntu from .iso file
menuentry "install ubuntu ISO" --class ubuntu --class os {
    insmod ntfs
    insmod loopback
    
    # In my computer, Ubuntu ISO file is stored in (hd0, gpt3)
    set root='(hd0,gpt3)'

    # In this tutor, iso file is stored under C:/
    # The / before ubuntu_i386.iso is mandatory!!!
    set isofile=/ubuntu_i386.iso
    loopback loop $isofile
    linux    (loop)/casper/vmlinuz  boot=casper iso-scan/filename=$isofile
    initrd    (loop)/casper/initrd

}


7. 重啓電腦,開始裝Linux

7.1 重啓系統,按F7(酷比魔方是F7,其餘電腦可能會有差別)進入啓動選項。選擇 `UEFI OS`,參照步驟5.7

7.2 在Grub 2啓動列表中,選擇 `install ubuntu ISO`

152544451324625964

7.3 而後會進入Ubuntu桌面,首先卸載掛載的ISO文件

按鍵盤 `CTRL+ALT+T`打開命令行,輸入`sudo umount –l /isodevice`卸載ISO文件。

若是想確認是否真的卸載成功,能夠輸入 `ls /`查看。

481799055026157072

7.4 雙擊桌面的 `Instal Ubuntu xxx`(xxx會根據你的版本而不一樣),開始安裝Ubuntu

209705140912350397

7.5 前3個頁面我都保持了默認,這三個頁面別是: Welcome, Wireless, Preparing to install Ubuntu

544829722819146481 456354996297079921 608324660861512690 

下面的步驟必定要當心,關係到雙系統安裝的成敗,並且一不當心,還可能把原來的Windows系統弄壞。

7.6 Installation type  選擇 「Something else」

453041072093446320


7.7 把Ubuntu安裝到步驟的 free space中,在安裝以前,須要將free space分區並格式化。

在本教程中,只分了兩個分區。

  • Swap area : 約7G
  • Ubuntu系統分區: 約13G

7.7.1 點擊「+」號新加分區。

image

7.7.2 新建7G左右的Swap area,

524114776317793132

7.7.3 新建13G左右文件分區,掛載在 根目錄 `/`下:

323466937021999674

7.7.4 將Ubuntu的Bootloader安裝到新建的13G左右的那個分區。

注意:不要保持默認值。默認值是把bootloader安裝到硬盤,這可能壞損壞硬盤原有的Windows的啓動。

image

7.8 選擇時區

481399072517505938

7.9 選擇鍵盤類型

121753677367680844

7.10 設置用戶名密碼

538866880636994160

7.11 而後安裝。

若是最後顯示 Grub 安裝失敗,不要緊,此時Ubuntu已經安裝完成,只是bootloader安裝失敗。咱們待會能夠在Grub 2中添加Ubuntu引導,就能正常啓動Ubuntu了。

838255434399665308


8. 正常重啓後進入Windows,在x64.cfg中添加 Windows和Linux啓動項

重啓進入Windows,編輯x64.cfg文件,添加Ubuntu和Windows入口,以下。若是你不肯定新安裝的Ubuntu所在分區的gpt號碼,能夠進入Grub 2命令行查看(參考5.8-5.9)。

menuentry "Ubuntu-16.04.5" {
    insmod ext2
    # Which gpt is located needs you to check firstly
    set root='(hd0,gpt9)'
    linux /vmlinuz ro root=/dev/sda9
    initrd /initrd.img
    echo "Start Ubuntu-16.04.5"
}

menuentry "WIN10" --class windows --class os {
    insmod ntfs
    set root='(hd0,gpt1)'
 
    clear
    echo "Start Windows"
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

9. 重啓進入新安裝的Ubuntu

重啓電腦,按F7,選擇進入Grub 2引導,能看到下面入口。若是你不想在看到 `install linux ISO`入口,能夠在x64.cfg中用 # 把相關的行註釋掉(建議註釋掉,下次有須要,直接去掉#又能看到了,不用再到網上查找一邊)

714499128733178494

最後秀一下Ubuntu的登錄界面:

688799123751805294


後問

這裏的問題算是一些題外話,因此卸載最後,若是感興趣,能夠看看。

由於涉及到更深的技術,我的能力有限,若是有錯誤,歡迎指出。

UEFI和傳統BIOS啓動有什麼差異?

這裏不深刻,只談這二者在重裝系統方面的差別。

傳統的BIOS啓動順序是:

開機->BIOS初始化 –> BIOS自檢 –> BIOS 加載磁盤第一個扇區(只有512KB) ,而後BIOS就無論了,將控制權交給第一個扇區中的程序。第一個扇區512KB通常叫作也叫作MBR[5],這個MBR會進一步加載另外一個程序(多是另外一個程序,好比EasyBCD,Grub 2,也多是操做系統)。

UEFI的啓動順序是:

開機 –> UEFI初始化 –> 找到特定分區中的UEFI引導文件 –> 根據UEFI引導文件引導另外一個程序

UEFI第一個好處是,擺脫了第一個扇區的限制。



image

圖 UEFI的啓動順序 (來自UEFI Specification Version 2.5[6]中圖2 頁17)

下面是UEFI規範中的原話(UEFI Specification Version 2.5[6] 頁17):

「UEFI allows the consolidation of boot menus from the OS loader and platform firmware into a single platform firmware menu. These platform firmware menus will allow the selection of any UEFI OS loader from any partition on any boot medium that is supported by UEFI boot  services. An UEFI OS loader can support multiple options that can appear on the user interface. It is also possible to include legacy boot options, such as booting from the A: or C: drive in the platform firmware boot menus.
UEFI supports booting from media that contain an UEFI OS loader or an UEFI-defined System Partition. An UEFI-defined System Partition is required by UEFI to boot from a block device. UEFI does not require any change to the first sector of a partition, so it is possible to build media  that will boot on both legacy architectures and UEFI platforms.」

裏面有幾個概念,

OS loader: OS表明操做系統, OS loader就是操做系統加載應用,好比 Grub 2, EasyBCD(惋惜EasyBCD最新版本2.3仍然不支持UEFI)

platform firmware: 結合圖1理解,這裏應該指主板的固件。firmware menu應該指在開機時按 ESC、F7看到的啓動目錄(具體按哪個鍵不一樣廠商有差異)。

第一段的話是說UEFI能夠吧OS loader和主板固件的啓動項目合併在一塊兒,呈現給用戶。舉個例子來講:

  • 對於傳統的BIOS啓動,在電腦剛開機時,按F7進入啓動選項(這裏假設爲F7),咱們只能選擇從硬盤啓動、從U盤啓動或者從光盤啓動。

就算此時硬盤內裝了多個操做系統,或者有多個OS loader(好比一個Windows自帶的loader,另外一個咱們本身安裝的Grub 2),咱們也只有一個選項,從硬盤啓動。

若是選擇今後硬盤啓動,BIOS會加載此硬盤第一個扇區(MBR)指內存,而後將控制器轉交給此扇區內的應用。

image

圖 傳統BIOS啓動的啓動選項

  • UEFI啓動: UEFI比BIOS厲害多了,會把硬盤的全部分區都遍歷一遍,找出可能的OS Loader,而後直接列在啓動列表裏。就好比下圖:

image

第二段第一句話「UEFI supports booting from media that contain an UEFI OS loader or an UEFI-defined System Partition. 「,給個人感受時,UEFI也能夠不從OS Loader啓動,而從一個UEFI定義的系統分區啓動,容許每一個OEM廠商實現上的差別。值得慶幸的是,對於個人平板KNOTE8,UEFI會遍歷硬盤全部分區,找到全部的OS Loader,而不是隻從 UEFI定義的系統分區啓動。酷比魔方仍是很給力的!


我也很好奇什麼是UEFI-Defined System Partition? 因此研究了一下標準。

UEFI-Defined System Partition是一個FAT格式,對於硬盤是FAT32格式,對於移動設備是FAT十二、或FAT16格式。同時爲了和通常的FAT格式區分開,用於UEFI的FAT格式有一個特殊的GUID類型:」C12A7328-F81F-11D2-BA4B-00A0C93EC93B「[1] [6]P123,通常的FAT格式的GUID類型爲」EBD0A0A2-B9E5-4433-87C0-68B6B72699C7「。

下面是UEFI規範中的原話(UEFI Specification Version 2.5[6] 頁536)

」The file system supported by the Extensible Firmware Interface is based on the FAT file system.

EFI encompasses the use of FAT32 for a system partition, and FAT12 or FAT16 for removable media. The FAT32 system partition is identified by an OSType value other than that used to identify previous versions of FAT. This unique partition type distinguishes an EFI defined file system from a normal FAT file system.「

上段話中的「OSType value」應該就是指特殊的GUID類型。


參考

[1] GPT(GUID Partition Table): https://en.wikipedia.org/wiki/GUID_Partition_Table

[2] 如何查看電腦硬盤是gpt分區仍是MBR分區

[3] ESP(EFI System Partition): https://en.wikipedia.org/wiki/EFI_system_partition

[4] UFEI (Unified Extensible Firmware Interface): https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface

[5] MBR主引導扇區解析

[6] "UEFI Specification Version 2.5" (PDF).

[7] Ubuntu桌面操做系統: https://cn.ubuntu.com/desktop/

[8] Grub 2官網下載連接: https://www.gnu.org/software/grub/grub-download.html

[9] 【Grub2】UEFI添加grub2引導: https://blog.csdn.net/xinlan3618/article/details/79862667

[10] Grub 2官網文檔: https://www.gnu.org/software/grub/grub-documentation.html]

相關文章
相關標籤/搜索