踩到 kernel overlay fs 的一个坑

转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/mimepp

作者联系方式:YU TAO <yut616 at sohu dot com>

关键字: yocto, docker, container, gobject-introspection, "Invalid argument", cap_inode_getsecurity, d_find_any_alias(), d_find_alias()

近期遇到一个 kernel overlay fs 文件系统的一个问题,这里将相关内容做一个记录。

你如果使用 docker container 容器来编译 yocto,如ubuntu 16.04, kernel 4.15, 可能会遇到相同的问题,提示 “Invalid argument” 错误:

./g-ir-compiler: line 117: tmp/work/x86_64-linux/gobject-introspection-native/1.54.1-r0/build/.libs/lt-g-ir-compiler: Invalid argument

而且还是个很随机出现的问题,但出错时,始终为同一个地方 lt-g-ir-compiler。

网络上也有人报告类似问题:

https://www.spinics.net/lists/linux-unionfs/msg05363.html

[13181.958681] Invalid argument reading file caps for
/vol/mnt/m/build/tmp/work/x86_64-linux/gobject-introspection-native/1.50.0-r0/build/.libs/lt-g-ir-compiler

还好,已经得到了解决。

Author: Eddie.Horng <eddie.horng@mediatek.com>
Date:   Fri Jul 20 15:30:00 2018 +0800
    cap_inode_getsecurity: use d_find_any_alias() instead of d_find_alias()
    commit 355139a8dba446cc11a424cddbf7afebc3041ba1 upstream.

patch:

https://github.com/torvalds/linux/commit/355139a8dba446cc11a424cddbf7afebc3041ba1

从 4.18.7 开始进入了 kernel

https://elixir.bootlin.com/linux/v4.18.7/source/security/commoncap.c#L391

4.19+ 也有了。

所以解决办法就是升级 kernel 到 4.19。

<think>嗯,用户现在遇到了一个问题,就是在执行`lsmod | grep overlay`的时候没有输出,想排查原因。首先,我需要回忆一下Linux内核模块相关的知识。`lsmod`命令是用来列出已加载的内核模块的,而`grep overlay`则是过滤出包含“overlay”的模块。如果没有任何输出,可能有几个原因。 首先,用户可能没有加载overlay模块。Overlay模块通常用于联合文件系统,比如Docker会用到overlayoverlay2驱动。如果模块没有加载,自然`lsmod`就不会显示。这时候需要检查模块是否存在,并尝试手动加载。 其次,可能是模块名称不同。用户可能输入的是“overlay”,但实际模块名可能有不同的拼写,比如“overlayfs”。这时候需要用`lsmod`不加过滤,查看所有模块,或者用`modinfo overlay`来确认模块是否存在。 另外,内核配置的问题。有些内核可能没有编译Overlay文件系统的支持,或者编译为内置模块(built-in),而不是可加载模块(loadable)。这种情况下,`lsmod`也不会显示,因为内置模块已经集成在内核里,不需要加载。需要检查内核配置,或者查看`/boot/config-$(uname -r)`文件里的相关选项。 还有可能是用户权限问题,执行`lsmod`需要足够的权限,不过通常普通用户也可以执行。不过加载模块可能需要root权限,比如使用`modprobe overlay`。另外,路径问题也可能导致命令找不到,不过`lsmod`一般在/sbin或者/usr/sbin下,这些路径应该包含在用户的PATH环境变量中。 根据用户提供的引用内容,之前的问题涉及到br_netfilter模块的配置,以及Kubernetes的设置。可能用户是在搭建Kubernetes环境时遇到这个问题,比如在安装Docker或配置容器运行时需要Overlay模块。引用中的内容提到了modprobe命令和模块加载配置,这可能和当前的问题相关。比如用户可能需要配置overlay模块自动加载,可以通过在/etc/modules-load.d/下添加配置文件来实现。 另外,引用中提到了网络相关的配置,比如VXLAN和GENEVE,这些可能和Overlay网络有关,但用户的问题是关于Overlay文件系统模块的。不过需要区分清楚Overlay网络和Overlay文件系统,虽然名称相似,但功能不同。 接下来,我应该按照步骤来引导用户排查问题。首先确认模块是否加载,如果未加载则尝试加载,并检查是否加载成功。然后确认模块是否存在,检查内核配置,查看是否为内置模块。最后,如果是内核不支持,可能需要重新编译内核或启用相关选项。 用户可能是在搭建容器平台时遇到这个问题,比如使用Docker或Kubernetes,这些需要Overlay文件系统支持。如果模块没有加载,容器可能无法启动,导致用户部署应用失败。所以解决这个问题对用户来说比较紧急。 在回答时,需要按照之前设定的格式,使用中文,行内公式用$...$,独立公式用$$...$$,但这个问题可能不太需要数学公式。然后生成相关问题,帮助用户深入理解。 还需要注意用户之前的引用,比如引用[1]中提到的配置br_netfilter模块的方法,可能类似地需要配置overlay模块自动加载。比如创建/etc/modules-load.d/k8s.conf文件,添加overlay。这样每次启动时自动加载模块。 总结来说,步骤应该是: 1. 检查模块是否加载:执行`lsmod | grep overlay`,若无输出,继续排查。 2. 尝试手动加载模块:`sudo modprobe overlay`,然后再次检查。 3. 确认模块是否存在:`modinfo overlay`,查看是否有信息。 4. 检查内核配置:查看config文件,确认CONFIG_OVERLAY_FS是否设置为y或m。 5. 如果是内置模块,则无需加载,但可能需要检查系统日志确认是否启用。 6. 配置自动加载模块:在/etc/modules-load.d/中添加配置文件。 7. 检查系统日志,查看是否有加载错误:`dmesg | grep overlay`。 相关问题可能涉及如何启用OverlayFS,如何配置自动加载模块,或者如何重新编译内核启用Overlay支持等。</think>### Linux系统`lsmod | grep overlay`无输出排查指南 --- #### 一、核心问题定位 当执行`lsmod | grep overlay`无输出时,表明系统**未加载OverlayFS内核模块**或模块名称不一致。以下是详细排查步骤: --- #### 二、分步排查方法 1. **手动加载OverlayFS模块** 尝试通过`modprobe`命令直接加载模块: ```bash sudo modprobe overlay # 加载OverlayFS模块 lsmod | grep overlay # 再次验证 ``` - **成功加载**:显示类似`overlay 98304 0`的输出 - **失败提示**:若报错`modprobe: FATAL: Module overlay not found`,说明内核未包含该模块[^1] 2. **验证模块是否存在** 检查内核是否支持OverlayFS: ```bash modinfo overlay # 查看模块详细信息 ``` - **有输出**:显示模块路径(如`/lib/modules/$(uname -r)/kernel/fs/overlayfs/overlay.ko.xz`) - **无输出**:内核未编译OverlayFS支持 3. **内核配置检查** 通过内核配置文件验证编译选项: ```bash grep CONFIG_OVERLAY_FS= /boot/config-$(uname -r) ``` - **输出`CONFIG_OVERLAY_FS=y`**:模块已编译为内核内置(无需手动加载) - **输出`CONFIG_OVERLAY_FS=m`**:模块应为可加载状态(需排查加载失败原因) - **无输出**:内核未启用OverlayFS支持[^2] 4. **内核日志分析** 通过`dmesg`检查模块加载错误: ```bash dmesg | grep overlay # 过滤内核日志中的OverlayFS相关错误 ``` --- #### 三、常见原因与解决方案 | 原因 | 解决方案 | |--------------------------|--------------------------------------------------------------------------| | **内核未启用OverlayFS** | 重新编译内核,启用`CONFIG_OVERLAY_FS=m` | | **模块名称冲突** | 尝试`lsmod | grep -E 'overlay|aufs'`,确认是否使用替代模块(如aufs) | | **系统未加载依赖模块** | 确保依赖模块(如`br_netfilter`)已加载[^1] | | **容器运行时占用模块** | 重启Docker/Containerd:`sudo systemctl restart docker` | --- #### 四、自动化配置(适用于Kubernetes环境) 若需持久化加载OverlayFS模块(参考引用[1]方法): ```bash # 创建模块加载配置文件 echo "overlay" | sudo tee /etc/modules-load.d/overlay.conf # 重新加载模块 sudo systemctl restart systemd-modules-load ``` --- ### 相关问题 1. **如何为旧内核手动编译OverlayFS模块?** 2. **Docker运行时如何强制指定存储驱动为overlay2?** 3. **内核模块加载失败时如何通过dmesg定位硬件兼容性问题?** [^1]: 配置`br_netfilter`模块的方法可类比用于OverlayFS的持久化加载 [^2]: 类似`CONFIG_VXLAN`的网络模块配置需在编译内核时启用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值