|
|
一开始我们(在 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 单文件启动镜像预加载的模块尽量最小化,以减小启动镜像文件大小;需要加载的模块命令搁在外置个性化定制的配置文件中。
|
|