UEFI+BOIS

https://help.ubuntu.com/community/LiveCDCustomization?highlight=%28%28InstallCDCustomization%29%29


Legacy BIOS和UEFI


BOIS+MBR

UEFI+GPT

操作系统两种启动模式

Legacy BIOS:在开机时需进行自检,启动过程较复杂。

由于

BIOS无法识别GPT分区

,所以在传统BIOS下GPT磁盘不能用于安装操作系统,只能用于数据存储。


UEFI:直接从预启动的操作环境加载操作系统,简化开机过程有效提高启动速度。

可以同时识别MBR和GPT,在UEFI模式中MBR和GPT都支持安装操作系统,

不过微软规定,在UEFI模式只能使用GPT硬盘安装Windows系统。



硬盘两种分区表:MBR和GPT

Legacy BIOS+MBR支持安装所有的Windows系统。

UEFI+GPT不能安装32位系统win7及win7之前的各种32位系统,支持安装64位的win7、win8、win8.1、win10以及32位的win8、win8.1、win10,xp x64是只支持基于x64的IA64安腾处理器才能GPT安装,基于AMDx64/IAx86架构的CPU是不能用于GPT安装的。



  • 准备开整
  • 基本步骤
  • 步骤一: 格式化U盘
  • 注意点: bios_grub标记的分区
  • 步骤二: 安装grub到U盘
  • 步骤三: 添加grub菜单




http://ju.outofmemory.cn/entry/204454 

准备开整

  • U盘一枚(4G容量以上,备份好数据,一会可能要重新格式化)
  • 可用的任意操作系统,64位(32位就不要折腾UEFI了)
  • UEFI ESP 预备知识,限于篇幅就不详细介绍了,自己看文档原理

USB启动的原理就不多做讲解了,有兴趣的话找找相关的文档,介绍很多,也很详细,跟硬盘引导过程差不多。注意的是BIOS+MBR模式和UEFI+GPT模式是不同的。

基本步骤

先说一下我的环境,金士顿16G U盘一个,操作系统是Deepin 2014.3 64bit,基于Ubuntu 14.04,其他类似的系统可以类比。Linux系统本来就使用grub引导(不要在CentOS/RHEL 6及以下版本折腾了,那个是Grub Legacy,已经不维护了),折腾起来要比其他操作系统方便的多,软件仓库就有grub相关的软件包,也不需要单独安装太多东西。Windows下可以用grub2win ,原理是一样的。

步骤一: 格式化U盘

想要支持UEFI引导,GPT是不可少了,而且GPT是兼容MBR了。所以第一步需要先将U盘格式化为GPT分区,这样efi文件可以和MBR共存,实现UEFI和BIOS双支持。

如果U盘已经是

Linux下支持GPT分区的工具: parted, gdisk。大致的步骤就是使用gdisk(命令和操作方式几乎和fdisk完全一样,只是支持GPT),或parted对U盘重新分区,然后标记ESP。如果用gdisk,只要给分区标记EF00编号即可,如果用parted,给分区boot标记即可。命令行就不演示了,很简单,我这边截图使用图形化工具gparted分区,同样结果也是GPT分区。

图形化的gparted操作也很简单,建立GPT分区表,分区,格式化为FAT32( 注: 尽管ESP支持多种分区,但是为了通用性与兼容性还是建议FAT32),标记分区为boot


这样U盘处理就完成了,使用gdisk或parted显示一下U盘的信息,看到这样的信息就是OK的

$ sudo gdisk-l /dev/sdb # 根据你的U盘的名字修改dev设备
GPT fdisk (gdisk) version0.8.8

Partition table scan:
MBR: protective     # <========================= 保护性的MBR,这个是GPT兼容MBR的一种设计
BSD: not present
APM: not present
GPT: present        # <========================= 看这里,已经是GPT了

Found valid GPTwith protective MBR;using GPT.  # <========== 这里的显示也说明是GPT分区
Disk /dev/sdb:30736384 sectors,14.7 GiB
Logical sector size:512 bytes
Disk identifier(GUID):022EE53E-9641-4D28-9394-0826CFA24730
Partition table holds up to128 entries
First usable sectoris 34,last usable sector is30736350
Partitions will be aligned on2048-sector boundaries
Total free spaceis 4029 sectors(2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
1            2048        30734335   14.7 GiB    EF00         # <======== 这里很关键,看Code是EF00,想要分区成为ESP必须设置这个标记,如果手工用gdisk别忘了这一步

$ sudo parted /dev/sdb print
Model: Kingston DataTraveler 3.0 (scsi)
磁盘 /dev/sdb: 15.7GB
Sector size (logical/physical): 512B/512B
分区表:gpt                                 # <======= GPT分区
Disk Flags:

数字 开始:  End    大小    文件系统 Name  标志
1  1049kB 15.7GB  15.7GB  fat32        启动, esp      # <===== ESP已经设置成功

注意点: bios_grub标记的分区

这个要特别强调,bios_grub标记的分区必须存在,否则BIOS模式下无法使用

有关bios_grub标记的分区说明: https://help.ubuntu.com/community/Installation/UEFI-and-BIOS#Make_a_system_bootable_in_UEFI_as_well_as_BIOS

这里我简单提及一下这个标记的作用。上面提到过,GPT兼容MBR,如果要让grub在GPT上使用MBR模式安装的话,需要设置这个标记。按照ubuntu官方文档(上面那个文档,想了解详细的话必看!),这个分区有以下几个特点:

  • 1MB容量
  • 不需要格式化
  • 设置bios_grub标记

如果用gdisk, parted, gparted这些工具分区的时候,你会发现总会有一个1MB的剩余空间,就是干这个用的,现在,我只需要给这个剩余空间分区,并打上bios_grub标记就行了(EF02),不用格式化。parted操作也类似

sudo gdisk /dev/sdb
# 下面可以看到gdisk的操作几乎和fdisk完全一样,熟悉fdisk可以无压力上手
GPT fdisk (gdisk) version 0.8.8
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-30736350, default = 30734336) or {+-}size{KMGTP}:
Last sector (30734336-30736350, default = 30736350) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'
Command (? for help): p
Disk /dev/sdb: 30736384 sectors, 14.7 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 0086B5EF-81D9-4BD1-816C-AD1EADCD2338
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 30736350
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number  Start (sector)    End (sector)  Size       Code  Name
            2048        30734335   14.7 GiB    EF00
        30734336        30736350   1007.5 KiB  EF02  BIOS boot partition # <== EF02对应的就是bios_grub这个标记
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
sudo parted /dev/sdb print
sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.8
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-30736350, default = 30734336) or {+-}size{KMGTP}:
Last sector (30734336-30736350, default = 30736350) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'
Command (? for help): p
Disk /dev/sdb: 30736384 sectors, 14.7 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 0086B5EF-81D9-4BD1-816C-AD1EADCD2338
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 30736350
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number  Start (sector)    End (sector)  Size       Code  Name
            2048        30734335   14.7 GiB    EF00
        30734336        30736350   1007.5 KiB  EF02  BIOS boot partition
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
$ sudo parted /dev/sdb print
Model: Kingston DataTraveler 3.0 (scsi)
磁盘 /dev/sdb: 15.7GB
Sector size (logical/physical): 512B/512B
分区表:gpt
Disk Flags: 
数字  开始:  End     大小    文件系统      Name                 标志
    1049kB  15.7GB  15.7GB  fat32                          启动, esp
    15.7GB  15.7GB  1032kB            BIOS boot partition  bios_grub  # <== 要的就是这个!

至此分区的步骤就完成了。如果你已经是GPT分区了,就不用重新分区了,只要处理成ESP就行了

步骤二: 安装grub到U盘

这一步相比上一步已经简单许多了,但还是有一个小坑需要注意。先贴命令:

$ sudo mount /dev/sdb1 /mnt -o uid=$USER,gid=$USER  # 没什么好说的,挂载U盘使用,加上uid和gid参数只是为了编辑文件不需要sudo而已
# grub安装到MBR
$  sudo grub-install --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.
# grub安装到ESP,特别注意--removable参数,安装到移动设备上一定要用这个参数
$ sudo grub-install --target x86_64-efi --efi-directory /mnt --boot-directory=/mnt/boot --removable
Installing for x86_64-efi platform.
Installation finished. No error reported.

命令没有任何难度,但是有几个坑需要特别注意:

  • Ubuntu的分包问题grub默认的target是i386-pc,这个target包含在 grub-pc 这个包,如果你的系统使用BIOS+MBR安装,这个包默认是存在的。x86_64-efi这个target包含在 grub-efi 这个包,只有你的系统使用UEFI+GPT方式安装这个包才会存在。如果某个target报错,错误信息类似于 grub-install: error:/usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory. 这样的话,就需要安装 grub-pcgrub-efi之后再试。
  • 安装到ESP要加–removable这个参数 这个参数专门针对于可移动设备,一定要加
  • bios_grub标记的分区 如果按照上面的分区过程操作了,增加了这个标记的分区,安装grub的时候会自动识别这个标记的分区并成功安装grub,否则报错:
    Installing for i386-pc platform.
    grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
    grub-install: warning: 无法嵌入。在此次安装中 GRUB 只能通过使用块列表安装。但是块列表是不可信赖的,不推荐使用。.
    grub-install:错误: will not proceed with blocklists.

步骤三: 添加grub菜单

如果前面都没问题的话,最后就只剩下添加grub菜单了。在 /mnt/boot/grub这个目录下,新建 grub.cfg配置文件就行了。grub2的语法很复杂,图省事就从网上各种摘抄拼接就行了。比如我把linux发行版的iso镜像都扔到了 boot/iso 这个目录,于是乎我的 grub.cfg成了这样:

# path to the partition holding ISO images (using UUID)
probe -u $root --set=rootuuid
set imgdevpath="/dev/disk/by-uuid/$rootuuid"
# define globally (i.e outside any menuentry)
insmod search_fs_uuid
search --no-floppy --set=isopart --fs-uuid $rootuuid
insmod all_video
menuentry "Linux Mint cinnamon 64bit ISO" {
 set isofile=/boot/iso/linuxmint-17.2-cinnamon-64bit.iso
 loopback loop ($isopart)$isofile
 linux (loop)/casper/vmlinuz file=/cdrom/preseed/linuxmint.seed boot=casper iso-scan/filename=$isofile noeject noprompt splash locale=zh_CN.UTF-8 --
 initrd (loop)/casper/initrd.lz
}
menuentry "Ubuntu Desktop 64bit ISO" {
 set isofile=/boot/iso/ubuntu-14.04.3-desktop-amd64+mac.iso
 loopback loop ($isopart)$isofile
 linux (loop)/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper iso-scan/filename=$isofile noeject noprompt splash locale=zh_CN.UTF-8 --
 initrd (loop)/casper/initrd.lz
}
menuentry "UbuntuKylin Desktop 64bit ISO" {
 set isofile=/boot/iso/ubuntukylin-14.04.3-desktop-amd64.iso
 loopback loop ($isopart)$isofile
 linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noeject noprompt splash locale=zh_CN.UTF-8 --
 initrd (loop)/casper/initrd.lz
}
menuentry "Ubuntu Server 64bit ISO" {
 set isofile=/boot/iso/ubuntu-14.04.3-server-amd64+mac.iso
 loopback loop ($isopart)$isofile
 set gfxpayload=keep
 linux (loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed iso-scan/filename=$isofile quiet --
 initrd (loop)/install/initrd.gz
}
menuentry "Deepin 2014 ISO" {
 set isofile=/boot/iso/deepin_2014.3_amd64.iso
 loopback loop ($isopart)$isofile
 linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noeject noprompt splash locale=zh_CN.UTF-8 --
 initrd (loop)/casper/initrd.lz
}







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值