grub-mkimage - 无法打开 `/srv/tftp/boot/grub/x86_64-efi/core.efi.mod;怎么解决?

grub-mkimage - 无法打开 `/srv/tftp/boot/grub/x86_64-efi/core.efi.mod;怎么解决?

我正在尝试构建一个新的引导加载程序,遗憾的是我对这个主题了解不多。我正在按照中的说明进行操作通过 PXE 将安装程序引导到 UEFI 系统时出现问题

我首先运行:

grub-mknetdir --net-directory=/srv/tftp/ --subdir=/boot/grub
Netboot directory for x86_64-efi created. Configure your DHCP server to point to /srv/tftp/boot/grub/x86_64-efi/core.efi

这似乎有效,所以我继续执行下一个命令:

root@vogon:~# grub-mkimage -O x86_64-efi /srv/tftp/boot/grub/x86_64-efi/core.efi --prefix='tftp,192.168.50.9)/boot/grub' efinet tftp
grub-mkimage: error: cannot open `/srv/tftp/boot/grub/x86_64-efi/core.efi.mod': No such file or directory.

我可以看到以下.mod文件/srv/tftp/boot/grub/x86_64-efi/

root@vogon:~# file /srv/tftp/boot/grub/x86_64-efi/*
/srv/tftp/boot/grub/x86_64-efi/acpi.mod:                 ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
/srv/tftp/boot/grub/x86_64-efi/adler32.mod:              ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
/srv/tftp/boot/grub/x86_64-efi/affs.mod:                 ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
/srv/tftp/boot/grub/x86_64-efi/afs.mod:                  ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
...

efinet.modtftp.mod存在,但core.efi.mod当然不存在。该core.efi文件与以下文件不同.mod

root@vogon:~# file /srv/tftp/boot/grub/x86_64-efi/core.efi
/srv/tftp/boot/grub/x86_64-efi/core.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows

我该如何解决这个问题?

答案1

一般来说,这些命令应该可以为标准 tftp 目录中托管的 BIOS 和 uefi 创建启动映像。

apt-get install grub-pc-bin grub-efi-amd64-bin
mkdir -p /srv/tftp
grub-mknetdir --net-directory /srv/tftp/

如果您使用详细标志,那么您可以看到grub-mkimage正在使用的命令grub-mknetdir

# grub-mknetdir --net-directory /srv/tftp/ -v
...
grub-mknetdir: info: grub-mkimage --directory '/usr/lib/grub/i386-pc' --prefix '/boot/grub' --output '/srv/tftp/boot/grub/i386-pc/core.0'  --dtb '' --format 'i386-pc-pxe' --compression 'auto'  'tftp' 'pxe'
...
grub-mknetdir: info: grub-mkimage --directory '/usr/lib/grub/x86_64-efi' --prefix '/boot/grub' --output '/srv/tftp/boot/grub/x86_64-efi/core.efi'  --dtb '' --format 'x86_64-efi' --compression 'auto'  'tftp' 'efinet'

您可以简单地根据您的自定义调整这些命令

grub-mkimage --directory '/usr/lib/grub/x86_64-efi' --prefix '(tftp,192.168.50.9)/boot/grub' --output './core.efi' --format 'x86_64-efi' --compression 'auto'  'tftp' 'efinet'

答案2

root@vogon:~# grub-mkimage -O x86_64-efi /srv/tftp/boot/grub/x86_64-efi/core.efi --prefix='tftp,192.168.50.9)/boot/grub' efinet tftp

你错过了这个-o选项。

而不是尝试建造核心映像正如/srv/tftp/boot/grub/x86_64-efi/core.efi您显然想要的那样,该命令假设所有非选项参数都是 GRUB 模块名称,因此它添加后缀.mod并寻找.../core.efi.mod将其合并到 GRUB 映像中,默认情况下该映像将输出到标准输出中。

尝试改为:

grub-mkimage -O x86_64-efi -o /srv/tftp/boot/grub/x86_64-efi/core.efi --prefix='tftp,192.168.50.9)/boot/grub' efinet tftp

您可能还希望包含 UEFI 显示驱动程序模块efi_gopefi_uga,以确保如果出现问题,您至少能够看到来自 GRUB 的错误消息。

相关内容