文档章节

[grub实现]U盘引导多个linux镜像安装,同时支持BIOS和UEFI模式

Feng_Yu
 Feng_Yu
发布于 2015/08/12 11:48
字数 2476
阅读 12303
收藏 60

前言: 生命不息,折腾不止。在折腾中进步,在踩坑中成长。

补: 我的grub.cfg配置已经托管到oschina git仓库: http://git.oschina.net/abcfy2/grub-cfg

准备开整

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

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双支持。

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

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

创建分区表 分区表类型GPT 输入图片说明 输入图片说明 输入图片说明

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

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

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

Found valid GPT with 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 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 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
   1            2048        30734335   14.7 GiB    EF00  
   2        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
Model: Kingston DataTraveler 3.0 (scsi)
磁盘 /dev/sdb: 15.7GB
Sector size (logical/physical): 512B/512B
分区表:gpt
Disk Flags: 

数字  开始:  End     大小    文件系统      Name                 标志
 1    1049kB  15.7GB  15.7GB  fat32                          启动, esp
 2    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
}

根据自己的需求增删改改就行了。想进一步美化的话,grub2关于美化的文档也很多,就不赘述了。

注意: 不要使用虚拟机测试,因为虚拟机不能完整模拟主板。因此不一定能引导你的U盘,让你误以为制作失败了。尽可能用真机去测试引导。

最后,贴一个效果图,可以看到BIOS模式和UEFI都可以引导了

输入图片说明输入图片说明

补充: 稍作美化一下效果

输入图片说明

参考文献

© 著作权归作者所有

共有 人打赏支持
Feng_Yu
粉丝 157
博文 38
码字总数 45571
作品 0
西安
运维
私信 提问
加载中

评论(27)

强强兄
强强兄

引用来自“sam_chin”的评论

boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?

引用来自“Feng_Yu”的评论

几种办法解决。fat32是ESP的要求,你可以把grub的efi文件放在ESP上引导,存储放在其他文件系统上,配置上就得改一下。

另外一个个人比较推荐的方式就是改用4G以内DVD镜像。这些发行版会考虑到刻盘的方便,提供4G以内的镜像,用那种镜像就可以了。印象中centos 7的DVD1就在4G以内。opensuse应该有cd版本。

引用来自“sam_chin”的评论

centos现在没有2个DVD , 都是一个,或者是 不完整, Minimal版本;

存储放在其他文件系统上, 增加一个分区吗?

引用来自“Feng_Yu”的评论

也可以考虑放livecd进去啊,那个dvd似乎就是4G,应该能放进去吧?如果放不进去的话你只能创建分区了,格式化成ext4或者xfs或者其他grub支持的分区

引用来自“sam_chin”的评论

我新建了一个 ntfs 分区, 稍微修改了下 配置文件, 现在 opensuse , centos, mint 都可以了;

ntfs 那个分区, 平常跟普通U盘一样使用, 挺好
请教个问题, 你新建了一个ntfs分区, grub.cfg是怎么配置的, 可以指点一下吗. 初次配置grub, 搞了两天没有搞定, 可以发到我邮箱里 305318952@qq.com 感谢了.
GunsNRose
GunsNRose
好文章,收藏,正在折腾 btrfs + gpt + bios方式启动移动硬盘上的archlinux
sam_chin
sam_chin

引用来自“sam_chin”的评论

boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?

引用来自“Feng_Yu”的评论

几种办法解决。fat32是ESP的要求,你可以把grub的efi文件放在ESP上引导,存储放在其他文件系统上,配置上就得改一下。

另外一个个人比较推荐的方式就是改用4G以内DVD镜像。这些发行版会考虑到刻盘的方便,提供4G以内的镜像,用那种镜像就可以了。印象中centos 7的DVD1就在4G以内。opensuse应该有cd版本。

引用来自“sam_chin”的评论

centos现在没有2个DVD , 都是一个,或者是 不完整, Minimal版本;

存储放在其他文件系统上, 增加一个分区吗?

引用来自“Feng_Yu”的评论

也可以考虑放livecd进去啊,那个dvd似乎就是4G,应该能放进去吧?如果放不进去的话你只能创建分区了,格式化成ext4或者xfs或者其他grub支持的分区
我新建了一个 ntfs 分区, 稍微修改了下 配置文件, 现在 opensuse , centos, mint 都可以了;

ntfs 那个分区, 平常跟普通U盘一样使用, 挺好
Feng_Yu
Feng_Yu

引用来自“sam_chin”的评论

boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?

引用来自“Feng_Yu”的评论

几种办法解决。fat32是ESP的要求,你可以把grub的efi文件放在ESP上引导,存储放在其他文件系统上,配置上就得改一下。

另外一个个人比较推荐的方式就是改用4G以内DVD镜像。这些发行版会考虑到刻盘的方便,提供4G以内的镜像,用那种镜像就可以了。印象中centos 7的DVD1就在4G以内。opensuse应该有cd版本。

引用来自“sam_chin”的评论

centos现在没有2个DVD , 都是一个,或者是 不完整, Minimal版本;

存储放在其他文件系统上, 增加一个分区吗?
也可以考虑放livecd进去啊,那个dvd似乎就是4G,应该能放进去吧?如果放不进去的话你只能创建分区了,格式化成ext4或者xfs或者其他grub支持的分区
sam_chin
sam_chin

引用来自“sam_chin”的评论

boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?

引用来自“Feng_Yu”的评论

几种办法解决。fat32是ESP的要求,你可以把grub的efi文件放在ESP上引导,存储放在其他文件系统上,配置上就得改一下。

另外一个个人比较推荐的方式就是改用4G以内DVD镜像。这些发行版会考虑到刻盘的方便,提供4G以内的镜像,用那种镜像就可以了。印象中centos 7的DVD1就在4G以内。opensuse应该有cd版本。
centos现在没有2个DVD , 都是一个,或者是 不完整, Minimal版本;

存储放在其他文件系统上, 增加一个分区吗?
Feng_Yu
Feng_Yu

引用来自“sam_chin”的评论

boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?
几种办法解决。fat32是ESP的要求,你可以把grub的efi文件放在ESP上引导,存储放在其他文件系统上,配置上就得改一下。

另外一个个人比较推荐的方式就是改用4G以内DVD镜像。这些发行版会考虑到刻盘的方便,提供4G以内的镜像,用那种镜像就可以了。印象中centos 7的DVD1就在4G以内。opensuse应该有cd版本。
sam_chin
sam_chin
boot 分区 fat32 格式, 最大4G, centos7, opensuse的iso 都 超过4G了。
怎么办?
Feng_Yu
Feng_Yu

引用来自“aozakiaoko”的评论

引用来自“Feng_Yu”的评论

引用来自“aozakiaoko”的评论

请教下怎么在windows平台使用grub2win制作?

没研究过这个软件,我现在已经不怎么用windows了。我觉得你可以看看官方文档。或者干脆搞个ubuntu虚拟机,在虚拟机下操作,我这些命令都是在ubuntu下测试过的
好的 谢谢 平时主要用的都是centos7 应该也可以吧?

理论上应该没有问题
a
aozakiaoko

引用来自“Feng_Yu”的评论

引用来自“aozakiaoko”的评论

请教下怎么在windows平台使用grub2win制作?

没研究过这个软件,我现在已经不怎么用windows了。我觉得你可以看看官方文档。或者干脆搞个ubuntu虚拟机,在虚拟机下操作,我这些命令都是在ubuntu下测试过的
好的 谢谢 平时主要用的都是centos7 应该也可以吧?
Feng_Yu
Feng_Yu

引用来自“aozakiaoko”的评论

请教下怎么在windows平台使用grub2win制作?

没研究过这个软件,我现在已经不怎么用windows了。我觉得你可以看看官方文档。或者干脆搞个ubuntu虚拟机,在虚拟机下操作,我这些命令都是在ubuntu下测试过的
UEFI/GPT 模式下 Win10 & Linux 双系统解决方案

写这篇文章的初衷在于网络上关于 Windows 和 Linux 双系统的安装大多停留在 BIOS/MBR 时代,而现在计算主板主要为 UEFI/GPT 的架构。本文假设读者已经重装过几次 Windows 系统,对计算机基础...

Altair_Wei
10/31
0
0
【亲测不管用】【DELL安装系统的坑】亲测UEFI启动模式的电脑安装Win10和Ubuntu双系统(dell笔记本和hp笔记本)

这个内容转自:http://blog.csdn.net/ysy950803/article/details/52643737 非常感谢上面的博主,我在网上找了许多教程都是老的教程,都不太对。 首先是dell笔记本的: 最新提示:双硬盘(固态...

Airship
05/06
0
0
Arch Linux 安装指南

1. 前提 为什么推荐Arch Linux?因为它好用呗! 如果想要学习Linux,Arch Linux是个很好的选择。Arch Linux提供了非常详细并且更新及时的Wiki(帮助文档),使用系统的过程中遇到的问题基本上...

清无色
05/14
0
0
use grub2 make dual boot cd(support bios and UEFI)

使用grub2 制作支持BIOS&UEFI 双启动的ISO镜像 首先就是准备grub2了。最新的Release版本可以从这里获取: ftp://ftp.gnu.org/gnu/grub. 其他信息参考 http://www.gnu.org/software/grub/ Co...

用户名已存在
2012/09/06
0
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Win10:默认的图片打开应用,打开图片时速度明显很慢的解决办法

首先,我们随便地打开一张图片。然后,点击右上角的三个小点,最后点击弹出菜单最下面的“设置”。如下图: 在“设置”中找到下面的“人物”,把它关掉就好了。 原来,默认情况下,Win 10的图...

LivingInFHL
53分钟前
2
0
js代码激发onchange事件,兼容谷歌火狐IE

var el = document.getElementsByName('role')[0]; el.value = '3'; var evt = document.createEvent("HTMLEvents"); evt.initEvent("change", false, true); el.dispatchEvent(evt);......

我退而结网
今天
3
0
mysql客户端报错:libmysqlclient_16 not defined in file libmysqlclient.so.16

报错情况: 安装完mydumper之后(上一篇文章),登陆Mysql客户端报错:version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference 同样:mysql的其他客...

machogyb
今天
1
0
MySQL 数据库中间件 安装部署测试全过程

1、环境准备 1.1、操作系统环境 [root@MyCat conf]# uname -aLinux MyCat 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux 1.2、关闭SELIN......

PeakFang-BOK
今天
6
0
Linux Mysql 安装

https://www.cnblogs.com/xinjing-jingxin/p/8025805.html

流氓兔-
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部