我想要启动的测试硬件是 MinnowBoard Max Turbot,它是一台带有 UEFI 的 x86 机器,到目前为止,我已经成功地从源代码构建了 GRUB2,并且它成功地从 USB 启动了内核。
现在,我想从网络启动 linux 内核和 rootfs。由于Minnowboard的UEFI固件不支持PXE(网络驱动程序不可用),所以我选择通过GRUB2来获取它,GRUB2可以使用网络驱动程序构建。
我可以设置 dhcp 服务器和 tftp 服务器,但是,我找不到任何有关如何指定 grub2 tftp 和 dhcp 服务器的 IP 地址的 Wiki/教程。如何告诉 GRUB2 从网络启动?
我能找到的最好的是: https://tr.opensuse.org/SDB:Booting_from_the_Network_with_GRUB
但是,它使用 grub-legacy。 GRUB2 文档也不清楚。
有人可以告诉我告诉 grub2 从网络启动内核的步骤和命令吗?另外,我需要使用哪些模块来构建 GRUB2(构建 GRUB2 的完整命令将不胜感激)
编辑
我使用以下命令构建了 GRUB2:
./grub-mkimage -d ./grub-core -o bootx64.efi -O x86_64-efi -p "" fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf tftp efinet
我有一个在 IP abcd 上运行的 tftp 服务器现在当我linux
在 GRUB2 控制台中进行如下设置时:
linux (tftp,a.b.c.d)/tftpboot/bzImage
我得到了错误destination unreachable
。另外,当我这样做时net_ls_cards
,我没有列出任何卡片。但我已经通过在其上启动 Ubuntu 来确认以太网上的互联网可以在该板上工作。
编辑2
感谢 @telcoM 指出 64 位版本需要网络 UEFI 支持。这让我有信心再花一天的时间去尝试,最终我成功了。
我设置了 tftp、dhcp 和 nfs 服务器(超出了本标题的范围)。
在 GRUB2 中,我点击了net_bootp
,这就是果汁。尽管名称具有误导性,但它是从 DHCP 服务器请求 IP 的第一步。这会将硬件置于具有合法网络设置的网络上。现在我可以设置内核路径
grub> linux (tftp,a.b.c.d)/tftpboot/bzImage
现在内核启动了。但我仍然落后一步——rootfs!加载 rootfs 时内核失败,这是预期的。
我无法弄清楚如何告诉 grub2 将 rootfs 位置设置为 NFS 服务器。有类似的功能吗(tftp)
?我正在检查文档。如果有人已经知道,请指出。
答案1
这主板最新固件的发行说明(2018 年 11 月发布)似乎表明 64 位版本的固件实际上确实支持网络启动,甚至使用 HTTP/HTTPS 协议。只有 32 位版本的固件仍然禁用 UEFI 网络支持。也许固件升级可以解决您的问题?
我看到您正在使用efinet
GRUB 网络驱动程序模块。我认为它假设固件已经初始化了网络接口并通过 DHCP 或从固件配置接收了 IP 地址。
如果固件无法初始化硬件并提供适当的 UEFI 协议供 GRUB 使用,则驱动efinet
程序将无法工作...当然,除非您从 Intel 的支持网页找到正确的 UEFI 网络驱动程序并首先编写一些 UEFI 脚本在启动之前从其他介质加载并配置 NIC 驱动程序和 TCP/IP 驱动程序堆栈grubx64.efi
。但这在某种程度上违背了网络启动的目的。
为了支持 UEFI PXE 引导和 UEFI 2.5 HTTP(S) 引导,您的 DHCP 服务器需要能够检测客户端 DHCP 请求中的 PXE 架构选项,并将适当的引导信息添加到 DHCP 响应中。如果您碰巧使用 ISCdhcpd
作为 DHCP 服务器,则与网络启动相关的 DHCP 服务器配置部分应类似于以下内容:
option pxearch code 93 = unsigned integer 16;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server <IP address of boot server>; # bootp style option
option tftp-server-name "<IP address of boot server>"; # DHCP style option
if option pxearch = 00:10 {
# 0x0010 = UEFI 2.5 HTTP boot for x86_64
filename "<HTTP or HTTPS URL pointing to a .efi bootloader file>";
} elsif option pxearch = 00:0f {
# 0x000f = UEFI 2.5 HTTP boot for 32-bit x86
filename "<HTTP or HTTPS URL pointing to a .efi bootloader file>"
} elsif option pxearch = 00:09 {
# TFTP-based UEFI PXE boot for x86_64 according to original RFC 4578
filename "/some/TFTP/path/grubx64.efi";
option boot-size <nnnn>; # size of grubx64.efi as reported by "du -B 512 grubx64.efi"
} elsif option pxearch = 00:07 {
# TFTP-based UEFI PXE boot for x86_64 according to current IANA registry
# and RFC 4578 errata
filename "/some/TFTP/path/grubx64.efi";
option boot-size <nnnn>; # as above
} elsif option pxearch = 00:06 {
# TFTP-based UEFI PXE boot for 32-bit x86
filename "/some/TFTP/path/grubia32.efi";
option boot-size <nnnn>;
} else {
# plain old x86 BIOS PXE boot options here
}
# end of PXE boot specific options
}
要在 GRUB 中指定根文件系统,您可以添加类似于ip=dhcp root=/dev/nfs nfsroot=nfs.server.ip.address:/root/filesystem/share
GRUBlinux
命令行的引导选项,和/或initrd
在输入命令之前使用 GRUB 命令从与内核相同的 TFTP 服务器加载 initramfs boot
。
在 initramfs 中,您可以包含用于任意复杂设置的工具,例如连接到 iSCSI 存储并使用其上的文件系统作为根文件系统(如果您愿意)。