Nutzen Sie einen Linux Laptop in verschiedenen Netzwerkumgebungen ?

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:

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.


Inhaltsübersicht

Was macht netenv ?

Wo bekommt man netenv ?

Hinweise zur Installation

Grundlagen

Erstes Erstellen einer Umgebungsbeschreibung

Konfiguration

Beispiele

Bemerkungen zu DNS

Bemerkungen für SuSe 7.3 Benutzer

Alternativen zu netenv

Schlußwort


Wo bekommt man netenv ?

Netenv hat eine Webseite bei Sourceforge: http://netenv.sourceforge.net

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.

Zurück zur Inhaltsübersicht

Hinweise zur Installation

Hängt natürlich von der Distribution ab. Bei allen, die rpm-Pakete benutzen, als root z.B.:
rpm -i netenv-0.94-2.i386.rpm
In Debian z.B.:
dpkg -i netenv-0.92-2.i386.deb
Andernfalls:
tar xvf netenv-0.94-2.tar
Es wird damit ein Shellskript namens netenv, ein kleines Hilfsprogramm trpnc, Konfigurationsbeispiele sowie diese Doku installiert. Abhängig von der Distribution ist nun ein wenig Handarbeit nötig - oder eben auch nicht.

RedHat

Ich habe keine Kenntnis über aktuelle RedHat-Versionen. Wahrscheinlich sind die folgenden Hinweise völlig veraltet. Vielleicht finden sich im Abschnitt
Zur Verwendung des tar-files nützliche Hinweise.

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ß

/etc/rc.d/rc.sysinit sieht dann wie folgt aus:
lulu:/home/bav> tail -2 /etc/rc.d/rc.sysinit
# Added by package netenv on 06.03.2000 19:53:10
/usr/sbin/netenv
Ferner 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=yes
Die 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

SuSe

Mit Suse 8.x haben sich beim Systemanlauf und bei der Netzwerkkonfiguration eine Vielzahl von Änderungen ergeben. Die aktuelle Prozedur geht von Suse 8.1 aus, sollte jedoch auch mit 8.0 funktionieren. Für ältere Versionen siehe den nächsten Abschnitt.

SuSe 8.1

Das Postinstall-Script fügt zwei Zeilen zu /etc/init.d/boot.local hinzu:
lulu:/etc/init.d> tail -3 boot.local
#
# Added by package netenv on 06.12.2002 10:45:10
/usr/sbin/netenv
Damit 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-eth0
die Zeile
if [ -r /tmp/netenv ]; then . /tmp/netenv; fi
angehä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; fi
Die 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 übersteuert. In diesem Beispiel wird unterstellt, daß die verwendete NIC keine PCMCIA-Karte ist. Falls doch, muß aus
STARTMODE='onboot'
STARTMODE='hotplug'
werden.

SuSe 7.3

Das Postinstall-Script fügt zwei Zeilen zu /etc/rc.d/boot.local hinzu:
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/netenv
Fü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; fi
Falls 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

Debian

Das Debian-Paket netenv wird aktuell überarbeitet. Soweit mir bekannt, können PCMCIA-NIC's ohne weitere Konfiguration genutzt werden.

Onboard-NIC's allerdings erfordern eine geänderte /etc/network/interfaces. Man kann das mit netenv-Mitteln machen, siehe das Beispielskript netenv_setup_debian_example. Tut man nichts, wird die NIC immer so wie bei der Systeminstallation konfiguriert - ganz gleich, was man in netenv ausgewählt hat.

Mandrake

Mandrake 9 User berichteten, daß der splash-screen abgeschaltet werden muß (disable vga=nnn in /etc/lilo.conf), da andernfalls keine Eingabe während des Systemanlaufs möglich ist. Ferner scheint das verwendete cdialog nicht stabil zu sein. Erst durch Einsatz eines SuSe-dialog konnte der Fehler behoben werden.

Zur Verwendung des tar-Files

Folgende Schritte sind zu tun:
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 config
Abhä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.

Zurück zur Inhaltsübersicht

Grundlagen

Die grundlegende Idee ist, daß der Laptopbenutzer während des Bootvorgangs eine Information darüber eingibt, wo er sich mit seinem Laptop gerade befindet. Dies geschieht vor dem Erreichen des run level 2, d.h. also bevor eine Netzwerkkarte konfiguriert wird.

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=lavie
Damit 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.

Diese Datei hat die Rechte 644, ist also von jedem Benutzer lesbar. Sie kann so für benutzerspezifische Konfiguration genutzt werden.

Zurück zur Inhaltsübersicht

Erstes Erstellen einer Umgebungsbeschreibung

Nach der Installation sollte der Benutzer root netenv aufrufen. Dazu:
netenv
Es erscheint eine Eingabemaske, die nur eine Wahlmöglichkeit bietet:
    new  Set_up_new_environment  
Es 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 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 restart
In 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 restart
Netenv führt dies bei entsprechender Bestätigung aus.

Zurück zur Inhaltsübersicht

Konfiguration

Netenv wird mit Beschreibungdateien konfiguriert. Diese liegen in /etc/netenv. Auf einem Laptop mit dem Namen "lulu" werden Dateien lulu, lulu-foo, lulu-bar usw. ausgewertet. Das Namensschema ist damit wie folgt:
/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=2
Leerzeichen führen hier (wie immer in der Shell) zu Problemen. Für eine erfolgreiche Konfiguration einer Netzwerkkarte sind mindestens Zuweisungen von
IPADDR
NETMASK
NETWORK
BROADCAST
erforderlich. Abhängig von der jeweiligen Situation kann auch
GATEWAY
DNS_1
notwendig sein. Man kann hier beliebige Variablendefinitionen einfügen - Hauptsache, alles bleibt syntaktisch korrekt. Eine Zuweisung in der Form
NETENV_SCRIPT=/etc/netenv/netenv_setup
nimmt 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.

Experten Modus

Wenn man in der netenv-dialog-box CANCEL wählt, kann man in eine shell verzweigen. Verläßt man diese, steht die Auswahlbox erneut zur Verfügung. Sicherheitshinweis: Das Verzeichnis /etc/netenv und darin liegende Dateien dürfen nur für den Benutzer root schreibbar sein. netenv prüft dies.

Zurück zur Inhaltsübersicht

Beispiele

Dies ist natürlich der bei weitem wichtigste Abschnitt dieser Doku ...

Diese Beispiele sind aufeinander aufbauend beschrieben. Also bitte hintereinander lesen !

StandAlone_Touchpad

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=3
Dies 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.

In_the_Office

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=900
Im 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

Laptop_at_home

Zu Hause nutze ich folgende Beschreibungsdatei. Da ich meistens hier arbeite, ist der Dateiname gleich dem Nodenamen meines Laptops und damit der Default. Es reicht also, im Netenv-Auswahlmenü einmal auszulösen:
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.

At_Customer_Foobar

Frühere Versionen der libc boten einem nicht privilegierten Benutzer die Möglichkeit, durch Setzen der Umgebungsvariablen HOSTALIASES quasi eine private /etc/hosts anzulegen. Aus Sicherheitsgründen steht dieser Weg in aktuellen Distributionen nicht mehr zur Verfügung.

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
fi
Die /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_LISTE
Anschließ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

Zurück zur Inhaltsübersicht

Bemerkungen zu DNS

Netenv nimmt keine DNS Konfiguration vor. Leider gibt es gerade hier etliche Unterschiede zwischen den Distributionen.

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.conf
Die 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

Zurück zur Inhaltsübersicht

Bemerkungen für SuSe 7.3 Benutzer

Wenn man eine Onboard-Ethernetschnittstelle hat (also gar keine PCMCIA-NIC nutzen muß), muß der normale Eintrag in /etc/rc.config übersteuert werden. Dies geschieht durch eine Zuweisung der Form
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_setup
Ferner 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.1
Ausgehend 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

Zurück zur Inhaltsübersicht

Alternativen zu netenv

Wie so oft in Linux gibt es Auswahl. Alternativen zu netenv sind im Linux on the Road - A Guide for Laptops and Mobile Devices von Werner Heuser beschrieben.

Die, 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.

Zurück zur Inhaltsübersicht

Schlußwort

Ich hoffe, netenv wird Ihnen nützlich sein. Bei Fragen und Kommentaren senden Sie eine Mail an gerd.bavendiek@gmx.net.

Zurück zur Inhaltsübersicht


Gerd Bavendiek
Last modified: Mon Feb 28 21:59:34 CET 2005