首先,如果这个问题已经被问过并得到回答,我深感抱歉;因为我找不到现有的答案。
我确实有一个 x86/64 设备,里面有两个驱动器。我对 2 个 Linux 系统使用双启动。
驱动器设置如下:
-NVMe drive
├─/dev/nvme0n1p128
├─/dev/nvme0n1p1 (bootfs)
└─/dev/nvme0n1p2 (rootfs)
-SSD drive
├─/dev/sda128
├─/dev/sda1 (bootfs)
└─/dev/sda2 (rootfs)
驱动器和分区之间的 UUID 和 PARTUUID 都是不同的。
每个驱动器上的 bootfs 设置如下:
─boot
├─grub
│ ├─boot.img
│ ├─core.img
│ └─grub.cfg
└─vmlinuz
─efi
└─boot
└─bootx64.efi
现在,我遇到的奇怪行为是:在 BIOS 中,当我选择 NVMe 驱动器作为启动驱动器时,使用的 grub.cfg 文件是 /dev/sda1/boot/grub/grub.cfg 中的一个,但使用的 vmlinuz 是来自 /dev/nvme0n1p1/boot/vmlinuz 的 vmlinuz(应该是)。
粗体部分表示意外行为。为什么 grub.cfg 文件从 BIOS 中未选定的启动驱动器的 SSD 驱动器读取,而 vmlinuz 文件却从正确的驱动器(NVMe)读取?
如果我在 BIOS 中选择 SSD 驱动器作为启动设备,则使用的将是 /dev/sda1/boot/grub/grub.cfg 中的相同 grub.cfg(正如我在这里所期望的那样),以及 /dev/sda1/boot/vmlinuz 中的相同 vmlinuz(正如我在这里所期望的那样)。
这正常吗?我希望当选择 NVMe 驱动器作为启动驱动器时,使用来自 /dev/nvme0n1p1/boot/grub/grub.cfg 的 grub.cfg,而不是来自 SSD 的 grub.cfg。
感谢您的耐心等待。
更多细节:
~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat ABCD-1234
├─sda2 ext4 rootfs ed0bc801-6679-4118-b8ad-28386c2e83d6
└─sda128
nvme0n1
├─nvme0n1p1 vfat 5678-ABCD 5M 69% /boot
├─nvme0n1p2 ext4 rootfs ff313567-e9f1-5a5d-9895-3ba130b4a864 1.6G 20% /
└─nvme0n1p128
~# fdisk -x
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: NVME SSD 512GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 4C2F5CD7-82D9-297C-31A4-0953C5B32A00
First LBA: 34
Last LBA: 1000215182
Alternative LBA: 1000215215
Partition entries LBA: 2
Allocated partition entries: 128
Device Start End Sectors Type-UUID UUID Name Attrs
/dev/nvme0n1p1 512 33279 32768 0FC63DAF-8483-4772-8E79-3D69D8477DE4 4C2F5CD7-82D9-297C-31A4-0953C5B32A01 LegacyBIOSBootable
/dev/nvme0n1p2 33280 4227583 4194304 0FC63DAF-8483-4772-8E79-3D69D8477DE4 4C2F5CD7-82D9-297C-31A4-0953C5B32A02
/dev/nvme0n1p128 34 511 478 21686148-6449-6E6F-744E-656564454649 4C2F5CD7-82D9-297C-31A4-0953C5B32A80
Partition table entries are not in disk order.
Disk /dev/sda: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: SPCC Solid State
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B3D4E8E2-95E4-48A0-8530-93CEB6CB6D0C
First LBA: 34
Last LBA: 1000215182
Alternative LBA: 1000215215
Partition entries LBA: 2
Allocated partition entries: 128
Device Start End Sectors Type-UUID UUID Name Attrs
/dev/sda1 512 33279 32768 0FC63DAF-8483-4772-8E79-3D69D8477DE4 001F6144-F22B-4119-AECF-E986C9EDF20E LegacyBIOSBootable
/dev/sda2 33280 4227583 4194304 0FC63DAF-8483-4772-8E79-3D69D8477DE4 C29A1F16-3054-47E2-A498-2AFAFDC6FFB2
/dev/sda128 34 511 478 21686148-6449-6E6F-744E-656564454649 D400B1E5-FD8F-465E-8C40-87B39B7F5328
Partition table entries are not in disk order.
还有 grub.cfg 文件:
~# cat /boot/boot/grub/grub.cfg
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 --rtscts=off
terminal_input console serial; terminal_output console serial
set default="0"
set timeout="5"
search -l kernel -s root
menuentry "NVMe OpenWrt" {
linux /boot/vmlinuz root=PARTUUID=4C2F5CD7-82D9-297C-31A4-0953C5B32A02 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
menuentry "NVMe OpenWrt (failsafe)" {
linux /boot/vmlinuz failsafe=true root=PARTUUID=4C2F5CD7-82D9-297C-31A4-0953C5B32A02 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
menuentry "SSD OpenWrt" {
linux /boot/vmlinuz root=PARTUUID=C29A1F16-3054-47E2-A498-2AFAFDC6FFB2 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
menuentry "SSD OpenWrt (failsafe)" {
linux /boot/vmlinuz failsafe=true root=PARTUUID=C29A1F16-3054-47E2-A498-2AFAFDC6FFB2 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
注意:有一个 /dev/sda3 和一个 /dev/nvme0n1p3 分区,但它们在这里无关,因为它们与启动、系统或 rootfs 无关,所以我简化了输出。
答案1
我最终通过在 Docker 容器上安装 Ubuntu 解决了这个问题,从容器内部编译最新的 Grub2,然后我使用此配置嵌入到内部bootx64.efi
名为的文件grub-buildin.cfg
:
search.fs_uuid 4C2F5CD7-82D9-297C-31A4-0953C5B32A01 root
set prefix=($root)/boot/grub
然后我像这样使用 grub-mkimage:
MODULES="configfile ext2 fat part_gpt normal linux ls boot echo reboot search search_fs_file search_fs_uuid search_label help font efi_gop efi_uga gfxterm"
./grub-mkimage -O x86_64-efi -o bootx64.efi -p /efi/boot -d ./grub-core search_fs_uuid -c ./grub-buildin.cfg $MODULES
这生成了一个bootx64.efi
然后我将其放入/dev/nvme0n1p1/efi/boot/(替换旧版本)。然后当我重新启动时,我得到了来自/dev/nvme0n1p1/boot/grub/grug.cfg 配置文件(并不是/dev/sda1/boot/grub/grug.cfg 不再适用),现在一切都很好,当我启动时:
BIOS -> bootx64.efi on NVMe EFI -> GRUB config on NVMe EFI -> whatever I choose from menu.
感谢@gapsf 为我指明正确的方向。