In diesem Artikel versuche ich einmal zu erklären wie man ein Wireless Device mit einem Ralink RT2870 Chipsatz zum laufen bekommt.
Folgendes Systemsetup habe ich:
- Slackware
- D-LINK Wireless USB Stick mit rt2870 Chipsatz von Ralink
- Linux Kernel 2.6.33
- ndiswrapper 1.56
Der angesprochene Kernel bringt zwar einen experimentellen rt2870 Treiber im Source Baum mit, allerdings funktionierte dieser bei mir nicht da der enthaltene rt2870 Treiber keine ndiswrapper Unterstützung bietet und somit wpa_supplicant mit dem Treibertyp ralink nicht funktioniert, was gleichzeitig bedeutet das man sich am AP nur mittels WEP verbinden kann.
Gehen wir nun zum ersten Schritt über und besorgen uns erst einmal alle benötigten tools und die rt2870 Firmware in Version 22.
- Download der Firmware: hier
- Download der Treiber Sourcen: hier
- ndiswrapper: hier
Beim Download der Firmware und der Treiber Sourcen muss man keine E-Mail Adresse angeben. Durch einen Klick auf Accept kann man sich die Pakete auch so runterladen.
Ein Ziel was ich immer versuche bei meinem Linux System zu verfolgen ist es, den Kernel so klein wie möglich zu halten was bedeutet das ich alle unnötigen Treiber und Module rauslasse. Im Kontext der rt2870 Treiber Installation bedeutet das also auf meinem System, dass ich keinen einzigen Wireless Device Treiber einkompiliert habe, weder fest noch als Modul. Und hier bin ich dann beim bauen der ndiswrapper und rt2870 Sourcen auch direkt auf ein Problem gestoßen:
Ein benötigtes Symbol, WEXT_PRIV, war nicht verfügbar somit schlug jedes make fehl.
Ein Umstand der mich ein wenig gewundert hat, da ich dennoch die generische WLAN Unterstützung eingebaut hatte. Nach ein bisschen rumtesterei habe ich dann rausgefunden das ein Workaround für dieses Problem das einbauen eines alten WLAN Treibers ist der dieses Symbol in seiner Kconfig definiert. Zum testen habe ich zum Beispiel den ipw2200 Treiber genommen. Da dies für mich aber nicht akzeptabel ist, habe ich mich dazu entscheiden direkt in die Kconfig in /usr/src/linux/net/wireless einzugreifen und die Symbole beim anwählen der 80211 API verfügbar gemacht.
Das bedeutet nichts anderes als dass ich dem Moment wo die CFG80211 Untersützung einkompiliert wird 3 Symbole verfügbar gemacht werden. Dazu fügt man folgendes in /usr/src/linux/net/wireless/Kconfig ein:
config CFG80211
tristate “cfg80211 – wireless configuration API”
depends on RFKILL || !RFKILL
select WIRELESS_EXT
select WEXT_SPY
select WEXT_PRIV
Die 3 Select Anweisungen sind diejenigen die hinzugefügt werden müssen. Setzt man nun in der Kernel config (.config) CONFIG_CFG80211_WEXT=y so werden die 3 definierten Symbole exportiert. Dann muss der Kernel noch neu gebaut werden und die Sourcen sollten sich kompilieren lassen. Das bauen des Kernels beschreibe ich hier nicht weiter, dazu sollten sich genug Informationen im Netz finden lassen.
Achtung: Durch diese Änderung an der Kconfig von net/wireless hat man keine “Standard”-Sourcen mehr. Dass heißt, will man einmal einen Patch auf den Kernel anwenden, so wird der Versuch schief gehen, da diese 3 Zeilen nicht nativer Bestandteil des Kernels sind.
Die nächsten Schritte sind nun den ndiswrapper sowie den rt2870 Treiber zu kompilieren, dazu bitte einfach die INSTALL oder README Anleitung im jeweiligen entpackten Verzeichnis lesen.
Hat alles geklappt hat man nun einen Kernel ohne unnötige Module, das Tool ndiswrapper sowie ein funktionierndes rt2870sta Modul. Da das gebaute Modul nicht vom Kernel geliefert wurde muss man das Laden des Moduls manuell nachtragen. Dazu erstellt man einfach unter /etc/modules.d eine Datei mit dem Namen rt2870.conf und schreibt einfach rt2870sta rein. Diese Datei mit dieser einen Zeile sorgt dafür dass der Kernel das Modul beim booten lädt.
Das Device sollte ra0 heißen und durch Eingabe von iwconfig sollte es als WLAN fähig angezeigt werden. Nun muss man die Firmware rt2870.bin noch nach /lib/firmware kopieren.
Nun muss man sich noch eine Konfigurationsdatei für den wpa_supplicant erstellen:
- wpa_passphrase SSID PASSPHRASE > /etc/wpa_supplicant_home.conf
SSID ist Service Set Identifier des WLAN Netzwerkes und PASSPHRASE das Passwort. Dieser Befehl erstellt die Konfigurationsdatei unter/etc mit den Namen wpa_supplicant_home.conf. Man sollte diese Konfigurationsdatei lediglich für Root lesbar machen, da das Plaintext Passwort als Kommentar mit rein geschrieben wird.
Im nächsten Schritt sollte man seinen AP in die Datei /etc/resolv.conf als Nameserver eintragen. Nehmen wir an der AP hat die IP 192.168.100.1 dann muss in /etc/resolv.conf folgendes stehen:
Dann muss das Interface ra0 konfiguriert werden:
- ifconfig ra0 192.168.100.1 netmask 255.255.255.0
Der Befehl bewirkt dass ra0 aktiv geschaltet wird und die feste IP 192.168.100.1 zugewiesen bekommt. Als nächstes muss der wpa_supplicant gestartet werden:
- wpa_supplicant -Dralink -c/etc/wpa_supplicant_home.conf -ira0
Der Befehl startet den Supplicant nicht als Daemon sodass Fehler direkt gesehen werden können. -D spezifiziert den Treibertyp, -c gibt die Konfigurationsdatei an und -i erwartet das Interface auf welchem wpa_supplicant angewendet werden soll. Nun muss noch die korrekte Route hinzugefügt werden und dann ist man fertig:
- route add default gw 192.168.100.1
Um mein WLAN Device direkt beim Booten zu starten und zu konfigurieren habe ich mir ein rc-Skript geschrieben welches unter Slackware in den Ordner /etc/rc.d gespeichert werden muss. Bei mir heißt das Skript rc.startWLAN und hat folgenden Inhalt:
#!/bin/sh
LOGFILE=/var/log/wlan
IP=”192.168.2.2″
NETMASK=”255.255.255.0″
IFACE=”ra0″
GW=”192.168.2.1″
ROUTE=/sbin/route
ECHO=/usr/bin/echo
DATE=/usr/bin/date
IFCONFIG=/sbin/ifconfig
WPA=/usr/sbin/wpa_supplicant
DRIVER=”ralink”
CONF=”/etc/wpa_supplicant_home.conf”
function log() {
STRING=”$1″
LOGTIME=”[`$DATE '+%d.%m.%Y %H:%M:%S'`]”
echo -e “$LOGTIME $STRING” >> $LOGFILE
return 0
}
log “Bringing up interface: $IFACE”
log “ IP: $IP”
log “ Netmask: $NETMASK”
$IFCONFIG $IFACE inet $IP netmask $NETMASK up 2> /dev/null 1> /dev/null
if [ $? -eq 0 ]; then
log “… Success”
else
log “… Error”
exit 1
fi
log “Starting WPA Supplicant”
log “ Driver: $DRIVER”
log “ Config: $CONF”
log “ Interface: $IFACE”
$WPA -B -D $DRIVER -i $IFACE -c $CONF
if [ $? -eq 0 ]; then
log “… Success”
else
log “…Error”
exit 1
fi
sleep 5
log “Setting routing options”
log “ Gateway: $GW”
log “ Netmask: $NETMASK”
$ROUTE add default gw $GW 2> /dev/null 1> /dev/null
if [ $? -eq 0 ]; then
log “…Success”
else
log “…Error”
exit 1
fi
exit 0
Die am Anfang definierten Variablen sind entsprechend anzupassen und dann sollte die Ausführung des Skriptes noch in /etc/rc.d/rc.local eingetragen werden.
Bei Fragen und/oder Anregungen einfach ein Kommentar hinterlassen.