操作系统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 分区)的菜单,一切都会正常工作,我已经显示了其中包含的行。configfile
chainloader
grub.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 上的人们。我希望这可以为您节省大量的搜索时间和痛苦。