如何确定哪个模块污染了内核?

如何确定哪个模块污染了内核?

当连接到某个无线网络时,我的内核不断出现恐慌。我想发送错误报告,但我的内核显然被污染了。从/var/log/messages

Apr 17 21:28:22 Eiger kernel: [13330.442453] Pid: 4095, comm: kworker/u:1 Tainted: G           O 3.8.4-102.fc17.x86_64 #1

[root@Eiger ~]# cat /proc/sys/kernel/tainted 
4096

我无法找到有关 4096 位掩码含义的文档,但该G标志表示外部 GPL 模块已加载到内核中。如何找出哪个模块污染了内核?

我已经 grep for [Tt]aintin /var/log/messagesordmesg并没有找到与加载模块时相对应的任何内容。我的内核是 Fedora 17 的最新内核:3.8.4-102.fc17.x86_64。

更新: 可能是rts5139模块的原因。它显示在lsmodmodinfo rts5139会产生ERROR: Module rts5139 not found. 当引导以前的内核 3.8.3-103.fc17.x86_64 时,该模块未列出,lsmod并且内核未受污染(/proc/sys/kernel/taint为 0)。

我尝试过将此模块列入黑名单

echo 'blacklist rts5139' >> /etc/modprobe.d/blacklist.conf

但重新启动仍然显示内核被污染。

答案1

好吧,我不相信标准的 Fedora 内核包会包含任何会触发此污点的模块,所以问题是,您还安装了哪些其他内核模块?

常见的候选者是图形驱动程序(尽管我认为这些驱动程序主要会设置“专有”位)和无线驱动程序。

如果您可以在lsmod输出中找到您认为可能是候选者的任何内容,则运行modinfo <module-name>并查看输出是否包含intree: Y任何模块,而没有该模块会触发您所看到的污点。

更新rts5139您看到的lsmod但似乎不在您的系统上的模块可能位于 initrd 中,并且在安装主文件系统之前在引导过程的早期从那里加载。

这也解释了为什么黑名单不起作用,因为您必须使用更新的黑名单重建 initrd。重建 initrddracut无论如何都会导致模块消失。

答案2

➜  ~  dmesg | grep -i 'taint'
[   10.029333] vboxdrv: module verification failed: signature and/or required key missing - tainting kernel
[   10.029364] Disabling lock debugging due to kernel taint

答案3

另一种方法是检查taint以下每个模块的文件/sys/module

#!/bin/bash

cat /proc/modules |
while read module rest
do
    if [[ $(od -A n /sys/module/$module/taint) != " 000012" ]] ; then
        echo $module
    fi
done

如果一个模块没有污点,那么该taint文件将只包含一个换行符,od表示为“ 000012”。您无法检查文件大小,因为无论其实际内容如何,​​大小都列为 4,096 字节。

答案4

检查您的启动日志或在早期阶段(在您的磁盘安装 RW 之前)观察您的启动过程。这可能是您的 initrd 中的一个错误模块。

您是否有 DKMS 或类似的东西?

相关内容