与 /boot、grub.cfg 和多个驱动器相关的奇怪行为

与 /boot、grub.cfg 和多个驱动器相关的奇怪行为

首先,如果这个问题已经被问过并得到回答,我深感抱歉;因为我找不到现有的答案。

我确实有一个 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 为我指明正确的方向。

相关内容