Wie richte ich den WLAN-Adapter ZyAir B-220 unter Debian Linux sarge ein?

Es gibt ein OpenSource-Projekt mit Treibern unter http://linux-lc100020.sourceforge.net/ . Hier wird die Installation des Treibers ZD1201 Driver 0.3 (Experimental) in der Version vom 2004-06-12 beschrieben, für das dadurch unterstützte Gerät »Zyxel ZyAir B-220 USB« unter Debian Linux sarge.

Der Treiber basiert auf dem Treiberpaket linux-wlan-ng. Der ZD1201 Driver 0.3 z.B. besteht zum Hauptteil aus den modifizierten Quellen von linux-wlan-ng 0.2.1pre21, dazu aus einem 2.6.x Kernel Patch. (Dieser Patch ist nur notwendig, wenn das USB-Device nicht korrekt erkannt wird). Die Haupt-README-Datei ist damit Zydas1201-README.txt; die Datei README dagegen gehört zum Paket linux-wlan-ng. Hier eine kommentierte, knappe Version der Installationsanleitung aus diesen beiden README-Dateien:

  1. Die Quellen für den Kernel, mit dem man den »Linux Zydas 1201 Driver 0.3« einsetzen will, als Debian-Paket installieren (apt-get oder synaptic verwenden).
  2. make menuconfig um den Kernel zu konfigurieren.
  3. Den Kernel aus diesen Quellen ein erstes mal kompilieren. Um das Debian-Paketmanagement nicht zu stören, verwende man: »make-kpkg kernel-image. Dabei wird z.B. die Datei ./include/linux/version.h (ausgehend vom root-Verzeichnis der Kernel-Quellen) erzeugt. Sie wird vom Script »Configure« (bei make config ausgeführt) erwartet; ist sie nicht vorhanden, erscheint die Fehlermeldung »Linux source tree […] is incomplete or missing!«. Selbst bei installierten Kernelquellen und korrekt in make config angegebenem Pfad.
    Tipp für die Zukunft: »make-kpkg buildpackage« ist äquivalent zu »make-kpkg clean binary«, wiederum äquivalent zu »make-kpkg clean kernel_source kernel_headers kernel_doc kernel_image«. Also Vorsicht: durch das Target »clean« wird also die Arbeit aller bisherigen Compiliervorgänge zunichte gemacht.
  4. In /usr/src/ ist dann der Kernel als Debian-Paket vorhanden (.deb), zum Beispiel: »/usr/src/kernel-image-2.6.8_10.00.Custom_i_386.deb«. Installieren mit (wieder am Beispiel): »dpkg -i kernel-image-2.6.8_10.00.Custom_i_386.deb«.
  5. Das Treiberpaket »Zydas1201-LinuxDriver-0.3.tar.gz« entpacken.
  6. In der obersten Ebene des entstehenden Verzeichnisbaums ausführen: make config; make all. Selbstkompilieren ist notwendig, da es zwar von linux-wlan-ng, aber nicht von »Linux Zydas 1201 Driver 0.3« vorkompilierte Binärpakete für verschiedene Distributionen gibt.
  7. Debian-Pakete für die Module des »Linux Zydas 1201 Driver 0.3« erstellen. checkinstall -D –pkgname=Zydas1201 –pkgversion=0.3 –pkgarch=i386 –pakdir=/var/cache/apt-build/repository/ –backup=yes make install Information: folgendes funktioniert nicht: »make-kpkg modules_image –added-modules /usr/local/src/Zydas1201-LinuxDriver-0.3/src/prism2/driver«
    Das angegebene Modul wurde im letzten Schritt ja schon konfiguriert und kompiliert, entsprechend den Vorgaben aus den Makefiles der höheren Ebenen des Verzeichnisbaums des Treibers. Compilieraufgaben bestehen jetzt also nicht mehr, das Modul sollte problemlos zu einem Debian-Paket verpackt werden.
    Beachten: Das Argument »–added-modules« bzw. »–added-modules« ist nur möglich bei den Aufrufen »make-kpkg modules«, »make-kpkg modules_config«, »make-kpkg modules_image« und »make-kpkg modules_clean«. Das wird in der Dokumentation (»man make-kpkg«, zum Argument »–added-modules foo«) leider ziemlich unverständlich geschrieben als »The argument should be a comma separated list of add-on modules (not in the main kernel tree) that you wish to build when you invoke the modules_blah targets.«.
    Das oben genannte Kommando schlägt fehl, weil das Modul kein Modul aus einem Debian-Paket ist. Es enthält deshalb nicht ein Verzeichnis ./debian/rules, was jedoch von make-kpkg erwartet wird.
    Es hilft auch nichts »Linux Zydas 1201 Driver 0.3« manuell im Verzeichnisbaum mit dem kompilierten Kernel und seinen Modulen zu installieren – es würde von make-kpkg nicht mit in das Kernel-Paket aufgenommen, da es keine Regel »install« für dieses Modul in irgendeiner Make-Datei des Kernels gibt. Das Modul ist ja kein Patch, der sich nur auf bestehende Dateien des Kernels auswirkt (und mit diesen zusammen installiert würde), sondern fügt neue Dateien hinzu.
    Man könnte also aus dem Quellcode von »Linux Zydas 1201 Driver 0.3« ein Modul im Debian-Format machen und »make-kpkg modules_image –added-modules […]« verwenden. Das ist jedoch gegenüber der oben vorgeschlagenen Lösung die weitaus aufwändigere Variante.
  8. checkinstall erstellt die neuen Pakete im aktuellen Verzeichnis. Sie können auch mit dpkg -i <paketname>.deb installiert werden, wenn die Installation innerhalb von checkinstall fehlschlägt. Evtl. ist eine nachträgliche Installation aber auch unnötig: man prüfe, ob die Module in /lib/modules/<kernelversion>/linux-wlan-ng/ installiert wurden. Bei der Kernelversion werden dabei auch die Debian Paketrevision (»-1«) und die Architektur (»-386«) mitgerechnet, wenn vorhanden.
  9. Die Module einfügen: sie liegen in einem Verzeichnis passend zur Kernelversion des Kernel source tree, mit dem man »Linux Zydas 1201 Driver 0.3« kompiliert hat. Also im Verzeichnis /lib/modules/<kernelversion>/linux-wlan-ng/. Einfügen mit: depmod -a; insmod p80211.ko; insmod prism2_usb.ko;.
    Eine Fehlermeldung wie »-1 Invalid module format« entsteht dann, wenn die aktuell gebootete Kernelversion nicht zu der Kernelversion des Kernel-Sourcetrees passt, für den der Treiber kompiliert wurde. Diskrepanz in Versionen besteht schon dann, wenn Zusätze zur Kernelversion wie die Debian Revision (»-1«) oder die Architektur (»-386«) sich unterscheiden. So können Module, die für den 2.6.8 source tree kompliert wurden nicht in einen laufenden Kernel 2.6.8-1-386 eingefügt werden – es kommt dann die Fehlermeldung »-1 Invalid module format«. Parallel steht dazu in /var/log/messages: »p80211: disagrees about version of symbol struct_module; prism2_usb: disagrees about version of symbol struct_module«.
    Immer wenn in der Ausgabe von »make config« für »Linux Zydas 1201 Driver 0.3« etwas erscheint wie »The kernel source tree is version 2.6.8. […] WARNING: the current running kernel is actually version 2.6.8-1-386«, besteht dieses Problem. »make config« kann zwar überlistet werden, indem man die Konstante in ./include/linux/version.h aus dem Kernel source tree auf die aktuell laufende Kernelversion ändert. Dieser Hack ändert jedoch nichts am eigentlichen Problem, das nicht in »make config«, sondern in den erstellten Modulen besteht (diese erfahren ihre Kernelversion nicht aus version.h!).
    Also genau den Kernel booten, für dessen source tree man »Linux Zydas 1201 Driver 0.3« kompiliert hat. Wenn man vor »make config« und nach einer Änderung der Kernelversion des installierten Kernels kein »make clean« (besser: »make mrproper«) ausgeführt hat, können diese Probleme weiterhin bestehen, da während »make config« vermerkt wird, für welche Kernelversion die Treibermodule von »Linux Zydas 1201 Driver 0.3« kompiliert werden.
    Und wenn auch jetzt nich die Fehlermeldung »-1 Invalid module format« auftritt, jedoch nicht mehr mit dem Zusatz in /var/log/messages?
    Welche Versionskonflikte hier genau bestehen, kann man in der Ausgabe von dmesg nachlesen. Hier zum Beispiel wird immer nach »insmod p80211.ko« die folgende Meldung angefügt: p80211: version magic '2.6.8 preempt 386 gcc-3.3' should be '2.6.8 586 gcc-3.3'
    »cat /proc/kmsg« während »insmod p80211.ko« zeigt, dass keine weiteren Meldungen auf niedrigeren Prioritätsstufen geschrieben werden. Die obige Meldung bedeutet: der Kernel hat Version »2.6.8 preempt 386 gcc-3.3«, das Modul erfordert aber die Version »2.6.8 586 gcc-3.3«. Achtung: dies trat auf, als die Module kompiliert wurden während der Kernel des betreffenden Kernel source trees gerade lief!
    Diese unwesentlichen Unterschiede können übergangen werden, indem man »modprobe -f <modulname>« verwendet. Das führt dann zur Meldung »p80211: no version magic, tainting kernel.« als Information.
    Das nächste Problem ist die folgende Meldung in dmesg: »p80211: Unknown symbol capable«
    Verfahren nach http://www.linuxforum.com/linux-kernel-modules/basekerncompat.html : Der erste Schritt ist zu bestätigen, dass das Symbol tatsächlich nicht in /proc/kallsyms vorhanden ist. Das ist hier für das Symbol »capable« der Fall. Vermutung: Der experimentelle »Module versioning support« (CONFIG_MODVERSIONS) des Kernels ist an diesem Problem schuld, weil er fälschlicherweise eine Versionierung einführt, die das Symbol »capable« für das Modul unsichtbar sein lässt. Dazu muss sowohl der Kernel als auch die Module neu kompiliert werden (also vorher make clean), denn sonst kommen für alle Module Fehlermeldungen wie »version magic: […] should be […]« und »Invalid module format«.
    Wenn das nicht hilft, liegt es möglicherweise daran, dass »Linux Zydas 1201 Driver 0.3« für Kernel 2.6.8 nicht geeignet ist: das Symbol »capable« gab es einmal, jetzt aber nicht mehr. In diesem Fall sollte man in den Sourcen des Moduls p80211 nach der Verwendung des Namens »capable« suchen und diese durch etwas äquivalentes, funktionierendes ersetzen. Vgl. auch http://sourceforge.net/forum/forum.php?thread_id=1125136&forum_id=326770 .
    Achtung: p80211.ko ist wohl ddie Basis für den Zydas-Treiber, der Treiber selbst ist jedoch nicht prism2_usb.ko, sondern zd1201.ko. Siehe http://sourceforge.net/forum/forum.php?thread_id=1125136&forum_id=326770 ; es kann sein, dass dieser Treiber nicht kompiliert wird und man muss ausführen:
    make -C /lib/modules/2.6.4/build/ SUBDIRS=/root/zd12011-0.8 modules make -C /lib/modules/2.6.4/build/ SUBDIRS=/root/zd12011-0.8 modules_install ksymoops 2.4.9 on i686 2.6.7.  Options used -v /home/pq/linux/linux-2.6.7/vmlinux (specified) -k ksyms (specified) -l proc_modules (specified) -o /lib/modules/2.6.7serial/kernel/crypto/blowfish.ko

    Diese Lösung u.a. nach: http://www.linuxquestions.org/questions/history/184459 .

Hilfreiche Dokumentation:

  • man make-kpkg
  • vi $(which make-kpkg); (es ist ein Perl-Script)

Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.