You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于通过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.modhttp.modiso9660.modloopback.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

火山引擎 最新活动