Letzte Änderung dieses Dokuments: 06.04.2008, 11:34:37. ISDN Inhaltsdatenkomprimierung unter Linux
1. Inhalt
2. Einleitung
3. Verfahren
4. Voraussetzungen
5. Vorbereitete Distributionen
6. Selber machen
6.1. ipppd
6.2. Das isdn_lzscomp Modul
6.3. isdn_lzscomp als Kernelpatch
6.4. ipppd-Optionen
6.5. Die erste Einwahl
7. Die tägliche Routine
7.1. Debian-only: /etc/modules
7.2. Automatisches Laden via /etc/modules.conf
7.3. Laden via Runlevel-Skript
8. Häufige Fehler
8.1. Der Compiler bricht ab, weil er Headerdateien (z.B. isdn_lzscomp.h) nicht finden kann!
8.2. Ich bekomme "unresolved symbols"
8.3. Mein ISDN-Monitor (z.B. gkrellm) zeigt max. einen Datendurchsatz von 8 Kbps an! Die Kompression funktioniert nicht!
8.4. Ich habe alles wie beschrieben gemacht, aber die Kompression funktioniert trotzdem nicht! Die Testdatei wird nur mit max. 8 Kbps übertragen!
8.5. Seit ich die Kompression aktiviert habe, wird mir mein Syslog ständig mit CCP-Frame-Einträgen vollgemüllt!
Seit einiger Zeit unterstützen manche Provider (z.B. T-Online) die ISDN-Inhaltsdatenkomprimierung. Damit werden, wie der Name schon sagt,
die Datenpakete komprimiert, bevor sie über die ISDN-Verbindung verschickt werden. Auf diese Weise lässt sich, je nach Art der übertragenen
Daten, eine erstaunliche Datenübertragungsrate erzielen, die weit jenseits des normalen 8 kbps Limit liegt.
Im Folgenden werde ich eine kurze Beschreibung dafür geben, wie man diese Komprimierung unter Linux aktiviert. Ich stütze mich dabei
allerdings nur auf eigene Erfahrungen, sollte also etwas falsch oder zu ungenau sein, teilt es mir bitte mit!
In dieser Anleitung geht es ausschliesslich im die Stac/LZS Komprimierung nach RFC 1974.
Das MPPC nach RFC 2118, lässt sich mit gegenwärtig nur mit dem pppd
und diesem Projekt realisieren.
Die Aushandlung und Aktivierung der Komprimierung erfolgt nach dem CCP-Protokoll gemäss
RFC 1962.
Folgende Dinge setzt dieses Dokument voraus:
- Linux Kernel 2.2 oder 2.4 (2.0 geht nicht, da das CCP-Framework fehlt)
- isdn4k-utils (kurz "i4l", bei den meisten Distributionen enthalten)
- eine bestehender, korrekt konfigurierter Internetzugang via ipppd
Bevor ich mich ausführlich zu dem Thema auslasse, möchte ich darauf hinweisen, dass manche Distributionen bereits für LZS Komprimierung
ausgelegt sind.
Bei SuSE gibt es beispielsweise das Paket "i4l_ccp" aus der Serie "sec2", welches genau diese Komprimierung
bereitstellt. Ebenfalls sollen aktuelle Versionen von fli4l die Komprimierung beherrschen. Bei anderen Distributionen
mag dies ähnlich sein, jedoch ist mir dort nichts bekannt. Wer mir aber entsprechendes mitteilen möchte, ist herzlich eingeladen.
Da für die Komprimierung auch ein Kernelmodul erforderlich ist, kann es aber durchaus sein, dass man trotzdem noch das Modul von Hand
kompilieren muss, wenn man einen eigenen Kernel verwendet.
Falls man keine entsprechend vorbereitete Distribution hat oder es trotzdem lieber selber machen möchte, ist man im folgenden Abschnitt goldrichtig.
Gehen wir nun der Reihe nach alles durch, was für die Aktivierung der Komprimierung erforderlich ist.
Der ipppd muss natürlich die CCP-Frames erkennen können und die später noch genauer erläuterte "lzs 1:4" Direktive kennen. Bei allen halbwegs
aktuellen Versionen sollte das der Fall sein. Wer aber noch eine Uralt-Version der isdn4k-utils hat, muss
diese vielleicht aktualisieren. Wie das geht, entnehmen Sie bitte der entsprechenden Dokumentation.
Für die LZS/Stac Komprimierung muss ein spezielles Kernelmodul geladen werden. Wer eine einigermaßen aktuelle Version des Quellcodes der
isdn4k-utils hat, findet den Quellcode des Moduls dort im Unterverzeichnis ./ipppcomp.
Andre Beck, der Autor des Moduls, bietet den Quellcode auf seiner Homepage
zum Download an.
Ansonsten kann man sich das Modul auch aus dem aktuellen CVS-Repository holen.
Entweder, indem man die kompletten isdn4k-utils zieht (Overkill rulez ;-) ) oder per
Webzugriff. Ferner kann man
sich hier auch einen Tarball herunterladen.
Wenn nun erst einmal alles da ist (ich gehe mal davon aus, dass das Modul sich im Verzeichnis /usr/src/isdn4k-utils/ipppcomp befindet),
sollten Sie sich die beiliegende Datei README.LZS durchlesen und dann das Modul kompilieren und installieren.
Ich habe hier eine Makefile erstellt, die das Kompilieren und installieren vereinfachen sollte. Einfach
im Verzeichnis /usr/src/isdn4k-utils/ipppcomp abspeichern und mit einem Editor Ihrer Wahl anpassend. Wenn soweit alles in Ordnung ist,
müsste ein:
bash# make && make install
genügen, um das Modul zu kompilieren und zu installieren.
Wer es lieber von Hand, also ohne meine Makefile machen möchte, geht folgendermassen vor:
bash# gcc -O2 -I/usr/src/linux/include -D__KERNEL__ -DMODULE -c isdn_lzscomp.c
bash# cp isdn_lzscomp.o /lib/modules/kernelversion/misc
bash# depmod -a
Fall Sie einen Kernel haben, der Versionsinformationen in die Module kompiliert (CONFIG_MODVERSIONS), lautet der Befehl zur Kompilierung:
bash# gcc -O2 -I/usr/src/linux/include -Wall -D__KERNEL__ \
-DMODULE -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h\
-c isdn_lzscomp.c
Laden Sie nun probeweise das Modul:
bash# modprobe isdn_lzscomp comp=8 debug=2
Der Parameter comp gibt die gewünschte Kompression an. Mögliche Werte sind alle ganzen Zahlen von 0
bis 9, wobei 0 keine Komprimierung und 9 maximale Komprimierung bedeutet. Je höher die Komprimierung, desto mehr CPU-Last erzeugt das Modul. Die
Werte 7 oder 8 eignen sich für das Testen besonders gut, später können Sie selbst ein wenig damit herumexperimentieren.
Der Parameter debug gibt den gewünschten Debugginglevel an, legt also fest, wieviele Informationen das Modul ins Systemlog schreiben
soll. Am Anfang sollten Sie den zweithöchsten Wert (2) wählen. Wenn dann alles läuft, können Sie auf 1 heruntergehen.
Bei debug=3 wird zusätzlich ein Hexdump jedes Frames vor und nach der Dekomprimierung in Log geschrieben
wird.
Ist das Modul erfolgreich geladen, erscheint im Syslog (/var/log/messages) folgende Zeile:
Sep 18 14:45:53 linux kernel: PPP Stac/HiFn LZS (De)Compression registered
In diesem Falle ist das Modul korrekt geladen und Sie können fortfahren.
Hinweis: Bedenken Sie, dass Sie das Modul evtl. neu kompilieren müssen, wenn Sie einen neuen Kernel bauen!
Falls Sie das isdn_lzscomp-Modul nicht jedesmal seperat kompilieren und installieren
wollen, ist die Seite von
Frank Elsner vielleicht interessant für Sie. Dort finden Sie fertige Downloads, mit denen
Sie in aktuelle Kernel der Serie 2.2 und 2.4 das isdn_lzscomp hineinpatchen können.
Die betreffende Konfigurationsoption heisst dann CONFIG_ISDN_PPP_LZSCOMP.
Das schlimmste haben wir hinter uns. Nun müssen wir nur noch dem ipppd mitteilen, dass er die LZS Komprimierung auch benutzen soll. Dazu
öffnen Sie die Konfigurationsdatei für Ihr ISDN-Device.
Bei SuSE ist dies /etc/ppp/options.ipppX (X steht für die Devicenummer, z.B. "0" für ippp0).
Debian verwendet normalerweise /etc/isdn/ipppd.ipppX (X wieder Devicenummer). Bei anderen Distributionen ist
die Datei üblicherweise /etc/ppp/options oder /etc/ppp/ioptions.
Fügen Sie dort folgende Zeile hinzu:
lzs 1:4
Stellen Sie ausserdem sicher, dass ein eventuell vorhandener noccp Eintrag auskommentiert ist! SuSE beispielsweise deaktiviert die
CCP-Aushandlungen standardmässig, offenbar, um Einwahlproblemen vorzubeugen.
Um während der Testphase die PPP-Verhandlungen mit Ihrem Provider beobachten zu können (was Ihnen bei der Fehlersuche sehr
hilfreich sein kann), können Sie ferner die Option debug hinzufügen.
Speichern Sie die Datei.
Starten Sie dann den ipppd neu:
bash# rci4l restart
bzw.:
bash# /etc/init.d/i4l restart
Wichtig: Die Option lzs 1:4 gibt nicht das Kompressionsverhältnis an! Also sorgt ein "lzs 1:20" nicht für bessere
Komprimierung! Vielmehr legt diese Angabe das genaue Format der Kompression fest. Wenn Sie bessere Komprimierung wünschen, geben Sie
dies beim Laden des isdn_lzscomp-Moduls über den Parameter comp=1..9 an!
Nun sind wir soweit und können einen ersten Einwahlversuch machen. Am besten beobachten Sie parallel zur Einwahl das Syslog,
beispielsweise durch Eingabe von:
bash# tail -f -n0 /var/log/messages
Wenn die Einwahl geklappt hat und die Kompression aktiv ist, finden Sie im Log den Eintrag:
Sep 18 16:01:22 linux ipppd[6536]: [0] LZS (hists 1 check 4) compression enabled
Zum Vergleich: Ein komplettes Log, das Ihnen zeigt, wie eine erfolgreiche Einwahl bei T-Online aussieht, können Sie sich
hier anschauen.
Testen Sie nun die Kompression, indem Sie sich etwas herunterladen, was gut komprimierbar ist. Testdateien, die aus gleichen Bytes
bestehen, liefern die höchsten Kompressionsraten und sind daher besonders gut hierfür geeignet. Solche Dateien finden Sie hier:
- ftp://ftp.xs4all.nl/pub/test/10mb.nul
- 10 MB Testdatei, bestehend aus 0-Bytes.
- Meine Testdatei
- Meine eigene Testdatei, aus Platzgründen nur 2 MB gross, sollte aber reichen. Bitte nur verwenden, wenn der
oben genannte Server überlastet ist!
Natürlich werden Sie diese hohen Kompressionsraten bei realen Downloads nie erreichen. Häufig ist das, was man herunterlädt,
bereits komprimiert (.zip, .tar.gz, .rar) und dann hält sich der Gewinn meist in engen Grenzen. Aber das reine Surfen dürfte schneller gehen,
da HTML recht gut komprimierbar ist.
Es ist Ihnen vielleicht etwas zu umständlich, vor jeder Einwahl das isdn_lzscomp-Modul von Hand zu laden. Hier beschreibe ich daher
einiger Methoden, wie man dies automatisieren kann.
Wer Debian oder Debian-basierte Distributionen einsetzt, hat es vergleichweise einfach. Man schreibt einfach
das zu ladende Modul in die Datei /etc/modules, am besten unterhalb der anderen benötigten ISDN-Module.
Dann wird es automatisch beim Systemstart geladen. Eventuelle Parameter für das Modul kann man in einer
eigenen Datei unter /etc/modutils ablegen.
Beispiel:
bash# echo -e "isdn_lzscomp" >> /etc/modules
bash# echo "options isdn_lzscomp comp=7 debug=1" > /etc/modutils/isdn_lzscomp
bash# update-modules
Vergessen Sie den abschliessenden Aufruf von update-modules nicht, falls Sie unterhalb
von /etc/modutils etwas geändert haben!
Öffnen Sie die Datei /etc/modules.conf und tragen Sie an geeigneter Stelle die folgenden Zeilen ein:
post-install isdn /sbin/modprobe isdn_lzscomp
pre-remove isdn /sbin/modprobe -r isdn_lzscomp
Führen Sie danach ein depmod -a aus und starten Sie Ihr ISDN-Subsystem neu. Nun müsste das isdn_lzscomp Modul automatisch
geladen werden.
Achtung, Debianer: Wer die Debian-Distribution verwendet (zu der ich auch übergewechselt bin), sollte die
/etc/modules.conf nicht von Hand editieren, sondern die dafür vorgesehenen Gerüstdateien verwenden, siehe
vorherigen Abschnitt.
Etwas aufwendiger ist das automatische Laden über ein eigenes Runlevel-Skript. Unter SuSE habe ich diese Methode
früher bei mir zuhause dennoch verwendet. Ich habe ein für SuSE ab Version 7.0 angepasstes
Runlevel-Skript gebastelt, die Sie gleich verwenden können. Oder Sie nehmen dieses Skript als
Grundlage für Ihr eigenes.
Die Installation ist denkbar einfach:
bash# tar xzf i4l_ccp.tar.gz
bash# cp -a i4l_ccp/etc/* /etc/
bash# cp -a i4l_ccp/usr/sbin/* /usr/sbin/
bash# chmod a+rx /etc/init.d/i4l_ccp
Öffnen Sie dann mit dem Editor Ihrer Wahl die Datei /etc/i4l_ccp.conf und passen Sie sie an Ihre Bedürfnisse an. Die Datei ist
ausführlich kommentiert, so dass Ihnen die Konfiguration keine Probleme bereiten sollte.
Ihnen wird auffallen, dass die Konfigurationsmöglichkeiten des Skriptes sich nicht allein auf die LZS-Komprimierung beschränken.
Genauso können Sie auch das Modul für die BSD-Komprimierung oder andere Module bei Bedarf nachladen.
Wann immer Sie nun etwas an der Konfiguration der Kompression ändern möchten, genügt eine Anpassung an der Datei
/etc/i4l_ccp.conf, gefolgt von einem rci4l_ccp restart.
So, nun müssten Sie Ihre ISDN-Komprimierung nach LZS haben! Viel Spass damit!
Im folgenden Abschnitt widme ich mich nur noch einigen häufig gemachten Fehlern.
Je nachdem, wo man seine isdn4k-utils her hat, kann es sein, dass die Datei isdn_lzscomp.h nicht beim Modulquellcode dabei ist. Normalerweise
spielt das jedoch keine Rolle, da Sie auf jeden Fall in allen aktuellen Kernelquellen enthalten sein müsste und der Compiler diese mit einbindet.
Diese Meldung kann folgende Ursachen haben:
- Sie haben die Kernelquellen nicht installiert. Installieren Sie in diesem Falle die Kernelquellen oder zumindest die Headerdateien. Wie dies
geht, entnehmen Sie der Dokumentation Ihrer Linux-Distribution.
- Die Kernelquellen bzw. -header sind installiert, liegen aber nicht unter /usr/src/linux. Verschieben Sie die Kernelquellen dorthin
oder ändern Sie die Include-Angabe beim Compileraufruf zum entsprechenden Verzeichnis. In meiner Makefile genügt es, die Variable
LINUX anzupassen.
- Wenn die beiden oberen Möglichkeiten nicht zutreffen und die Datei isdn_lzscomp.h trotzdem nicht gefunden wird, dann ist die Datei
weder in den Kernelquellen noch beim isdn_lzscomp-Modul dabei. Sie können sich die Datei
hier herunterladen.
Wenn Sie beim Ausführen des Befehls depmod -a die Fehlermeldung "unresolved symbols" bekommen, liegt dies höchstwahrscheinlich
daran, dass Sie den falschen Compileraufruf verwendet haben. Entweder haben Sie das Modul mit Versionsinformationen kompiliert, während Ihr
Kernel dies nicht unterstützt oder umgekehrt. Finden Sie zunächst heraus, ob Ihr Kernel Versionsinformationen verlangt:
So sieht es aus, wenn Sie keine Versionsinformationen benötigen:
bash# grep MODVERSION /usr/src/linux/.config
# CONFIG_MODVERSIONS is not set
Und so, falls Sie welche brauchen:
bash# grep MODVERSION /usr/src/linux/.config
CONFIG_MODVERSIONS=y
Führen Sie dann den entsprechenden Compileraufruf manuell durch (siehe Abschnitt "Selber machen") oder öffnen Sie meine Makefile mit einem
Editor Ihrer Wahl und aktivieren Sie die passende CFLAGS-Variable.
Die meisten ISDN-Monitore, unter anderem auch der gkrellm, zeigen nur die Auslastung der Bandbreite des Interfaces an. Da sich die Brandbreite
nicht ändert (Sie haben ja nach wie vor ISDN), ändert sich auch deren Auslastung nicht.
Wenn Sie den effektiven Datendurchsatz wissen wollen, müssen Sie auf einer höheren Ebene ansetzen. Beispielsweise Downloadmanager
wie wget zeigen Ihnen diese Werte an. Versuchen Sie einmal, gut komprimierbare Dateien (wie die oben
genannte Testdatei) herunterzuladen, um die Kompression zu testen.
Prüfen Sie die Logs! Im Syslog (/var/log/messages) finden Sie häufig die Erklärung hierfür. Das Lesen dieser Logs gestaltet sich
zugegebenermassen nicht immer ganz einfach und ich kann hier nicht auf alle denkbaren Fehlerquellen eingehen.
Häufige Probleme sind jedoch:
Sep 18 15:07:27 linux ipppd[5483]: sent [0][CCP ConfRej id=0x1 <LZS (RFC) hists 1 check 4]
Hier lehnt Ihr eigener Rechner die LZS-Kompression ab! Höchstwahrscheinlich liegt das Problem also auf Ihrer Seite. Als mögliche Ursachen
kommen ein nicht geladenes isdn_lzscomp Modul oder eine fehlende lzs 1:4 Option beim ipppd in Frage.
Sep 18 15:07:27 linux ipppd[5483]: rcvd [0][CCP ConfRej id=0x1 <LZS (RFC) hists 1 check 4]
In diesem Fall hat Ihr Provider die Kompression abgelehnt. Höchstwahrscheinlich ist dies nicht Ihre Schuld. Eventuell unterstützt er gar keine
LZS-Kompression. Vielleicht gibt es andere Formate, die er untersützt. Suche Sie nach Zeilen der folgenden Form:
rcvd [0][CCP ConfReq id=0x1 blahblahblah .
Dort finden Sie die Konfigurationsvorschläge, die die Gegenstelle Ihnen macht.
Reduzieren Sie den Loglevel beim Laden des isdn_lzscomp-Moduls und entfernen Sie evtl. debug Optionen aus Ihrer
ipppd-Konfiguration.
|