动机

最近在自学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引导》中的命令,把

`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信息)。

3a1b563deafc7af1374fba7b1323d601.png

若是你遇到一样问题,建议你经过Type-C接口外接键盘试试,或者拆开机器,取下固态硬盘开机后开机,让UEFI程序重置一下,接着插入固态硬盘,机器又能正常启动进入Windows了。

我是经过后一种方式解决的,同时附上固态硬盘的位置:

544e0813971e393ce18711b8c568764a.png

建议:保持 Windows Boot Manager为第一个默认启动选项,至少在KNOTE8上这样设置。

在经过Grub 2安装Ubuntu成功前,不要经过EasyUEFI工具、BIOS等将Grub 2设置为第一个默认入口至,少在酷比魔方KNOTE8上不要这样设置。

具体安装步骤

1. 关闭电源选项中的 启用快速启动(推荐),以下图

1d2312cd82a5471fc4b5946bfcf6d607.png

2. 压缩磁盘

2.1 打开 文件资源管理器,鼠标右击 此电脑,鼠标点击 管理。

5f90de76f8b9dfecc26546574a6ecd0f.png

2.2 在弹出的 计算机管理界面中,点击左边列表中的 存储->磁盘管理

选择一个剩余空间比较多的磁盘,鼠标右击,点击 压缩卷,以下图

b6def5ca9a67e67969493f039a7f554f.png

2.3 在 可用压缩空间量(MB)(E) 中输入你想为 Ubuntu 系统分配的磁盘空间, 而后点击 压缩

02142386fa556e2e294f2e507348f85f.png

4.4 获得一个 未利用分区(黑色)

d780cf6ede914f3767a29d007a4d465b.png

第一步就算完成了

3.  新建一个分区存放Grub 2的启动文件

在free space分区中新建一个200M左右的分区(本后面将此分区叫作 MY_UEFI),后面用于存放Grub 2启动文件。单独存放启动文件,避免损坏。损坏可能电脑就不能启动了。

3.1 鼠标右击步骤2建立的 未分配空间

194532db23a4093327d399f6d4a6951f.png

3.2 在 简单卷大小(MB)(S) 中输入要为Grub 2启动文件分配的大小,本教程设置为 200 MB

9ae332f3c49da6ff27cfb3aa6fd012c9.png

3.3 本教程中把 这个分区取名为 MY_UEFI

21fd6a79373f3b4416f68b2e69d58db3.png

4. 准备 Ubuntu 镜像安装文件

能够去Ubuntu官网

我下载了一个32位16.0.4LTS版本。

5. 下载Grub 2,生成能引导Grub 2启动的EFI文件

5.1 能够经过Grub 2官网

下载到本地后,进入Grub 2文件夹,个人在 C:\grub\grub-2.02-for-windows

下面的操做步骤参考自 《【Grub2】UEFI添加grub2引导》[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

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=5set menu_color_normal=white/black

set menu_color_highlight=black/light-gray

menuentry"-------------------" --class ubuntu --classos{

set root='(hd0,gpt1)'}

menuentry"reboot" --class windows --classos{

insmod reboot

reboot

}

menuentry"halt" --class windows --classos{

insmod halt

halt

}

5.7 重启系统,在出现启动画面时按F7(不一样厂商的快捷键可能会有差别)进入启动选项,以下图

“Windows Boot Manager”是windows的启动选项;“UEFI OS”是咱们新加的Grub 2的启动选项。

c2e2297666d4d28d3c1cffe25b449ace.png

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`,进入命令行格式

49d0321a97fc47a3836358786e3cb933.png

5.9 进入命令行后,输入 `ls –a -h`查看分区信息

在本例子中,个人C盘(名称是`Windows`)在(hd0,gpt3),个人Grub 2启动文件(名称是 `MY_UEFI`)在(hd0,gpt4)。

此时最好拍个照,后面会用到。

2c247c23f82e16be56a8bb592a0664aa.png

5.10 输入 `reboot`重启,正常启动,进入Windows系统

6. 在Grub2入口配置文件x64.cfg中新加一个启动项:Ubuntu ISO镜像文件

下面是新加的启动项:

#install Ubuntu from .iso file

menuentry "install ubuntu ISO" --class ubuntu --classos {

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`

55b0ce04c035fa25d53b0bf44f085faf.png

7.3 而后会进入Ubuntu桌面,首先卸载挂载的ISO文件

按键盘 `CTRL+ALT+T`打开命令行,输入`sudo umount –l /isodevice`卸载ISO文件。

若是想确认是否真的卸载成功,能够输入 `ls /`查看。

3387c8e8f756210942af63c1846e7099.png

7.4 双击桌面的 `Instal Ubuntu xxx`(xxx会根据你的版本而不一样),开始安装Ubuntu

945bfc02ef9c18fcf72dac458ef5ad2f.png

7.5 前3个页面我都保持了默认,这三个页面别是: Welcome, Wireless, Preparing to install Ubuntu

bc9076439f9572eb9969f25fa4b3e532.png 3ecd6ecda22b1024eaf985e538a5bd76.png dccdbb85941b1391b2c7d61cad665076.png

下面的步骤必定要当心,关系到双系统安装的成败,并且一不当心,还可能把原来的Windows系统弄坏。

7.6 Installation type  选择 “Something else”

0d5357a9f3d589e78ac5075bdda790a3.png

7.7 把Ubuntu安装到步骤的 free space中,在安装以前,须要将free space分区并格式化。

在本教程中,只分了两个分区。

Swap area : 约7G

Ubuntu系统分区: 约13G

7.7.1 点击“+”号新加分区。

4500d66db3045876f562e37e9a5e647c.png

7.7.2 新建7G左右的Swap area,

801fcca792b5e4578c64b7a89da8f3bf.png

7.7.3 新建13G左右文件分区,挂载在 根目录 `/`下:

54f5438229128ea8768952544be8a7d2.png

7.7.4 将Ubuntu的Bootloader安装到新建的13G左右的那个分区。

注意:不要保持默认值。默认值是把bootloader安装到硬盘,这可能坏损坏硬盘原有的Windows的启动。

3999a5ce1f8d2ec2c4d74adc6000bc2b.png

7.8 选择时区

bd6878ce4543cb3fc15fccef1f6c77d6.png

7.9 选择键盘类型

6a390971f87aa254fdff4c3fdb78b818.png

7.10 设置用户名密码

24ef5637fc694383824af30c56a62f1d.png

7.11 而后安装。

若是最后显示 Grub 安装失败,不要紧,此时Ubuntu已经安装完成,只是bootloader安装失败。咱们待会能够在Grub 2中添加Ubuntu引导,就能正常启动Ubuntu了。

901c8b18594ed0206d9b9d304cc5e4aa.png

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 --classos {

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中用 # 把相关的行注释掉(建议注释掉,下次有须要,直接去掉#又能看到了,不用再到网上查找一边)

eb20bcfbc3dca8ff21a94c0d90d1e21c.png

最后秀一下Ubuntu的登录界面:

b67b8ddfc64fc749ccef2aebdb1704fc.png

后问

这里的问题算是一些题外话,因此卸载最后,若是感兴趣,能够看看。

由于涉及到更深的技术,我的能力有限,若是有错误,欢迎指出。

UEFI和传统BIOS启动有什么差异?

这里不深刻,只谈这二者在重装系统方面的差别。

传统的BIOS启动顺序是:

开机->BIOS初始化 –> BIOS自检 –> BIOS 加载磁盘第一个扇区(只有512KB) ,而后BIOS就无论了,将控制权交给第一个扇区中的程序。第一个扇区512KB通常叫作也叫作MBR

UEFI的启动顺序是:

开机 –> UEFI初始化 –> 找到特定分区中的UEFI引导文件 –> 根据UEFI引导文件引导另外一个程序

UEFI第一个好处是,摆脱了第一个扇区的限制。

51f95371c08f0511f468b6038bc3f8b4.png

图 UEFI的启动顺序 (来自UEFI Specification Version 2.5中图2 页17)

下面是UEFI规范中的原话(UEFI Specification Version 2.5

“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 loaderor 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)指内存,而后将控制器转交给此扇区内的应用。

897566fe20c157afdf9b3cfc0c61e359.png

图 传统BIOS启动的启动选项

UEFI启动: UEFI比BIOS厉害多了,会把硬盘的全部分区都遍历一遍,找出可能的OS Loader,而后直接列在启动列表里。就好比下图:

1e4fcc1f441c1210a47f41e8feff835a.png

第二段第一句话“UEFI supports booting from media that contain an UEFI OS loaderor 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

”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 valueother 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类型。

参考

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐