我几乎已经完成了《Linux From Scratch》;然而,当我尝试启动新的LFS系统时。 GRUB 无法启动系统:
错误:未找到磁盘“(hd0,)”。
然后我使用grub> ls
输出:(hd0) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1)
我按照说明进行操作,没有任何特别的地方,除了我将 GRUB 与 UEFI 一起使用,因为我的主机系统一直在使用 UEFI 和 GPT。
这是分区表:
- /dev/sda GPT
- /dev/sda1:大小为 512MB。 EFI系统分区。 FAT32
- /dev/sda2:大小为 16GB。 Linux 交换。 [交换]
- /dev/sda3:大小为 64GB。 Linux x86_64 根。分机4。主机系统。
- /dev/sda4:大小为 32GB。 Linux x86_64 根。分机4。 LFS系统。我在 sda1 中安装 grub。 sda1中的文件树如下:
.
├── config-5.16.9
├── EFI
│ └── LFS
│ └── grubx64.efi
├── grub
│ ├── fonts
│ ├── grub.cfg
│ ├── grubenv
│ ├── i386-pc
│ ├── locale
│ │ ├── ast.mo
│ │ ├── ca.mo
│ │ ├── ...
│ │ └── zh_TW.mo
│ └── x86_64-efi
│ ├── acpi.mod
│ ├── ...
│ └── zstd.mod
├── System.map-5.16.9
└── vmlinuz-5.16.9-lfs-11.1-systemd
以及内容grub.cfg
:
set default=0
set timeout=5
insmod part_gpt
insmod vfat # I've tried fat here.
set root=(hd0) #I've tried (hd0,gpt1), (hd0,gpt4), (hd0,1) .etc here.
if loadfont /boot/grub/fonts/unicode.pf2; then
set gfxmode=auto
insmod all_video
terminal_output gfxterm
fi
menuentry "GNU/Linux, Linux 5.16.9-lfs-11.1"{
linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro
}
menuentry "Firmware Setup"{
fwsetup
}
我主要参考了这些参考资料:
另外,我已设置在没有 CSM 支持或遗留的情况下使用 UEFI。
更多细节:
- GRUB 版本 2.06
- LFS 版本 11.1-systemd
- Linux 内核版本 5.16.9
- 安全启动已禁用
答案1
最初,GRUB 依赖 UEFI 服务来访问 ESP,因此除非您有固件支持ext4
,否则 GRUB 将只能读取 FAT32。它可以ext4
在之后读取insmod ext2
,但要做到这一点,它需要ext2.mod
先读取。
为了获得更多功能,GRUB 需要能够加载其模块,这些模块显然/grub/x86_64-efi
位于/dev/sda1
.但要做到这一点,GRUB 需要正确设置两个重要的变量:root
和prefix
。
在您的情况下,您需要set root=(hd0,gpt1)
,假设您只有一张磁盘。如果您有多个磁盘,预测正确的hdN
数量可能会很棘手,这就是为什么现代发行版通常更喜欢使用语法search --fs-uuid --set=root <UUID-of-the-filesystem>
而不是直接的set root=
.
应prefix
设置为(hd0,gpt1)/grub
.在 GRUB 提示符下使用set
不带参数的命令来查看 GRUB 变量的当前状态。
GRUB 一次只能关注一个文件系统,因此如果您挂载/dev/sda1
为/boot
,那么当 GRUBroot
设置为时(hd0,gpt1)
,它将显示/boot
为/
。因此,您应该/boot
从所有引用 的路径中省略sda1
。
如果您需要从 ext4 文件系统加载某些内容/dev/sda4
,则需要执行三步操作:
insmod ext2
whileroot
和prefix
仍然按上述设置set root=(hd0,gpt4)
将 GRUB 焦点切换到 LFS 根文件系统- 加载您需要的任何内容,请记住,这
/boot
只是sda4
. Linux 内核稍后将使用它作为 的挂载点/dev/sda1
,但这对 GRUB 没有任何帮助。
因此,您需要更正的行grub.cfg
是:
...
#set root=(hd0) # not just the disk, but the partition/filesystem GRUB will focus on
set root=(hd0,gpt1)
...
#if loadfont /boot/grub/fonts/unicode.pf2; then # GRUB will see /boot as /
if loadfont /grub/fonts/unicode.pf2; then
...
# linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro # same here, also fix the kernel filename
linux /vmlinuz-5.16.9-lfs-11.1-systemd root=/dev/sda4 ro
...
该/boot/grub/i386-pc
目录在 UEFI 系统上将毫无用处;请随意删除它。
该/boot/grub/fonts/unicode.pf2
文件当前似乎不存在于sda1
.但由于您显然可以在没有它的情况下以文本模式获取 GRUB,因此您可以在没有它的情况下生活。