当 BIOS 缺乏支持时,GRUB 可以访问 NVMe 驱动器吗?

当 BIOS 缺乏支持时,GRUB 可以访问 NVMe 驱动器吗?

NVMe 驱动器可以安装在 BIOS 不支持的计算机上;任何正在运行的操作系统仍可以使用驱动程序访问它,只是不能用作启动驱动器。GRUB 是否有功能可以在没有 BIOS 支持的情况下访问 NVMe 驱动器?

答案1

这在理论上是可行的。事实上,GRUB2 包含各种驱动程序用于访问块存储,包括 AHCI、SCSI 等等。但是没有NVMe驱动程序。(并且可能永远不会有。)这些驱动程序用于访问存储位置以加载内核映像和其他文件。

正如 ChanganAuto 在其评论中提到的,GRUB(包括初始 GRUB 配置和至少必要的 GRUB 模块)必须位于 BIOS 可以访问的驱动器上。这也可以是 USB 驱动器。

一旦 GRUB 将内核(以及任何其他所需文件)加载到内存中,它就会将控制权移交给内核。如果内核有 NVMe 驱动程序,它也可以访问 NVMe 驱动器。

对于 Linux,一个更好的解决方案是只让内核驻留在 GRUB 中,就像通常那样。对于 BSD/UNIX,这也可能是一个可行的解决方案。

如果您想要链式加载某些东西(例如 DOS、Windows 等),事情就会变得更加困难:您必须挂接 INT13 以在实模式下处理磁盘访问,然后希望您正在启动的任何内容都可以使用本机驱动程序接管。我不确定这样的功能是否能与 GRUB 的架构很好地融合。

答案2

恕我直言,我还没有亲自测试过,但事实证明一个有点过时的 [2018] 补丁,用于 grub4dos 0.4.5(不是 grub),它添加了 AHCI 和 NVMe 支持作为 int13H(bios 模式)驱动程序。该驱动程序似乎是 Kai Schtrom 的原创作品。(事实证明他还写道适用于 Windows Server 2003 的 NVMe 驱动程序。)根据 grub4dos 驱动程序源代码中的注释 [大约第 5000 行],它基于或受到 OFA(开放结构联盟)NVMe 驱动程序的启发。


更新:我现在已经尝试过了,但对我来说没用。AHCI 部分工作正常(当然适用于 SATA 驱动器),但 NVMe 部分完全不行。对于后者,我得到的只是

Error: Can't read LBA 0 in NVMe mode!

驱动程序的 grub4dos 接口也有点不稳定(除了解释不清之外):即使在工作 AHCI 模式下,例如,如果您不传递端口号,即使您传递了端口号,它也会抱怨--showall等等。

我在其他地方找到的唯一关于此问题的讨论是http://reboot.pro/index.php?showtopic=21872这有点像恶搞,但大多数报告说它不起作用,尽管也有少数人报告说它起作用了。

值得一提的是,作者有一句话表明这不是一个通用的 NVMe 驱动程序(即使在 grub4dos 环境中):

驱动器号应始终与系统的实际 BIOS 驱动器号相匹配,否则系统可能会挂起。

因此,如果你还没有映射 NVMe 驱动器的 BIOS(有少数那些比如 Gigabyte MX-31),从设计上来说,这可能毫无用处。

更新 2:我查看了源代码,我的 (Kinston NV2) 设备实际上正在初始化……一点点。我这样说是因为如果驱动程序之前失败了,它还会打印一堆其他消息,即:

    // do this for all found controllers
    for(i = 0; i < *foundControllers; i++)
    {
        // find adapter
        if(NVMeFindAdapter(&(*DevExt)[i]) != SP_RETURN_FOUND)
        {
            printf("NVMeInit Error: Can't find NVMe adapter!\n");
            return 3;
        }
        
        // initialize adapter
        if(NVMeInitialize(&(*DevExt)[i]) != TRUE)
        {
            printf("NVMeInit Error: Can't initialize NVMe adapter!\n");
            return 4;
        }

        // NVMe read initialization
        if(NVMeReadInit(&(*DevExt)[i]) != 0)
        {
            printf("NVMeInit Error: Can't initialize NVMe read!\n");
            return 5;
        }
    }

    return 0;

但我不知道那些我得到的(关于 LBA 0)出现在代码的后面(调用序列),但驱动程序编码很糟糕,打印不出有关设备的任何信息(即使它可以从 PCIe 总线读取它),除非它可以读取 LBA 0,但它并不严格需要打印有关设备的信息。

    // check if at least one NVMe controller is present
    if(nvmeg.FoundControllers == 0)
    {
        grub_printf("Error: No NVMe controller present!\n");
        rc = 0;
        goto cleanup;
    }

    ...........

    // read LBA 0
    // test if we can read from the specified NVMe controller
    unsigned char buf[512];
    if(NVMeRead(&nvmeg.DevExt[nvmeg.SelectedController],0,(DWORD)buf,1) != 0)
    {
        printf("Error: Can't read LBA 0 in NVMe mode!\n");
        rc = 0;
        goto cleanup;
    }

此外,显然,已解除 OFA 代码的编译方式是NVME_DEBUG关闭的,因此我没有得到任何更详细的跟踪。我必须在打开该标志的情况下重新编译,才能获得一些关于失败原因的合理诊断。

TLDR:这可能 [实际上] 适用于某些设备。开发人员显然有一台三星设备。

答案3

帖子 使用 GRUB 从 PCIe NVMe SSD 引导 Windows10 描述了使用 USB 磁盘和另一个引导加载程序从 NVME 启动的方法。

这是被接受的答案,并且还获得了大笔赏金。

据我所知,目前没有办法使用 GRUB 从不支持 Windows 的主板上的 PCIe 设备启动 Windows。这就是我来到这里的原因。

但是,您可以使用Clover EFI 引导加载程序,它是为在 Mac 上启动 Windows 而制作的。

其想法是通过 USB 启动 Clover,它将加载一个驱动程序,允许您从 PCIe NVMe SSD 启动 Windows。

这是在 USB 上安装 Clover 的指南。

安装完成后,您需要NvmExpressDxe.efi 从移动EFI/CLOVER/drivers/offEFI/CLOVER/drivers/BIOSEFI/CLOVER/drivers/UEFI

从那里开始,它应该像启动 USB 一样简单。

相关内容