枚举已加载内核模块:Debian内存中sky2.ko未被lsmod识别问题问询
关于Debian中sky2.ko内存存在但lsmod未列出的问题分析
首先明确:sky2.ko是Marvell Yukon系列以太网控制器的官方驱动模块,你遇到的内存中有其代码但lsmod无显示的情况,大概率和内核内置模块的特性有关,下面分情况拆解:
1. 最常见原因:sky2被编译为内核内置模块
Debian的官方内核(比如linux-image-amd64)经常会把常用硬件的驱动直接编译进内核镜像(即built-in模块),而非作为可动态加载的LKM(Loadable Kernel Module)。这种情况下:
lsmod仅会列出动态加载的模块,内置模块不在其输出范围内- 内置模块的代码会一直驻留在内核内存中,无论对应的硬件是否被使用(内核启动时就会加载这部分代码)
验证方法:
- 检查内核配置:执行
grep CONFIG_SKY2= /boot/config-$(uname -r),若输出为CONFIG_SKY2=y,说明是内置模块;若为CONFIG_SKY2=m,则是可加载的LKM - 查看内置模块列表:
cat /lib/modules/$(uname -r)/modules.builtin | grep sky2,能找到条目即可证明是内置模块 - 查看启动日志:
dmesg | grep sky2,内置模块在系统启动时会输出初始化日志,比如sky2: driver version 1.30、sky2 0000:02:00.0: enabling device (0000 -> 0002)这类信息
2. LKM的基础概念补充
LKM是Linux内核的核心特性之一:
- 允许在系统运行时动态加载/卸载模块,无需重启内核
- 常用于添加硬件驱动、文件系统支持、安全工具(如SELinux模块)或自定义内核功能
lsmod、modinfo、modprobe这类工具都是针对动态加载的LKM设计的,对内置模块无效
3. 特殊情况:模块被隐藏(非预期场景)
如果上述验证都显示sky2应为可加载LKM,但lsmod仍无输出,就要考虑模块被恶意隐藏的可能:
- 恶意LKM可以通过hook内核中的模块遍历函数(比如
sys_get_modules)篡改lsmod的输出,让自身或其他模块“隐身” - 排查方法:
- 查看内核符号表:
cat /proc/kallsyms | grep sky2,若能找到sky2相关符号(如sky2_init)但lsmod无显示,大概率是被隐藏了 - 使用内核调试工具:比如用
strace lsmod查看其读取的内核数据,或通过systemtap脚本直接枚举内核中的模块列表
- 查看内核符号表:
总结
90%以上的概率是sky2被编译为Debian内核的内置模块,这是完全正常的系统行为。如果确认不是内置模块,再进一步排查是否存在模块隐藏的异常情况。
内容的提问来源于stack exchange,提问作者lkmssss




