Ubuntu 映像中默认的 bootx64.efi 文件中嵌入了哪些模块?
我想使用以下命令复制原始 bootx64.efi 文件:
grub-mkimage -o bootx64.efi -O x86_64-efi -p /boot/grub <default_modules>
这些 <default_modules> 是什么?
我还想知道 grubx64.efi 和 mmx64.efi 文件中的默认模块。
答案1
事实上,我的逆向工程答案有点不对,因为该strings
命令只能识别大于 4 个字符的字符串。Ubuntu build-efi-images
/Debian 源代码中实际上构建了 grubx64.efi。可以在 [链接] 找到它https://git.launchpad.net/ubuntu/+source/grub2-unsigned/tree/debian/build-efi-images里面有三个带有模块名称的变量。请注意,这些变量不包含所包含模块的完整列表,因为其中一些模块具有依赖关系。
获取依赖项后,包含的模块的完整列表是
acpi afsplitter all_video bitmap bitmap_scale boot btrfs bufio cat chain configfile cpuid crypto cryptodisk datetime disk diskfilter echo efi_gop efinet efi_uga ext2 extcmd fat font fshelp gcry_arcfour gcry_blowfish gcry_camellia gcry_cast5 gcry_crc gcry_des gcry_dsa gcry_idea gcry_md4 gcry_md5 gcry_rfc2268 gcry_rijndael gcry_rmd160 gcry_rsa gcry_seed gcry_serpent gcry_sha1 gcry_sha256 gcry_sha512 gcry_tiger gcry_twofish gcry_whirlpool gettext gfxmenu gfxterm gfxterm_background gzio halt help hfsplus iso9660 jpeg keystatus linux linuxefi loadenv loopback ls luks lvm lzopio mdraid09 mdraid1x mmap mpi net normal ntfs password_pbkdf2 pbkdf2 pgp png probe procfs raid5rec raid6rec regexp relocator search search_fs_file search_fs_uuid search_label sleep smbios squash4 terminal trig video video_bochs video_cirrus video_colors xfs xzio zfs zfscrypt zfsinfo zstd
。(我之前的回答中缺少:cat, fat, ls, lvm, pgp, png, zfs
- 所有两个或三个字母 - 及其依赖项。)
答案2
所包含模块的列表是在编译时收集的。但是,我通过逆向工程成功列出了 Ubuntu 22.04 中包含的 grubx64 模块列表:
strings /boot/efi/EFI/ubuntu/grubx64.efi|grep -A10 --no-group-separator LICENSE= |grep -v LICENSE=|grep -v '^grub_' |grep -v '^_'|grep -v '^\.'|grep -v '[A-Z]' > /tmp/modulelist
for n in `cat /tmp/modulelist|sort|uniq`; do if [ -f /usr/lib/grub/x86_64-efi/$n.mod ]; then echo $n; fi; done > /tmp/grub-include-these
echo `cat /tmp/grub-include-these` > /root/grub-modulelist
因此要回答这个问题(“这些 <default_modules> 是什么”):Ubuntu 22.04 中的默认模块似乎是:acpi afsplitter all_video archelp bitmap bitmap_scale boot btrfs bufio chain configfile cpuid crypto cryptodisk datetime disk diskfilter echo efifwsetup efi_gop efinet efi_uga ext2 extcmd font fshelp gcry_arcfour gcry_blowfish gcry_camellia gcry_cast5 gcry_crc gcry_des gcry_dsa gcry_idea gcry_md4 gcry_md5 gcry_rfc2268 gcry_rijndael gcry_rmd160 gcry_rsa gcry_seed gcry_serpent gcry_sha1 gcry_sha256 gcry_sha512 gcry_tiger gcry_twofish gcry_whirlpool gettext gfxmenu gfxterm gfxterm_background gzio halt help hfsplus iso9660 jpeg keystatus linux linuxefi loadenv loopback lsefi lsefimmap lsefisystab lssal luks lzopio mdraid09 mdraid1x memdisk minicmd mmap normal ntfs part_apple part_gpt part_msdos password_pbkdf2 pbkdf2 play priority_queue probe procfs raid5rec raid6rec reboot regexp relocator search search_fs_file search_fs_uuid search_label sleep smbios squash4 terminal test trig true video video_bochs video_cirrus video_colors video_fb xzio zfscrypt zfsinfo zstd
这已经很多了,但是并非所有模块都包括在内。例如,该minix
模块不包含在 grubx64.efi 中,尽管可以在 中找到它/boot/grub/x86_64-efi/
。
顺便说一句,我继续使用以下命令构建自己的 grubx64.efi:
grub-mkimage -c /boot/efi/EFI/my-own/grub.cfg -o /boot/efi/EFI/my-own/grub.efi -O x86_64-efi -p grub/ `cat /root/grub-modulelist`
...并使其可启动:
efibootmgr -v -c -d /dev/nvme0n1 -p 1 -l '\EFI\my-own\grub.efi' -L my-grub
请注意,我还包含了一个 grub.cfg 文件 - 一个最小文件,它只会搜索特定的 UUID,然后从那里加载 grub.cfg。
Ubuntu 默认的 grubx64.efi 似乎还包含一个带字体的 squashfs4 文件系统。也许还有更多。