Overlayfs 无法在 Gentoo VPS 上的内核 6.1.31 上工作

Overlayfs 无法在 Gentoo VPS 上的内核 6.1.31 上工作

我有一个装有 Gentoo 的 VPS,但内核覆盖文件系统无法正常工作。

这些是与overlay相关的内核选项

编译进内核

cat .config | grep -i overlay

CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
CONFIG_OVERLAY_FS=y
# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
# CONFIG_OVERLAY_FS_INDEX is not set
# CONFIG_OVERLAY_FS_XINO_AUTO is not set
# CONFIG_OVERLAY_FS_METACOPY is not set

编译为模块

cat .config | grep -i overlay

CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
CONFIG_OVERLAY_FS=m
# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
# CONFIG_OVERLAY_FS_INDEX is not set
# CONFIG_OVERLAY_FS_XINO_AUTO is not set
# CONFIG_OVERLAY_FS_METACOPY is not set

加载到内核时来自 dmesg 的消息

dmesg | grep -i overlay
[   10.144242] request_module fs-overlay succeeded, but still no fs?

编译为模块时来自 dmesg 的消息

dmesg | grep -i overlay
[   10.000001] request_module fs-overlay succeeded, but still no fs?

当编译为模块时,该模块位于正确的位置

locate overlay.ko
/lib/modules/6.1.46-gentoo/kernel/fs/overlayfs/overlay.ko
/usr/src/linux-6.1.46-gentoo/fs/overlayfs/.overlay.ko.cmd
/usr/src/linux-6.1.46-gentoo/fs/overlayfs/overlay.ko

cat /proc/文件系统 | grep -i 覆盖层为空。

该系统是:

uname -a
Linux patito 6.1.31-gentoo #3 SMP PREEMPT_DYNAMIC Sun Jun 25 09:04:44 GMT 2023 x86_64 QEMU Virtual CPU version 2.5+ AuthenticAMD GNU/Linux

整个系统运行 ext4 只有一个分区,除了 /boot 位于不同的 ext4 分区上。

系统拥有2GB内存和充足的空间。我下载了系统的快照,并使用 virt-manager 在我的计算机上运行它,添加了更多内存和 CPU 核心,只是为了测试,我得到了相同的结果。 qemu-img 是否转换为从 .img 更改为 qcow2,以防有帮助但没有变化。

我尝试过不同的内核,使用不同的选项重新编译,删除所有的overlayfs部分,重新​​启动并重新启用它们,在互联网上搜索类似的问题,但我没有找到任何东西,任何理论都会受到赞赏。

内核中的overlayfs被编译为内核的一部分,如上所示,但我也尝试将其编译为模块,它没有自动加载,当我尝试使用手动加载它时modprobe,什么也没有发生,但它没有加载,运行 lsmod 后我不在那里。我会再试一次并将内核配置添加到上面的部分。

答案1

谷歌搜索您在中看到的消息,dmesg找到以下文件puppet源代码描述问题的原因:

    # On a fresh node overlay may be unloaded automatically by the OS
    # if no fs needs it. In this case the kern.log should look like:
    # kernel: request_module fs-overlay succeeded, but still no fs?
    # This may lead to unwanted side effects, like Docker not finding
    # the overlay kernel module loaded and falling back to
    # the device-mapper storage driver.
    # Therefore we explicitly load the overlay module when the overlayfs
    # option is true.
    kmod::module { 'overlay':
        ensure => 'present',
    }

因此,在您的主机上,如果运行以下命令,您将看到overlay内核模块未加载:

lsmod |grep overlay

所以你只需要重新加载overlay内核模块即可。

modprobe overlay

答案2

发表回复后阿维罗,我意识到我的内核版本 6.1.46 与原始消息中的 6.1.31 不同。这完全可能是因为我从发布问题的原始网站复制了大部分信息,码头工人社区论坛,我已经做了很多测试并尝试解决这个问题,但这让我开始考虑加载的内核版本。

检查它/usr/src/linux是否指向正确的内核,6.1.46并且它被重新编译为覆盖 fs 作为模块以发布原始帖子中的相关信息,然后make && make modules_install && make install重新grub-mkconfig -o /boot/grub/grub.cfg启动。

重启后,我再次运行uname -a,内核是6.1.31,为什么?

可能是我使用错误的路径执行了 mkconfig,所以我小心翼翼地再次执行,然后再次重新启动。同样的事情,还是 6.1.31。

重新启动后,我检查了/boot/grub/grub.cfg正确的选项,6.1.46 是启动系统的第一个选项。因此,为了防止某些随机行未更新的问题,我执行了rm /boot/\*6.1.31*并运行grub-mkconfig -o /boot/grub/grub.cfg,用 grep 检查,没有发现 6.1.31 的痕迹,只有 6.1.46。

再次重新启动,又出现了,6.1.31。但一切看起来都很好,它应该启动 6.1.46。

然后我重新启动并手动控制启动过程,手动编辑数字以加载6.1.46,但系统失败,找不到内核。

这是关键。

我改回 6.1.31,让它启动并检查我的安装点(/boot 是一个不同的分区)。

它就在那里,或者我应该说,它没有,/boot没有被安装。在这个系统生命周期的某个时刻,我在 noauto 上犯了一个错误,/etc/fstab所以/boot它没有被安装。

我改变了这一点,删除了不自动对于/bootb /etc/fsta,重新启动系统,瞧!系统是 6.1.46,overlayfs 正在工作

虽然,这是我不明白的新部分。即使/boot是文件夹而不是分区,6.1.46 内核也在那里并且/boot/grub/grub.cfg具有正确的配置,那么为什么它没有被读取和加载呢?在启动时出现的 grub 菜单上,只有一个选项,6.1.31,但我在磁盘上找不到它 not withlocate和 not with find,那么它在哪里?它是如何加载的?/boot/grub/grub.cfg使用 cat 从磁盘读取的数据为 6.1.46。

好吧,在这个长篇故事之后,我解决了这个问题并得到了一个新的谜团,但现在这个谜团仍然悬而未决,因为我已经花了太多时间了。

感谢您的帮助,如果没有尝试回答 aviro 的最后一条评论,我就不会偶然发现解决方案。

相关内容