编译UEFI版本Grub2引导多系统文件efi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译UEFI版本Grub2引导多系统文件efi相关的知识,希望对你有一定的参考价值。

参考技术A 官网源码地址
首先要从grub官网下在grub2,grub2中包含所有grub2相关的命令,可以用来生成grub2引导,这里着重介绍制作UEFI版本的grub2

内置配置文件为:grub.cfg,内置配置文件搜索/EFI/grub/compile.cfg 文件,并将其设定为配置文件。
将其保存在grub2解压的压缩目录下,内容如下:

在grub2压缩包下面解压目录下打开命令行,输入以下命令:下面是编译64的文件

以上生成完毕,在文件夹下会出现一个bootx64.efi文件,BOOTIA32.efi 文件夹,

将其和x86_64-efi、locale文件夹、unicode.pf2一起拷贝到第一个fat/fat32分区,并新建一个grub.cfg。

其中,x86_64-efi为模块目录,locale为地区语言,unicode.pf2为字体,grub.cfg为引导加载的配置文件

目录如下:

FAT/FAT32
#########################
/EFI/Boot/bootx64.efi
/EFI/Boot/BOOTIA32.efi
/EFI/grub/grub.cfg
/EFI/grub/unicode.pf2
/EFI/grub/x86_64-efi/
/EFI/grub/locale/

#####################

x64.cfg内容示例:

[plain] view plain copy
function load_video
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi


insmod part_gpt
insmod fat
set root='hd0,gpt1'

font="/EFI/grub/unicode.pf2"
if loadfont prefix/locale
set lang=zh_CN
insmod gettext
fi

terminal_output gfxterm

insmod jpeg
if background_image /EFI/grub/background.jpg; then
true
else
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 255,255,155,0; then
clear
fi
fi

set default=0

set timeout_style=menu
set timeout=5

menuentry "启动 delta win7" --class windows --class os
insmod ntfs
set root='(hd0,gpt2)'



menuentry "local win7" --class windows --class os
insmod ntfs
set root='(hd0,gpt3)'



menuentry "ubuntu16.04 x86" --class ubuntu --class os
insmod ext2
set root='(hd0,gpt5)'
linux /vmlinuz ro root=/dev/sda5
initrd /initrd.img
echo "Start Ubuntu 16.04"


menuentry "ubuntu16.04 x64" --class ubuntu --class os
insmod ext2
set root='(hd0,gpt6)'
linux /vmlinuz ro root=/dev/sda6
initrd /initrd.img
echo "Start Ubuntu 16.04"


menuentry "-------------------" --class ubuntu --class os
set root=(hd0,gpt1)


menuentry "ubuntu-efi" --class ubuntu --class os
insmod ext2
set root='(hd0,gpt5)'
chainloader /efi/grub.efi


menuentry "install ubuntu" --class ubuntu --class os
insmod ext2
insmod loopback
set root=(hd0,gpt4)
set isofile=/OS/linux/ubuntu-16.04.2-desktop-amd64.iso
loopback loop isofile
initrd (loop)/casper/initrd.lz


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


https://wiki.archlinux.org/index.php/GRUB_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://help.ubuntu.com/community/UEFIBooting

http://ftp.gnu.org/gnu/grub/
http://ftp.gnu.org/gnu/grub/grub-2.02-for-windows.zip

https://www.gnu.org/software/grub/manual/grub.html

http://jingyan.baidu.com/article/c85b7a640cd7d6003bac95f8.html

https://packages.ubuntu.com/source/trusty/grub2

https://www.kernel.org/pub/linux/utils/boot/syslinux/

http://www.jinbuguo.com/linux/grub.cfg.html
http://blog.csdn.net/listener_ri/article/details/45621947

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385353

在进入grub界面如果出现

问题出在引导配置文件没有找到.
那么如何调试呢?
可以尝试打印变量的方法,输入C进入命令模式
输入gettext $prefix
我们发现还是提示(hd0,gp1)/EFI/grub
说明目录并没有被更改,我们可以验证一下放到此目录在跑起来.
发现果然又可以了,后面原因就是便宜目录的compile.cfg里面的目录并没有修改到根目录。

打开cfg文件查看是不是配置了语言文件,但是目录不存在

如果依然乱码,修改文件编码为utf-8

在④步骤中,已经生成Bios模式所需的内核文件Core.img,其大小是86.5 KB
生成的只是单单BIOS模式的内核文件,还无法引导Grub2,还需要个启动文件Boot.img,该文件很小,只有512Byte,位于i386-pc文件夹,该文件的作用是启动Grub2,然后加载内核文件Core.img
所以这里的最后壹步就是把启动文件Boot.img和内核文件Core.img以二进制形式合并,合并后的文件我个人称呼为扇区文件G2ldr(不知道这个文件有没标准的名称),因为可以直接导入到扇区,来引导启动Grub2,也可以由GRUB4DOS直接加载这个扇区文件来启动Grub2。
老样子,先给出命令(如果命令行的路径不是Grub2包所在的路径,就先要修改命令行的路径,前面有提到)
Copy /B i386-pc\Boot.img+Core.img G2ldr

用bootice 导入扇区
恢复扇区数改成63不能大于63的
之所以会超过是定制问题, 那么这个不会

学习uefi和bios所使用的启动器仿真
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=335197

具体教程来自 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411&extra=page%3D1

: qq5274202

我的cmd批处理定制

那么bios加载方式如何启动呢。

出现这个错误,说明文件系统是不支持引导此分区,可以一个一个测试
输入 ls
出现了(hd0) (hd0,msdos2) (hd0,msdos1)
(hd1)
出现了msdos的都可以引导bios,
尝试输入了ls (hd0,msdos2)显示的是存储盘的内容,
尝试输入(hd0,msdos1)显示的是uefi分区内容.

而输入 其他的都显示未知的系统,也验证了bios只识别mbr分区表.

于是我把grub移动到了uefi分区 也就是(hd0,msdos1) 然后输入如下内容
后依次输入如下内容:

成功加载菜单.

clover如何使用UEFI引导和EFI驱动选择

EFI分区实际上是一个FAT格式的分区,不一定要是第一个分区,GPT磁盘下任何一个FAT文件格式的分区都可以用来放EFI引导文件。
主板UEFI先默认引导你所设置的第一优先启动分区下的\EFI\boot\bootx64.efi,这个文件实际上是一个可执行文件
如果你EFI分区里的\EFI\boot\下放的是clover的bootx64.efi,它应该就会执行\EFI\CLOVER\CLOVERX64.efi,这个CLOVERX64.efi就是clover的主程序。
如果EFI分区里的\EFI\boot\下是安装windows时候自动生成的bootx64.efi,它应该就会自动加载\EFI\microsoft\boot\BCD,这个BCD文件实际上是一个配置文件,里面记录了windows的启动路径,比如说HD0\Partition2\Windows\system32\winload.efi

有些主板的BIOS可以不用默认引导\EFI\boot\bootx64.efi,而是可以直接设置为引导\EFI\Microsoft\Boot\bootmgfw.efi,这个bootmgfw.efi其实跟\EFI\boot\bootx64.efi的功能一样,都是读取\EFI\microsoft\boot\BCD的配置然后引导windows系统。

clover启动之后会自动搜索所有分区,看有没有windows的启动引导文件\EFI\Microsoft\Boot\bootmgfw.efi,如果有的话clover就会把这个引导文件添加到启动列表里。

所以我们在安装clover到EFI分区之前只要把原来windows的EFI文件夹移动到任意分区下,clover都会找到这个windows的引导文件并引导这个windows。

如果分区发生了变化导致windows无法引导,我们还可以用BOOTICE这个软件来编辑\EFI\microsoft\boot\BCD里面的参数,人工进行修复。

 

------------------------------------------

 

clover如何使用UEFI引导和EFI驱动选择

这边我就说几个uefi引导要注意的地方:
当试图用UEFI引导时,在/EFI/Drivers64UEFI文件夹中应试着包含具有如下文件:
1.HFSPlus.efi,OsxFatBinaryDrv-64.efi,如果工作不正常,那么看2。

2.HFSPlus.efi,OsxFatBinaryDrv-64.efi, OsxLowMemFixDrv-64.efi,还不正常,看3。

  1. HFSPlus.efi, OsxFatBinaryDrv-64.efi,OsxAptioFixDrv-64.efi(在config.plist中boot args值含有slide=0 (默认))。
  2. HFSPlus.efi,OsxFatBinaryDrv-64.efi, OsxAptioFixDrv-64.efi (在config.plist 中bootargs值含有slide=0 (默认),EmuVariableRuntimeDxe.efi 。

具体的: 

  1. HFSPlus.efi, OsxFatBinaryDrv-64.efi这个在技嘉 Hybrid EFI主板工作正常。这是最佳选择对于uefi 引导在此情况下无需特别的修复。任意版本的os x应该都可以正常引导。除非发生一些重大改变(不知道是硬件还是说osx—媛)导致启动失败。
  2. HFSPlus.efi, OsxFatBinaryDrv-64.efi,OsxLowMemFixDrv-64.efi这个工作在Insyde H2O UEFI,一些小内存问题可由OsxLowMemFixDrv-64.efi修复,这样,其他同第一种情况都没有问题

3.HFSPlus.efi,OsxFatBinaryDrv-64.efi,OsxAptioFixDrv-64.efi (with slide=0 for ML) 这种情况下几乎可以工作在任何主板。但是这不是一个最佳选择。因为这取决于 boot.efi 的功能和当前的传递的参数介于boot.efi(引导器)和内核之间,如引导的参数boot arg和设备树(好吧我晕啦)。这就是说:如果启动参数改变,就如在lion刚出来时,变色龙启动lion失败一样,这将再次破坏变色龙和uefi引导,直到某人修复它。对我而言这是非常恼人的,因为用uefi引导就是为啦避免发生破坏EFI引导区的情况。如果发生这种情况,第一个方法就是回滚到标准的clover,直到问题解决。要注意的是,标准的clover配置也是依赖于启动参数的当kext 自动打补丁或kext 注入功能启用时。所以在这种情况下也要关闭这些功能。

  1. HFSPlus.efi, OsxFatBinaryDrv-64.efi,OsxAptioFixDrv-64.efi, EmuVariableRuntimeDxe.efi 这工作在Dell Vostro, someThinkPads some laptops with Phoenix UEFI,情况同3。

未提到其他驱动也许需要也许不要,上面所罗列的是最小要求。是否需要其他驱动自己一个个测试。

EFI驱动选择

在drivers64UEFI目录下:

CsmVideoDxe-64.efi:Clover图形界面的图像驱动,可以有更多的分辨率选择。(仅限于启动界面)。他基于UEFI BIOS的CSM模块,因此需要CSM可用。
这个驱动比较危险,可能导致Clover无法启动或启动后系统出现唤醒问题,谨慎使用!

DataHubDxe-64.efi:DataHub协议是MacOSX的强制支持的。通常它是已经存在的,但有时它可能会丢失,在这种情况下,你应该看到屏幕上的警告信息。该文件的存在始终是安全的。
EmuVariableUefi-64.efi :大多数UEFI主板有NVRAM硬件,这个驱动提供支持MacOSX在一些罕见情况下需要的NVRAM变量。 仅当你不使用这个驱动出现问题时才使用这个驱动 。
OsxAptioFixDrv-64.efi :AMIApti UEFI主板内存修复
OsxLowMemFixDrv-64.efi:OsxAptioFixDrv-64.efi的简化版,不能和OsxAptioFixDrv-64.efi同时使用。
PartitionDxe-64.efi:支持非常用的分区图表,比如混合GPT/MBR 或 苹果分区图表。这个文件的存在始终是安全的。

怎么用

前提是你已经安装好啦clover。
默认的配置(使用默认的config.plist)足以应付的各种情况。
要记住选择在bios选择启动设备或在uefibios中选择cloverx64.EFI

启动顺序:

bios引导

BIOS->boot0->boot1->BOOT->CLOVERIA32.efi->Apples boot.efi->mach_kernel
BIOS->boot0->boot1->BOOT->CLOVERX64.efi->Apples boot.efi->mach_kernel

UEFI BOOT
UEFI BIOS->CLOVERX64.efi->Apples boot.efi->mach_kernel

CLOVERX64.EFI是图形化引导菜单,该文件位于你安装clover所在分区/EFI/Clover/下。

当你看到图形化引导菜单(如下图)后可按下F1键,看到帮助菜单 。其他功能键如F2(获取启动log) 也是在这个界面按。

以上是关于编译UEFI版本Grub2引导多系统文件efi的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 UEFI 只读变量?

Linux系统bootx64是怎么引导grub的

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

win7从efi文件启动怎么办

GPT+UEFI双系统引导

惠普笔记本启动要手动选择efi才能进系统