关于通过iPXE链式启动GRUB搭建网络启动菜单及多OS启动的技术咨询
通过iPXE链式启动GRUB搭建网络启动菜单及多OS启动的技术咨询
你好,我来一步步帮你搞定这些网络启动的问题——我自己折腾过不少办公室的PXE/网络启动环境,这些方案都是实测可行的:
1. 怎么用iPXE脚本链式启动GRUB?
其实非常简单,只要在你的嵌入式iPXE脚本里添加链式加载GRUB EFI文件的命令就行。首先先定义你的启动服务器地址(支持HTTP、TFTP等,推荐用HTTP,速度更快),然后调用chain命令:
# 先设置你的GRUB资源所在的服务器地址,比如HTTP服务器 set boot_server http://your-office-boot-server.local/grub-resources # 链式启动64位x86架构的GRUB EFI文件(如果是其他架构,替换成对应的文件名) chain ${boot_server}/grubx64.efi
注意:不同架构的GRUB EFI文件名不一样:32位x86用grubia32.efi,ARM64用grubaa64.efi,根据你的办公机器架构选择就行。
2. 哪里获取不绑定特定OS的GRUB资产?
不用特意从某个发行版里提取,有两种省事的方式:
- 用Debian/Ubuntu的预编译包:在一台Debian/Ubuntu机器上安装
grub-efi-amd64-bin(对应x86_64架构),这个包只包含GRUB的EFI二进制文件和必要模块,不会安装整个GRUB系统。安装后,你可以从/usr/lib/grub/x86_64-efi/目录里复制出grubx64.efi,以及需要的模块(比如net.mod、http.mod、iso9660.mod、loopback.mod这些网络和ISO相关的模块,放到服务器上的grub-resources/modules/目录下)。 - GRUB官方预编译文件:直接从GRUB官方下载对应架构的预编译EFI文件,但需要自己搭配必要的模块,不如用发行版的包省事。
3. 怎么托管GRUB配置让GRUB EFI正确找到?
GRUB启动后会自动查找配置文件,默认路径是相对于它启动时的根目录的:
- 如果你把
grubx64.efi放在http://your-server/grub-resources/,那GRUB会默认找http://your-server/grub-resources/grub.cfg,所以直接把你的菜单配置文件grub.cfg放到和grubx64.efi同目录下就行。 - 如果需要自定义配置文件路径,可以在iPXE里给GRUB传参数指定:
chain ${boot_server}/grubx64.efi --config-file="configfile (http,your-office-boot-server.local)/custom-path/grub.cfg"
另外,建议在grub.cfg开头加上前缀设置,确保GRUB能找到模块文件:
set prefix=(http,your-office-boot-server.local)/grub-resources
4. 怎么用GRUB启动ISO格式的系统(Proxmox、Linux发行版、Memtest等)?
大部分可引导ISO都可以直接用GRUB的loopback功能加载,不用解压ISO内容,非常方便。下面分几种场景给你例子:
启动Linux发行版/Proxmox ISO
以Ubuntu Server和Proxmox为例,在grub.cfg里添加对应的菜单条目:
menuentry "Ubuntu 22.04 LTS Live Server" { set isofile=http://your-office-boot-server.local/isos/ubuntu-22.04-live-server-amd64.iso # 把ISO挂载为循环设备 loopback loop $isofile # 加载ISO内的内核和initrd,注意不同发行版的路径不一样 linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash initrd (loop)/casper/initrd } menuentry "Proxmox VE 8.x Installer" { set isofile=http://your-office-boot-server.local/isos/proxmox-ve_8.0-1.iso loopback loop $isofile linux (loop)/boot/linux26 quiet root=/dev/ram0 ramdisk_size=16777216 rw proxmox.ports=auto iso-scan/filename=$isofile initrd (loop)/boot/initrd.img }
提示:如果不知道发行版的内核和initrd路径,可以用归档工具打开ISO查看,或者查发行版的网络启动文档。
启动Memtest86+
Memtest有两种方式:要么直接用它的EFI文件链式启动,要么用ISO:
# 方式1:直接链式启动Memtest的EFI文件(更简单) menuentry "Memtest86+" { chainloader http://your-office-boot-server.local/tools/memtestx64.efi } # 方式2:用ISO启动 menuentry "Memtest86+ (ISO)" { set isofile=http://your-office-boot-server.local/isos/memtest86+-6.20.iso loopback loop $isofile linux16 (loop)/memtest }
如果ISO不支持直接loop启动的情况
如果遇到少数不能直接loop启动的ISO,你可以把ISO内容解压到服务器的某个目录(比如http://your-server/isos/debian-extracted/),然后在GRUB里直接指向内核和initrd,同时设置网络根路径:
menuentry "Debian 12 (Extracted ISO Files)" { set root=(http,your-office-boot-server.local)/isos/debian-extracted linux /live/vmlinuz boot=live quiet splash initrd /live/initrd.img }
备注:内容来源于stack exchange,提问作者vox.nero




