Netenv 0.94 - Linux Laptop in verschiedenen Netzwerkumgebungen

## 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:

- Auswahl einer XF86Config

  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.

- Konfiguration des DNS

  Mit den netenv-Daten kann eine geeignete /etc/resolv.conf angelegt werden.

- Drucker Umgebung

  Mit einer Zuweisung für z.B. PRINTER kann der Defaultdrucker gesetzt werden.

- Netscape preferences editieren

  So können lästige Timeouts vermieden werden, wenn ohne Verbindung zu einem Netz gearbeitet wird und nur lokale Dateien betrachtet werden sollen.

- Fetchmail anpassen

  Wenn ich eine permanente Verbindung zu meinem Mailserver habe, nutze ich netenv, um fetchmail als Dämon aufzurufen. Die Mail wird dann zyklisch abgeholt.

- Linking /dev/pilot

  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.

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ß

- netenv in `/etc/rc.d/rc.sysinit` aufgerufen wird
- die Einbindung in die Konfiguration der Netzwerkkarte erfolgt.

`/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 bav@epost.de.

Zurück zur Inhaltsübersicht

Last modified: Tue Apr 1 20:55:15 CEST 2003