Homepage Logo

Letzte Änderung dieses Dokuments: 06.04.2008, 11:34:37.

ISDN Inhaltsdatenkomprimierung unter Linux

1. Inhalt

   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!


2. Einleitung

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!


3. Verfahren

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.


4. Voraussetzungen

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

5. Vorbereitete Distributionen

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.


6. Selber machen

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.

6.1. ipppd

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.

6.2. Das isdn_lzscomp Modul

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!

6.3. isdn_lzscomp als Kernelpatch

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.

6.4. ipppd-Optionen

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!

6.5. Die erste Einwahl

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.


7. Die tägliche Routine

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.

7.1. Debian-only: /etc/modules

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!

7.2. Automatisches Laden via /etc/modules.conf

Ö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.

7.3. Laden via Runlevel-Skript

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.


8. Häufige Fehler

8.1. Der Compiler bricht ab, weil er Headerdateien (z.B. isdn_lzscomp.h) nicht finden kann!

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.

8.2. Ich bekomme "unresolved symbols"

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.

8.3. Mein ISDN-Monitor (z.B. gkrellm) zeigt max. einen Datendurchsatz von 8 Kbps an! Die Kompression funktioniert nicht!

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.

8.4. Ich habe alles wie beschrieben gemacht, aber die Kompression funktioniert trotzdem nicht! Die Testdatei wird nur mit max. 8 Kbps übertragen!

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.

8.5. Seit ich die Kompression aktiviert habe, wird mir mein Syslog ständig mit CCP-Frame-Einträgen vollgemüllt!

Reduzieren Sie den Loglevel beim Laden des isdn_lzscomp-Moduls und entfernen Sie evtl. debug Optionen aus Ihrer ipppd-Konfiguration.

[05.05.2008] Neuer PGP-Schlüssel
Ich habe einen neuen PGP/GPG-Schlüssel erzeugt. Der alte ist nach wie vor gültig und kann auch noch benutzt werden.

[02.04.2008] Umzug
Die Domain malte-wetz.de wird jetzt bei einem anderen Anbieter gehostet. Es sollte keine Probleme mehr mit der Umleitung geben und Werbepopups oder -frames gehören der Vergangenheit an.

[02.04.2008] Gästebuch offline
Das Gästebuch bleibt erst einmal offline. Es wurde dort zu viel Werbemüll hinein geschrieben. Sorry.

[09.01.2006] Diverses
Kleinere Korrekturen und Ergänzungen an den Texten, IP-Filter im Gästebuch stark erweitert (Lateinamerika, Spanien, Asien, Italien).

[28.07.2005] vbox3-Anleitung
Kleinere Ergänzungen/Korrekturen im Abschnitt 4.1.1

[23.04.2005] gDesklets aktualisiert
Da meine gDesklets offenbar von gdesklets.gnomedesktop.org gelöscht wurden, habe ich die aktuellsten Fassungen hier abgelegt.

[25.01.2005] Kleinere Reparaturen
Links auf BSI-Seite und OE-FAQ angepasst und Gästebuch repariert.