linux efi分区安装grub2,编译UEFI版本Grub2引导多系统文件efi
可以直接从这个人的源码github中下载学习,项目地址:https://github.com/beatfan/UEFI_grub2
官网源码地址
首先要从grub官网下在grub2,grub2中包含所有grub2相关的命令,可以用来生成grub2引导,这里着重介绍制作UEFI版本的grub2
UEFI启动是fat/fat32分区/EFI/Boot/bootia32.efi或者/EFI/Boot/bootx64.efi,然后进程由UEFI交给efi程序,我们就是制作这个efi程序,使用grub-mkimage命令即可生成。
efi程序中需要内置配置文件,类似grub的grldr文件,一旦生成后就很难修改了,所以,我们需要一个类似与menu.lst的配置文件,所以我们指定的配置文件中指向外部的cfg配置文件
以下为64位efi生成,32位参考文件夹名称,将x86_64-efi修改为i386-efi即可,一般是不需要,支持UEFI的基本都是64位的PC。
定制文件目录方法
内置配置文件为:grub.cfg,内置配置文件搜索/EFI/grub/compile.cfg 文件,并将其设定为配置文件。
将其保存在grub2解压的压缩目录下,内容如下:
search.file /EFI/grub/grub.cfg root
set prefix=($root)/EFI/grub
configfile ($root)/EFI/grub/grub.cfg
编译64位efi文件Bootx64.efi
在grub2压缩包下面解压目录下打开命令行,输入以下命令:下面是编译64的文件
grub-mkimage.exe -d x86_64-efi -c compile.cfg -p /EFI/grub -o Bootx64.efi -O 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
编译32位efi文件BOOTIA32.efi
grub-mkimage.exe -d i386-efi -c compile.cfg -p /EFI/grub -o BOOTIA32.efi -O i386-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
命令解释
-d 表示指定查找模块目录
-c 表示指定配置文件,这个配置文件会集成到efi文件内,就是我们刚刚编写的x86_64-efi.cfg
-p 设置偏好文件夹,cfg文件中会调
-o 表示生成的目标文件
-O 表示集成的模块
模块这东西,有些命令不需要刻意不编译进去,如果有些linux16命令没编译进去,就会找不到linux16.
以上生成完毕,在文件夹下会出现一个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'
set font
font="/EFI/grub/unicode.pf2"
if loadfont
prefix/locale
set lang=zh_CN
insmod gettext
fi
adjust the screen resolution
terminal_output gfxterm
background
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
default select menu index
set default=0
timeout
set timeout_style=menu
set timeout=5
menuentry "启动 delta win7" --class windows --class os {
insmod ntfs
set root='(hd0,gpt2)'
clear
echo "Start Windows"
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry "local win7" --class windows --class os {
insmod ntfs
set root='(hd0,gpt3)'
clear
echo "Start Windows"
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
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
}
参考文档
官网源代码
官网说明文档
排错教程
其他源代码
命令参考文档
grub2入门教程
测试配置是否生效
在进入grub界面如果出现
[Minima] BASH-like line editing is supported.For the first word,TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ESC at any time exits
问题出在引导配置文件没有找到.
那么如何调试呢?
可以尝试打印变量的方法,输入C进入命令模式
输入gettext $prefix
我们发现还是提示(hd0,gp1)/EFI/grub
说明目录并没有被更改,我们可以验证一下放到此目录在跑起来.
发现果然又可以了,后面原因就是便宜目录的compile.cfg里面的目录并没有修改到根目录。
文件语法错误,语法错误问题找起来比较难!
字体乱码
打开cfg文件查看是不是配置了语言文件,但是目录不存在
loadfont ($root)/grub/fonts/unicode.pf2
set locale_dir=($root)/grub/locale
如果依然乱码,修改文件编码为utf-8
题外话 编译bios模式
echo 正在编译bios 模式引导文件
grub-mkimage.exe -d i386-pc -c compile.cfg -p /grub -o core.img -O i386-pc biosdisk 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 search gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true blocklist cat date echo play memdisk tar
pause
在④步骤中,已经生成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
导入g2ldr
用bootice 导入扇区
恢复扇区数改成63不能大于63的
之所以会超过是定制问题, 那么这个不会
grub-mkimage.exe -d I386-PC -p (hd0,1)/Grub2/BIOS -o Core. img -O i386-pc biosdisk part_msdos fat exfat ntfs
: qq5274202
我的cmd批处理定制
@echo off
echo 所有文件将移动到根目录下的grub文件夹下
echo 正在编译64位
grub-mkimage.exe -d x86_64-efi -c compile.cfg -p /grub -o Bootx64.efi -O 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 search gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true blocklist cat date echo play memdisk tar search_fs_uuid
echo 正在编译32位
grub-mkimage.exe -d i386-efi -c compile.cfg -p /grub -o BootIA32.efi -O i386-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 search gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true blocklist cat date echo play memdisk tar search_fs_uuid
::grub-mkimage.exe -d I386-PC -p (hd0,1)/Grub2/BIOS -o Core.img -O i386-pc biosdisk part_msdos fat exfat ext2 ntfs normal iso9660 search_fs_file 定制bios模式生成了core.img
echo 正在编译bios 模式引导文件
grub-mkimage.exe -d i386-pc -c compile.cfg -p /grub -o core.img -O i386-pc biosdisk part_gpt part_msdos disk fat exfat ext2 ntfs xfs hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo video_bochs video_cirrus file search gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true blocklist cat date echo play memdisk tar
::不是所有模块其他编译架构就有的不如efi开头的,在bios里面肯定会找不到
copy /b i386-pc\boot.img+core.img g2ldr
echo 编译完成
pause
那么bios加载方式如何启动呢。
下是主要的命令示例,%%围绕的变量自行替换成实际的路径或名称。
ECHO 生成bios启动文件
start /wait /min %grubDir%\grub-mkimage.exe -d %grubDir%\i386-pc -p /grub2/bios -o %BootFileDir%\Core.img -O i386-pc biosdisk part_msdos iso9660 udf configfile search help reiserfs font linux chain search_fs_file
Copy /B %grubDir%\i386-pc\cdboot.img+%BootFileDir%\Core.img %BootFileDir%\G2ldr.bin
COPY /y %BootFileDir%\G2ldr.bin %ISODir%\G2ldr.bin
COPY /y %BootFileDir%\Core.img %ISODir%\grub2\bios\i386-pc\Core.img
ECHO 生成EFI 64启动文件
start /wait /min %grubDir%\grub-mkimage.exe -d %grubDir%\x86_64-efi -p /grub2/uefi -o %EFIImgDir%\Bootx64.efi -O x86_64-efi search search_fs_file configfile help iso9660 fat part_gpt part_msdos disk exfat ext2 ntfs appleldr hfs normal reiserfs font linux chain
ECHO 生成EFI 32启动文件
start /wait /min %grubDir%\grub-mkimage.exe -d %grubDir%\i386-efi -p /grub2/uefi -o %EFIImgDir%\Bootia32.efi -O i386-efi search search_fs_file configfile help iso9660 fat part_gpt part_msdos disk exfat ext2 ntfs appleldr hfs normal reiserfs font linux chain
ECHO 生成EFI启动扇区
start /wait /min %ToolDir%\WinImage\WinImage.exe %ToolDir%\efisys.bin %BootFileDir%\efiImg /i /h /y
COPY /y %ToolDir%\efisys.bin %ISODir%\efisys.bin
IF "%1" neq "NoPause" PAUSE
ECHO 生成ISO镜像
mkisofs.exe -v -d -N -R -J -boot-info-table -l -relaxed-filenames -gbk4dos-filenames -gbk4win-filenames -no-emul-boot -boot-load-size 4 -o %ISOName% -v -V "%ISOTitle%" -b %biosImg% %efi% %ISODir%
IF "%1" neq "NoPause" PAUSE
unknown filesystem排错教程
出现这个错误,说明文件系统是不支持引导此分区,可以一个一个测试
输入 ls
出现了(hd0) (hd0,msdos2) (hd0,msdos1)
(hd1)
出现了msdos的都可以引导bios,
尝试输入了ls (hd0,msdos2)显示的是存储盘的内容,
尝试输入(hd0,msdos1)显示的是uefi分区内容.
而输入 其他的都显示未知的系统,也验证了bios只识别mbr分区表.
于是我把grub移动到了uefi分区 也就是(hd0,msdos1) 然后输入如下内容
后依次输入如下内容:
set root=(hd0,msdos1)/boot/grub
set prefix=(hd0,msdos1)/grub
insmod normal
normal
成功加载菜单.
linux efi分区安装grub2,编译UEFI版本Grub2引导多系统文件efi相关推荐
- linux环境下安装多个任意版本的python环境
linux环境下安装多个任意版本的python环境 安装方法可以归结为 [下载 + 编译 + 配置环境变量] 下载Python Windows下载发送到linux上 step1. 下载linux版本的 ...
- 服务器远程连接控制以及在Linux环境下安装go编译环境
本文主要内容 一.xshell远程控制服务器 二.VS code远程控制服务器 三.在Linux环境下安装go编译环境 初学者在没有人的指导下自己摸索学习真的是太难了,回想一下从大二创新实践开始到现在 ...
- linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6
原标题:Linux 上如何安装并切换最新版本的 Python 3.6 如果你安装了 Linux 系统,正在学习 Python 并想要使用最新的版本的话,那么这篇文章就是为你而写的. -- Shekin ...
- linux安装mysql图解,linux中怎么安装mysql5.6.12版本图解
linux中怎么安装mysql5.6.12版本图解 更新时间:2019-08-10 07:16 最满意答案 首先检查环境: 输入命令:rpm -qa | grep -i mysql* 将查询到的包名: ...
- Linux 您未安装Flash Player 或者版本过低
Linux 您未安装Flash Player 或者版本过低 (1)点击 更新Flash (2)选择下载的版本,我这里选择.tar.gz适用于linux (3)点击OK (4)点击 Extract (5 ...
- 【Windows系统相关问题记录一】在原有Win10 EFI分区还在的前提下,使用DiskGenius误删EFI文件夹
问题 在原有Win10 EFI分区还在的前提下,使用DiskGenius误删EFI文件夹,导致开机无法引导. 解决办法 参考这篇文章的做法,但是只用了其中一部分步骤,因为能解决我的问题在此特作记录,仅 ...
- 【Grub2】制作UEFI版本Grub2引导
可以直接下载以下操作的所有文件:https://download.csdn.net/download/u010875635/10655981 本来不想设置积分,无奈最低只能设置1分,大家见谅.没有积分 ...
- legacy引导gpt分区_安装win10用uefi还是legacy引导模式?(最全分析)
[文章导读]uefi最近有网友问我装win10用uefi还是legacy引导模式安装?uefi和legacy是两种不同的引导方式,uefi是新式的BIOS,legacy是传统BIOS.你在UEFI模式 ...
- python3.6.2安装教程-Linux下升级安装Python-3.6.2版本
本文主要介绍在Linux(CentOS)下将Python的版本升级为3.6.2的方法 众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的 ...
- linux下载哪个python版本-Linux下升级安装Python-3.6.2版本
本文主要介绍在Linux(CentOS)下将Python的版本升级为3.6.2的方法 众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的 ...
最新文章
- Git 工作流的正确打开方式
- 未来计算机的缺陷,新技术将计算机芯片缺陷变为优势
- SRS性能、内存优化工具用法
- 刘海又回来了?iPhone 12 Pro摄像头曝光...
- 转-ios设备唯一标识获取策略
- 数据是以什么形式存放在计算机中的?计算机与进制 (进制转换原则)
- linux 查看端口占用命令 亲测可用
- 新型脑刺激疗法治疗重度抑郁症
- 51单片机——蜂鸣器按照次数响起1.0
- git(4)服务器上的 Git
- 深入学习计算机组成原理,计算机浮点运算详解深入学习计算机组成原理.ppt
- 比亚迪元EV汽车拆解报告
- macOS SwiftUI 教程之 06 绘图实现正弦波,通过调整频率和步进值来更新正弦波视图 (教程含源码)
- Android 的 Fragment 教程
- 微信小程序如何修改小程序名称
- FreeBSD中编译JDK
- Mybatis从入门到精通(刘增辉)
- IDEA中Translation插件无法使用怎么办?
- 你画我猜 计算机题目,你画我猜:你知道这些题目的答案是什么吗?
- Android AOSP资源的下载
热门文章
- 惠普打印机驱动服务器系统,在打印机服务器(系统WIN2003)上安装了HP5100 打印机,客户机系统WIN7 64位,现没法添加HP5100的驱动...
- winRAR 破解注册码
- 分布式微服务架构及演变过程
- 细说php在哪买,细说PHP
- JavaEE三大框架ssh
- matlab 函数取整函数,MATLAB取整函数
- 车站计算机系统sc英文,城市轨道交通信号系统常见英文缩写大全(二)
- 分享一下苹果手机绕激活锁的体验
- 中学计算机基础知识,初中信息技术学业水平考试计算机基础知识考点大全(重点汇总)...
- canvas实现背景图和二维码合并-生成海报