无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4797|回复: 8

[分享] 编译安装grub-2.06到U盘uefi和bios双启动3分区

  [复制链接]
发表于 2022-7-24 22:15:50 | 显示全部楼层 |阅读模式
本帖最后由 qli365 于 2022-7-24 22:39 编辑

长期潜水,今天也发一篇
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
官网地址
https://www.gnu.org/software/grub/
https://www.gnu.org/software/grub/manual/grub/grub.html

下载地址
https://www.gnu.org/software/grub/grub-download.html
https://ftp.gnu.org/gnu/grub/
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
分3个区
/dev/sdc1=16G  ,=83 linux,小一些,linux grub2 加上boot标记,文件调入到 sdc2
/dev/sdc2=128G,=ef[EFI(FAT-12/16/32)] =fat32,大一些,UEFI=FAT32,文件IMG、PE、linuxISO
/dev/sdc3=剩余  ,=6 FAT16

# fdisk /dev/sdc  ## 格式化硬盘

83  Linux
ee  GPT
ef  EFI (FAT-12/16/ *
6  FAT16 *
b  W95 FAT32
c  W95 FAT32 (LBA)     
e  W95 FAT16 (LBA)

p[显示分区]-->>d[删除山区]-->>n[添加新分区]
  p[主分区]-->>1-->>回车(2048),+16G
  p[主分区]-->>2-->>回车,+128G
  p[主分区]-->>2-->>回车,回车

t[更改分区类型]-->>1-->>83 linux
t[更改分区类型]-->>2-->>ef[EFI(FAT-12/16/32)]
t[更改分区类型]-->>3-->>6 FAT16 (后期用win格式化NTFS=7 HPFS/NTFS/exFAT)
a[可启动标志]-->>1-->>w[保存分区]

设备       启动             起点            末尾            扇区        大小   Id   类型
/dev/sdc1  *             2048   33556479   33554432        16G  83   Linux
/dev/sdc2         33556480 243271679 209715200      100G  ef    EFI (FAT-12/16/32)
/dev/sdc3       243271680 514892758 271621079   129.5G    6   FAT16

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
格式化U盘
将sdc1分区格式化为fat32格式
# mkfs -t ext4 /dev/sdc1
# mkfs -t vfat  /dev/sdc2
# mkfs -t vfat  /dev/sdc3

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
挂载U盘
按照该对应方式挂载
/dev/sdc1 >>> /sdc1dir
/dev/sdc2 >>> /sdc2dir

# mount /dev/sdc1 sdc1dir/
# mount /dev/sdc2 sdc2dir/

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
1=虚拟机=vmware16.1,bios方式启动,u盘使用插入方式,而不是硬盘方式
2=编程环境 ubuntu-20.04.2.0-desktop-amd64,
    ubuntu-22.04-desktop-amd64.iso 中有 grub-install 和编译软件冲突,造成 EFI 错误
3=需要软件grub-2.06.tar.gz

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
编译时,需要软件

# apt-get install gcc make autoconf automake bison flex libdevmapper-dev libzfslinux-dev liblzma-dev

# apt-get install binutils  更新
# apt-get install gettext  更新
# apt-get install unifont  
# apt-get install xz-utils

# apt install libfreetype-dev libfreetype6-dev  

# wget 192.168.10.6/dir/dir_path/dir_linux/1-soft/grub2/grub-2.06.tar.gz
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
MBR Bios 编译安装

# tar -zxvf grub-2.06.tar.gz
# cd grub-2.06

编译文件
# ./configure --target=i386
# make
# make install
安装文件
# ./grub-install --version
# ./grub-install --target=i386-pc --boot-directory=/sdc2dir/bios/ /dev/sdc
文件自动安装到u盘

安装文件选项
--target=i386-pc   # 类型=MBR-biso
--boot-directory= # MBR-bios 启动文件目录,文件夹会自动建立
/dev/sdc                # 安装引导文件

sdc1dir
-->fonts
-->i386-pc
-->grubenv

# ./grub-install --version
grub-install (GRUB) 2.06
*******************************************************
GRUB2 will be compiled with following components:
Platform: i386-pc
With devmapper support: Yes
With memory debugging: No
With disk cache statistics: No
With boot time statistics: No
efiemu runtime: Yes
grub-mkfont: No (need freetype2 library)
grub-mount: No (need FUSE library)
starfield theme: No (No build-time grub-mkfont)
With libzfs support: Yes
Build-time grub-mkfont: No (need freetype2 library)
Without unifont (no build-time grub-mkfont)
With liblzma from --llzma (support for XZ-compressed mips images)
Without liblzma (no support for XZ-compressed mips images) (need lzma library)
*******************************************************
# mkdir /sda1dir/iso

文件列表
bios/grub/fonts/unicode.pf2
bios/grub/grubenv
bios/grub/i386-pc/文件模块
bios/grub/locale/zh_CN.mo 等文件

拷贝菜单文件=grub.cfg,需要手动拷贝
# cp /grub-2.06/docs/grub.cfg /sda1dir/bios/grub/

拷贝字体文件=unicode.pf2,安装时自动拷贝
# cp /usr/share/grub/unicode.pf2  /sdb1dir/bios/grub/fonts/unicode.pf2

拷贝背景图
# cp /grub-2.06/themes/starfield/starfield.png /sda1dir/bios/grub/

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
UEFI 编译安装,需要重新引导 ubuntu iso,重新编译安装
# tar -zxvf grub-2.06.tar.gz
# cd grub-2.06

编译文件
# ./configure --target=x86_64  --with-platform=efi
# make
# make install  
安装文件
# ./grub-install --version
# ./grub-install --target=x86_64-efi --boot-directory=/sdc2dir/uefi/ --efi-directory=/sdc2dir/ --removable
文件自动安装到U盘

安装文件选项
--target=x86_64-efi              # 类型=x86_64-efi
--boot-directory=/sdc2dir/uefi/  # grub2-uefi 文件位置=/uefi/grub
--efi-directory=/sdc2dir/        # EFI 目录位置,EFI 启动文件位置=/EFI/BOOT/
--removable                      # 移动设备,安装到ESP要加--removable这个参数 这个参数专门针对于可移动设备,一定要加

# ./grub-install --version
grub-install (GRUB) 2.06

*******************************************************
GRUB2 will be compiled with following components:
Platform: x86_64-efi
With devmapper support: Yes
With memory debugging: No
With disk cache statistics: No
With boot time statistics: No
efiemu runtime: No (not available on efi)
grub-mkfont: No (need freetype2 library)
grub-mount: No (need FUSE library)
starfield theme: No (No build-time grub-mkfont)
With libzfs support: Yes
Build-time grub-mkfont: No (need freetype2 library)
Without unifont (no build-time grub-mkfont)
With liblzma from -llzma (support for XZ-compressed mips images)
With stack smashing protector: No
*******************************************************
# mkdir /sda2dir/iso

文件列表
EFI/BOOT/BOOTX64.EFI
iso/
uefi/grub/fonts/unicode.pf2
uefi/grub/grubenv
uefi/grub/x86_64-efi/文件模块
uefi/grub/locale/zh_CN.mo 等文件

拷贝菜单文件=grub.cfg,需要手动拷贝
# cp /grub-2.06/docs/grub.cfg /sda2dir/uefi/grub/

拷贝字体文件=unicode.pf2,安装时自动拷贝
# cp /usr/share/grub/unicode.pf2  /sdb2dir/uefi/grub/fonts/unicode.pf2

拷贝背景图
# cp /grub-2.06/themes/starfield/starfield.png /sda2dir/uefi/grub/
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

评分

参与人数 1无忧币 +5 收起 理由
wuxin9712 + 5

查看全部评分

 楼主| 发表于 2022-7-24 22:20:21 | 显示全部楼层
本帖最后由 qli365 于 2022-7-24 23:17 编辑

最后还需要查询3分区UUID
进入Ubuntu后挂在U盘
# blkid

/dev/sda1: UUID="3e7a8cbb-c380-4f43-a4fa-ab065367428e" BLOCK_SIZE="4096" TYPE="ext3" PARTUUID="00000001-01"
/dev/sda2: UUID="9BEA-83EC" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="00000001-02"
/dev/sda3: LABEL="M-fM-^VM-0M-eM-^JM- M-eM-^MM-7" BLOCK_SIZE="512" UUID="9CD4A288D4A2646C" TYPE="ntfs" PARTUUID="00000001-03"

在菜单开始前输入
set USBUUID_EXT3="de887e19-7b06-42d2-86e5-5b3576eda54e"
set USBUUID_UEFI="244C-CCA9"
set USBUUID_NTFS="9CD4A288D4A2646C"

在菜单中输入
search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
即可在相映的磁盘读取

关于程序中/dev/sdc或者/dev/sda的说明
使用fdisk -l命令可以列出磁盘,如果实验教程,可以根据自己的情况做出修改。

最后的说明,在vm16虚拟机中,uefi可以通过安全引导启动,我这实体机也能通过,其他的机器就不清楚了,记得grub2.04的时候我这还不能安全引导。

在论坛里传不了大文件,就贴出来uefi的菜单样式,大家参考,其中winre在efi中调用需要修改bcd文件中的目录位置
# Sample GRUB configuration file
# 设置grub.cfg启动菜单
#
# =============================================================== #
set USBUUID_EXT3="de887e19-7b06-42d2-86e5-5b3576eda54e"
set USBUUID_UEFI="244C-CCA9"
set USBUUID_NTFS="9CD4A288D4A2646C"

#为root的目录 root 指定用于启动系统的分区
#set=root ${USBUUID_UEFI}
# =============================================================== #
# 启动延长时间,单位“秒”
set timeout=10

# 启动顺序,默认为“0”
set default=0

# 返回菜单到第二条 Fallback to the second entry.
set fallback=1
# =============================================================== #
#添加图片类型
insmod jpeg
insmod png
# =============================================================== #
# 一次性加载所有可用的视频驱动
insmod all_video
# =============================================================== #
# 启用gfxterm模块,分辨率什么的,都靠它
insmod gfxterm
insmod gfxmenu
insmod gettext
# =============================================================== #
insmod video_bochs
insmod video_cirrus
# =============================================================== #
# 字体模块
insmod font

# 加载unicode字体显示中文
loadfont /uefi/grub/fonts/unicode.pf2
set locale_dir=/uefi/grub/locale
set lang=zh_CN
# =============================================================== #
#设置分辨率\1024x768\800x600\640x480\
set gfxmode=auto
# =============================================================== #
terminal_output gfxterm
loadfont unicode

theme=slack/theme.txt
# =============================================================== #
# =============================================================== #
submenu "启动 Rock-Linux" --class rocky-linux {

set USBUUID_EXT3="de887e19-7b06-42d2-86e5-5b3576eda54e"
set USBUUID_UEFI="244C-CCA9"
set USBUUID_NTFS="9CD4A288D4A2646C"

theme=slack/theme.txt

# =============================================================== #
menuentry "启动 Rocky-8.6-Workstation-x86_64-20220515.1-Live" --class rocky-linux {
    set isolabel="Rocky-Workstation-8"
    set isofile="iso/iso_linux/rockylinux/rocky-86/Rocky-Workstation-8-x86_64-20220515.1.iso"  
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    insmod fat
    insmod ext2
    insmod ntfs

    echo /${isofile}
    loopback loop /${isofile}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux  (loop)/isolinux/vmlinuz root=live:LABEL=${isolabel} iso-scan/filename=/$isofile ro rd.live.image quiet  rhgb inst.lang=zh_CN.UTF-8  
    initrd (loop)/isolinux/initrd.img
}
# =============================================================== #
menuentry "启动 Rocky-8.6-Lite-Workstation-x86_64-20220515.1-Live" --class rocky-linux {
    set isolabel="Rocky-Workstation-Lite-8"
    set isofile="iso/iso_linux/rockylinux/rocky-86/Rocky-Workstation-Lite-8-x86_64-20220515.1.iso"  
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    insmod fat
    insmod ext2
    insmod ntfs

    echo /${isofile}
    loopback loop /${isofile}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux  (loop)/isolinux/vmlinuz root=live:LABEL=${isolabel} iso-scan/filename=/$isofile ro rd.live.image quiet  rhgb inst.lang=zh_CN.UTF-8  
    initrd (loop)/isolinux/initrd.img
}
# =============================================================== #
menuentry "启动 Rocky-8.6-XFCE-x86_64-20220515.4-Live" --class rocky-linux {
    set isolabel="Rocky-XFCE-8"
    set isofile="iso/iso_linux/rockylinux/rocky-86/Rocky-XFCE-8-x86_64-20220515.4.iso"  

    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    echo /${isofile}
    loopback loop /${isofile}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux  (loop)/isolinux/vmlinuz root=live:LABEL=${isolabel} iso-scan/filename=/$isofile ro rd.live.image quiet  rhgb inst.lang=zh_CN.UTF-8  
    initrd (loop)/isolinux/initrd.img
}
# =============================================================== #
menuentry "安装 Rocky-8.6-minimal-x86_64" --class rocky-linux {
    set isolabel="Rocky-8-6-x86_64-dvd"
    set isofile="iso/iso_linux/rockylinux/rocky-86/Rocky-8.6-x86_64-minimal.iso"  

    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    echo /${isofile}
    loopback loop /${isofile}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux  (loop)/isolinux/vmlinuz inst.stage2=hd:LABEL=${isolabel} iso-scan/filename=/$isofile inst.lang=zh_CN.UTF-8
    initrd (loop)/isolinux/initrd.img
}
# =============================================================== #
menuentry "安装 Rocky-9.0-minimal-x86_64" --class rocky-linux {
    set isolabel="Rocky-9-0-x86_64-dvd"
    set isofile="iso/iso_linux/rockylinux/rocky-90/Rocky-9.0-x86_64-minimal.iso"

    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    loopback loop /${isofile}
    echo /${isofile}   
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux  (loop)/images/pxeboot/vmlinuz inst.stage2=hd:LABEL=${isolabel} ro iso-scan/filename=/$isofile inst.lang=zh_CN.UTF-8
    initrd (loop)/images/pxeboot/initrd.img
}
# =============================================================== #

}


menuentry "启动 Ubuntu 22.04 desktop amd64" --class ubuntu-linux {
    set isofile="iso/iso_linux/ubuntu/ubuntu-22.04-desktop-amd64.iso"

    set gfxpayload=keep
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    loopback loop /$isofile
    echo /$isofile
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."

    linux        (loop)/casper/vmlinuz boot=casper iso-scan/filename=/$isofile noprompt noeject locale=zh_CN.UTF-8 bootkbd=uk vga=normal debian-installer/framebuffer=false quiet splash ---
    initrd        (loop)/casper/initrd
}
menuentry "启动 kali-linux-2021.1-live-amd64" --class kali-linux {
    set isofile="iso/iso_linux/kali/kali-linux-2021.1-live-amd64.iso"

    set gfxpayload=keep
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    echo ${isofile}
    loopback loop /${isofile}
    echo "BOOT MODE is UEFI."

    linux        (loop)/live/vmlinuz-5.10.0-kali3-amd64 findiso=/$isofile boot=live components ocales=zh_CN.UTF-8 hostname=kali quiet splash noeject
    initrd        (loop)/live/initrd.img-5.10.0-kali3-amd64
}


submenu "启动 Win-RE" --class windows {

set USBUUID_EXT3="de887e19-7b06-42d2-86e5-5b3576eda54e"
set USBUUID_UEFI="244C-CCA9"
set USBUUID_NTFS="9CD4A288D4A2646C"

theme=slack/theme.txt

# =============================================================== #
menuentry "启动 Win11 RE x64 202207 --UEFI" --class windows {
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."
    echo "Start Windows 11 RE "

    chainloader /iso/iso_winre/win11_x64_RE_UEFI/bootmgfw.efi
}
# =============================================================== #
menuentry "启动 Win10 RE x64 --EFI" --class windows {
    search --no-floppy --fs-uuid --set=root ${USBUUID_UEFI}
    echo ${USBUUID_UEFI}
    echo "BOOT MODE is UEFI."
    echo "Start Windows RE "

    chainloader /iso/iso_winre/win10_x64_RE_UEFI/bootmgfw.efi
    #chainloader /iso/iso_winre/win10_x64_RE_UEFI/bootx64.efi
}

}
# =============================================================== #


submenu "启动 MemTest86 内存条测试" --class memtest-c {

set USBUUID_EXT3="de887e19-7b06-42d2-86e5-5b3576eda54e"
set USBUUID_UEFI="244C-CCA9"
set USBUUID_NTFS="9CD4A288D4A2646C"

theme=slack/theme.txt

# =============================================================== #
menuentry "启动 MEMTEST 9.40 内存条测试64位版AA" --class memtest-c {
        chainloader /iso/memtest_uefi/memtest-EFI_940/BOOTAA64.efi
}
menuentry "启动 MEMTEST 9.40 内存条测试64位版" --class memtest-c {
        chainloader /iso/memtest_uefi/memtest-EFI_940/BOOTX64.efi
}
menuentry "启动 MEMTEST 9.40 内存条测试32位版" --class memtest-c {
        chainloader /iso/memtest_uefi/memtest-EFI_940/BOOTIA32.efi
}
# =============================================================== #
menuentry "启动 MEMTEST 6.30 内存条测试64位版" --class memtest-c {
        chainloader /iso/memtest_uefi/memtest-EFI_630/neicun64.EFI
}
menuentry "启动 MEMTEST 6.30 内存条测试32位版" --class memtest-c {
        chainloader /iso/memtest_uefi/memtest-EFI_630/neicun32.EFI
}


}

menuentry "重启 Restart" --class reboot {
        reboot
}
menuentry "关机 Shutdown" --class halt {
        halt
}



回复

使用道具 举报

发表于 2022-7-24 22:32:04 | 显示全部楼层
感谢楼主的分享精神
回复

使用道具 举报

发表于 2022-7-24 22:48:57 | 显示全部楼层
感谢楼主分享,小白还是很难折腾的。楼主能把成品分享出来吗,广大小白只需要成品的模板就可以了。
回复

使用道具 举报

发表于 2022-7-25 07:04:05 | 显示全部楼层
感谢楼主,非常好`1
回复

使用道具 举报

发表于 2022-8-1 09:58:04 | 显示全部楼层
感谢楼主的分享精神
回复

使用道具 举报

发表于 2022-8-12 15:21:43 | 显示全部楼层
简单明了,搞懂了,标记一下借鉴。
回复

使用道具 举报

发表于 2022-10-6 12:30:14 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 2022-10-14 18:00:53 | 显示全部楼层
多谢楼主提供的教程,菜鸟学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-28 22:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表