我有一个装有 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
它没有被安装。
我改变了这一点,删除了不自动对于/boot
b /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 的最后一条评论,我就不会偶然发现解决方案。