如何通过 GRUB2 控制台从网络启动 Linux 内核?

如何通过 GRUB2 控制台从网络启动 Linux 内核?

我想要启动的测试硬件是 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 网络支持。也许固件升级可以解决您的问题?

我看到您正在使用efinetGRUB 网络驱动程序模块。我认为它假设固件已经初始化了网络接口并通过 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/shareGRUBlinux命令行的引导选项,和/或initrd在输入命令之前使用 GRUB 命令从与内核相同的 TFTP 服务器加载 initramfs boot

在 initramfs 中,您可以包含用于任意复杂设置的工具,例如连接到 iSCSI 存储并使用其上的文件系统作为根文件系统(如果您愿意)。

相关内容