如何確定哪個模組污染了內核?

如何確定哪個模組污染了內核?

當連接到某個無線網路時,我的核心不斷出現恐慌。我想發送錯誤報告,但我的核心顯然被污染了。從/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 或類似的東西?

相關內容