Kürzlich erschien die zweite Betaversion von Ubuntu 11.04 “Natty Narwal”. Also USB-Stick gepackt, Image draufgespielt und ausprobiert. Es kam nur der Standard-Desktop, also kein Unity, weil kein 3D. Das war zu erwarten, denn der vorinstallierte freie Nvidia-Treiber kann für meine Karte kein 3D. Was mich aber verwunderte war, dass mein D-Link DWA 140 WLAN Stick (Ralink-Chipsatz) nicht ging, der Network Manager zeigte nur ein “firmware missing” an. Ich installierte den Natty-Kernel 2.6.38 vom Mainline-PPA unter Maverick und stellte fest, dass das Problem dort auch auftrat. Ein Kernel-Problem also. Ich googelte und stellte fest, dass ich nicht allein war. Da fiel mir ein Artikel aus dem Ubuntu-User-Magazin ein, indem verschiedene WLAN-Sticks auf Linux-Tauglichkeit geprüft wurden. Bei einem stand der Autor vor demselben Problem; es wurden falsche Kernelmodule geladen.
Normalerweise lädt Ubuntu beim Booten oder beim Anschluss des Geräts das dafür passende Kernelmodul. Danach kann man mit dem Gerät schon loslegen. In diesem Fall aber (und offenbar in vielen anderen Fällen auch) lud Ubuntu zusätzlich zum richtigen Modul noch einige falsche Module für ähnliche Chipsätze. Dies sorgt allerdings dafür, dass das System nun nicht weiß, welches Modul die Kontrolle über den WLAN-Stick haben soll und deswegen kam keine Verbindung zustande.
Um das Problem zu lösen, sollte man sich ersteinmal alle geladenen WLAN-Module anzeigen lassen. Da mein Stick einen Ralink-Chipsatz benutzt, lautet der Befehl
$ lsmod | grep rt
Der Hersteller des Sticks bzw. der WLAN-Karte ist unwichtig, wichtig ist nur der Chipsatz (z.B Atheros, Broadcom oder eben Ralink). Wer einen anderen Chipsatz als ich hat, muss in Erfahrung bringen, welches Präfix die entsprechenden Module haben (das ubuntuusers-Wiki ist eine gute Anlaufstelle). Die Ausgabe schaut bei mir folgendermaßen aus:
parport_pc 36959 0
parport 46458 3 parport_pc,ppdev,lp
rt2870sta 450556 0
rt2800usb 18235 0
rt2800lib 45181 1 rt2800usb
crc_ccitt 12667 2 rt2870sta,rt2800lib
rt2x00usb 20330 1 rt2800usb
rt2x00lib 49235 3 rt2800usb,rt2800lib,rt2x00usb
mac80211 294370 3 rt2800lib,rt2x00usb,rt2x00lib
cfg80211 178528 2 rt2x00lib,mac80211
Hier sind nur die Module interessant, die mit “rt” anfangen. Diese werden jetzt allesamt entladen:
$ sudo modprobe -rf rt2870sta rt2800usb rt2800lib rt2x00usb rt2x00lib
Jetzt kommt das Ausprobieren. Man muss jetzt probieren, welches Modul das richtige ist. Also mit
$ sudo modprobe <modulname>
das Modul laden, ausprobieren, ob das WLAN läuft und wenn nicht, das Modul mit
$ sudo modprobe -rf <modulname>
wieder entladen. Glücklicherweise wusste ich schon von meiner Maverick-Installation, dass das Modul rt2870sta das richtige ist. Nach dem Laden dieses Moduls funktionierte auch das WLAN wieder.
Eine Kleinigkeit wäre da noch: Damit man das Prozedere nicht bei jedem Neustart wiederholen muss, sollte man die falschen Module blacklisten. In meinen Fall reicht es, folgende Zeilen zur Datei /etc/modprobe.d/blacklist.conf hinzuzufügen:
blacklist rt2800usb
blacklist rt2800lib
blacklist rt2x00usb
blacklist rt2x00lib
Es freut mich zwar, dass das Problem so einfach zu lösen war, aber Anfänger werden dadurch abgeschreckt. Wegen der neuen Unity-Oberfläche wird Natty sowieso ein heikles Release werden. Hoffen wir, dass es nicht das Vista der Ubuntu-Versionen wird
Update 2.Juni 2011:
Wie aus den von mir gemeldeten Launchpad-Bug hervorgeht, hatte ich mit meiner Einschätzung nicht ganz recht. Alle Module, die beim Hochfahren/Einstecken des DWA 140 geladen werden, sind richtige Treiber, die für den Stick geeignet sind. rt2870sta ist ein alter Staging-Treiber, der nicht offiziell zum Kernel gehört, nicht wirklich gepflegt wird und der irgendwann mal verschwinden wird. Der neue Treiber der ihn ersetzen soll ist dieser rt2800usb, welcher auch von den Wifi-Schnittstellen des Kernels besser Gebrauch macht. Die in Natty enthaltene Version dieses Treibers funktioniert aber mit meinem Stick noch nicht, weil linux-firmware zu alt ist. rt2800usb wird also geladen, kann aber nicht arbeiten, daraufhin wird rt2870sta geladen, welcher aber auch nicht arbeiten kann, weil rt2800usb nicht entladen wurde.
Eine bessere Alternative zu dem oben vorgestellten Lösungsvorschlag ist die Benutzung von rt2800usb mit aktueller Firmware, weil dieser Treiber besser gepflegt wird. Zuerst muss rt2870sta geblacklistet werden:
$ echo 'blacklist rt2870sta' | sudo tee -a /etc/modprobe.d/blacklist.conf
Das Blacklisting der anderen rt-Module muss natürlich rückgängig gemacht werden. Anschließend lädt man sich die neueste Version von linux-firmware herunter und entpackt das Archiv. Einzig die Datei rt2870.bin ist interessant. Nun wird die alte Firmware umbenannt und die neue installiert:
$ cd <entpackter Ordner> $ sudo mv /lib/firmware/rt2870.bin /lib/firmware/rt2870.bin.old $ sudo cp rt2870.bin /lib/firmware/rt2870.bin
Nach einem Neustart sollte das drahtlose Netzwerk wieder funktionieren. Am besten, man testet beide Treiber und nutzt dann den, welcher besser läuft.