我正在尝试构建一个新的引导加载程序,遗憾的是我对这个主题了解不多。我正在按照中的说明进行操作通过 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.mod
都tftp.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_gop
和efi_uga
,以确保如果出现问题,您至少能够看到来自 GRUB 的错误消息。