Installation und Konfiguration
Derzeit empfiehlt sich ein Kernel 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. Man besorgt sich den Kernel z.B. unter
ftp.leo.org/pub/comp/os/linux/Linus/v2.0/linux-2.0.7.tar.gzund 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.
Man 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).
Beim Compilieren 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: Yes 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": 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.
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. Zunächst müssen die Programme erzeugt werden. Man übersetzt sie 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.
Damit sind die grundlegenden Installationen abgeschlossen.
Eine Datenbank mit fertigen Dateien für einige Unis und andere Provider kann man sich herunterladen. Es ist recht einfach, auch selber die Datei /etc/i4l.config herzustellen - dazu kann man sich eine Vorlage laden oder den entsprechenden Abschnitt aus der Datenbank schnipseln.
Diese Datei definiert etliche Umgebungsvariable, die in den hier verwendeten Scripten teilweise eingebunden werden. Wenn ich mal viel Elan aufbringe, werde ich ein Script machen, das automatisch alle erforderlichen Dateien aus i4l.config und i4l.param erstellt - das ist allerdings ein recht ehrgeiziges Projekt. Bisher muß man sich noch alle Dateien, die in /etc stehen, selber anpassen.
Ich wäre übrigens nicht undankbar, wenn man mir funktionierende Dateien mailen würde!
Beispieldatei (hier für meinen Provider, das Leibniz-Rechenzentrum in München):
/etc/i4l.config #!/bin/sh # i4l.config # (c) 1996 Bernhard Hailer (GNU GPL V.2) # Please send your completed file to Bernhard.Hailer@lrz.uni-muenchen.de. # Thank you! # Provider: Leibniz-Rechenzentrum Muenchen # Hotline: (089) 289-28800 # Data collected: Bernhard Hailer <dl4mhk@lrz.uni-muenchen.de> # Telephone numbers for raw terminal programs: # 08928057421, 0892805601 # Add here data of first provider PROV1_PHONE=0892881010 # phone number of provider PROV1_NAME=ppp.lrz-muenchen.de # name of provider PROV1_IP=129.187.24.253 # IP address of provider # Add here data of second provider # (leave empty, if there is none) PROV2_PHONE=0892881190 # phone number of provider PROV2_NAME=ppp.lrz-muenchen.de # name of provider PROV2_IP=129.187.24.126 # IP address of provider # Name servers (add manually to /etc/resolv.conf): # search lrz-muenchen.de # nameserver 129.187.10.25, 129.187.16.1 # Mail server (add manually to /etc/hosts): # 129.187.13.48 sunmailhost.lrz-muenchen.de getmail # News server (add manually to /etc/hosts): # 129.187.13.48 news.lrz-muenchen.de getnewsDie Datei i4l.param ist so aufgebaut (Beispiel):
/etc/i4l.param #!/bin/sh # /etc/i4l.param Bernhard Hailer 1996 # ATTENTION! This file contains PASSWORDS and other security belonging data. # It MUST be hidden using "chmod 700 /etc/i4l.param"!!!!! # used in /sbin/init.d/rc.isdn MY_PHONE=8178***** # no leading zero! MY_DOMAIN=dl4mhk.ampr.org # my fully qualified domain name PROV1_LOGIN= # not used currently PROV1_PASSWD= # not used currently PROV2_LOGIN= # not used currently PROV2_PASSWD= # not used currently # used in /sbin/transmail MAIL_LOGIN=******** MAIL_PASSWD=******** MAIL_PATH=/var/spool/mail/dl4mhk # dl4mhk is my user name at home NEWS_LOGIN= # not used currently NEWS_PASSWD= # not used currently
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.isdn # <-- diese Zeile einfügen! . /etc/rc.d/rc.inet2Jetzt kreiert man eine neue Datei namens /etc/rc.d/rc.isdn. Das besprechen wir gleich nach dem folgenden Kapitel, in dem kurz auf die Arbeitsweise von sysvinit eingegangen wird.
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.isdn (Achtung: bei SuSE heist diese Datei i4l!), 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.isdn K20rc.isdn root:# ln -s ../rc.isdn S20rc.isdn root:# _
/sbin/init.d/rc.isdn #!/bin/sh # rc.isdn This shell script boots up the ISDN subsystem. # Version: @(#)/sbin/init.d/rc.isdn 3.0 01-Sep-96 # Author: Bernhard Hailer <Bernhard.Hailer@lrz.uni-muenchen.de> . /etc/i4l.config . /etc/i4l.param case "$1" in start) # === The following is /etc/rc.d/rc.isdn for "simpleinit"! ================= # turn on isdn echo "Starting isdn4linux" echo "0" >/etc/lines.active # makes it more comfortable. # global /sbin/isdnctrl verbose 0 # For debugging set to 2 (max. 4) # ISDN device drivers ippp0 (PPP) /sbin/isdnctrl addif ippp0 /sbin/isdnctrl addphone ippp0 out $PROV1_PHONE # 1st provider /sbin/isdnctrl addphone ippp0 in $MY_PHONE # my telephone no /sbin/isdnctrl eaz ippp0 $MY_EAZ # my MSN / EAZ /sbin/isdnctrl huptimeout ippp0 300 # 5 min /sbin/isdnctrl secure ippp0 on # nobody may entry /sbin/isdnctrl l2_prot ippp0 hdlc /sbin/isdnctrl l3_prot ippp0 trans /sbin/isdnctrl encap ippp0 syncppp /sbin/ifconfig ippp0 $MY_DOMAIN pointopoint prvdr0 metric 1 /sbin/route add default ippp0 # interface definitions /sbin/ipppd remotename prvdr0 /dev/ippp0 & # Now delete Route again to prevent unwanted connections - see chapter # "Running". The route must be set at the beginning! /sbin/route del default # ISDN device drivers ippp1 (PPP) # Same again for 2nd provider (not necessary if no 2nd server!) /sbin/isdnctrl addif ippp1 /sbin/isdnctrl addphone ippp1 out $PROV2_PHONE /sbin/isdnctrl addphone ippp1 in $MY_PHONE /sbin/isdnctrl eaz ippp1 $MY_EAZ /sbin/isdnctrl huptimeout ippp1 300 /sbin/isdnctrl secure ippp1 on /sbin/isdnctrl l2_prot ippp1 hdlc /sbin/isdnctrl l3_prot ippp1 trans /sbin/isdnctrl encap ippp1 syncppp /sbin/ifconfig ippp1 $MY_DOMAIN pointopoint prvdr1 metric 1 /sbin/route add default ippp1 /sbin/ipppd remotename prvdr1 /dev/ippp1 & /sbin/route del default # ISDN device driver isdn0 (no PPP) # Option: VT100 connection /sbin/isdnctrl addif isdn0 # with terminal program /sbin/isdnctrl huptimeout isdn0 300 # via /dev/ttyI0 # === Until here /etc/rc.d/rc.isdn for "simpleinit"! ====================== ;; stop) ## turn off isdn # === Put this to the beginning of the "rc.6" file for "simpleinit": ====== echo "Shutting down isdn4linux..." /sbin/ifconfig ippp0 down /sbin/isdnctrl delif ippp0 /sbin/ifconfig ippp1 down /sbin/isdnctrl delif ippp1 /sbin/ifconfig isdn0 down /sbin/isdnctrl delif isdn0 # === Until here! ========================================================= ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esacHier 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". Die Geräte ippp0 und ippp1 werden nicht gleichzeitig eingesetzt. Falls die Verbindung über ippp0 nicht zustande kommt, klappt es vielleicht über ippp1.
Eine Anmerkung noch zu den letzten Zeilen: mit isdn0 wird ein Gerät definiert, welches einfachen Terminalbetrieb ohne PPP erlaubt. Man kann mit einem Terminalprogramm wie minicom oder seyon via /dev/cui0 mit wenigen AT-Befehlen eine solche Verbindung aufbauen:
at&eyyyyy (yyyyy: eigene MSN bzw. EAZ) atdNummer für normale TerminalprogrammeJetzt kann man die Rechenleistung des Providers in Anspruch nehmen und z.B. ein "telnet" zu anderen Rechnern machen. Natürlich kann man sich hierzu auch ein Script basteln.
/etc/ppp/options (Optionen-Datei für den ipppd) user <Login-Name> # eigener User-Name beim Provider ipcp-accept-local # Akzeptiere Vorgabe der eigenen IP vom Provider ipcp-accept-remote # Akzeptiere Vorgabe der IP des Providers noipdefault # Wir setzen keine IP-Adresse voraus useifip # IP-Adresse vom Netzwerkinterface übernehmen -vjccomp # Abschalten der VJ-Kompression der Connection-ID -ac # Abschaltung der Adreß/Kontrollfeld-Kompression -pc # Abschalten der Protokollfeld-Kompression -bsdcomp # BSD-Kompression aus (ipppd kann das nicht!) -vj # Keine Komprimierung nach Van Jacobson - s.u.! mru 1024 # Maximum Receive Unit debug # ACHTUNG! Damit werden auch übermittelte Paßwörter # geloggt - entsprechende Dateien müssen unbedingt # mit "chmod 600 <datei>" geschützt werden! -detach # Prozeß soll nicht selbständig werdenAnmerkung 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.
/etc/resolv.conf: (siehe /etc/i4l.config-Datenbank!) domain <eigener.domain.name> nameserver <1st nameserver> nameserver <2nd nameserver> nameserver <3rd nameserver> /etc/hosts: # 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.) # Rest of the World IP.1.Provider name.des.1.provider prvdr0 # 1. Provider IP.2.Provider name.des.2.provider prvdr1 # 2. Provider 129.187.10.22 sun3.lrz-muenchen.de sun3 # (als Beispiel) 129.187.13.48 sunmailhost.lrz-muenchen.de sunmail # für email 129.187.13.3 mailhost.lrz-muenchen.de lrzmail # (s.u. 6.1.!) /etc/networks (muß nicht geändert werden) loopback 127.0.0.0 localnet 127.0.0.0 # oder eigenes Netz
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> -
/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> ""
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/isdn on und /sbin/isdn off.
/sbin/isdn #!/bin/sh # isdn: connects to / disconnects from provider # Author: Bernhard Hailer <Bernhard.Hailer@lrz.uni-muenchen.de> # Version: 3.0 (01-Sep-96) . /etc/i4l.config . /etc/i4l.param case $1 in on) declare -i con_apps # line already active? read con_apps </etc/lines.active let con_apps+=1 echo $con_apps >/etc/lines.active line="0" while [ $line!="finished" ] do if [ $con_apps -lt 2 ] then echo "Calling ippp$line" /sbin/isdnctrl dial ippp$line echo "Sleeping 8 sec for PPP handshaking..." sleep 8s /sbin/route add default ippp$line echo "Line open - checking..." else let con_apps-=1 echo "Line seems to be open already $con_apps time(s) - checking..." let con_apps+=1 fi set `ping -qc5 -i1 prvdr$line | grep transmitted` if [ $4 -gt 0 ]; then echo "8-) Line is ok - have fun!" line="finished" # paranoia setting break else /sbin/isdnctrl hangup ippp$line route del default read con_apps </etc/lines.active echo "0" >/etc/lines.active if [ $con_apps -gt 0 ] then echo ":-| Hmm, no. Trying to rebuild..." let con_apps=1 echo $con_apps >/etc/lines.active line="0" # paranoia setting continue else case $line in 0) if [ $PROV_NAME_2 = "" ] then echo ":-[ Sorry, Line is down. Bad luck... Try later!" line="finished" echo "0" >/etc/lines.active con_apps=1 break else echo ":-( Sorry, Line 0 is down. Trying second line." line="1" continue fi ;; 1) echo "0" >/etc/lines.active con_apps=1 echo ":-[ Sorry, Line 1 is also down. Bad luck... Try later!" line="finished" break ;; *) echo "=:-0 THIS CANNOT HAPPEN. Fatal Error in script /sbin/isdn!" break ;; esac fi fi done ;; off) declare -i con_apps read con_apps </etc/lines.active if [ $con_apps -gt 0 ] # line active, indeed? then let con_apps-=1 echo $con_apps >/etc/lines.active if [ $con_apps -eq 0 ] then echo "Last application stopped - closing line." /sbin/isdnctrl hangup ippp0 /sbin/isdnctrl hangup ippp1 /sbin/route del default # and delete route. else echo "There are $con_apps more applications running - keeping line." fi else echo "Hey boss, there had no line been active!" fi ;; *) echo -e "\aUsage:" echo "isdn on: opens line to the provider," echo "isdn off: closes line." ;; esacDieses 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/isdn root:# _Hinweise für eigene Experimente:
Test:
root:# isdn on Calling ippp0 Dialing of ippp0 triggered Sleeping 8 sec for PPP handshaking... Line open - checking... :-) Line is ok - have fun! root:# telnet sun3 [...](nun wie gewohnt einloggen; später zum Abschluß "exit" eingeben)
root:# isdn off Last application stopped - closing line. ippp0 hung up ippp1 not connected root:# _
Man sehe sich dazu das README von Fritz Elfert an.