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
;;
esac
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".
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 werden
Anmerkung 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."
;;
esac
Dieses 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.