grub2:错误:无法分配 initrd - 从 FAT32 链式加载 NTFS 分区,初始 ramdisk(initrd)文件上没有错误

grub2:错误:无法分配 initrd - 从 FAT32 链式加载 NTFS 分区,初始 ramdisk(initrd)文件上没有错误

操作系统Ubuntu 20.04.3 LTS Desktop 64-bit位于 gpt2 分区,文件系统为 NTFS。

这是具有文件系统 FAT32 的 gpt1 分区的结构:

.
├── boot
│   └── grub
│       └── grub.cfg
└── efi
    └── boot
        ├── bootx64.efi
        ├── grubx64.efi
        └── mmx64.efi

4 directories, 4 files

这是 NTFS 分区的 grub 菜单(默认 grub.cfg):

if loadfont /boot/grub/font.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

set timeout=5
menuentry "Ubuntu" {
    set gfxpayload=keep
    linux   /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet splash ---
    initrd  /casper/initrd
}
menuentry "Ubuntu (safe graphics)" {
    set gfxpayload=keep
    linux   /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet splash nomodeset ---
    initrd  /casper/initrd
}
menuentry "OEM install (for manufacturers)" {
    set gfxpayload=keep
    linux   /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed only-ubiquity quiet splash oem-config/enable=true ---
    initrd  /casper/initrd
}
grub_platform
if [ "$grub_platform" = "efi" ]; then
menuentry 'Boot from next volume' {
    exit 1
}
menuentry 'UEFI Firmware Settings' {
    fwsetup
}
fi

如果 grub.cfg 文件(FAT32 分区)包含:

search --no-floppy --set=root --fs-uuid 2E92F36515DD4A5A
chainloader /EFI/BOOT/BOOTx64.EFI
boot

在 grub 选择菜单中做出选择后,放置在默认 grub.cfg 文件(NTFS 分区)中(该文件与 iso 映像中包含的默认文件相同)Ubuntu 20.04.3 LTS Desktop 64-bit,出现错误消息:

error: can't allocate initrd.
Press any key to continue...

我必须强调的是,NTFS 分区引导加载程序使用该chainloader命令正确启动,否则我将不会看到 grub 选择菜单,而是该initrd命令给出了错误。

如果 grub.cfg 文件(FAT32 分区)包含:

search --no-floppy --set=root --fs-uuid 2E92F36515DD4A5A
configfile /boot/grub/grub.cfg

选择菜单后,一切都正常工作,因此 initrd 命令不再给出错误。

initrd运行 NTFS 分区引导程序并使用其中的默认 grub.cfg 文件进行引导有什么问题?
我已经测试过,如果分区 2 有 Windows,则使用chainloader一切都可以正常工作。

更新 1:
我尝试交换分区,但错误仍然存​​在。

更新 2:
我想从initrd命令中获取更详细的错误输出,但我不知道怎么做
我努力了

linux   /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed nosplash debug ignore_loglevel ---
initrd  /casper/initrd

但错误输出仍然相同,没有添加行。

更新 3:
总结并澄清我要做的事情,我从 FAT32 分区执行位于 NTFS 分区上的引导加载程序的链式加载。
如果我直接从 BIOS 启动 NTFS 分区,则一切正常,如果我从 FAT32 分区开始链式加载,则会出现问题。即使我使用命令而不是FAT32 分区文件中的命令
调用 grub.cfg(NTFS 分区)的菜单,一切都会正常工作,我已经显示了其中包含的行。configfilechainloadergrub.cfg

更新 4:无论如何
我都会chainloader出于通用原因使用该命令,甚至能够使用configfile可以解决问题的命令,因为我可以执行相同的命令来启动 Windows 和 Ubuntu 的分区。

更新 5:
ntfs模块已内置到两个分区的引导加载程序中。该lsmod命令证实了这一点。无论如何,我尝试插入两个分区的insmod ntfs文件grub.cfg,并且如预期的那样,错误没有改变。

更新 6:
我不直接从 BIOS 启动 NTFS 分区,因为旧电脑上的 UEFI 无法直接读取 NTFS。

更新 7:
我发现了一个错误!之前我没有注意到它,因为它只持续了一小段时间。但是,我录制了一段手机视频,必须将其设置为 60 fps 才能捕捉到错误,然后将其带到 PC 上,从 PC 上我截取了该视频片段的屏幕截图,然后旋转并用 gimp 裁剪。
错误如下:

error: can't find command `grub_platform`.

以下是屏幕截图:

在此处输入图片描述

答案1

您在 NTFS 上运行 Linux,对吗?

如果是这样,GRUB 可能默认无法读取 NTFS,因此无法访问 initrd 文件。根据 Grub2 文档https://www.gnu.org/software/grub/manual/grub/html_node/Chain_002dloading.html我会尝试将其添加insmod ntfs到适当的菜单项中。

如果不正确,您应该使用配置文件的精确(相关)配置节来澄清您的问题。

我也不知道错误是来自 GRUB 还是 Linux 内核。内核是否开始加载?

我也不清楚为什么要链式加载到另一个引导加载程序来加载 Linux,而不是直接从 NTFS 分区加载内核,但鉴于您已经在 NFTS 上安装了 Linux,我假设您有这样做的理由。

答案2

对于那些在安装其他操作系统后想知道为什么 grub 会说“无法分配 initrd”的人,我发现 BIOS 中的启动顺序设置为加载新操作系统。一旦我拔下外部驱动器,它就会给我一个 grub 恢复。我不得不学习这一点才能获得英寸 grub,但一切都是徒劳的。

经过几个小时的痛苦挣扎,我终于找到了解决方案,感谢Hiveon 上的人们。我希望这可以为您节省大量的搜索时间和痛苦。

相关内容