教程在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统

Posted 佰夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统相关的知识,希望对你有一定的参考价值。

本文为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/9949789.html

动机

最近在自学MIT6.828 Operating System Engineering, 这门课程的代码是针对Linux系统(Ubuntu)的。

我有一台WIN10平板电脑,基本信息如下:

  • 型号是酷比魔方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操作系统。

网上有相关资料,但很零散,所以我就写一篇完整的,希望可以帮助有同样需求的人,可以少走一些弯路。

适用

下面介绍的WIN10+Ubuntu双系统安装教程适用于下面情况:

1. 电脑中已经有一个Windows操作系统

     虽然我自己是WIN10操作系统,但对WIN8, WIN7应该也适用。

2. 你电脑硬盘的分区是 GPT分区,非MBR分区。

    如果不知道如何查看电脑硬盘是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、F7、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格式,对于移动设备是FAT12、或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]

以上是关于教程在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统的主要内容,如果未能解决你的问题,请参考以下文章

GPT+UEFI双系统引导

UEFI和GPT下硬盘克隆后的BCD引导修复

UEFI+GPT引导实践篇:切换到UEFI启动,准备安装介质

电脑一开机就进入“uefi bios utility”,怎么设置?

UEFI引导过程及windows引导修复

如何创建 UEFI 只读变量?