Zur Inhaltsübersicht
Zu Hause ? Im Büro ? Bei einem Kunden ?
Falls ja, kann das kleine Paket netenv nützlich für Sie sein. Beim Booten des Laptops können Sie die aktuelle Netzwerkumgebung mit Hilfe eines einfachen Menüs auswählen. Sind Sie zum ersten Mal in einer Umgebung, so können Sie einige Grunddaten zur späteren Verwendung eingeben.
Netenv erstellt eine Datei mit einigen Variablen, die die aktuelle Netzwerkumgebung beschreiben. Diese Datei wird dann beim PCMCIA-Start benutzt (so z.B. in Debian, RedHat und SuSe). Der Mechanismus kann auch für Laptops genutzt werden, die eine Netzwerkkarte (oft NIC genannt) onboard haben.
So sieht die Auswahlbox von netenv aus:
Neben der Grundfunktionalität der Konfiguration der NIC kann netenv für weitere Aufgaben genutzt werden:
Nützlich z.B. dann, wenn man das Laptop mal standalone mit dem Touchpad und mal mit einem CRT Monitor und externer Maus nutzen möchte.
Mit den netenv-Daten kann eine geeignete /etc/resolv.conf angelegt werden.
Mit einer Zuweisung für z.B. PRINTER kann der Defaultdrucker gesetzt werden.
So können lästige Timeouts vermieden werden, wenn ohne Verbindung zu einem Netz gearbeitet wird und nur lokale Dateien betrachtet werden sollen.
Wenn ich eine permanente Verbindung zu meinem Mailserver habe, nutze ich netenv, um fetchmail als Dämon aufzurufen. Die Mail wird dann zyklisch abgeholt.
Wenn Sie einen Palm nutzen, können Sie /dev/pilot auf das korrekte serielle Device linken wenn ein Cradle angeschlossen ist. Andernfalls zeigt der Link auf den IRDA-Port.
Netenv gibt es als Paket für Debian und RedHat Linux. Mandrake- und SuSe-Benutzer können das RedHat-Paket benutzen. Selbstverständlich ist auch ein tar-File verfügbar. Für das Menüsystem benötigt netenv dialog(1) bzw. gdialog (in den genannten Distributionen immer enthalten).
Ein Wort an alle Experten: Ich versuche hier, die Dinge mit Blick auf Nicht-Experten zu erklären - also bitte Geduld.
Erstes Erstellen einer Umgebungsbeschreibung
Bemerkungen für SuSe 7.3 Benutzer
Bemerkungen für Debian-Benutzer
Aber das wissen Sie wohl schon ...
Dort ist sowohl das tar-File als auch das RedHat-Paket verfügbar. Letzteres sollte auch für Mandrake und Suse benutzbar sein.
Debian-User
Netenv gibt es schon recht lange als Debian-Paket. Näheres siehe unter http://www.debian.org/distrib/packages.
rpm -i netenv-0.94-2.i386.rpmIn Debian z.B.:
dpkg -i netenv-0.92-2.i386.deboder einfach apt-get install netenv
Andernfalls:
tar xvf netenv-0.94-2.tarEs wird damit ein Shellskript namens netenv, ein kleines Hilfsprogramm trpnc, Konfigurationsbeispiele sowie diese Doku installiert. Außerdem wird ein init-Skript erstellt, das netenv beim Booten aufruft. Abhängig von der Distribution ist nun ein wenig Handarbeit nötig - oder eben auch nicht.
Das netenv-RPM wurde unter RedHat 6.1 gepackt. Damit kann es in allen Distributionen, die RPM nutzen, installiert werden.
Das Postinstall-Script sorgt dafür, daß
lulu:/home/bav> tail -2 /etc/rc.d/rc.sysinit # Added by package netenv on 06.03.2000 19:53:10 /usr/sbin/netenvFerner wird /etc/sysconfig/network-scripts/ifcfg-eth0 geändert. Direkt nach der Erstinstallation von Redhat sieht diese Datei z.B. so aus:
lulu:/etc/sysconfig/network-scripts>>> cat ifcfg-eth0 DEVICE=eth0 BROADCAST=192.168.200.255 IPADDR=192.168.200.201 NETMASK=255.255.255.0 NETWORK=192.168.200.0 ONBOOT=yesDie Installation von netenv fügt zwei Zeilen hinzu:
lulu:/etc/sysconfig/network-scripts>>> tail -3 ifcfg-eth0 ONBOOT=yes # Added by package netenv on 06.03.2000 19:53:10 if [ -r /tmp/netenv ]; then . /tmp/netenv; fi
lulu:/etc/init.d> tail -3 boot.local # # Added by package netenv on 06.12.2002 10:45:10 /usr/sbin/netenvDamit wird dafür gesorgt, daß netenv beim Systemanlauf überhaupt aufgerufen wird. Netenv nimmt als zu konfigurierende NIC eth0 an. Daher wird an die Datei
/etc/sysconfig/network/ifcfg-eth0die Zeile
if [ -r /tmp/netenv ]; then . /tmp/netenv; fiangehängt. Das ganze sieht dann wie folgt aus:
lulu:/etc/sysconfig/network> cat ifcfg-eth0 FIREWALL="YES" BOOTPROTO='static' BROADCAST='nn.nn.nn.nn' IPADDR='nn.nn.nn.nn' NETMASK='nn.nn.nn.nn' NETWORK='nn.nn.nn.nn' REMOTE_IPADDR='' STARTMODE='onboot' UNIQUE='oxTw.yHaVEFCrUXE' WIRELESS='no' if [ -r /tmp/netenv ]; then . /tmp/netenv; fiDie Einträge IPADDR, NETMASK usw. rühren von der Grundinstallation her und brauchen nicht gelöscht werden. Sie werden durch die Zuweisungen in /tmp/netenv[1] übersteuert. In diesem Beispiel wird unterstellt, daß die verwendete NIC keine PCMCIA-Karte ist. Falls doch, muß aus
STARTMODE='onboot'
STARTMODE='hotplug'werden.
mweb@guru:/etc/rc.d > tail -3 boot.local # before we're going to the first run level. # # Added by package netenv on 06.02.2001 20:28:10 /usr/sbin/netenvFür PCMCIA-Karten wird ein Eintrag in /etc/pcmcia/network.opts vorgenommen:
mweb@guru:/etc/pcmcia > tail -2 network.opts esac # Added by package netenv on 06.02.2001 20:28:10 if [ -r /tmp/netenv ]; then . /tmp/netenv; fiFalls das Laptop eine eingebaute Netzwerkkarte hat und so auf PCMCIA verzichtet werden kann, können die mit YAST eingetragenen Parameter wie folgt übersteuert werden (manuell eintragen !):
mweb@guru:/etc/rc.d > head -16 network #! /bin/sh # Copyright (c) 1996 SuSE GmbH Nuernberg, Germany. All rights reserved. # # Author: Florian La Roche, 1996 # Werner Fink , 1996 # Burchard Steinbild , 1996 # Rolf Haberrecker , 1998 # Werner Fink (based on a patch of Andries Brouwer) 1999 # # /sbin/init.d/network # . /etc/rc.status . /etc/rc.config if [ -r /tmp/netenv ] ; then . /tmp/netenv; fi
tar zxvf netenv-0.94-2.tar.gz cd netenv-0.94-2 make make install # ab hier muß das als user root geschehen ! make configAbhängig von der Distribution muß der letzte Schritt zur Einbindung von netenv make config evtl. manuell vorgenommen werden.
netenv muß vor dem normalen Netzwerk- oder PCMCIA-Start aufgerufen werden. Suchen Sie nach /etc/init.d/boot.local oder einem äquivalent. Für weitere Details siehe den SuSE 8.1 Abschnitt.
Nachdem so sichergestellt ist, daß netenv beim Systemanlauf aufgerufen wird, müssen die Konfigurationsdaten von den Netzwerk scripts gelesen werden. Aktuelle Distributionen nutzen ifup um eine vorkonfigurierte Netzwerk-Karte zu starten. Dann siehe den SuSE 8.1 Abschnitt für weitere Details.
Eine häufige Fehlerquelle besteht in der Verwechslung von eth0 und eth1 wenn es eine onboard NIC und eine PCMCIA NIC. Oft ist eth0 onboard und eth1 PCMCIA NIC. Man kann das mit dmesg | grep eth und lspci überprüfen.
Netenv prüft ob eine eth1 vorhanden ist. Dies ist allerdings unzulänglich, da der Laptop zum Zeitpunkt der Installation vielleicht gerade in einer anderen Konfiguration betrieben wurde.
Dazu wird dialog(1) benutzt, ein einfaches und den meisten Benutzern vertrautes Menüsystem. Der Bootvorgang wird solange angehalten, bis der Benutzer seine Wahl getroffen hat. Für eine voreingestellte Umgebung reicht es, einmal CR zu drücken.
Wenn man "lilo" als Bootmanager benutzt, kann man alternativ auch z.B. eingeben:
linux NETENV=lavieDamit wird eine Shellvariable "NETENV" mit dem Wert "lavie" definiert. In meinem Fall heißt das: Ich bin mit meinem Laptop namens lulu im Büro. Die Datei mit den Zuweisungen für IP-Addresse usw. hat den Namen /etc/netenv/lulu-lavie. Der Linuxkern startet den init-Prozess mit der Variablen NETENV als Teil seiner Umgebung. Das gleiche tut dann init mit den sog. rc-Skripten.
Das netenv-Skript prüft, ob NETENV gesetzt ist. Falls ja, wird der Hochlauf fortgesetzt, ohne daß das Auswahlmenü erscheint.
Wenn die aktuelle Umgebung bestimmt ist, kopiert netenv die zugehörige Beschreibungsdatei nach /tmp/netenv[1].
Diese Datei hat die Rechte 644, ist also von jedem Benutzer lesbar. Sie kann so für benutzerspezifische Konfiguration genutzt werden.
netenvEs erscheint eine Eingabemaske, die nur eine Wahlmöglichkeit bietet:
new Set_up_new_environmentEs werden dann nacheinander abgefragt:
Enter the current IP-Address or the keyword dhcp ... Enter the netmask of the current subnet ... Enter the IP-Address of the current network ... Enter the Broadcast-Address of the current network ... Enter the Gateway-Address of the current network ... Enter the IP-address of the current nameserver ...Falls man sich in einem Netzwerk mit DHCP-Server befindet, gibt man statt der IP-Addresse dhcp ein. Es wird dann eine /tmp/netenv[1] erstellt, die nur
BOOTPROTO='dhcp' STARTMODE='hotplug'enthält. Alle anderen Werte werden dann gemäß der DHCP-Konfiguration ermittelt. Falls die NIC onboard ist, sollte netenv
STARTMODE='onboot'gesetzt haben.
Bei statischer IP-Addresse wird nach Eingabe des Wertes für die folgenden Werte ein in vielen Fällen sinnvoller Vorschlag eingeblendet.
Es kommt dann die Frage, ob diese Konfiguration gesichert werden soll:
Do you want to save this configuration ?Für den Namen, den man hier angibt, bitte keine Leerzeichen verwenden !
netenv bietet abhängig von der Distribution an, das Netzwerk zu restarten und so die änderungen zu aktivieren.
Andernfalls kann man bei einer PCMCIA-NIC entweder die Karte entnehmen und wieder einführen oder als Benutzer root das PCMCIA-Skript ausführen:
/etc/init.d/pcmcia restartIn beiden Fällen sollte der cardmanager aus dem PCMCIA-Paket aktiv werden und die Schnittstelle konfiguriert werden.
Ein ping auf die angegebene Gateway-Addresse wird es zeigen !
Falls nicht: Leuchtet die Link-LED ? Prüfen Sie die Ausgabe von
ifconfig eth0
Das gerade beschriebene Vorgehen ist auch dann zu wählen, wenn bei laufendem Laptop zwischen zwei Netzwerkumgebungen gewechselt werden soll. Auch hier ist ein Reboot nicht nötig - wir nutzen ja Linux ...
Diejenigen, die statt PCMCIA eine Netzwerkkarte onboard nutzen, müssen ihr Netzwerk restarten.
In RedHat 7.0 oder SuSE dazu z.B..
/etc/init.d/network restartNetenv führt dies bei entsprechender Bestätigung aus.
/etc/netenv/<NODE-NAME>-<VALUE-OF-VARIABLE-NETENV>Die Datei, die den Hostnamen des Laptops hat, erscheint im Auswahlmenü immer ganz oben. Hier reicht also einmal auslösen, um den Bootvorgang fortzusetzen. In dieser Datei sollte also sinnvollerweise die Beschreibung der am häufigsten genutzten Netzwerkumgebung liegen.
Die Beschreibungsdateien enthalten Zuweisungen in Shell Syntax, z.B.
netenv_id=At_Home_LCD_WheelMouse_pcmcia ... IPADDR=123.456.78.9 ... NETSCAPE_PROXY_TYPE=2Leerzeichen führen hier (wie immer in der Shell) zu Problemen. Für eine erfolgreiche Konfiguration einer Netzwerkkarte sind mindestens Zuweisungen von
IPADDR NETMASK NETWORK BROADCASTerforderlich. Abhängig von der jeweiligen Situation kann auch
GATEWAY DNS_1notwendig sein. Man kann hier beliebige Variablendefinitionen einfügen - Hauptsache, alles bleibt syntaktisch korrekt. Eine Zuweisung in der Form
NETENV_SCRIPT=/etc/netenv/netenv_setupnimmt eine Sonderstellung ein. Wenn die hier angezogene Datei lesbar ist, wird netenv diese Datei nach der Auswahl der aktuellen Netzwerkumgebung ausführen (genauer: sourcen).
Achtung ! Dies gescheht in einem frühen Status des Bootvorgangs. Es ist noch kein Netzwerk aktiv ! NETENV_SCRIPT wird mit root-Rechten ausgeführt !
Mit Hilfe des hier angezogenen Skriptes kann man dann etliche sinnvolle Sachen machen. Dazu mehr bei den Beispielen.
Dies ist ein Sicherheitsrisiko! Jeder, der physikalisch Zugang zum Computer hat, erhält so eine Shell mit root-Rechten, ohne ein Passwort eingeben zu müssen!
Daher steht diese Funktion in Debian nicht zur Verfügung, es sei denn, Sie setzen in netenv.conf die Variable ALLOW_EXPERT auf "YES" (siehe unten).
Diese Beispiele sind aufeinander aufbauend beschrieben. Also bitte hintereinander lesen !
lulu:/etc/netenv>>> cat lulu-touch-pad netenv_id=StandAlone_Touchpad_no_eth STARTMODE=manual export XF86CONFIG_FILE=/etc/X11/XF86Config-4-lcd-touch NETENV_SCRIPT=/etc/netenv/netenv_setup # This may be used to edit ~/.netscape/preferences.js NETSCAPE_PROXY_TYPE=3Dies nutze ich, wenn mein Laptop keine Verbindung zu einem Netz hat.
Der Wert der Variablen netenv_id (wie gesagt: Bitte ohne Leerzeichen) wird als Beschreibung im Auswahlmenü benutzt.
Es wird keine IP-Addresse zugewiesen. Durch das STARTMODE=manual wird beim Systemanlauf keine NIC konfiguriert. Ich setze NETENV_SCRIPT=/etc/netenv/netenv_setup. Dieses ist eine Datei mit Shell-Befehlen. Sie ist dieser Dokumentation hier beigefügt.
Das Beispiel ist einfach gehalten und kann so als Ausgangsbasis für eigene Anpassungen dienen. Hier relevanter Code ist:
lulu:/etc/netenv>>> cat netenv_setup ... # Simple way to configure the X-Server if [ -r $XF86CONFIG_FILE ]; then echo $XF86CONFIG_FILE will be used for configuring the X-Server ... mv /etc/X11/XF86Config /etc/X11/XF86Config.old ln -s $XF86CONFIG_FILE /etc/X11/XF86Config fi ...Da ich XF86CONFIG_FILE einen Wert zugewiesen habe, wird ein Link angelegt. Diesmal von der Beschreibungsdatei, die ich für mein LCD mit Touchpad erstellt habe.
Typischerweise führe ich mit netenv_setup alle die Aktionen aus, für die der User root nötig ist und die das ganze Systeme betreffen. Einstellungen hingegen, die nur für meine Arbeitsumgebung wichtig sind, werden in meiner .xinitrc getroffen. Dazu ein Beispiel:
NETSCAPE_PROXY_TYPE nutze ich in meiner ganz privaten Konfiguration:
lulu:/home/bav> cat .xinitrc #!/bin/sh ... if [ -r /tmp/netenv ]; then . /tmp/netenv fi if [ -n "$NETSCAPE_PROXY_TYPE" ]; then ~/tools/edit-ns-preferences $NETSCAPE_PROXY_TYPE fi ...Das angezogene Skript edit-ns-preferences findet sich bei der netenv-Dokumentation. Ich vermeide so unnötige Network-Timeouts, wenn ich den Browser starte.
lulu:/etc/netenv>>> cat lulu-lavie # Networkenvironment: netask netenv_id="lavie_pcmcia_dhcp" export BOOTPROTO=dhcp export STARTMODE=hotplug export PRINTER=cc_hp NETSCAPE_PROXY_TYPE=2 FETCHMAIL_POLL_INTERVALL=900Im Büro bekomme ich meine Netzwerkkonfiguration von einem DHCP-Server. STARTMODE=hotplug ist gesetzt, weil mein Laptop keine onboard-NIC hat und daher die PCMCIA-NIC genutzt werden muß.
Mit PRINTER=cc_hp wird der Defaultdrucker auf den Drucker im Büro gesetzt. NETSCAPE_PROXY_TYPE=2 aktiviert die automatische Proxykonfiguration im Netscape.
Wenn ich im Büro arbeite, möchte ich, das zyklisch Email abgeholt wird. Dazu dient FETCHMAIL_POLL_INTERVALL. Folgende Zeilen in meiner ~/.xinitrc starten fetchmail als Dämon, der dann alle 15 min gemäß den Definitionen in meiner ~/.fetchmailrc arbeitet:
if [ -n "$FETCHMAIL_POLL_INTERVALL" ]; then fetchmail -d $FETCHMAIL_POLL_INTERVALL fi
lulu:/etc/netenv>>> cat lulu netenv_id=At_Home_Docking_LCD_WheelMouse_onboard_VPN IPADDR=nnn.nn.nnn.nnn NETMASK=nnn.nnn.nnn.nnn NETWORK=nnn.nn.nnn.nnn BROADCAST=nnn.nn.nnn.nnn GATEWAY=nnn.nn.nnn.nnn SEARCH=foo.bar.com DNS_1=nnn.nn.nn.nn DNS_2=nnn.nn.nn.nn FETCHMAIL_POLL_INTERVALL=900 # If the variable NETENV_SCRIPT points to an readable file, # it will be run when netenv is executed NETENV_SCRIPT=/etc/netenv/netenv_setup ICEWM_INCLUDE_FILE=home # This defines my CRT with 1024x768 and a wheelmouse XF86CONFIG_FILE=/etc/X11/XF86Config-4-lcd-wheel # This may be used to edit ~/.netscape/preferences.js NETSCAPE_PROXY_TYPE=2 # This may be used to edit ~/.opera/opera6.ini OPERA_PROXY_FILE=proxy-fsc.ini # NIC is in the docking unit - like it were onboard STARTMODE='onboot'Aus der netenv_setup ist hier folgender Abschnitt von Bedeutung:
lulu:/etc/netenv>>> cat netenv_setup ... PROFILE=$1 ... if [ "$PROFILE" = "default" ]; then print_action linking /dev/pilot rm -f /dev/pilot; ln -s /dev/ttyS0 /dev/pilot print_status print_action calling ptal-init start /usr/sbin/ptal-init start print_status else # When there is no docking station, start irattach appropiately and # link /dev/pilot to ircomm0. print_action running irattach /usr/sbin/irattach /dev/ttyS3 -s print_status print_status linking /dev/pilot rm -f /dev/pilot; ln -s /dev/ircomm0 /dev/pilot print_status fi ...netenv_setup wird mit dem Parameter PROFILE aufgerufen, der hier den Wert "default" hat (sonst immer Name der Beschreibungsdatei abzüglich Hostname).
Zu Hause habe ich einen Cradle für meinen Palm. Daher sorge ich dafür, daß /dev/pilot auf den entsprechenden seriellen Anschluß zeigt. Ferner muß die Software für meinen HP Officejet gestartet werden. In allen anderen Umgebungen kann ich den Palm nur über IRDA ansprechen. ptal braucht dann nicht gestartet werden.
Zu Hause befindet sich mein Laptop in einer Docking-Unit. Diese enthält eine NIC. Um diese zu verwenden, muß
STARTMODE='onboot'gesetzt werden.
Will man nun seine /etc/hosts nicht jedesmal manuell editieren, kann folgender Mechanismus helfen. Für mich ist er auch deshalb praktisch, wenn ich in unterschiedlichen Umgebungen Rechner mit gleichen Namen aber unterschiedlichen IP-Nummern antreffe.
Ich habe in meine /etc/hosts Marken wie folgt eingetragen:
lulu:/home/bav> cat /etc/hosts ... # netenv hosts begin # netenv hosts end ...In meiner aktuellen Beschreibungsdatei definiere ich eine Reihe von Rechnern mit den dazugehörigen IP-Addressen, die ich erreichen möchte:
NETENV_HOST_ENTRIES="192.168.10.11 abba:192.168.10.12 bebe:192.168.10.3 alfa-sw:\ 192.168.10.4 beta-sw:192.168.10.13 coca:192.168.10.14 cola"Folgendes Codefragment aus meiner /etc/netenv/netenv_setup sorgt nun dafür, daß nach Auswahl der Umgebung automatisch /etc/hosts editiert wird:
if [ -n "$NETENV_HOST_ENTRIES" ]; then if egrep '^# netenv hosts begin$' /etc/hosts > /dev/null 2>&1; then ( awk 'NR==1,/^# netenv hosts begin$/' /etc/hosts echo $NETENV_HOST_ENTRIES | awk -F'\:' '{ for ( j=1; j<=NF; j++ ) print $j }' awk '/^# netenv hosts end$/,/*/' /etc/hosts ) > /etc/hosts.netenv mv /etc/hosts.netenv /etc/hosts chmod 644 /etc/hosts echo netenv_setup: /etc/hosts was modified ... fi else if egrep '^# netenv hosts begin$' /etc/hosts > /dev/null 2>&1; then ( awk 'NR==1,/^# netenv hosts begin$/' /etc/hosts awk '/^# netenv hosts end$/,/*/' /etc/hosts ) > /etc/hosts.netenv mv /etc/hosts.netenv /etc/hosts chmod 644 /etc/hosts echo netenv_setup: /etc/hosts was cleaned up ... fi fiDie /etc/hosts stellt sich danach wie folgt dar:
... # netenv hosts begin 192.168.10.11 abba 192.168.10.12 bebe 192.168.10.3 alfa-sw 192.168.10.4 beta-sw 192.168.10.13 coca 192.168.10.14 cola # netenv hosts end ...Alle diese Rechner sind für mich vertrauenswürdig, daher nutze ich in meiner ~/.xinitrc diesen Mechanismus und sorge noch dafür, daß automatisch X-Displays von diesen Rechner akzeptiert werden:
XHOST_PLUS_LISTE=`awk '/^# netenv hosts begin$/,/^# netenv hosts end$/' /etc/hosts | awk '!/^#/ {print $2}'` xhost $XHOST_PLUS_LISTEAnschließend liefert xhost mir dann:
lulu:/home/bav> xhost access control enabled, only authorized clients can connect INET:cola INET:coca INET:beta-sw INET:alfa-sw INET:bebe INET:abba
Der Mechanismus, den David Hinds in seinem PCMCIA-Paket implementiert hatte, schien mir immer hinreichend (Skript network, Teil des pcmcia-package). Ein Ausschnitt macht deutlich, was dort geschieht:
# Update DNS stuff cp /etc/resolv.conf /etc/resolv.new echo "# $DEVICE begin" >> /etc/resolv.new test "$DOMAIN" && echo "domain $DOMAIN" >> /etc/resolv.new if [ "$DNSSRVS $DNS_1 $DNS_2 $DNS_3" != " " ] ; then for DNS in $DNSSRVS $DNS_1 $DNS_2 $DNS_3 ; do echo "nameserver $DNS" >> /etc/resolv.new done fi echo "# $DEVICE end" >> /etc/resolv.new mv /etc/resolv.new /etc/resolv.confDie Datei /etc/resolv.conf wird auf eine temporäre umkopiert. Wenn eine der Variablen DOMAIN, DNSSRVS, DNS_1, DNS_2 oder DNS_3 einen Wert haben, werden die entsprechenden Kommandos abgesetzt. Dieser neue Abschnitt beginnt mit z.B. # eth0 begin und endet mit z.B. # eth0 end. Dies wird beim Beenden des PCMCIA-Services benutzt, um diesen Abschnitt wieder zu entfernen. Danach wird die /etc/resolv.conf wieder im Originalzustand sein.
Um dies zu nutzen, ist es also hinreichend, z.B. DNS_1 zu setzen.
Wenn man das mit netenv machen möchte, kann z.B. folgender Code in /etc/netenv/netenv_setup eingefügt werden:
if [ ! -z "$DNS_1" ]; then ( echo "# resolv.conf autogenerated by netenv "`date` if [ ! -z "$DOMAIN" ]; then echo domain $DOMAIN; fi if [ ! -z "$SEARCH" ]; then echo search $SEARCH; fi echo nameserver $DNS_1 if [ ! -z "$DNS_2" ]; then echo nameserver $DNS_2; fi ) > /etc/resolv.conf chmod 644 /etc/resolv.conf echo netenv: /etc/resolv.conf was set up ... fi
IFCONFIG_0="172.25.64.130 broadcast 172.25.64.255 netmask 255.255.255.0 up"Wenn man hingegen DHCP verwenden möchte, muß der Eintrag
IFCONFIG_0="dhcpclient"lauten. Dies kann mit mit netenv wie folgt tun. Zunächst das zugehörige Profil:
elli:/etc/netenv> cat elli-ht # Networkenvironment: DHCP export USE_DHCP=yes NETENV_SCRIPT=/etc/netenv/netenv_setupFerner braucht man ein netenv_setup-Skript mit mindestens folgendem Inhalt:
elli:/etc/netenv> cat netenv_setup edit_rc_config() { if [ ! -r /etc/rc.config ]; then echo No /etc/rc.config, probably not a SuSE-System, giving up ... return 1 fi VARIABLE_TO_CHANGE=$1 shift echo ${VARIABLE_TO_CHANGE}'="'$*'"' > /tmp/.netenv.tmp.$$ LINE=`awk '/^'$VARIABLE_TO_CHANGE'=/ {LINE=NR} END {print LINE}' /etc/rc.config` awk -v LINE=$LINE 'NR/tmp/.rc.config.netenv cat /tmp/.netenv.tmp.$$ >> /tmp/.rc.config.netenv awk -v LINE=$LINE 'NR>LINE' /etc/rc.config >> /tmp/.rc.config.netenv cat /tmp/.rc.config.netenv > /etc/rc.config rm -f /tmp/.rc.config.netenv /tmp/.netenv.tmp.$$ echo netenv_setup: rc.config edited, Variable $VARIABLE_TO_CHANGE set to $* } if [ "$USE_DHCP" = yes ]; then edit_rc_config IFCONFIG_0 dhcpclient else edit_rc_config IFCONFIG_0 "$IPADDR broadcast $BROADCAST netmask $NETMASK up" fi
Für das statische Routing nutzt SuSe die Datei /etc/route.conf. Eine Default-Route sieht hier wie folgt aus:
default 172.246.2.1Ausgehend von dem Beispiel, in dem gezeigt wird, wie man mit netenv die /etc/hosts editiert, kann man hier entsprechend vorgehen. Als Beispiel:
if grep SuSE /etc/issue 1>/dev/null; then if [ ! -z "$GATEWAY" ]; then ( echo "# route.conf autogenerated by netenv "`date` echo default $GATEWAY 0.0.0.0 eth0 ) > /etc/route.conf echo netenv_setup: /etc/route.conf was modified ... fi fi
Zusätzliche Möglichkeiten mit Debian
netenv und der Offline-http-Proxy wwwoffle
Bei der Installation des Debian-Pakets versucht dieses, eine funktionierende Konfiguration einzurichten, die den aktuellen Netzwerkeinstellungen entspricht. Leider ist bei Debian die Netzwerkkonfiguration grundsätzlich anders gelöst als bei den übrigen Distributionen, und es gibt auch noch zwei Möglichkeiten dafür. Daher sind, je nachdem, entweder bei der Installation oder beim Einrichten weiterer Konfigurationen manuelle Eingriffe nötig.
Wenn es netenv nicht gelingt, die aktuelle Konfiguration auszulesen, dann wird es beim Booten nicht aufgerufen, und der Rechner verhält sich wie vor der Installation. Man muss dann wie im folgenden beschrieben eine funktionierende Konfiguration erzeugen und anschließend mit
update-rc.d netenv start 40 Sden nötigen Link auf das init-Skript erzeugen.
Die folgenden Absätze beschreiben, welche Benutzereingriffe erforderlich sind: Stehen die Netzwerkeinstellungen bisher in /etc/network/interfaces, so ist netenv zwar sofort funktionsfähig, aber die Einrichtung neuer Netzwerkkonfigurationen für die Auswahlliste ist etwas komplizierter. Diese Methode wird bei Debian mit eingebauten ("on-board") Netzwerkkarten und manchmal mit PCMCIA-Karten verwendet. Die zweite Methode, mit den Netzwerkeinstellungen in /etc/pcmcia/network.opts, kann dagegen nur mit PCMCIA-Karten angewandt werden.
Die Installationsroutine ermittelt, welche Methode verwendet wird, und erstellt eine passende Musterkonfiguration. Allerdings sind in beiden Fällen noch Nutzereingriffe notwendig! Werden in beiden Dateien oder in keiner Netzwerkinformationen gefunden, so wird keine Konfiguration erstellt und netenv beim Booten vorerst nicht aufgerufen.
Die Syntax von interfaces ist grundsätzlich anders als netenv es erwartet, es wird also nicht mit Variablenzuweisungen gearbeitet. Daher gibt es auch keine Möglichkeit, die Informationen aus dieser Datei einfach zu "überschreiben". Stattdessen wird netenv angewiesen, nach der Auswahl einer Netzwerkumgebung ein Skript auszuführen, in dem symbolische Links verändert werden. Das Ergebnis sieht zum Beispiel so aus:
ls -l /etc/network/interfaces* /etc/network/interfaces -> /etc/network/interfaces.work /etc/network/interfaces.home /etc/network/interfaces.work /etc/network/interfaces.offline /etc/network/interfaces.old -> /etc/network/interfaces.offline
Es werden also nicht die Dateien verändert, sondern nur der symbolische Link /etc/network/interfaces auf das jeweils passende Ziel umgeleitet. Auch die Datei /etc/resolv.conf muss genauso behandelt werden. Beachten Sie, dass man auch zum offline-Betrieb ein lo-Device in interfaces braucht.
Die Befehle, mit denen diese Links verändert werden, könnte man direkt in die Konfigurationsdatei für die jeweilige Netzwerkumgebung schreiben. Auf einem Rechner mit Namen lulu könnten sie /etc/netenv/lulu-home, /etc/netenv/lulu-office usw. heissen. Es ist allerdings vom Autor von netenv empfohlen, in diesen Dateien nur Variablenzuweisungen durchzuführen. Wenn speziell die Variable NETENV_SCRIPT definiert wird, dann wird dieses Skript automatisch ausgeführt und setzt die Links.
Eine Beispielkonfiguration auf Rechner lulu könnte demnach so aussehen: In /etc/netenv/ befinden sich folgende Dateien:
lulu lulu-customer lulu-offline setup-customer setup-offline lulu-work lulu-home netenv.conf setup-work setup-home(Beachten Sie, dass es immer eine Datei (oder einen symbolischen Link) mit dem Rechnernamen und ohne den Anhang -irgendwo geben muss. Ich verwende diese Datei normalerweise für meine default-Konfiguration.)
In lulu-work steht zum Beispiel:
netenv_id=Arbeit export NETENV_SCRIPT=/etc/netenv/setup-work # you can set any variable here. export it!
Die Variable netenv_id wird im Auswahldialog von netenv verwendet, das Skript setup-work wird ausgeführt (genauer gesagt gesourcet), sobald lulu-work eingelesen wurde. Es sieht folgendermaßen aus:
#!/bin/sh if [ -r /etc/network/interfaces.work ]; then mv /etc/network/interfaces /etc/network/interfaces.old ln -s /etc/network/interfaces.work /etc/network/interfaces fi if [ -r /etc/resolv.conf.work ]; then mv /etc/resolv.conf /etc/resolv.conf.old ln -s /etc/resolv.conf.work /etc/resolv.conf fi if [ -r /etc/exim/exim.conf.work ]; then mv /etc/exim/exim.conf /etc/exim/exim.conf.old ln -s /etc/exim/exim.conf.work /etc/exim/exim.conf fi
Wie man sieht, können auch andere Dateien bequem so angepasst werden. Wenn einmal eine Konfiguration erstellt ist - was ja normalerweise das Debian-Setup übernimmt - sollte es leicht sein, weitere hinzuzufügen.
Allerdings kann der Menüpunkt "new" im Auswahldialog von netenv nicht zur Erstellung einer neuen Konfiguration verwendet werden, denn dort werden nur Variablenzuweisungen in die Dateien im Verzeichnis /etc/netenv/ eingetragen! Stattdessen muss man dort Dateien erzeugen, die genauso aufgebaut sind wie oben beschrieben: $rechnername-$netzname definiert das NETENV_SCRIPT, dieses lenkt die symbolischen Links um. Das Debian-Setup erstellt übrigens diese Dateien unter den Namen $rechnername (Konfigurationsdatei) bzw. setup-default (NETENV_SCRIPT).
Es gibt noch weitere Möglichkeiten zur Konfiguration von netenv, wenn die Netzwerkeinstellungen in /etc/network/interfaces erwartet werden. Besonders sei auf den "mapping"-Mechanismus hingewiesen, der in der Manpage zu interfaces(5) beschrieben ist. Ein anderer Weg ist in der Datei netenv_setup_debian_example angedeutet.
IPADDR="123.456.789.12"
Dies ist genau die Methode, für die netenv ursprünglich eingerichtet wurde. Daher kann man in diesem Fall einfach über den Menüpunkt "new" (Set_up_new_environment) im Auswahldialog neue Netzwerkumgebungen einrichten.
Damit diese Variablen aber beim Starten der Netzwerkkarte überhaupt wirksam werden, müssen sie in /etc/pcmcia/network.opts zunächst eingelesen werden. Da diese Datei zum Paket pcmcia-cs gehört, darf netenv sie nicht einfach verändern. Wohl aber darf das der Benutzer (bzw. Administrator). Am einfachsten ist es, einfach die Zeile
. /var/tmp/netenv
ans Ende dieser Datei einzutragen[1] (Ja, mit dem führenden Punkt!). Etwas ausgefeilter wäre es, folgenden Patch anzuwenden (er ist in der Datei netenv-network.opts.patch enthalten):
--- etc/network.opts.orig Sat Nov 8 12:10:56 2003 +++ etc/network.opts Sat Nov 8 12:42:27 2003 @@ -21,6 +21,8 @@ PPPOE="n" # Use WHEREAMI (via the whereami package)? [y/n] WHEREAMI="n" + # Use NETENV (via the netenv package)? [y/n] + USE_NETENV="y" # Host's IP address, netmask, network address, broadcast address IPADDR="" NETMASK="255.255.255.0" @@ -55,5 +57,13 @@ # Card eject policy options NO_CHECK=n NO_FUSER=n + if [ $USE_NETENV = y ]; then + if [ -r /var/tmp/netenv ]; then + . /var/tmp/netenv + else + echo "/var/tmp/netenv unreadable. Perhaps you should set" + echo "USE_NETENV=n in /etc/pcmcia/network.opts" + fi + fi ;; esacDies ermöglicht zum einen, netenv einfach zu deaktivieren. Zum anderen wird das erste Zeilenpaar dort eingefügt, wo schon whereami, ein Programm mit ähnlicher Funktionalität wie netenv, konfiguriert wird - ein Außenstehender findet so leichter heraus, dass netenv verwendet wird, zum Beispiel bei Bugreports. Und drittens gibt es eine zusätzliche Überprüfung, ob die Datei vorhanden und lesbar ist, in der netenv die Informationen für diesen Rechnerstart speichert.
ALLOW_EXPERT=YESSie wurden gewarnt!
NETENV_RUN_INIT_SCRIPTS="chrony myinitscript". /etc/init.d/networking wird auf jeden Fall ausgeführt.
NETENV=irgendwo netenvzur in der Datei /etc/netenv/lulu-irgendwo angegebenen Konfiguration, während
NETENV=lulu netenvdie Konfiguration in /etc/netenv/lulu verwendet.
Wie oben beschrieben kann man netenv anweisen, bestimmte Dämonen über deren init-Skripte neu zu starten. Bei wwwoffle funktioniert dies leider nicht. wwwoffle merkt sich nämlich vor dem Anhalten des Dienstes den Status (online oder offline?) und stellt ihn nach dem Neustart wieder her. Dies ist unter bestimmten Bedingungen sinnvoll (z.B. wenn man das wwwoffle-Paket updated, während man online ist). Es führt aber dazu, dass man den Aufruf
/etc/init.d/wwwoffle restartnicht verwenden kann, wenn man gerade von einer offline- zu einer online-Konfiguration wechselt oder umgekehrt.
Daher gibt es für wwwoffle (und für andere Skripte mit ähnlichem Verhalten) eine weitere Variable, NETENV_START_STOP_SCRIPTS. In ihr aufgeführte Skripte werden nicht mit restart, sondern zunächst mit stop und dann mit start aufgerufen.
Im übrigen hält der Debian-Maintainer von netenv dieses Verhalten des wwwoffle-Pakets für einen Bug, siehe http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=224937.
Zurück zur InhaltsübersichtDie, die ich näher angeschaut habe, versuchen, die Netzwerkumgebung zu bestimmen, indem sie entsprechende arp requests versenden. SuSe liefert mit 8.x das System Configuration Profile Management scpm. Dies ist sicherlich mächtig, mir fehlt jedoch ein Benutzerinterface beim Booten.