Und es geht doch: Schnelles WLAN unter Linux

27.02.2004 von STEFAN RUBNER 
Auch Linux-Anwender wollen die kabellose Freiheit genießen, finden aber oft keinen Treiber für aktuelle 802.11g-Karten mit 54 Mbit/s. Doch das ist kein Problem: Nehmen Sie einfach den Windows-Treiber!

Kaum eine Netzwerktechnik hat in den letzten Monaten einen derart rasanten Zulauf erhalten wie die drahtlosen Netze. Doch während Windows-Nutzer mehr oder weniger problemlos in Wireless LANs nach neuestem Standard partizipieren, haben Linux-Anwender oft das Nachsehen. Gerade die jüngste Generation drahtloser Netzwerkadapter mit Transferraten von 54 Mbit/s und mehr zeichnet sich aus ihrer Sicht vor allem durch eines aus: fehlende Linux-Treiber. Doch selbst wenn man sich - mehr oder weniger notgedrungen - auf die ältere Technik und deren geringere Transferrate von 11 Mbit/s beschränkt, ist der Weg ins drahtlose Netz mit einigen Stolperfallen versehen.

Aber keine Sorge, meistens handelt es sich wirklich um Kleinigkeiten, die schnell aus dem Weg geräumt sind. Und mit etwas Glück sausen auch Sie schon bald mit 54 Mbit/s durch den Äther. Wie das im Einzelnen geht, beschreiben wir anhand von SuSE Linux 9.0, das neben einigen Annehmlichkeiten in Bezug auf drahtlose Netze ein paar - zum Teil recht ärgerliche - Besonderheiten im Umgang mit diesen aufweist. Als Hardware kommt ein Dell Precision M60 zum Einsatz: Pentium-M mit 1,6 GHz Taktrate, Dell TrueMobile, Broadcom Gigabit-Ethernet und 40-GByte-Festplatte.

WLAN-Support unter Linux

Um einen WLAN-Adapter korrekt ansprechen zu können, benötigt auch Linux einen passenden Treiber. Ursprünglich wurden diese im Rahmen des Projekts PCMCIA-CS entwickelt. Dieses stellt die generelle Unterstützung für PCMCIA- oder Cardbus-Adapter zur Verfügung und liefert auch eine große Zahl von Treibern - unter anderem auch für drahtlose Netzwerkadapter.

Seit der Kernel-Version 2.4 ist dieses System fester Bestandteil des Linux-Kerns. Allerdings wird bei dieser Variante ein neuer Treiber zur Ansteuerung der Hardware eingesetzt, der so genannte yenta_socket. Dieser unterstützt nicht die gesamte Palette der vom Originalpaket unterstützten PCMCIA-Hardware, ist aber bezüglich der verwendeten Treiber weit gehend identisch.

Eine Besonderheit stellt das Treiberpaket des Linux WLAN Project dar. Es versucht, eine möglichst standardkonforme WLAN-Infrastruktur unter Linux umzusetzen. Durch eine enge Zusammenarbeit mit Intersil, einem der größten Hersteller von Chipsätzen für WLANs nach IEEE 802.11b, bietet das Linux WLAN Project vor allem Treiber für WLAN-Adapter mit neueren Intersil-Chips, die vom normalen PCMCIA-CS nicht unterstützt werden.

Unter SuSE Linux 9.0 sind alle drei Systeme geboten. Das macht es relativ leicht, einen passenden Treiber für einen WLAN-Adapter zu finden - sofern ein Treiber vorhanden ist. Allerdings kommen sich die Systeme auch in die Quere und verhindern so, dass eine eigentlich unterstützte Karte einwandfrei arbeitet.

Mit den beschriebenen Paketen ist aber erst ein Teil der Möglichkeiten abgedeckt. Zumindest bei der Kernel-Variante von PCMCIA-CS kommt noch eine Spielart hinzu: Cardbus-Adapter. Diese werden nämlich nicht wie bei der externen Variante vom Cardmanager-Prozess gehandhabt, sondern an den Hotplug-Manager weitergereicht. Da für diesen noch überhaupt keine WLAN-Treiber existieren, sind Cardbus-Adapter für Linux-Anwender also eigentlich nicht zu empfehlen. Über einen Trick ermöglicht es aber gerade der Hotplug-Manager, auch neuere WLAN-Adapter nach 802.11g unter Linux in Betrieb zu nehmen. Doch zunächst widmen wir uns der einfachen Variante, den direkt unterstützten Adaptern für Netze nach 802.11b.

Unterstützten WLAN-Adapter integrieren

Als Beispiel verwenden wir zunächst einen WLAN-Adapter von Netgear, den MA401 in der alten Version. Dieser - erkennbar an einer Seriennummer, die mit MA41A beginnt - verwendet einen älteren Prism-Chipsatz von Intersil, der über das im Kernel integrierte PCMCIA-Subsystem direkt unterstützt wird. Nach dem Einstecken der Karte sind zwei kurze Pieptöne zu hören, danach startet sofort der Hardware-Assistent von SuSE Linux und bietet die Konfiguration des Adapters an.

Da ein vorhandener Access Point in der Regel auch DHCP-Dienste anbietet, können Sie die Grundeinstellungen für die Karte im nachfolgenden Konfigurationsmenü weit gehend übernehmen. In diesem Fall bezieht die WLAN-Karte alle wichtigen Parameter wie IP-Adresse, DNS-Server und Internet-Gateway vom Access Point.

Einige Parameter setzt SuSE Linux allerdings nicht optimal. So versetzt es den Adapter standardmäßig in den Ad-hoc-Modus. Für den Betrieb an einem Access Point ist aber die Betriebsart "Managed" - unter SuSE "Verwaltet" genannt - notwendig. Um diese einzustellen, müssen Sie zuerst über die Schaltfläche "Hardwaredetails" in das entsprechende Untermenü wechseln. Von dort gelangen Sie über den Button "Einstellungen für Funkverbindungen" zu den Optionen, die den Betriebsmodus und die Sicherheitseinstellungen beeinflussen.

Hier stellen Sie als Erstes den Betriebsmodus auf "Verwaltet" um. Arbeiten Sie in mehreren unterschiedlichen drahtlosen Netzen, ist es ratsam, den Netzwerknamen (ESSID - Extended Service Set ID) auf "Any" zu stellen. Wollen Sie sich nur mit einem bestimmten WLAN verbinden, so tragen Sie dessen ESSID hier ein. Zu guter Letzt lässt sich hier auch der Schlüssel für die Datenverschlüsselung nach WEP erfassen. Hier müssen Sie den im Access Point eingestellten Schlüssel als Hexadezimalfolge eintragen.

Haben Sie alle Einstellungen vorgenommen und quittiert, speichert SuSE Linux die neue Konfiguration und startet das komplette Netzwerk-Subsystem neu. Allerdings hat die Sache noch einen kleinen Haken: Zwar funktioniert der WLAN-Adapter, Sie haben aber wahrscheinlich immer noch keinen drahtlosen Zugang zum Netz. Sowohl Verbindungen zu lokalen Systemen als auch zu Rechnern im Internet sind nicht möglich.

SuSE-Besonderheiten ausbügeln

Der Grund für die fehlende Verbindung liegt bei SuSE. Dort hat man nämlich beschlossen, dass nach Möglichkeit nur ein Netzwerk-Interface Änderungen an den Netzwerkparametern vornehmen darf. Per Default ist dies die integrierte Netzwerkkarte. Zweitrangige Schnittstellen wie eben der WLAN-Adapter haben zunächst einmal keine Erlaubnis, ein neues Routing zu implementieren oder die Liste der zu verwendenden DNS-Server zu ändern.

Damit auch der WLAN-Adapter die notwendigen Rechte erhält, müssen Sie manuell eingreifen. In der Konfigurationsdatei /etc/sysconfig/network/ifcfg-wlan-pcmcia ist ein zusätzlicher Parameter einzutragen:

DHCLIENT_PRIMARY_DEVICE='yes'

Wenn Sie jetzt das Netzwerk-Subsystem über das Kommando /etc/init.d/network restart neu starten, werden auch die Routing-Informationen richtig angepasst.

Unwillige Adapter zum Laufen bringen

Wie Sie sehen, sind im Fall von direkt lauffähigen Karten nur kleine Hürden zu nehmen. Was aber, wenn der WLAN-Adapter nicht läuft? Dafür gibt es zwei mögliche Ursachen: Zum einen, dass schlicht der falsche Treiber für das Gerät geladen wird, und zum anderen, dass das PCMCIA-Subsystem keinen Treiber für die Karte findet.

Die erste Variante beruht oft auf der Parallelinstallation der diversen Systeme unter SuSE. Bei einigen WLAN-Adaptern mit Intersil-Chips kann es vorkommen, dass statt des Treibers des PCMCIA-CS-Projekts fälschlicherweise der des Linux-WLAN-Projekts geladen wird. Ein Beispiel für so einen Fall ist die Netgear MA401 in der neuen Version. Fatal dabei ist, dass auch hier die gewohnten zwei hohen Pieptöne ausgegeben werden, es aber komplett unmöglich ist, der Karte eine IP-Adresse zuzuweisen. Zudem steht die Datenrate fix auf 2 Mbit/s, wie sich schnell mit Hilfe des Utilitys iwconfig prüfen lässt.

Der Grund für dieses Fehlverhalten ist eine doppelt vorhandene Konfiguration für diesen Adapter. Er ist sowohl in der normalen Adapter-Datenbank /etc/pcmcia/config sowie in der Linux-WLAN-Adapterliste /etc/pcmcia/wlan-ng.conf aufgeführt. Da Letztere von der Standardkonfiguration aus nachgeladen wird, überschreiben die Einstellungen dort die eigentlich richtigen Werte. Die einfachste Lösung ist es also, die störenden Parameter in wlan-ng.conf auszukommentieren und das PCMCIA-Subsystem per /etc/init.d/pcmcia restart neu zu starten.

Eigene Karte mit Treiber versehen

Ein Spezialfall des genannten Problems ist es, wenn zwar ein passender Treiber für die Karte vorhanden ist, das PCMCIA-Subsystem diesen aber nicht findet, da ihm die Kartenparameter nicht bekannt sind. Dieses Problem tritt zum Beispiel bei älteren WLAN-Adaptern von Zyxel auf, betrifft aber auch die neuerdings vermehrt auf dem Markt zu findenden No-Name-Adapter.

Dass Linux keinen passenden Treiber finden kann, ist einfach diagnostiziert: Nach dem Einstecken der Karte ertönt statt der beiden hohen Pieptöne lediglich ein tiefer. Das größte Problem ist nun herauszufinden, mit welchem Chipsatz die verwendete Karte arbeitet. Eine gute Hilfe bietet hierbei die Adapterübersicht des Linux-WLAN-Projekts. Allerdings ist zumindest im Bereich 802.11b die Wahrscheinlichkeit hoch, dass es sich um einen Prism-Chipsatz handelt. Dieser wird recht gut vom so genannten Orinoco-Treiber des PCMCIA-Subsystems abgedeckt. Wie aber teilt man diesem mit, dass es den richtigen Treiber laden soll?

Hierzu müssen Sie zunächst feststellen, wie sich die Karte gegenüber dem System identifiziert. Dazu öffnen Sie ein Kommandozeilenfenster und starten dort das Hilfsprogramm tail, mit dem Sie das Systemprotokoll überwachen:

tail -f /var/log/messages

Stecken Sie nun den WLAN-Adapter in den PCMCIA-Slot des Rechners. Im Systemprotokoll erscheinen nun recht viele Zeilen. Wichtig sind hierbei die Ausgaben des Card-Managers. Dieser vermeldet eine nicht unterstützte Karte und gibt einige Infos zu dieser aus. Wichtig sind hier die beiden Werte in Hexadezimal-Schreibweise, die in der mit dem Parameter manfid beginnenden Zeile stehen.

Hierbei handelt es sich um die Manufacturer-ID, zu Deutsch: die Herstellerkennung. Genau diese kann das PCMCIA-Subsystem verwenden, um der Karte einen Treiber zuzuordnen. Dazu tragen Sie die ermittelten Werte wie folgt in die Datei /etc/pcmcia/config ein:

card "Meine WLAN-Karte"
manfid <hexid1>, <hexid2>
bind "<treibername>"

Um beispielsweise die neuere Version der Netgear MA401 mit dem für sie passenden Orinoco-Treiber zu verbinden, sieht der Eintrag wie folgt aus:

card "Netgear MA401RA"
manfid 0x000b, 0x7300
bind "orinoco_cs"

Welche Treiber Sie ausprobieren können, erfahren Sie am Anfang der Datei /etc/pcmcia/config. Dort finden sich Einträge, die mit dem Schlüsselwort device beginnen und in der nachfolgenden Zeile den Bezeichner class aufweisen. Alle Module, deren Klasse als network definiert ist, können Sie ausprobieren.

Wichtig ist, dass Sie nach jeder Änderung der Konfigurationsdatei das PCMCIA-Subsystem über das Kommando rcpcmcia restart neu starten. Die Konfigurationsinformationen werden nämlich nur einmalig beim Start eingelesen, Änderungen werden daher nur nach einem Neustart aktiv.

Die Alternative: Windows-Treiber für schnelle WLANs

Nun ist es zwar ganz nett, immerhin mit 11 Mbit/s und dank Ramschverkauf wegen geringer Nachfrage auch recht günstig drahtlos zu surfen. Aber dennoch reizen die hohen Transferraten von 802.11g. Und selbst wenn man sich mit 11 Mbit/s bescheiden kann: Ein Centrino-Notebook bekommt man unter Linux trotzdem nicht so ohne Weiteres ins WLAN. Aus einem nicht erkennbaren Grund scheint sich ein Großteil der Industrie einfach zu weigern, Linux-Treiber für drahtlose Netzwerkadapter zu produzieren.

Da es nun einmal einfacher ist, wenn der Prophet zum Berg geht, haben sich einige engagierte Entwickler die Mühe gemacht, spezielle Treiber zu schreiben. Diese sprechen nicht etwa direkt mit der Hardware. Vielmehr erlauben sie es, die für Windows verfügbaren Treiber auch unter Linux zu verwenden. Derzeit gibt es dazu zwei verschiedene Ansätze. Auf der einen Seite die kommerzielle Variante von Linuxant, auf der anderen Seite das Open-Source-Projekt Ndiswrapper.

Im Folgenden beschreiben wir die Schritte, die notwendig sind, um eine mit Broadcom-Chipsatz arbeitende WLAN-Karte für 54-Mbit/s-Netze nach 802.11g unter Linux in Betrieb zu nehmen. Als Voraussetzung benötigen Sie einen installierten Quellcode des Linux-Kernel sowie die zur Übersetzung von Quelltexten erforderlichen Compiler. Beides richten Sie unter SuSe Linux 9.0 am einfachsten über Yast ein. Wählen Sie im Menü "Software" das Icon "Software installieren oder löschen", stellen Sie anschließend über das Drop-down-Menü in der linken oberen Ecke den Filter auf "Selektionen" und wählen Sie dann die beiden Gruppen "C/C++ Compiler und Werkzeuge" sowie "Kernel Entwicklung". Ist die Installation dieser Pakete abgeschlossen, sollten Sie ein Online-Update durchführen, um die aktuellsten Versionen der Programme zu erhalten.

Ndiswrapper installieren

Holen Sie sich jetzt von den Seiten des Ndiswrapper-Projekts den aktuellen Sourcecode. Zu Redaktionsschluss dieses Beitrags war die Version 0.4 aktuell, die mindestens einen Kernel 2.4.23 voraussetzt. SuSE und auch andere Distributionen liefern diesen Kernel jedoch noch nicht aus. Mit einem einfachen Patch lässt sich das Paket aber auch unter älteren Kernel-Versionen einsetzen. Die dazu erforderlichen Dateien finden Sie hier. Nachdem Sie die Dateien heruntergeladen haben, entpacken Sie diese und erstellen die ausführbaren Binärdaten:

tar -xvzf ndiswrapper-0.4.tar.gz
tar -xvzf ndis_wrapper_patch.tar.gz
cp wrapper.* ndiswrapper/driver/
cd ndiswrapper
make install
cp utils/loadndisdriver /usr/bin

Der nächste Schritt besteht darin, den Windows-Treiber für Ihren WLAN-Adapter zu besorgen. Das erledigen Sie am besten über die Webseite des Herstellers Ihrer Karte. Für die weit verbreiteten Karten mit Broadcom-Chipsatz lohnt sich auch ein Besuch auf der Webseite von Dell, da der Treiber für den in deren Notebooks integrierten Adapter True Mobile 1300 in den meisten Fällen funktioniert. Zudem hat er den Vorteil, dass er sich nicht gleich installieren will, sondern die Treiber einfach auf der lokalen Festplatte entpackt. Sollte Ihr Hersteller kein selbstentpackendes Archiv anbieten, sondern lediglich einen Treiber mit Installationsroutine, dann müssen Sie wohl oder übel in den sauren Apfel beißen, zunächst den Treiber einrichten und dann versuchen herauszufinden, welche Dateien denn nun eigentlich installiert wurden. Für den Broadcom-Treiber suchen Sie am besten nach Dateien mit dem Namen bcmwl5.* und kopieren diese in das Verzeichnis /lib/windriver auf dem Linux-Rechner.

WLAN-Treiber einrichten

Jetzt benötigen Sie noch die PCI-IDs des WLAN-Adapters. Dabei unterstützt Sie das Hilfsprogramm lspci. Rufen Sie es zunächst ohne Parameter auf, um festzustellen, welche globale Device-ID die Karte hat. Für unser Beispiel ist dies die 02:03.0.

Meistens sind die WLAN-Adapter in der von lspci ausgegebenen Liste leicht durch Kennungen zu identifizieren, die die Zeichenkette "802.11" enthalten. Notieren Sie sich den Wert am Anfang der Zeile und rufen Sie lspci erneut auf, diesmal mit der Option -n. Sie erhalten eine Liste, die nun nur Zahlen enthält. Suchen Sie hier nach der zuvor ermittelten Device-ID des WLAN-Adapters und notieren Sie sich die beiden letzten Hexadezimal-Werte in der passenden Zeile. In unserem Beispiel sind dies 14e4 und 4320. Diese Zahlen stehen für die Hersteller- und die Geräte-ID der Karte.

Ndiswrapper starten

Jetzt kommt der große Augenblick. Laden Sie zuerst das Ndiswrapper-Modul:

modprobe ndiswrapper

Wechseln Sie nun in das Verzeichnis mit den Windows-Treibern und laden diese. Der Befehl dazu lautet:

loadndisdriver <hrst-id> <grt-id> <driver.sys> <driver.inf>

Für unser Beispiel wäre der richtige Aufruf also:

loadndisdriver 14e4 4320 ./bcmwl5.sys ./bcmwl5.inf

Wenn nun eine Ausgabe mit Statusinformationen erfolgt, dann haben Sie schon fast gewonnen. Wenn nicht, sollten Sie sich zunächst auf die Suche nach einer anderen Version des verwendeten Treibers machen. Es kann allerdings sein, dass auch diese nicht funktioniert und Sie auf eine neuere Version des Ndiswrappers warten müssen.

WLAN-Adapter konfigurieren

Mit Hilfe des Utilitys iwconfig können Sie sich versichern, dass der Adapter erkannt wurde. Es sollte in der Liste der verfügbaren Geräte der Bezeichner wlan0 auftauchen. Diesem müssen Sie nun noch eine passende Konfiguration zur Verfügung stellen. Erzeugen Sie dazu im Verzeichnis /etc/sysconfig/network die Datei ifcfg-wlan0 mit folgendem Inhalt:

BOOTPROTO='dhcp'
MTU='
STARTMODE='manual'
WIRELESS_ESSID='<Ihre ESSID>'
WIRELESS_KEY='<Ihr WEP-Key>'
DHCLIENT_PRIMARY_DEVICE='yes'

Aktivieren Sie jetzt den Netzwerkadapter über das Kommando ifup wlan0. Sehr wahrscheinlich erscheint dabei eine Fehlermeldung, die ein Problem bei der Ausführung des Kommandos "Set Nickname" bemängelt. Ignorieren Sie diese einfach. Prüfen Sie stattdessen über den Befehl ifconfig, ob der WLAN-Adapter aktiviert wurde und vom Access Point eine IP-Adresse erhalten hat.

Integration automatisieren

Da es nun nicht sonderlich komfortabel ist, die ganzen Befehle jedes Mal wieder aufs Neue einzutippen, hier noch das Verfahren, um den Prozess zu automatisieren. Tragen Sie dazu die folgenden Zeilen in die Datei /etc/modules.conf.local ein:

alias wlan0 ndiswrapper
post-install ndiswrapper /usr/bin/loadndisdriver 14e4 4320 /lib/windriver/bcmwl5.sys /lib/windriver/bcmwl5.inf

Nach dem nächsten Neustart des Systems können Sie den WLAN-Adapter nun über das Kommando ifup wlan0 aktivieren. Soll der drahtlose Netzzugang beim Hochfahren des Rechners automatisch aktiviert werden, ändern Sie einfach in der Datei /etc/sysconfig/network/ifcfg-wlan0 den Parameter für das Schlüsselwort BOOTPROTO von manual auf onboot. Handelt es sich bei dem Adapter nicht um ein integriertes Modul, sondern um eine Steckkarte, können Sie auch den Wert hotplug verwenden. Er bewirkt eine automatische Aktivierung der Karte, sobald diese in den PCMCIA-Slot gesteckt wird.

Ein kleiner Wermutstropfen zum Schluss: Noch laufen bei weitem nicht alle Windows-Treiber unter Linux. Die Entwickler des Ndiswrapper geben sich aber größte Mühe, mehr und mehr Treiber zu unterstützen. Gelegentlich hilft auch der Rückschritt auf eine ältere Treiberversion, um eine WLAN-Karte unter Linux betreiben zu können. Sollte auch das nicht zum Erfolg führen, bleibt immer noch die kostenpflichtige Alternative von Linuxant. (mha)