Installation und Konfiguration
Derzeit empfiehlt sich ein Kernel frühestens ab 1.3.97 (erst seit Kernel 1.3.69 ist der Einsatz von Kernel-internen ISDN-Treibern überhaupt möglich, und erst ab 1.3.97 laufen die Treiber hinreichend stabil). Nachdem nun der Kernel 2.0 herausgekommen ist, werden wir ihn hier auch besprechen. Es empfiehlt sich derzeit die Kernelversion 2.0.27, die mit isdn4linux ziemlich problemlos zusammenarbeitet. Man besorgt sich den Kernel z.B. unter
ftp.leo.org/pub/comp/os/linux/Linus/v2.0/(zum Beispiel linux-2.0.27.tar.gz; dieser Kernel läuft seit Monaten ohne Probleme beim Autor) und sollte auch gleich das neue modules-Paket mit holen:
ftp.leo.org/pub/comp/os/linux/Linus/v2.0/modules-2.0.0.tar.gzMit dem Kernel geht man wie gewohnt um - siehe dazu auch das Kernel-HOWTO, zu finden beim nächsten SunSite, beispielsweise unter
ftp.leo.org/pub/comp/os/linux/sunsite/docs/HOWTO/Kernel-HOWTO.gzDie Modules sollte man vorher noch entpacken und entsprechend der Anweisungen im Kernel-HOWTO einbauen.
Wer isdn4linux einsetzen will, um eine ISDN-Karte zu bedienen, muß keinerlei Patches mehr einspielen (das war nur beim Kernel 2.0.0 erforderlich - dort mußte man noch die zwei Patches isdn4kernel-2.0-patch1+2 einbauen). Aber: Die meisten passiven Karten mit Siemens-Chipsatz (Teles, Creatix, AVM, Elsa, ...) laufen nur mit einem Treiberpaket, das noch nicht im Kernel integriert ist: "HiSax". Wer so eine Karte einsetzt, muß sich den aktuellen Treiber in's Verzeichnis /usr/src holen:
ftp.franken.de/pub/isdn4linux/HiSax/(z.B. Version 1.5; die unterstützten Karten finden sich im README!) und ihn in den Kernel patchen:
root:# cd /usr/src root:# tar zxfv HiSax_1.5.patch_for_2.0.tar.gz root:# patch -p <HiSax_1.5.patch_for_2.0 root:# _Beim Compilieren des Kernels muß man nun folgendes bei "make config" (bzw. seinen graphischen Verwandten "make menuconfig" oder "make xconfig") eingestellt werden:
Sektion "Code maturity level options": Prompt for development and/or incomplete code/drivers: No Sektion "General Setup": Networking support: Yes Sektion "Networking options": TCP/IP networking: Yes alle anderen je nach Bedarf. Sektion "Network device support": Network device support: Yes PPP (point-to-point) support: Yes alle anderen je nach Bedarf Sektion "ISDN subsystem": Nur wenn isdn4linux benötigt wird: ISDN support: Yes Support synchronous PPP: Yes Use VJ compression with synchronous PPP: Yes Support audio via ISDN: Yes Support generic MP (RFC 1717): Yes Verwendete Karte eintragen.Wenn später der Kernel ohne Probleme läuft, kann man daran denken, einige dieser Bausteine auch als Module statt als feste Kernelbestandteile zu definieren.
Wer eine ISDN-Karte einsetzt, muß aber zusätzlich Arbeit investieren und sich die aktuelle Version von Fritz Elferts "isdn4kernel-Utilities" holen. Wer eine ältere Version von isdnctrl besitzt, muß updaten: der Befehl "isdnctrl pppbind" muß laufen! Das bekommt man heraus, indem man isdnctrl eingibt und sich die möglichen Optionen ansieht. Hier gibt es die neue Version:
ftp.franken.de/pub/isdn4linux/v2.0/isdn4k-utils-2.0.tar.gzMan setzt sich diese ins Verzeichnis /usr/src und entpackt sie per "tar zxfv isdn4k-utils-2.0.tar.gz". Im Verzeichnis
/usr/src/isdn4k-utils-2.0findet man jetzt alle zum Betrieb notwendigen Dateien. Bei einigen Linux-Distributionen fehlen einige wichtige Links, weshalb man an einigen Makefiles drehen muß. Diese Makefiles befinden sich alle im Unterverzeichnis tools
/usr/src/isdn4k-utils-2.0/tools/Makefile In der folgenden Zeile "isdnbutton-1.1" entfernen, falls Sie kein Motif besitzen - sonst Compilierfehler. SUBDIRS=imon imontty-0.3 isdnlog-2.41 isdnbutton-1.1 tcltk [...] /usr/src/isdn4k-utils-2.0/tools/imontty-0.3/Makefile [...] LDFLAGS=-lncurses -lm [...] /usr/src/isdn4k-utils-2.0/tools/isdnlog-2.41/Makefile [...] LIB = -lgdbm [...]Zunächst müssen die Programme erzeugt werden. Dazu begibt man sich in's Verzeichnis /usr/src/isdn4k-utils-2.0, übersetzt alles mit "make", erzeugt anschließend die neuen ISDN-Gerätedateien mit "make devices" und installiert zum Schluß die ausführbaren Programme mit "make install" im Verzeichnis /sbin sowie die man-Seiten dort, wo sie hingehören.
Die Kartenparameter müssen auch noch eingestellt werden - hierzu ist die ISDN4Linux-Anleitung
/usr/src/linux/Documentation/isdn/READMEzu Rate zu ziehen. Die Parameter werden beim Booten als Kernelparameter oder beim Laden des entprechenden Modules übergeben.
Eine Reihe weiterer Dateien müssen angelegt werden. So ist für jeden Provider je eine Datei pro Einwahl-Telefonnummer herzustellen, in der alle wichtigen Daten enthalten sind. Die PPP-Dämonen benötigen überdies ein paar weitere Dateien. Das werden wir nun der Reihe nach besprechen.
Leute, die sich diese WWW-Seiten als Paket "leafsite.tar.gz" geladen haben, finden die Scripte im Unterverzeichnis "scripts".
Wenn Sie vorher bereits das alte "isdn"-Paket dieses Tutorials benutzt haben, so müssen sie zuallererst ein paar Sachen ändern:Zu Beginn müssen einige Verzeichnisse eingerichtet werden:root:# <startup_path>/i4l stop (oder "rc.isdn stop" oder wasimmer) root:# _(<startup_path> ist das Verzeichnis, in dem alle System-Bootdateien enthalten sind).Dann löscht man (oder sichert sie woanders) einige alte Dateien:
root:# rm <startup_path>/i4l (falls eine neuere SuSE benutzt wird) root:# rm <startup_path>/rc.isdn root:# rm /sbin/isdn root:# rm /etc/i4l.provider (/etc/i4l.config bei alten "isdn"-Versionen) root:# rm /etc/i4l.secrets (/etc/i4l.param bei alten "isdn"-Versionen) root:# _
root:# mkdir /usr/lib/connect root:# mkdir /usr/lib/connect/providers root:# mkdir /var/lib/connect root:# _
Beispiel für eine isdn4linux-Datei
#!/bin/bash MODE=i4l PHONE=0891234567 IP_ADDRESS=123.234.210.109 OPTIONS_FILE=/etc/ppp/options.ipppdBeispiel für eine Modem-Datei
#!/bin/bash MODE=modem IP_ADDRESS=234.123.134.56 DEVICE=ttyS1 OPTIONS_FILE=/etc/ppp/options.pppd CHAT_SCRIPT="ABORT BUSY ABORT 'NO CARRIER' '' ATZ0 OK ATD0,08912345 CONNECT"Diese Dateien definieren etliche Umgebungsvariable, die in den hier verwendeten Scripten teilweise eingebunden werden. MODE sagt connect, ob es isdn4linux aufrufen oder ein Modem ansteuern soll. IP_ADDRESS ist die IP-Adresse des Remotes, bei dem Sie sich einwählen möchten. OPTIONS_FILE ist die Optionendatei des (i)pppd für diesen Remote. isdn4linux benötigt die Telefonnummer des Remotes (PHONE), und der pppd braucht den Namen der seriellen Schnittstelle (DEVICE) sowie ein CHAT-Script (CHAT_SCRIPT), an welcher das Modem angeschlossen ist.
Eine Datenbank mit Daten einiger Unis und anderer Provider kann man sich herunterladen.
Ich wäre übrigens nicht undankbar, wenn man mir funktionierende Dateien mailen würde (eventuelle Privatdaten wie Paßwörter entfernen!).
/usr/lib/connect/base #!/bin/bash # (c) 1997 Bernhard Hailer (GNU GPL V.2) # Edit this file for your needs # local settings # ============== # Fully qualified host name read MY_HOSTNAME </etc/HOSTNAME # read host's name # MY_HOSTNAME=foo.bar.com # Host phone number and MSN (EAZ) - replace by your numbers! MY_PHONE=817890032 # no leading zero! MY_EAZ=90032 # Email address for fetching mail - replace by your address! MY_EMAIL_ADDRESS=dl4mhk@lrz.uni-muenchen.de # extra start commands for rc.connect (e.g. module loading) # --------------------------------------------------------- function Con_Start() { insmod /lib/modules/`/bin/uname -r`/misc/isdn.o insmod /lib/modules/`/bin/uname -r`/misc/hisax.o io=3,2,12,0xd80 HiSax_id=Teles0 #insmod /lib/modules/`/bin/uname -r`/misc/teles.o io=0,12,0xd80,2 teles_id=Teles0 #rmmod teles.o #insmod /lib/modules/`/bin/uname -r`/misc/teles.o io=0,12,0xd80,2 teles_id=Teles0 return } # extra stop commands for rc.connect (e.g. module unloading) # ---------------------------------------------------------- function Con_Stop() { rmmod hisax.o #rmmod teles.o sleep 1 rmmod isdn.o return } # Default remote providers for regular connects DEFAULT_REMOTES="lrz-d1 lrz-d2" # default device where your modem is connected - no leading "/dev/"! DEFAULT_DEVICE="ttyS1" # Maximum number of dialin attempts declare -i DEFAULT_MAX_TRIES DEFAULT_MAX_TRIES=4 # Maximum idle time before hangup (you should use a time of about 300 secs # here, because it is more expensive to dial often than to hold a line!) # This only works for isdn4linux connections. declare -i HUPTIMEOUT HUPTIMEOUT=300 # 5 minDie Shell-Funktionen Con_Start() und Con_Stop() werden vom Script rc.connect aufgerufen und verdienen besondere Beachtung: Wenn man das ISDN-Subsystem als Module laden und entladen will, so kann man die dazugehörigen Befehle hier eintragen. Beispiele für den Teles- und den HiSax-Treiber sind aufgeführt (ich benutze inzwischen HiSax 1.4 an meiner Teles 16.3).
Desweiteren werden noch ein paar Defaultwerte vereinbart. DEFAULT_REMOTES enthält die Dateinamen der Remotes, die normalerweise angerufen werden sollen (wenn man mehrere angibt, dann wird einer nach dem anderen ausprobiert, bis eine Verbindung zustandekommt). DEFAULT_MAX_TRIES sagt aus, wie oft das passieren soll. HUPTIMEOUT wirkt nur bei der Benutzung von isdn4linux. Man trägt hier ein, nach wieviel Zeit ohne Datenübertragung aufgelegt werden soll (bei Modems das Handbuch zu Rate ziehen). Und DEFAULT_DEVICE ist der Name der normalerweise vom Modem benutzten seriellen Schnittstelle.
Das Bootscript rc.connect wollen wir als nächstes behandeln.
Diese Datei muß neu angelegt werden. Damit sie beim Booten als Startdatei erkannt wird, muß man vorher folgenden Eintrag in die Datei /etc/rc.d/rc.M vornehmen:
/etc/rc.d/rc.M; Sektion "# Initialize the NET subsystem." . /etc/rc.d/rc.inet1 . /etc/rc.d/rc.connect # <-- diese Zeile einfügen! . /etc/rc.d/rc.inet2
Das mit der Reihenfolge ist "tricky": ein "Masterscript" sieht in den Runleveln zugeordneten Verzeichnissen (./rc0.d, ./rc1.d, ./rc2.d) nach, was zu tun ist. Darin befinden sich eine Reihe von Soft-Links auf die gerade beschriebenen Scripten. Alle Links heißen entweder
SnnScriptnameoder
KnnScriptnamemit einer Zahl nn, die bestimmt, wann diese Datei aufgerufen wird. Wenn also eine neue Datei - nennen wir sie auch hier wieder rc.connect, unterzubringen im Scriptenverzeichnis - eingebunden werden soll, die das ISDN-System integriert, dann ist das zugehörige Runlevelverzeichnis ./rc2.d, und man muß dort zwei Softlinks unterbringen:
root:# cd /sbin/init.d/rc2.d # (Pfad anpassen!!) root:# ln -s ../rc.connect K20rc.connect root:# ln -s ../rc.connect S20rc.connect root:# _
Hinweis für Benutzer der S.u.S.E.-Distribution ab Version 4: Hier heißt diese Datei i4l, ferner gibt es eventuell eine Datei i4l_hardware. Diese Dateien müssen beseitigt werden, entsprechend auch ihre Aufrufdateien in /sbin/init.d/rc2.d. Damit werden selbstverständlich auch die Einträge I4L_* in der S.u.S.E.-Konfigurationsdatei /etc/rc.config belanglos.Diese Änderungen sind leider notwendig, weil nur so ein distributionsunabhängiges Paket geschaffen werden kann.
/sbin/init.d/rc.connect (Ausschnitt) /sbin/isdnctrl verbose 0 # For debugging set to 2 (max. 4) # ISDN device drivers ippp0 (PPP) /sbin/isdnctrl addif ippp0 /sbin/isdnctrl pppbind ippp0 0 /sbin/isdnctrl addphone ippp0 out $PHONE # dial-out number /sbin/isdnctrl addphone ippp0 in $MY_PHONE # my telephone no /sbin/isdnctrl eaz ippp0 $MY_EAZ # my MSN / EAZ /sbin/isdnctrl huptimeout ippp0 $HUPTIMEOUT # defined in $BASE /sbin/isdnctrl secure ippp0 on # nobody may enter /sbin/isdnctrl l2_prot ippp0 hdlc /sbin/isdnctrl l3_prot ippp0 trans /sbin/isdnctrl encap ippp0 syncppp /sbin/ifconfig ippp0 $MY_HOSTNAME pointopoint $IP_ADDRESS metric 1 /sbin/route add default ippp0 # interface definitions /sbin/ipppd /dev/ippp0 file $OPTIONS_FILE & /sbin/route del default ifconfig ippp0 downUnter Umständen muß der Pfad PATH in diesem Script angepaßt werden!
Vor Aufruf muß rc.connect mit chmod 744 rc.connect ausführbar gemacht werden.
Man sieht: hier werden etliche der oben definierten Umgebungsvariable benutzt! Einige der Kommandos sind bemerkenswert: das "pppbind"-Kommando wird gegen Seiteneffekte eingesetzt, die entstehen, wenn mehr als ein ipppd gestartet werden. Ohne dieses Kommando benutzen alle ipppd's beispielsweise die Paßwörter, die für den ersten definiert wurden. Auch die letzten beiden Kommandos sind essentiell: nur wenn kein ipppd "up" ist, kann man daneben problemlos einen herkömmlichen pppd für Modems starten.
Hier wird übrigens nicht der Standard-PPP-Dämon pppd 2.2.0f aufgerufen, sondern eine speziell gepatchte Version namens "ipppd". Diese liegt dem ISDN4Linux-Paket bei und wurde beim Installieren nach /sbin befördert. Trotzdem gelten die man-Seite zum pppd sowie das "PPP-HOWTO".
/etc/ppp/options # comment out the following three lines if you don't need # dynamic IP negotiation. ipcp-accept-local ipcp-accept-remote noipdefault # more pppd/ipppd options lock mru 1500 mtu 1500 debug -detachFalls man nicht dynamisch von seinem Provider eine IP zugewiesen bekommt, muß man die ersten drei Befehle auskommentieren. Der Rest wird praktisch immer benötigt.
Nun zu den Extra-Optionsdateien. Sie sind erforderlich, weil
Beispieldatei für den pppd # /etc/ppp/options crtscts user hailer
Beispieldatei für den ipppd # /etc/ppp/options for ipppd useifip -vjccomp -ac -pc -detach -bsdcomp -vj user hailerAnmerkung zur Option "-vj": Wird dieser Parameter nicht gesetzt, so kann das System sehr ungehalten reagieren. Während es bei einer laufenden X-Sitzung schlicht und einfach hängenbleiben kann, so kommt es bei einer einfachen Sitzung zur Anzeige von "Kernel-Oopses". Speziell die Zeile "Aiee, killing interrupt handler" deutet auf eine eingeschaltete VJ-Kompression hin. Die Option useifip verhindert Seiteneffekte bei mehreren gleichzeitig laufenden ipppd's.
/etc/resolv.conf: (siehe /etc/i4l.provider-Datenbank!) search <what_you_need> nameserver <IP 1st nameserver> nameserver <IP 2nd nameserver> nameserver <IP 3rd nameserver>Es können maximal drei Nameserver angegeben werden. Bei "search" trägt man ein, wo verkuerzte Hostnamen gesucht werden sollen. Beispiel: bei einem Eintrag von search lrz-muenchen.de kann beim Befehl ping sun3 der Rechner sun3.lrz-muenchen.de gefunden werden.
/etc/host.conf: order hosts bind multi on /etc/hosts: (ein Beispiel!) # For loopbacking. 127.0.0.1 localhost # My own IP address 192.168.1.1 maschinen.name alias # oder eigene IP-Adresse # (192.168.x.x ist frei verfügbar und kann immer verwendet werden.) # example entries 129.187.10.22 sun3.lrz-muenchen.de sun3 # (Beispiel-Remote) 129.187.13.48 sunmailhost.lrz-muenchen.de getmail # (Beispiel, für Mail) 129.187.13.48 news.lrz-muenchen.de getnews # (Beispiel, für News)
root:# chmod 600 /etc/ppp/pap-secrets (bzw. /etc/ppp/chap-secrets) root:# _
/etc/ppp/pap-secrets # Secrets for authentification using PAP # client server secret IP addresses <provider_login> <1. Provider> '<password>' - <provider_login> <2. Provider> '<password>' -Anmerkungen:
Das Schützen mit chmod 600 /etc/ppp/pap-secrets nicht vergessen!
/etc/ppp/chap-secrets # Secrets for authentification using CHAP # client server secret IP addresses <provider_login> <1. Provider> <password> <1. Provider> <provider_login> "" <provider_login> <2. Provider> <password> <2. Provider> <provider_login> ""Das Schützen mit chmod 600 /etc/ppp/chap-secrets nicht vergessen!
daemon.* /var/log/ppp-logDamit wird alles, was der PPP-Dämon an Informationen abgibt, in der Datei /var/log/ppp-log abgelegt.
Damit hat man alle erforderlichen Dateien angepaßt, und das System sollte laufen.
Die neuen Kernels ab 1.3.100 haben eine etwas unangenehme Eigenschaft: sie greifen intensiv in die Routenlegung ein. Damit es keine Kollisionen gibt, muß man erst wählen, dann warten, bis die Verbindung steht und darf erst dann die Defaultroute legen. Das folgende Script erledigt das "An-" und das "Abschalten" der Route. Es ist so abgefaßt, daß es auch mehrmal aufgerufen werden kann, so daß die erste Anwendung (beispielsweise Post holen) die Verbindung herstellt, und weitere Verbindungen nicht neue Leitungen aufmachen müssen. Die letzte Anwendung räumt auf: es wird aufgelegt und die Defaultroute wieder gelöscht. Aufruf: /sbin/connect on und /sbin/connect off. Eine ausgeklügelte Datei kann geladen werden (auf die Überschrift klicken!), hier nur eine ganz kurze Beispieldatei.
Das Script setzt man in das Verzeichnis /sbin und macht es ausführbar (der route-Befehl ist nur für "root" ausführbar!):
root:# chmod 744 /sbin/connect root:# _
/sbin/connect #! /bin/bash PATH=/sbin:/usr/sbin:/bin:/usr/bin # ISDN4Linux: case $1 in on) isdnctrl dial ippp0 # Verbindung herstellen sleep 5 # warten, bis Leitung offen route add default ippp0 # Route setzen ;; off) isdnctrl hangup ippp0 # Verbindung abbrechen route del default # und Route wieder löschen ;; esac # Modem: IF_FILE=/var/lib/connect/interface case $1 in on) pppd connect "chat $CHAT_SCRIPT" file $OPTIONS_FILE /dev/$DEVICE & # the interface name was saved now by /etc/ppp/ip-up in IF_FILE. sleep 1 echo "Sleeping 40 seconds for establishing connection..." sleep 40 read INTERFACE <$IF_FILE route add default $INTERFACE ;; off) kill -HUP `cat /var/lock/LCK..$DEVICE` route del default ;; esacUnter Umständen muß der Pfad PATH in diesem Script angepaßt werden!
Beim Modem wird das INTERFACE auf raffinierte Art und Weise bestimmt: beim Hochfahren des pppd wird das Script /etc/ppp/ip-up mit folgenden Argumenten aufgerufen:
ip-up interface device speed local_address remote_addressUnd das macht man sich zunutze. Man schreibt eine Datei ip-up:
/etc/ppp/ip-up #!/bin/bash # This script is called by (i)pppd while starting up. # It is called this way: # ip-up interface device speed local_address remote_address. # So you can get the used interface by fetching $1 echo $1 >/tmp/connect_interface.tmpund schon hat man den Namen des Interfaces gespeichert!
Hinweise für eigene Experimente:
Test:
root:# connect Calling ippp0 Dialing of ippp0 triggered Sleeping 8 sec for PPP handshaking... Line open - checking... :-) Line is ok - have fun! root:# telnet foo.bar.com [...](nun wie gewohnt einloggen; später zum Abschluß "exit" eingeben)
root:# connect off Last application stopped - closing line. prov0 hung up prov1 already closed! To force closing use "connect off all" root:# _
"connect" (oder "connect on") Verbindung mit Defaultremote herstellen "connect off" Verbindung abbrechenWichtiger Befehl:
"connect off all" bricht alle Verbindungen abWeitere Remotes lassen sich ganz einfach anwählen:
"connect remote1 (on)" Verbindung mit remote1 herstellen "connect remote1 off" und wieder abbrechenWenn man mehrere Remotes angibt, wird einer nach dem anderen probiert, bis eine Verbindung zustandekommt. Das "on" ist immer optional.
"connect remote1 remote2 remote3 ..."Man kann auch mehrere Verbindungen gleichzeitig aufbauen. Natürlich macht es dann keinen Sinn mehr, lauter Defaultroutes zu legen: sie darf nur einmal existieren. Bei mehreren offenen Leitungen muß man einzeln Routen legen:
"connect remote1 route Netz-IP" Verbindung mit Route "connect remote2 route default" Verbindung mit Default-RouteDie Route muß zum Remote passen! Das "route default" ist nicht wirklich nötig.
Wenn die Einwahlports des Providers stark belastet sind, kann man eine Maximalanzahl von Einwahlversuchen angeben:
"connect remote1 maxtries versuche"Wenn man kein "maxtries" angibt, wird der Defaultwert aus /usr/lib/connect/base verwendet.
Ähnlich ist das hiermit:
"connect remote1 device ttySn"So gibt man bei Verwendung eines Modems die serielle Schnittstelle an, an der das Modem hängt. Ohne diese Angabe gilt das Defaultgerät, das in /usr/lib/connect/base definiert ist.
Man sehe sich dazu das README von Fritz Elfert an.