refind 引导 btrfs 识别不到 vmlinuz-linux-lts

三块硬盘,其中esp分区在nvme0n1p1上,引导位于第二块硬盘上subvol=@arch 的 系统,但是开机显示没有vmlinuz-linux-lts 文件 我完全按照btrfs wikirefind wiki

分别在mkinitcpio.conf中添加了 btrfs ,并重新生成内核,但是于事无补

有高手帮忙看看是什么问题么?


MODULES=(btrfs)

BINARIES=(btrfs)

分区如下:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0 946.7M  1 loop /run/archiso/airootfs
sda           8:0    1  57.8G  0 disk
├─sda1        8:1    1  57.7G  0 part
│ └─ventoy  253:0    0   1.4G  0 dm
└─sda2        8:2    1    32M  0 part
sdb           8:16   0   1.9T  0 disk
└─sdb1        8:17   0   1.9T  0 part
nvme2n1     259:0    0   1.8T  0 disk
└─nvme2n1p1 259:2    0   1.8T  0 part
nvme0n1     259:1    0   1.8T  0 disk
├─nvme0n1p1 259:3    0     1G  0 part /mnt/boot/efi
├─nvme0n1p2 259:4    0   128M  0 part
├─nvme0n1p3 259:5    0 150.1G  0 part
├─nvme0n1p4 259:6    0 906.7G  0 part
└─nvme0n1p5 259:7    0 805.1G  0 part
nvme1n1     259:8    0   1.8T  0 disk
└─nvme1n1p1 259:9    0   1.8T  0 part /mnt
menuentry "Arch" {
    icon     /EFI/refind/icons/os_arch.png
    volume   "UUID=8f4d6769-418e-4bd5-8b9a-2554903c7af5"
    loader   /@arch/boot/vmlinuz-linux-lts
    initrd   /@arch/boot/initramfs-linux-lts.img
    options  "root=UUID=8f4d6769-418e-4bd5-8b9a-2554903c7af5 rw add_efi_memmap rootflags=subvol=@arch initrd=/@arch/boot/amd-ucode.img"
    submenuentry "Boot using fallback initramfs" {
        initrd /@arch/boot/initramfs-linux-lts-fallback.img
    }
    submenuentry "Boot to terminal" {
        add_options "systemd.unit=multi-user.target"
    }
}

你这里写的是 vmlinuz-linux 不是 vmlinuz-linux-lts,当然就没有了(

不过正常来说 refind 应该不需要手写 entry 的。参阅:https://www.rodsbooks.com/refind/drivers.html#:~:text=Prior%20to%20rEFInd%200.10.0%2C%20adding%20also_scan_dirs%20%2B%20%40/boot%20to%20refind.conf%20was%20often%20necessary%2C%20but%20%40/boot%20is%20now%20part%20of%20the%20default.

vmlinuz-linux 不是 vmlinuz-linux-lts 贴错内容了,这个错误我发现后已经改掉了

手写是因为要引导多个操作系统,而且 /boot/refind.conf 配置比较麻烦。

根据这里的提示

我添加了,但是似乎并没有什么作用

also_scan_dirs boot,ESP2:EFI/linux/kernels
also_scan_dirs boot,@/boot
also_scan_dirs +,@/kernels

volume 这一项支持这样的语法吗?看文档的说法,这里只支持填写文件系统 LABEL、分区 PARTLABEL、分区 PARTUUID,不支持文件系统 UUID,而且看 wiki 的例子不需要像内核参数那样写 UUID= 这个前缀,直接写值即可。

查看分区 PARTUUID 可以用 lsblk -o+PARTUUID 命令。

(不论如何,我个人是更倾向于使用自动探测而不是手写 menuentry)

目前而言,自动探测并没有探测到要启动的系统。

我改下 partuuid试试,之前一直在用uuid一直是正常的,事实证明,partuuid 和 uuid 结果相同的


menuentry "Arch" {
    icon     /EFI/refind/icons/os_arch.png
    volume   "UUID=8f4d6769-418e-4bd5-8b9a-2554903c7af5"
    loader   /@arch/boot/vmlinuz-linux-lts
    initrd   /@arch/boot/initramfs-linux-lts.img
    options  "root= PARTUUID=f3931f49-426e-4569-b03e-a56ec31fb498 rw add_efi_memmap rootflags=subvol=@arch initrd=/@arch/boot/amd-ucode.img"
    submenuentry "Boot using fallback initramfs" {
        initrd /@arch/boot/initramfs-linux-lts-fallback.img
    }
    submenuentry "Boot to terminal" {
        add_options "systemd.unit=multi-user.target"
    }
}

还要去掉 UUID= 那个前缀,只写值

还是不行,怎么感觉refind 读不到子卷里的 /boot目录,但是我在driver目录里已经复制了btrfs的驱动了。

menuentry "Arch" {
    icon     /EFI/refind/icons/os_arch.png
    volume   label  ## 经测试此处一定要填写卷标,否则无法启动。
    loader   /@arch/boot/vmlinuz-linux-lts
    initrd   /@arch/boot/initramfs-linux-lts.img
    options  "root= PARTUUID=f3931f49-426e-4569-b03e-a56ec31fb498 rw add_efi_memmap rootflags=subvol=@arch initrd=/@arch/boot/amd-ucode.img"
    submenuentry "Boot using fallback initramfs" {
        initrd /@arch/boot/initramfs-linux-lts-fallback.img
    }
    submenuentry "Boot to terminal" {
        add_options "systemd.unit=multi-user.target"
    }
}

哦,我才发现你上面改错位置了,我说的就是 volume 那一行,不是 options 里的内核命令行参数,这是不相干的两回事。volume 是告诉 refind 在哪里寻找内核和 initramfs,内核命令行参数是在内核启动后给 initramfs 寻找 root 分区使用的。

写成 volume f3931f49-426e-4569-b03e-a56ec31fb498 的话大概是可以的

你好,我也遇到类似情况,我有点看不懂你这路径里的@arch是什么意思,我是直接将vmlinuz和initramfs文件放到esp分区后,这样可以自动识别的

@arch 是我的btrfs 子卷名称

我是ext4分区,尝试了多次,我发现vmlinuz和initramfs文件放在非esp分区是无法启动的,不过看你的情况能启动,说明内核不用放在esp分区也可以,很纳闷。