Linux: Blacklist von Kernel-Modulen funktioniert nicht?

Das Problem

Das Folgende gilt für mein Ubuntu 14.04 und die genannte Netzwerkkarte. Ähnlich sollte es für andere Debian-ähnliche Systeme und andere Treiber funktionieren. Bitte dazu das Update unten beachten!

Ich habe eine neue Netzwerk-Karte eingesteckt und fand danach  raus, dass durch sie beim Booten 2 verschiedene Kernel-Module (Treiber) geladen wurden. Ich wusste, auf der Karte steckt ein Realtek-8139-Chip und ich fand mit dmesg die Bootmeldungen:

[~] dmesg | grep 8139
[    0.884538] 8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22,
2004)
[    0.884619] 8139cp 0000:04:05.0: This (id 10ec:8139 rev 10) is not an
8139C+ compatible chip, use 8139too
[    0.887191] 8139too: 8139too Fast Ethernet driver 0.9.28
[    0.887976] 8139too 0000:04:05.0 eth0: RealTek RTL8139 at
0x000000000001be00, 60:e3:27:02:b1:da, IRQ 18
[   21.854176] 8139too 0000:04:05.0 eth0: link up, 100Mbps, full-duplex,
lpa 0xC5E1

Heißt also, der Treiber 8139cp wurde geladen, als nicht passend erkannt und stattdessen 8139too benutzt. lsmod zeigte mir aber, dass offenbar doch beide Treiber geladen wurden, was irgendwie nicht gesund ist:

[~] lsmod | grep 8139
8139cp xxx 0
8139too xxx 0
mii xxx 1 8139too

Die (vorläufige) Lösung

Zunächst habe ich also mittels modprobe den einen Treiber entfernt

[~] modprobe -r 8139cp

und mit ifdown / ifup mal getestet, ob das Netzwerk noch spielt. Tat es. Also wollte ich nun den Treiber in die Blacklist schreiben, damit er dauerhaft nicht geladen wird. Also in /etc/modprobe.d/blacklist.conf ans Ende

blacklist 8139cp

geschrieben und fertig. Dachte ich. Denn nach dem nächsten Reboot war der Treiber wieder da! Was ich nicht wusste war, dass Treiber (Module), die in den Kernel kompiliert sind, nicht über die Blacklist beim Booten ignoriert werden können. Dagegen hilft nur eine andere Möglichkeit, die ich hier fand:

In /etc/default/grub ergänzt man die Kommandozeile für das Booten

GRUB_CMDLINE_LINUX_DEFAULT="modprobe.blacklist=8139cp"

(da können noch mehr Optionen nach Wunsch stehen!), macht danach

update-grub2
update-initramfs -u

als root und nach dem nächsten Booten ist alles gut. Sofern man alles richtig gemacht hat, vor allem in der grub-Datei… Die Überprüfung mit lsmod liefert nun genau einen Treiber.

Ein Update

Zunächst mal ist es richtig, dass der beschriebene Weg über den Eintrag in /etc/default/grub und das anschließende Procedere ein unliebsames Kernel-Modul „verschwinden“ lässt.

Falsch ist jedoch im konkreten Fall des Treibers 8139cp die Annahme, dass dieser in den Kernel einkompiliert sei und deswegen ein Eintrag in der Blacklist nicht funktionieren würde. Dem ist nicht so: Das Modul war zuvor mit lsmod sichtbar, ist also nicht im Kernel eingebaut – aber ich habe schlicht und einfach anschließend

update-initramfs -u

vergessen :-(. Hätte ich das gemacht, hätte alles gleich funktioniert. Fazit: Die Methode über /etc/default/grub ist universell (und etwas kritischer, denn wenn da was vertippt wird, könnte das Booten nicht mehr klappen), der Weg über /etc/modprobe.d/blacklist.conf für nicht einkompilierte Module eher der normale, was man mit lsmod überprüfen kann.

Übrigens: Wie ich mich mit Hilfe einiger netter Jungs in der Newsgroup rangetastet habe, findet man hier groups.google.com/forum/#!topic/de.comp.os.unix.linux.misc/qI2g13BX3WA.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.