当连接到某个无线网络时,我的内核不断出现恐慌。我想发送错误报告,但我的内核显然被污染了。从/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]aint
in /var/log/messages
ordmesg
并没有找到与加载模块时相对应的任何内容。我的内核是 Fedora 17 的最新内核:3.8.4-102.fc17.x86_64。
更新: 可能是rts5139
模块的原因。它显示在lsmod
但modinfo 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 或类似的东西?