Wie kann man feststellen, welches Modul den Kernel befleckt?

7

Mein Kernel gerät immer wieder in Panik, wenn er mit einem bestimmten drahtlosen Netzwerk verbunden ist. Ich möchte einen Fehlerbericht senden, aber mein Kernel ist anscheinend beschädigt. Von /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

und

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

Ich konnte keine Dokumentation für die Bedeutung der 4096-Bitmaske findenDas GFlag bedeutet jedoch, dass ein externes GPL-Modul in den Kernel geladen wird. Wie finde ich heraus, welches Modul den Kernel befleckt?

Ich habe für grep [Tt]aintin /var/log/messagesoder dmesgund finde nichts entspricht , wenn ein Modul geladen wird. Mein Kernel ist der neueste Kernel von Fedora 17: 3.8.4-102.fc17.x86_64.

UPDATE : Möglicherweise liegt es am rts5139Modul. Es wird in angezeigt, erzeugt lsmodaber Beim Booten des vorherigen Kernels 3.8.3-103.fc17.x86_64 wird dieses Modul nicht aufgelistet und der Kernel ist nicht fehlerhaft ( ist 0).modinfo rts5139ERROR: Module rts5139 not found.lsmod/proc/sys/kernel/taint

Ich habe versucht, dieses Modul auf die schwarze Liste zu setzen

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

Beim Neustart wird der Kernel jedoch weiterhin als fehlerhaft angezeigt.

drs
quelle
2
Laut den Dokumenten 4096 - An out-of-tree module has been loaded .
don_crissti
1
G wird immer gedruckt, wenn P nicht vorhanden ist. Dies impliziert nicht unbedingt ein externes Modul (obwohl das O-Flag dies tut).
Random832
@ Random832 Danke. Ich bemerkte, dass die Flagge immer noch da war, nachdem ich meinen Kernel neu installiert hatte. Ich habe mich gefragt warum.
Dr.

Antworten:

5

Ich glaube nicht, dass ein Standard-Fedora-Kernel-Paket Module enthält, die diesen Makel auslösen würden. Die Frage ist also, welche anderen Kernel-Module haben Sie installiert?

Übliche Kandidaten wären Grafiktreiber (obwohl ich denke, dass diese meistens das "proprietäre" Bit setzen) und drahtlose Treiber.

Wenn Sie in der lsmodAusgabe etwas finden, von dem Sie glauben, dass es sich um einen Kandidaten handelt, führen Sie es aus modinfo <module-name>und intree: Yprüfen Sie, ob die Ausgabe ein beliebiges Modul enthält, ohne das der von Ihnen angezeigte Makel ausgelöst wird.

UPDATE : Das rts5139Modul, in dem Sie sich befinden, lsmoddas sich jedoch nicht auf Ihrem System zu befinden scheint, befindet sich wahrscheinlich in der initrd und wird von dort zu Beginn des Startvorgangs geladen, bevor das Hauptdateisystem bereitgestellt wird.

Dies erklärt auch, warum Blacklisting nicht funktioniert, da Sie die initrd mit der aktualisierten Blacklist neu erstellen müssten. Wenn Sie die initrd mit neu erstellen, dracutwird das Modul trotzdem entfernt.

TomH
quelle
Danke für den Tipp, ich habe es versucht lsmod | awk '{print $1}' | xargs modinfo -F intree. Leider sind alle Ergebnisse Y, bis auf eine Zeile,ERROR: Module rts5139 not found.
drs
1
@drs In diesem Fall - sind Sie sicher, dass die Module in Ihrem initrd mit denen des laufenden Systems übereinstimmen? Dies könnte auch ein verdorbenes Modul in der initrd sein.
Nils
Wie überprüfe ich die Module in meinem initrd?
Dr.
1
Nun, um mit der Verwendung zu beginnen, um lsinitrdzu sehen, ob rts5139vorhanden ist.
TomH
@ TomH In der Tat war dies der Fall. Ich hatte das kmod-stagingPaket entfernt, aber die initrd enthielt noch einige der Staging-Module. Die Neuinstallation des Kernels hat den Trick getan. Wenn Sie Ihre Antwort mit diesen Informationen aktualisieren, werde ich sie akzeptieren.
Dr.
4
➜  ~  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
fessy
quelle
3

Eine andere Möglichkeit besteht darin, die taintDatei jedes Moduls in /sys/modulefolgenden Schritten zu untersuchen :

#!/bin/bash

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

Wenn ein Modul keinen taintMakel aufweist, enthält die Datei nur eine neue Zeile, die odals " 000012" dargestellt wird. Sie können die Dateigröße nicht überprüfen, da alle Größen unabhängig vom tatsächlichen Inhalt als 4.096 Byte aufgeführt sind.

Matthew Cline
quelle
2

Dies kann (zumindest teilweise) das vboxdrv-Kernelmodul von VirtualBox sein. Es ist GPL-fähig, aber Kernel-Betreuer kennzeichnen jetzt Kernel, die als verdorben geladen sind. Weitere Informationen finden Sie unter https://lkml.org/lkml/2011/10/6/317 .

Ich bin mir nicht sicher, ob das Entladen dieses Moduls den Kernel "entleert", aber wenn Sie es geladen haben, ist es wahrscheinlich die Ursache (zumindest teilweise).

Informationen zum Wert der Nummer finden Sie hier: http://kmaiti.blogspot.com/2011/09/how-to-check-whether-current-running.html Es sagt Ihnen nicht, welches Modul, sondern Sie kann die Gründe sehen. Wenn der Wert nicht 0 ist, ist er grundsätzlich fehlerhaft.

adam820
quelle
VirtualBox ist nicht installiert und vboxdrvwird nicht von aufgelistet lsmod. Ich habe diese Liste von Kernel-Taint-Werten schon einmal gesehen. 4096 ist jedoch nicht aufgeführt und kann nicht durch Kombinieren der anderen Bits generiert werden. Ich vermute, die Dokumentation ist alt.
Dr.
1

Überprüfen Sie Ihr Boot-Protokoll oder beobachten Sie Ihren Boot-Prozess in einem frühen Stadium (bevor Ihre Festplatten RW gemountet werden). Dies könnte ein schlechtes Modul in Ihrer initrd sein.

Haben Sie DKMS oder ähnliches?

Nils
quelle
Ich habe kein DKMS. Früher hatte ich kmod-Staging, um meinen Kartenleser zu aktivieren, aber das habe ich vor einiger Zeit entfernt.
Dr.
Nun rts5139ist anscheinend ein Treiber für einen Realtek-Kartenleser, also vermute ich, dass Sie es nicht geschafft haben, ihn vollständig zu entfernen.
TomH
@drs schau dir den Kommentar von TomH an! Das Kernel-Modul befindet sich also wahrscheinlich noch in Ihrer Initrd.
Nils