无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 173|回复: 7
打印 上一主题 下一主题

构建 GRUB2 单文件启动镜像那点事 ...

[复制链接]
跳转到指定楼层
1#
发表于 昨天 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一开始我们(在 EFI 平台)使用 grub-install 命令在移动 U 盘上构建 GRUB2 启动器:
grub-install.exe --removable x86_--directory=/path/to/x86_64-efi --target=x86_64-efi --themes="" --efi-directory=/path/to/usb --boot-directory=/path/to/usb/boot
命令运行结果让我们在 FAT 格式的 U 盘上得到了了两个目录:EFI 和 boot 目录。

EFI 下 BOOT 目录中含有 *.efi 启动镜像文件及配置文件 grub.cfg,该配置文件写明加载在其它位置的实际配置文件 (($root)/boot/grub/grub.cfg),这里 ($root) 就是 U 盘根目录。

boot 目录下只含有 grub 目录,这才是我们要关注的,个性化定制的配置文件 (grub.cfg) 要搁在 grub 目录下;grub 目录里还含有 300 多个文件,其中有 290 多个属文件系统用动态模块文件,另外本地语言配置文件,字体文件,主题文件等也在此目录下。

为了减小文件大小,grub-install 命令参数可添加 --compress=xz 选项,可惜 Windows 平台无此“福利”。

“灵魂”拷问:有无其他构建 grub 启动镜像命令可将 EFI 启动镜像和 grub 目录打包成一个文件?下面我们来读一段关于 grub 有关命令的表述:
grub-mkimage is the key central for grub to build all other stuffs when needed. For example, grub-[install,mkstandalone,mkrescue] all refer to the use of grub-mkimage, so once grub-mkimage is understood, everything looks easy to do.

中文表述:grub-mkimage 是 GRUB 构建其他组件的核心工具。例如,grub-[install,mkstandalone,mkrescue] 等命令均依赖于 grub-mkimage 的使用,因此只要理解了 grub-mkimage 的工作原理,后续操作便会变得简单明了。

如果在 grub-install 命令里添加 --verbose 参数选项,我们就会看见命令执行过程中有调用 grub-mkimage 命令身影。

查阅有关 grub-mkimage 使用情景发现,使用 --memdisk 选项,可将整个文件系统映像嵌入为内存磁盘。该内存磁盘是 GRUB 可识别的虚拟磁盘设备,采用 tar-fs 或 cpio-fs 文件系统;其中存放的各类模块处于“随时可用”状态,意味着可直接通过 insmod 加载。
--memdisk 选项作用等价:
loopback loop /path/to/tar-fs
set prefix=(memdisk)/boot/grub

我们只要将 grub-install 命令生成的 /boot/grub 目录打包成 memdisk.tar 文件(也可换成 memdisk.cpio),在 grub-mkimage 命令中告诉 GRUB: --memdisk=/path/to/memdisk.tar,--prefix=(memdisk)/boot/grub;再设置好其他参数选项,grub-mkimage 命令运行结果就会生成一个 GRUB2 单文件启动镜像。完整命令如下:
grub-mkimage.exe --directory=/path/to/x86_64-efi --format=x86_64-efi --memdisk=/path/to/memdisk.tar --prefix=(memdisk)/boot/grub --output=/path/to/GRUB2X64.EFI memdisk tar xzio part_gpt part_msdos

上述命令中如果使用 --memdisk=/path/to/memdisk.cpio,预加载的模块 tar 用 cpio newc 替换。

嵌入 GRUB 内的配置文件 (memdisk)/boot/grub/grub.cfg 要写明加载在其它位置的实际配置文件,如:
configfile ${cmdpath}/grub.cfg
上面命令指定加载的实际配置文件为和 GRUB2X64.EFI 同目录的 grub.cfg,你的个性化定制的配置文件。

使用上面的方法构建的 GRUB2 单文件启动镜像 (GRUB2X64.EFI)  大小近 8M,可以使用 xz 或 gz 压缩工具对文件大小进行压缩。

前面提到为了减小文件大小,grub-install 命令参数在 Linux 平台可添加 --compress=xz 选项;再添加 --verbose 参数选项,仔细观察命令执行过程中的信息,我们发现:
...
executing xz --lzma2=dict=128KiB --check=none --stdout </usr/lib/grub/x86_64-efi/memdisk.mod >/path/to/boot/grub/x86_64-efi/memdisk.mod
...
原来是对每个单独文件使用指定算法压缩,然后再移除 .xz 扩展名(重新命名)。例如:/path/to/memdisk.mod -> /path/to/memdisk.mod.xz -> /path/to/memdisk.mod

在 Linux 平台使用 grub-install 命令生成的 /boot/grub 目录文件作类似的 xz 压缩,然后移除 .xz 扩展名,并保持原目录结构。具体命令如下:
/path/to/<working directory># find . -type f -not -name "*.xz" -exec sh -c 'xz --lzma2=dict=128KiB --check=none "{}"' \;

/path/to/<working directory># find . -depth -name "*.xz" -exec sh -c 'file="{}"; mv -- "$file" "${file%.xz}"' \;

文件打包 (tar/cpio)命令如下:
/path/to/<working directory># tar  -cf /path/to/memdisk.tar boot

/path/to/<working directory># find boot | cpio -ov -H newc > /path/to/memdisk.cpio

回到 Windows 平台在 grub-mkimage.exe 命令中使用 memdisk.tar 或 memdisk.cpio 包,就能得到文件大小小于 2.5M GRUB2 单文件启动镜像。具体命令如下:
grub-mkimage.exe --directory=/path/to/x86_64-efi --format=x86_64-efi --memdisk=/path/to/memdisk.tar --prefix=(memdisk)/boot/grub --output=/path/to/GRUB2X64.EFI memdisk tar xzio gcry_crc part_gpt part_msdos

grub-mkimage.exe --directory=/path/to/x86_64-efi --format=x86_64-efi --memdisk=/path/to/memdisk.cpio --prefix=(memdisk)/boot/grub --output=/path/to/GRUB2X64.EFI memdisk cpio newc xzio gcry_crc part_gpt part_msdos
上述命令中不需要设置  -c, --config=FILE。

多年来使用上述方法,“跨越”多个 GRUB 版本,制作的 GRUB 单文件启动镜像都非常成功。

总结:GRUB 单文件启动镜像预加载的模块尽量最小化,以减小启动镜像文件大小;需要加载的模块命令搁在外置个性化定制的配置文件中。

2#
发表于 昨天 18:53 | 只看该作者
进来学习一下
回复

使用道具 举报

3#
 楼主| 发表于 昨天 19:00 | 只看该作者
该文章的重点是:/boot/grub 目录文件进行 xz 或 gz 的压缩方法不同于以前的论坛文件
回复

使用道具 举报

4#
发表于 昨天 19:24 | 只看该作者
启动镜像那点事
回复

使用道具 举报

5#
发表于 昨天 19:26 | 只看该作者
windows10以及以上版本不是有wsl吗,在wsl里面可以在windows中打包的,memdisk.cpio还可以压缩的,gurb-mkimage命令行最后的那些个模块是启动时加载的,其他有冲突或暂时不用加载的可以选择或者全部打包进memdisk,然后可以在启动memdisk后在加载,毕竟grub2就是模块化的。这不就是完整的单文件版本吗?
回复

使用道具 举报

6#
发表于 昨天 20:09 | 只看该作者
支持分享心得经验
回复

使用道具 举报

7#
发表于 昨天 20:48 | 只看该作者
谢谢老大
回复

使用道具 举报

8#
发表于 昨天 21:10 | 只看该作者
感谢分享!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2026-2-25 01:16

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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