Linux系统之grub-mkstandalone详解
grub-mkstandalone
是 GRUB 工具链中的一个实用工具,用于生成指定格式的独立 GRUB 镜像文件。该工具支持多种目标平台(如 BIOS、UEFI、Coreboot 等),适用于制作自定义启动盘、嵌入式系统引导程序或跨平台启动镜像。其核心功能是将 GRUB 引导程序、模块、主题、字体等资源打包为特定格式的可执行镜像,便于部署到不同硬件平台。
功能描述
grub-mkstandalone
的核心功能包括:
- 多平台支持:支持 BIOS、UEFI、Coreboot、QEMU 等多种平台的镜像生成。
- 模块化构建:允许指定预加载模块、安装模块及其依赖项,灵活控制镜像内容。
- 主题与字体集成:支持自定义主题(如
starfield
)和字体(如unicode
)。 - 压缩优化:支持
xz
、gz
、lzo
或无压缩,减小镜像体积。 - 语言包管理:支持安装指定语言包(如
en
,zh
)。 - 路径与工具自定义:允许指定模块目录、
grub-mkimage
路径等。
语法格式
grub-mkstandalone [选项] <源文件>
选项说明
选项 | 描述 |
---|---|
-o / --output=FILE | 将生成的镜像文件保存为 FILE (默认为标准输出)。 |
-O / --format=FORMAT | 指定目标平台格式(见下文支持列表)。 |
-C / `–compression=(xz | none |
--modules=MODULES | 预加载指定模块(逗号分隔)。 |
--install-modules=MODULES | 仅安装指定模块及其依赖项(默认安装所有模块)。 |
--themes=THEMES | 安装指定主题(逗号分隔,默认安装 starfield )。 |
--fonts=FONTS | 安装指定字体(逗号分隔,默认安装 unicode )。 |
--locales=LOCALES | 仅安装指定语言包(逗号分隔,默认安装所有语言包)。 |
--compress[=no,xz,gz,lzo] | 指定 GRUB 文件压缩算法(xz /gz /lzo /no )。 |
-d / --directory=DIR | 使用 DIR 路径下的镜像和模块。 |
--grub-mkimage=FILE | 指定 grub-mkimage 的路径(默认 /usr/bin/grub-mkimage )。 |
支持的目标平台格式
--format=FORMAT
参数支持以下目标平台:
格式 | 说明 |
---|---|
i386-coreboot | Coreboot 平台(32 位 x86)。 |
i386-multiboot | Multiboot 平台(32 位 x86)。 |
i386-pc | BIOS 平台(传统 GRUB 32 位)。 |
i386-pc-pxe | PXE 网络启动(32 位 x86)。 |
i386-efi | UEFI 平台(32 位 x86)。 |
i386-ieee1275 | Open Firmware(32 位 x86)。 |
i386-qemu | QEMU 模拟器(32 位 x86)。 |
x86_64-efi | UEFI 平台(64 位 x86)。 |
mipsel-yeeloong-flash | Yeeloong 平台(MIPS 小端)。 |
mipsel-fuloong2f-flash | Fulong 2F 平台(MIPS 小端)。 |
mipself-loongson-elf | Loongson 平台(MIPS 小端 ELF)。 |
powerpc-ieee1275 | PowerPC 平台(Open Firmware)。 |
sparc64-ieee1275-raw | SPARC64 平台(原始格式)。 |
sparc64-ieee1275-cdcore | SPARC64 平台(CD 核心)。 |
sparc64-ieee1275-aout | SPARC64 平台(AOUT 格式)。 |
ia64-efi | IA64 平台(UEFI)。 |
mips-arc | ARC 平台(MIPS 大端)。 |
mipsel-arc | ARC 平台(MIPS 小端)。 |
mipsel-qemu_mips-elf | QEMU MIPS 平台(小端 ELF)。 |
mips-qemu_mips-flash | QEMU MIPS 平台(大端 Flash)。 |
mipsel-qemu_mips-flash | QEMU MIPS 平台(小端 Flash)。 |
mips-qemu_mips-elf | QEMU MIPS 平台(大端 ELF)。 |
使用场景与示例
1. 生成 BIOS 平台的 GRUB 镜像
sudo grub-mkstandalone -o /path/to/grub_bios.img --format=i386-pc --modules=ext2,iso9660
- 效果:生成适用于 BIOS 平台的 GRUB 镜像,预加载
ext2
和iso9660
模块。 - 应用场景:制作传统 BIOS 启动的 USB 盘或软盘。
2. 生成 UEFI 平台的 GRUB 镜像
sudo grub-mkstandalone -o /path/to/grub_efi.img --format=x86_64-efi --themes=mytheme
- 效果:生成适用于 64 位 UEFI 平台的 GRUB 镜像,使用自定义主题
mytheme
。 - 应用场景:制作现代 UEFI 启动的 USB 盘或 ISO 镜像。
3. 生成 QEMU 模拟器启动镜像
sudo grub-mkstandalone -o /path/to/grub_qemu.img --format=i386-qemu --compress=xz
- 效果:生成适用于 QEMU 模拟器的 GRUB 镜像,并使用
xz
压缩。 - 应用场景:测试 GRUB 在虚拟环境中的启动行为。
4. 自定义模块和语言包
sudo grub-mkstandalone -o /path/to/grub_custom.img --format=i386-pc --install-modules=ext2,btrfs --locales=en,fr
- 效果:生成仅包含
ext2
和btrfs
模块,并安装英语和法语语言包。 - 应用场景:精简镜像以适应嵌入式设备或特殊需求。
注意事项
-
模块依赖性
- 使用
--install-modules
时需确保指定模块及其依赖项可用。 - 示例依赖检查:
find /usr/lib/grub/i386-pc -name "*.mod"
- 使用
-
路径权限
- 生成的镜像文件需具有写入权限。
- 示例权限设置:
sudo chmod 755 /path/to/output_directory
-
压缩算法兼容性
- 不同平台对压缩算法的支持可能不同,需根据目标平台选择合适的算法。
- 示例压缩验证:
file /path/to/grub_bios.img
-
镜像验证
- 生成后可通过
grub-file
工具验证镜像格式:grub-file --is-x86-multiboot /path/to/grub_bios.img
- 生成后可通过
-
平台适配
- 使用
--format
时需确认目标硬件架构(如 BIOS/UEFI)。 - 示例架构验证:
uname -m
- 使用
常见问题与解决方案
1. 错误提示:grub-mkstandalone: error: cannot open output file
- 原因:输出路径无写入权限或磁盘空间不足。
- 解决方法:
- 使用
sudo
运行命令。 - 检查磁盘空间:
df -h
- 使用
2. 错误提示:grub-mkstandalone: error: module not found
- 原因:指定模块不存在或未安装依赖项。
- 解决方法:
- 列出可用模块:
find /usr/lib/grub/i386-pc -name "*.mod"
- 安装缺失模块:
sudo apt install grub-common
- 列出可用模块:
3. 错误提示:grub-mkstandalone: error: invalid compression algorithm
- 原因:指定压缩算法不支持(如
bzip2
)。 - 解决方法:
- 使用有效算法(
xz
,gz
,lzo
或no
)。
- 使用有效算法(
4. 镜像无法启动
- 原因:未正确配置 GRUB 或目标平台不匹配。
- 解决方法:
- 检查 GRUB 配置文件(如
/boot/grub/grub.cfg
)。 - 使用
grub-mkconfig
更新配置:sudo grub-mkconfig -o /boot/grub/grub.cfg
- 检查 GRUB 配置文件(如
典型工作流程
-
准备资源
- 收集所需模块(如
ext2
,iso9660
)、主题、字体等。 - 示例模块路径:
/usr/lib/grub/i386-pc/
- 收集所需模块(如
-
生成镜像
sudo grub-mkstandalone -o /path/to/grub_bios.img --format=i386-pc --modules=ext2,iso9660
-
验证镜像
file /path/to/grub_bios.img
-
部署镜像
- 写入 USB 设备:
sudo dd if=/path/to/grub_bios.img of=/dev/sdX bs=4M status=progress
- 或嵌入到 ISO 镜像中:
xorriso -as mkisofs -o rescue.iso /path/to/content
- 写入 USB 设备:
-
测试启动
- 插入 USB 或挂载 ISO,并设置 BIOS/UEFI 从设备启动。