分页: 1 / 1

uefi + grub 的顿悟

发表于 : 2025-05-02 20:56
百草谷居士
在相当长的时间,我对于 efi 模式下 ubuntu 的启动有错误的理解。我过去认为 efi 分区下的 Boot/bootx64.efi 启动 ubuntu/grubx64.efi,然后它又启动 ubuntu 安装分区下的 grub,接着再去启动 vmlinuz。
但是我错了,其实是 efi 分区下的 ubuntu/grubx64.efi 直接启动了 ubuntu 分区下的 vmlinuz 。这中间有个配置文件的切换过程,一开始它读取的是 efi 分区下的 ubuntu/grub.cfg ,这个配置文件的末尾有一个 configfile 指令,切换到了 ubuntu 安装分区下的 /boot/grub/grub.cfg 文件(当然你也可以手工修改它)。
明白了这个道理,其实就意味着,可以在 efi 下的 ubuntu/grub.cfg 文件中进行更多设置,比如直接在这个地方定义多重引导菜单。
然而,efi 下的 ubuntu/grubx64.efi 是不完整的,缺失了许多模块,要在此使用 grub 配置的更多语法,需要把 ubuntu 系统的 /boot/grub/x86_64/ 文件夹复制到 efi 分区下的 ubuntu 文件夹下。
自此,就可以在这个 grub.cfg 文件中进行更多自定义配置。比如,我在此添加了启动 system rescue cd 的菜单项。

Re: uefi + grub 的顿悟

发表于 : 2025-05-04 16:22
eagle5678
高级

Re: uefi + grub 的顿悟

发表于 : 2025-05-04 23:58
百草谷居士
不少基于 debian(包括 ubuntu)的 live cd 中,都有一个 /boot/grub/loopback.cfg 的 grub 配置文件。通过跳转到这个配置文件,可以像从实体光盘启动那样,呈现出本身的 GRUB 菜单。这是依照 system rescue 官方指南中,跳转 loopback 配置文件的启动方法。

代码: 全选

menuentry "System Rescue CD"	{
	insmod part_gpt
	insmod btrfs
	search --no-floppy --fs-uuid --set=root 2b07112e-8764-46f1-96ae-1d5176134085
  	iso_path="/systemrescue.iso"
  	export iso_path
  	search --set=root --file $iso_path
  	# support booting recent GRUB versions on UEFI systems
  	rmmod tpm
  	loopback loop $iso_path
  	set root=(loop)
  	# the path below is on the SystemRescue ISO, not the hard drive
  	configfile /boot/grub/loopback.cfg
}
而下面则是,传统的,直接启动 vmlinuz 的引导方法。不过这种方法的好处是可以传递内核。下面是个启动 mint xfce 22.1 安装盘的 grub 菜单。

代码: 全选

menuentry "Mint Xfce 22.1 Live CD"	{
	insmod part_gpt
	insmod btrfs
	search --no-floppy --fs-uuid --set=root 1d5373bf-96ea-43f9-b0ce-fab3574d7f20
  	loopback loopmint /mint-xfce-221.iso
  	set root=(loopmint)
  	#configfile /boot/grub/loopback.cfg
	linux	/casper/vmlinuz  boot=casper username=mint hostname=mint locale=zh_CN.UTF-8 iso-scan/filename=/mint-xfce-221.iso quiet splash --
	initrd	/casper/initrd.lz
}