Mein Libretto #1 TOP Inhalt

Mein neuer Libretto 50CT

Der Libretto CT50 in AktionNachdem mein erster Libretto verstorben war, habe ich mich möglichst schnell bei ebay nach einem "neuen" Gerät umgeschaut. Nach relativ kurzer Zeit wurde ich fündig und habe diesmal für 150€ einen Libretto 50CT mit PCMCIA-Floppy, Dockingstation und Parallel-CDROM-Laufwerk erstanden. Natürlich war klar, dass wieder eine Slackware laufen wird und dass ich die beiden neuen Komponenten einbinden werde. Der Libretto ist auf 100MHz hochgetaktet, was sich sehr schnell als Nachteil herausgestellt hat, denn bei der Kompilierung eines neuen Kernels schaltet sich das Gerät sehr schnell wegen Überhitzung ab. Nach einem Monat sehr unbefriedigender Ergebnisse habe ich diesen Libretto dann wieder bei ebay verkauft, da das System sehr instabil reagiert hat. Die Stromversorgung ist mit dem hochgetakteten Prozessor hoffnungslos überfordert und auch das RAM scheint mit der kürzeren Zykluszeit nicht zurecht zu kommen. Im Akkubetrieb stellte der Libretto regelmäßig schon nach kurzer Zeit den Betrieb mit einer Kernelpanic ein. Besonders wenn das X im Akkubetrieb lief bootete der Rechner einfach mittendrin neu. Da man so nicht arbeiten kann und ich ein solches Verhalten von meinem ersten Libretto nicht kannte, habe ich mir ein weiteres Gerät mit Originalausstattung beschafft und es funktioniert so stabil wie ich es gewohnt war. Soll sich ein Windows-User mit dem "performanten" Gerät herumschlagen. Ich habe von diesem ganzen Übertaktungsblödsinn noch nie viel gehalten. Was soll ich mit einer Maschine, die so viel Performance hat, dass sie schneller abstürzen kann als andere Geräte :-)
Die Paketauswahl habe ich ansonsten ähnlich dem ersten Libretto gestaltet. Wenn das Gerät über eine genügend große Platte (>3GB) verfügt, kann man auch gern eine Komplettinstallation der Slackware vornehmen.
Ich gebe hier die Installationsprozedur wieder, um anderen Libretto-Fans die Installation zu erleichtern.
Wer im Besitz eines PCMCIA-Floppy-Laufwerkes und eines Parallel-CDROMs ist, kann die Installation mit Bootdiskette (parportide-Kernel) und CDROM starten. Das ist jedoch nur etwas für Leute, mit sportlichem Ehrgeiz. Da aber eine Kompilierung des Kernels notwendig wird, da der Standard-Kernel das Floppy-Laufwerk nicht unterstützt, ist eine Installation in einem anderen Laptop oder über einen HD-Adapter in einem Desktop-PC zu empfehlen. Die letzte Änderung ist der Einbau einer 4GB Solid-State-Disk (SSD) als Ersatz für die Festplatte. Der Stromverbrauch wird dadurch erheblich gesenkt, sodass die Akkus länger halten. Außerdem ist das Gerät dadurch robuster, denn Originalplatten passen geradeso in das Gehäse und sind daher Stößen ungeschützt ausgesetzt.

TOP TOP Der Libretto Inhaltsverzeichnis

  1. Der Libretto
  2. Die Hardware
  3. Die Installation
  4. Der Systemstart
  5. Die Konfiguration
  6. Hilsscripte
  7. Software
  8. Solid-State-Disk
  9. Fazit
  10. Linkliste
  11. Hinweis

TOP TOP Die Hardware Der Libretto

Der MousepointDer Libretto von Toshiba ist ein handliches kleines Gerät mit den Abmessungen 208mmx114mmx32mm und einer Masse von unter 900g inclusive Akku. Man hat es also mit einem Gerät zu tun, dass nur wenig größer als eine Videocassette ist. Also kein riesiges flaches Ufo, sondern ein kompaktes, kleines Gerät, dass man wirklich fast überall hin mitnehmen kann. Mit der Tastatur kann man recht gut umgehen, wenn man nicht gerade Kartoffelsortierer ist und das Display ist zwar sehr klein, besticht jedoch durch seine Schärfe. Leider reicht die Helligkeit bei direkter Sonneneinstrahlung nicht aus, aber das ist wohl auch ein Kompromiss an den Stromverbrauch. Wirklich gewöhnungsbedürftig ist der absolut unergonomische Mousepoint. Da ich früher schon mit einem Toshiba T2100 zu tun hatte, waren mir die Mousestickspielereien schon bekannt. Aber mal ehrlich, so richtig gibt es neben einer richtigen Mouse keine sinnvolle Alternative. Touchpads spielen bei Feuchtigkeit verrückt, Trackballs verschmutzen schnell ..... usw.usf. Mit der richtigen Grifftechnik ist jedoch ein recht zielgenaues Arbeiten möglich. Ich bediene den Mousepoint mit dem Daumen und die Tasten auf der Rückseite des Displays mit dem 3.und 4.Finger. Dabei klemme ich das Display zwischen dem Zeigefinger und dem 3.Finger ein. Die Arbeiten mit dem Mousepoint ist sehr gewöhnungsbedürftig und ungenau, Linkshänder sind ganz angeschmiert. Die Akkulaufzeit ist ein weiteres Thema. Mit dem Standardakku (10,8V; 1200mAh) läuft der Libretto 1½ Stunden. Ich habe mir deshalb noch einen 2600mAh Akku zugelegt, um die Laufzeit zu verdoppeln. Vom Libretto gibt es unterschiedliche Modelle mit unterschiedlicher Ausstattung. Hier nun mein Libretto CT50.


TOP Der Libretto Die Installation Die Hardware

Der Libretto 50CT besitzt folgende Hardwareaustattung:

Zu beachten ist, dass der PCMCIA-Schacht mit einem 16Bit/5V-Slot ausgestattet ist. Als Controller ist der i82365sl als ISA-to-PCMCIA-Bridge verbaut. Damit wird der Kreis der möglichen PC-Cards sehr eng, denn alle modernen Cardbus-PCMCIA Karten können nicht verwendet werden. Es ist bei der Beschaffung also darauf zu achten, dass die PCMCIA-Karten 16Bit/5V Karten sind. Diese kann man äußerlich daran erkennen, dass sie über der PCMCIA-Buchse kein!!! goldenes Blech besitzen. Da der Libretto intern mit ISA/VLB-Bus läuft, ist auch keine hotplug-Unterstützung möglich. Der Wechsel der PCMCIA-Karten wird jedoch problemlos durch den PCMCIA-Cardcontroller gesteuert.

16Bit PCCard 32Bit Cardbus-Adapter
16Bit-PCMCIA-Karte
Über der PCMCIA-Buchse rechts befindet sich kein goldenes Blech.
32Bit-Cardbus-Adapter
Über der PCMCIA-Buchse rechts ist das goldene Blech deutlich erkennbar.

TOP Die Hardware Der Systemstart Die Installation

Ich habe für den Libretto wieder ein Slackware-LinuX in Version 9.1 vorgesehen. Die Slackware ist sehr schlank und schnell und damit für den Libretto geeignet. Die Kernelsourcen werden nicht abgeändert, wodurch Software unkompliziert kompiliert werden kann. Ich gebe hier eine kurze Installations- und Konfigurationsbeschreibung, um anderen Nutzern den Einstieg etwas leichter zu machen.
Abzüge der benötigten Software, die sich nicht auf den Slackware-CDs befindet, habe ich hier zum Download hinterlegt.
Ich habe das BIOS_Menü hier mit einem Formular nachempfunden, um die umfassenden Einstellungsmöglichkeiten ohne lange Textausführungen darzustellen. Zu einigen Menüpunkten erscheinen jeweils Untermenüs, die über den Link "OPTIONS" erreichbar sind.

Die Installation Start der Installation Hibernations-Modus Das Bios des Libretto 50CT

In das BIOS des Librettos gelangt man, indem man nach dem Einschalten oder Neustart des Gerätes die <ESC>-Taste ständig gedrückt hält. Es erscheint dann die Aufschrift "Check system. Then press [F1] key._"und nach betätigen der F1-Taste erscheint das BIOS-Menü.
Sollte der Libretto trotzdem booten, sollte man sofort ein <Strg><Alt><Entf> eingeben und danach die <ESC>-Taste gedrückt halten. Dass klappt auf alle Fälle. Im BIOS können wir nun die wichtigsten Hardware-Einstellungen ablesen und verändern. Entscheidende Einstellungen, die wir uns auf jeden Fall merken müssen sind:



 SYSTEMSETUPBIOS version = 6.60
MEMORY
Total=
Base=
Extended=
Shadow BIOS ROM =
DISPLAY
Display Adaptor=
LCD Display Colors=
Power on Display=
VGA Segment Address=
Text Mode Stretch=
HARD DISK
HDD Mode=
PASSWORD
I/O PORTS
Serial=
Infrared=
Parallel= OPTION
Sound= OPTION
OTHERS
Power up Mode= OPTION
CPU Cache= OPTION
System Auto Off=
Alarm Volume= OPTION
System Beep=
Panel Power On/Off=
Alarm Power On= OPTION
Pointing Devices=
Boot Priority=


^v<>: Select items Space,BkSp: Change values
ESC: Exit without saving Home: Set default values End: Save changes and Exit


Die Optionen im BIOS_Menü
  1. Optionen zum Menüpunkt Parallel
    OPTIONS
    Mode=
    DMA=
    Zurück zum BIOS-Menü
  2. Optionen zum Menüpunkt SOUND
    SOUND SYSTEM
    WSS I/O Address=
    SBPro I/O Address=
    Synthesizer I/O Adress=
    WSS & SBPro & MPU401 IRQ LEVEL
     =
    WSS(Play)DMA=
    SBPro DMA=
    Control I/O Adress=
    MPU401 (MIDI I/F)=
    Zurück zum BIOS-Menü
  3. Optionen zum Menüpunkt Power-up Mode
    OPTION
    Standby Time=

    Wenn im Power-up Menüpunkt der Modus "Hibernation" gewählt wurde, dann erscheint dieses Optionsfenster. Damit ist einstellbar, nach welcher Zeitspanne ohne Bedienung der Libretto sich schlafen legen soll. Dabei geht das Gerät zuerst in den Stand-by-Modus, wobei der RAM-Inhalt erhalten bleibt und das Gerät relativ schnell wieder erweckt werden kann.
    Der Menüpunkt "System Auto Off" legt die Zeitspanne fest, nach der der Libretto sich nach dem Stand-by komplett abschaltet. Wird das Gerät danach wieder erweckt, muss der RAM-Inhalt erst von der Festplatte zurückgeladen werden. Der Systemzustand wird komplett wieder hergestellt und das System arbeitet genau an der Stelle weiter, an der man vorher die Arbeit beendet hat. Probleme treten dabei jedoch mit einigen PCMCIA-Karten und der Systemuhr auf. Siehe dazu unter Konfiguration bei APM nach.

    Zurück zum BIOS-Menü
  4. Optionen zum Menüpunkt CPU-Cache
    OPTION
    Write Policy=
    Zurück zum BIOS-Menü
  5. Optionen zum Menüpunkt Alarm Volume
    OPTION
    Low Battery Alarm=
    Panel Close Alarm=

    Die BIOS-Einstellung "Alarm Volume" sollte man möglichst nicht komplett abstellen (Off), denn dann wird man beim Laden einer PCMCIA-Karte nicht mehr durch die Piepser über Erfolg oder Fehlschlag informiert.

    Zurück zum BIOS-Menü
  6. Optionen zum Menüpunkt Alarm Power On
    OPTIONS
    Alarm Time=
    Alarm Date Option=
    Zurück zum BIOS-Menü

Die Installation Das BIOS des Libretto Start der Installation Hibernations-Modus

Im Hibernations-Modus legt das BIOS des Librettos einen Abzug des gesamten Systemspeichers am Ende der Festplatte ab. Wenn man diesen Modus nutzen möchte, sollte man deshalb die letzten Zylinder der Platte mit einem Volumen von mindestens 34MByte ungenutzt lassen. Eine Formatierung oder eine spezielle Partition (ähnlich PHDISK) ist nicht notwendig. Wenn der Hibernations-Modus im BIOS aktiviert ist, überschreibt es dort angelegte Dateisysteme gnadenlos. Ein weiteres Problem entsteht, wenn man im Hibernationsmodus die Festplatte wechselt. Im abgelegten Speicherabbild befindet sich der alte Festplatten-Cache, der dann auf die neue Platte zurückgeschrieben wird und so ebenfalls die Dateisysteme zerstört. Wenn man also die Platte wechseln möchte, sollte man vorher zuindest einmal sync aufrufen oder besser noch das System komplett herunterfahren. Das sync Kommando kann natürlich auch in den apmd-Daemon eingebunden werden und wird dann automatisch ausgeführt.

Die Installation Der Hibernations-Modus Partitionierung der Festplatte Start der Installation

Der Installationsstart des Librettos ist die erste Hürde, die überwunden werden muss. Die Standardkernel unterstützen das PCMCIA-Floppy nicht und nach dem Kernelstart wird init nicht gefunden.
Die einfachste und effektivste Methode ist der Ausbau der Platte und das Einsetzen in einen anderen Laptop oder Desktop-PC (mit Adapter). Da der Kernel und die Module neu kompiliert werden müssen, macht es sowieso Sinn, ein leistungsstärkeres Gerät als den Libretto zu verwenden.
Damit kommen wir zur Standardinstallation der Slackware.

  1. PC/Laptop auf booten von CD einstellen
  2. Slackware-CD 1 einlegen und PC starten
  3. boot: Prompt abwarten und mit Enter bestätigen
  4. slackware: Prompt abwarten
  5. root eingeben und mit Enter bestätigen

So, das System ist bereit, die Festplatte muss nun partitioniert werden.

Die Installation Start der Installation Paketauswahl Partitionierung der Festplatte

Bei der Partitionierung der Festplatte ist der Hibernations-Modus bereits zu beachten. Dazu müssen wir dem BIOS die letzten 32MB der Festplatte zur Speicherung des RAM freilassen. Dazu kommt noch 1MB für den Videospeicher und etwas Platz für Systemdaten. Hier darf auf keinen Fall ein LinuX-Filesystem angelegt werden, da dieses durch das BIOS unweigerlich überschrieben wird und eine Neuinstallation nach sich zieht. So sieht die Ausgabe von fdisk für meine Festplatte nun aus:

root@libretto:/root> fdisk /dev/hda  
Disk /dev/hda: 3253 MB, 3253469184 bytes  
128 heads, 63 sectors/track, 788 cylinders  
Units = cylinders of 8064 * 512 = 4128768 bytes  
   
Device Boot Start End Blocks   Id System Hinweise
/dev/hda1 * 1 3 12064 + 83 Linux Das wird das Bootverzeichnis /boot
/dev/hda2   4 20 68544   82 Linux swap Der SWAP-Bereich 64MB (doppelter RAM)
/dev/hda3 * 21 505  1955520   83 Linux Das wird das Rootverzeichnis /
/dev/hda4   506 778 1100736   83 Linux Das wird das Home-Verzeichnis /home

Die restlichen 10 Zylinder (41MByte) bleiben für das BIOS übrig.

Die Installation Partitionierung der Festplatte PCMCIA-Floppy Installation Die Paketauswahl

Nach der Partitionierung der Platte kann die Installation starten. In der Slackware gibt es dazu das Kommando setup. Auf die Auswahl der Pakete möchte ich hier nicht weiter eingehen. Wichtig ist für das weitere Vorgehen die Installation der Pakete d (Development) und k (Kernelsourcen), der Rest bleibt im wesentlichen dem persönlichen Geschmack vorbehalten. Wer das X-Windows-System verwenden möchte, sollte einen kleinen und schnellen Window-Manager installieren. Gnome und KDE scheiden wegen der Performance aus. fvwm ist sehr gewöhnungsbedürftig in der XFce auf der Slackware 8.1 funktionierte einwandfrei, die neue Version in der Slackware 9.1 macht nur Scherereien. Ich verwende blackbox. Der ist schnell, man hat sich ruck-zuck eingearbeitet und er läuft stabil.

Die Installation Partitionierung der Festplatte Installation der Toshiba-Linux-Utilities PCMCIA-Floppy Installation

Gemeinsam mit der Installation des Floppy-Laufwerkes werden wir ein Update auf das PCMCIA-Paket Version 3.2.8 vornehmen. Dazu können hier die erforderlichen Pakete heruntergeladen werden. Das PCMCIA-Paket ist ein Original von Sourceforge, der floppy_cs-Patch wurde von mir speziell für den Kernel 2.4.22 angepasst. Dazu habe ich den Patch floppy_cs.2.02 entsprechend verändert.


Download

Diese beiden tar-Archive werden nach /usr/src/ kopiert und wie folgt entpackt:

  1. cd /usr/src
  2. tar -xzf pcmcia-cs-3.2.8.tar.gz
  3. tar -xzf floppy_cs-2.4.22.tar.gz
  4. cd floppy_cs.2.4.22
  5. ./INSTALL.floppy_cs-2.4.22

Das zuletzt gestartete Skript INSTALL.floppy_cs-2.4.22 nimmt automatisch das Patchen des Kernels vor und startet darauf hin die Neukompilierung des Kernels. Es erscheinen eine Reihe von Ausgaben auf der Konsole und als nächstes startet die Kernelkonfiguration. Ich gehe hier nur auf die Einbindung des Floppy-Treibers ein, es bleibt jedem natürlich selbst überlassen, weitere andere Optionen zu wählen. Wichtig ist natürlich, dass die PCMCIA-Unterstützung im Kernel nicht!!! abgeschaltet wird :-).
Im Konfigurationsmenü navigiert man mit den Cursortasten. Auswahlen werden durch <ENTER> bestätigt und Einträge mit <SPACE> geändert.
Jetzt wird die Kernelkonfiguration folgendermassen geändert.

  1. Wir befinden uns im Hauptmenü der Kernelkonfiguration.
    Mit Hilfe der Cursor-Tasten <AUF> und <AB> wird der Menüpunkt
    Block devices --->
    angewählt und mit <ENTER> bestätigt.
  2. Im nun erscheinenden Untermenü lautet der erste Eintrag
    <*> Normal floppy disk support
    Dieser wird wieder mit den Cursor-Tasten <AUF> und <AB> ausgewählt und dann mit der <SPACE>-Taste so abgeändert, dass der Eintrag so aussieht
    <M> Normal floppy disk support
    Damit erscheint darunter ein neuer Eintrag
    [  ] Support removeable floppy interface (PCMCIA) (NEW)
    der wieder mit Hilfe der Cursor-Tasten <AUF> und <AB> ausgewählt wird und mit der <SPACE>-Taste so abgeändert, dass der Eintrag so aussieht
    [*] Support removeable floppy interface (PCMCIA) (NEW)
  3. Nun kann dass Menü durch Anwahl von <EXIT> mit der Cursor-Taste <RECHTS> und Bestätigung mit <ENTER> wieder verlassen werden.
  4. Nun befinden wir uns wieder im übergeordneten Menü, dass wir auf die gleiche Weise verlassen.
  5. Jetzt sind wir wieder im Hauptmenü der Kernelkonfiguration und auch das können wir verlassen.
  6. Die abschliessende Frage
    [ Do you wish to save your new kernel configuration? ]
    bestätigen wir mit <Yes>, indem wir die <ENTER>-Taste drücken.
  7. Das Skript startet nun vollautomatisch die Kompilierung des Kernels und des PCMCIA-Paketes.
  8. Da das alles eine Weile dauern wird, ist jetzt Zeit für einen Kaffee :-)

Nach einer ganzen Weile (kann auf einem 300MHz Rechner 2 Stunden dauern) erscheinen ein paar Fragen zur Installation des PCMCIA-Paketes auf der Konsole, die wir noch beantworten müssen.
Linux kernel source directory [/usr/src/linux]: mit <ENTER> bestätigen.
Build "trusting" versions of card utilities (y/n) [n]: mit <ENTER> bestätigen.
Include 32-bit (Cardbus) card support (y/n) [y]: mit <ENTER> bestätigen, die Cardbus Unterstützung kann mit n <ENTER> abgeschaltet werden. Das macht jedoch nur Sinn, wenn die Platte nur im Libretto laufen soll. Damit das PCMCIA-System auch mit modernen Laptops zusammenarbeitet, lasse ich diese Option eingeschaltet.
Include PnP BIOS resource checking (y/n) [n]: mit <ENTER> bestätigen.
How would you like to set kernel-specific options?
  1 - Read from the currently running kernel
  2 - Read from the Linux source tree
Enter option (1-2) [1]:
mit 2 <ENTER> bestätigen.
Module install directory [/lib/modules/2.4.22]:_ mit <ENTER> bestätigen.
Dann müsste das Skript durchgelaufen sein und wenn bis hier alles gut gegangen ist, dann ist es fast geschafft.
Das Ziel ist nahe!
Im Verzeichnis /boot befindet sich nun der neue Kernel mit der Bezeichnung vmlinuz.floppy_cs. Da nun die notwendigen Module existieren, müsste das PCMCIA-Floppy auch mit den Standard-Kerneln zusammenarbeiten. Ein Versuch lohnt sich auf jeden Fall.
Also einfach mal testen, Rechner neu starten
shutdown -r now oder <CTRL><ALT><DEL>
und das Floppy mit Diskette in den PCMCIA-Schacht einschieben. Wenn zwei hohe Piepstöne zu hören sind, dürfte das Laufwerk auch zu mounten sein, also
mount /dev/fd0 /mnt
ls -al /mnt
Wenn das geklappt hat, ist es nicht notwendig, den neuen Kernel zu installieren, ansonsten müssen wir noch an den Bootmanager ran.
Dieser neue Kernel muss nun noch in den Bootmanager aufgenommen werden. Ich benutze lilo als Bootmanager und habe den Floppy-Kernel zuerst einmal an zweiter Stelle in das Bootmenü aufgenommen. Wenn der Kernel sich als stabil erweist, kann er dann als default-Kernel konfiguriert werden. Die Anpassung des Bootmanagers müssen Sie selbst vornehmen. Ich gebe hier meine angepasste Datei /etc/lilo.conf als Hilfestellung wieder.

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/hda
#compact        # faster, but won't work on all systems.
prompt          # Eintrag erzeugt einen Bootprompt zur Auswahl des neuen Kernels
timeout = 50
# Normal VGA console
vga = normal
# VESA framebuffer console @ 1024x768x64k
# vga=791
# VESA framebuffer console @ 1024x768x32k
# vga=790
# VESA framebuffer console @ 1024x768x256
# vga=773
# VESA framebuffer console @ 800x600x64k
# vga=788
# VESA framebuffer console @ 800x600x32k
# vga=787
# VESA framebuffer console @ 800x600x256
# vga=771
# VESA framebuffer console @ 640x480x64k
# vga=785
# VESA framebuffer console @ 640x480x32k
# vga=784
# VESA framebuffer console @ 640x480x256
# vga=769
# ramdisk = 0     # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /boot/vmlinuz
  root = /dev/hda3
  label = LinuX
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking

#Die folgenden vier Zeilen müssen in die Datei /etc/lilo.conf eingefügt werden.
#image = gibt den Namen und die Position des neuen Kernels an
#root = gibt die Festplattenpartition mit dem root-Filesystem an
#label = gibt einen beliebigen Bezeichner an, der im Bootmenü angezeigt wird

image = /boot/vmlinuz-floppy_cs
  root = /dev/hda3
  label = LinuXF_CS
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

Jetzt muss nur noch der Bootmanager neu geschrieben werden, also das Kommando
lilo
und lilo meldet zurück, welche Kernel verfügbar sind. Jetzt ist es Zeit für einen Neustart des Systems.
shutdown -r now oder <CTRL><ALT><DEL>
Bei erscheinen des Bootmenüs muss nun der neue Kernel (LinuXF_CS) ausgewählt werden. Sollte das System sauber hochfahren, so kann das PCMCIA-Floppy (mit Diskette) eingesteckt werden. Im Normalfall müssten zwei hohe Pieptöne hintereinander ertönen. Das bedeutet, das Floppy ist erkannt und das Modul fehlerfrei geladen.
Also versuchen wir gleich, das Laufwerk zu mounten:
mount /dev/fd0 /mnt
Sollte das Mounten ohne Fehler ablaufen, schauen wir ins directory:
ls -al /mnt
Es klappt?? Du kannst dich nun beruhigt zurücklehnen, es ist geschafft!!!. Generell empfiehlt sich für die Verwendung von Wechselmedien der komfortable Automounter.

Die Installation PCMCIA-Floppy Installation Das Parallel-CDROM-Laufwerk Installation der Toshiba-Linux-Utilities

Die Toshiba Utilities bieten die Möglichkeit, einige BIOS-Funktionen von der Konsole und dem X-Windows aus zu steuern. Dazu müssen wir zuerst die Sourcen toshutils-2.0.1.tar.gz downloaden und nach /usr/src kopieren. Dort verfahren wir dann wie folgt:
cd /usr/src
tar -xzf toshutils-2.0.1.tar.gz
cd toshutils-2.0.1
./configure
make depend
make all
make install
fertig.
Damit stehen uns die Tools fan, svpw, hotkey, tpasswd, alarm, tdocked, dispwitch, tbacklight, ownerstring, thotswap, wmtuxtime, tuxtime-conf zur Verfügung, die jedoch nicht alle vom Libretto unterstützt werden. Besonders wmtuxtime ist für X-Windows Anwender interessant, da eine Reihe von BIOS-Optionen in einem grafischen Menü eingestellt werden können.

Die Installation Toshiba-Linux-Utilities Das Parallel-IOMEGA-Zip-Laufwerk Das Parallel-CDROM-Laufwerk

Die Unterstützung für diese Laufwerke ist als Modul verfügbar. Das Laufwerk muss dabei an der parallelen Schnittstelle angeschlossen und eingeschaltet sein. Die notwendigen Module sind
modprobe parport
modprobe paride
modprobe epat
(Modul für das übertragene Protokoll, hängt vom Chip im Laufwerk ab)
modprobe pd
Mit dem Kommando
dmesg
kann kontrolliert werden, welche Geräte der Kernel zum mounten nun zur Verfügung stellt. So könnte nun das Gerät pcd0 als CDROM verfügbar sein, so dass es gemountet werden kann.
mount /dev/pcd0 /mnt
ls -al /mnt

Für das Einbinden und Entladen der Module habe ich ein Startscript geschrieben, das auch automatisch testen kann, welches Protokollmodul passend ist. Es ist natürlich auch möglich, eine Festplatte in das Laufwerksgehäuse einzubauen. Dann zeigt das Kommando dmesg die verfügbaren Partitionen z.B. pda1, pda2, pda3 der Festplatte an. Diese können dann wieder einzeln gemountet werden. Generell empfiehlt sich für die Verwendung von Wechselmedien der komfortable Automounter.

Die Installation Das Parallel-CDROM-Laufwerk Der USB-Kontroller Das Parallel-IOMEGA-Zip-Laufwerk

Eher durch Zufall kam ich in den Besitz eines Zip-Laufwerkes. Es handelt sich um ein externes ZIP100 Laufwerk für den Anschluss an die parallele Schnittstelle. Was lag also näher, als auch dieses Laufwerk einzubinden. Die notwendigen Module sind parport und ppa. Für das Modul ppa muss die SCSI Unterstützung im Kernel aktiviert sein und der ppa-Support als Modul eingetragen werden. Im Standardkernel sind diese Optionen bereits aktiviert, also bei selbst kompilierten Kerneln beachten. Natürlich habe ich auch dafür ein Startscript geschrieben. Dieses tut nichts weiter, als das Modul zu laden oder zu entladen. Wer solch ein Laufwerk öfter nutzt, kann das Modul auch in die Datei /etc/rc.d/rc.modules eintragen und permanent laden. Dazu muss nur die Zeile
modprobe ppa
eingetragen werden.

Die Installation Das Parallel-IOMEGA-Zip-Laufwerk Der USB-Controller Der Smartcard-Reader

Als Reader für SmartMedia-Karten ist mir der FS-B53 von RICOH in die Hände gefallen. Das Gerät macht keinerlei Schwierigkeiten. Sowie eine Karte eingeschoben wird, springt das pcmcia-System an und es wird eine ide-cs platte hdc erkannt. Alles was noch zu tun war, ist ein entsprechender Eintrag in den Automounter.

RICOH SmartMedia-Card-Reader

Die Installation Der Smartcard-Reader Der Systemstart Der USB-Controller

Im Systemchip des Libretto 50CT ist ein USB-Controller (usb-uhci) integriert, der sich auch initialisieren lässt. Interessant wäre jetzt natürlich, ob der USB-Port am Libretto auch zugäglich ist, evtl. über den Expansionsport an der Unterseite.

TOP Die Installation Die Konfiguration Der Systemstart

Zuerst möchte ich den Systemstart der Slackware kurz umreißen. Dadurch wird das Zusammenspiel und die Bedeuting der einzelnen Scripte deutlich.
Der Rechner startet, ähnlich wie bei anderen Betriebssystemen auch, durch den Aufruf eines Bootmanagers (lilo). Der Bootmanager startet den ausgewählten Kernel. Welche Kernel zur Auswahl stehen, wird in der Datei /etc/lilo.conf festgelegt(z.B. /boot/vmlinuz).
Die letzte Aktion des Kernels ist der Start des init-Prozesses. Dieser ist Urprozess mit der Prozessnummer PID=1. Alle anderen auf dem System gestarteten Prozesse sind damit Kindprozesse von init. Das kann man sehr schön mit dem Kommando pstree überprüfen. Mit diesem Kommando wird die Baumstruktur aller laufenden Prozesse, mit init als Wurzel, angezeigt. Init ruft also auch die Scripte zur Konfiguration des Systems auf.
Das Verhalten von init wird in der Datei /etc/inittab gesteuert. Dort sind die einzelnen Scripte für den Systemstart eingetragen. Jede einzelne Zeile der Datei /etc/inittab legt dabei eine Systemreaktion fest. Die Einträge in einer Zeile sind durch Doppelpunkte voneinander getrennt. Der erste Eintrag ist eine eindeutige Kennung (im Prinzip frei wählbar, 2-4 Zeichen, siehe man inittab). Danach folgt die Angabe der Runlevel, in denen die Aktion ausgelöst werden soll, gefolgt vom Namen der Aktion. Der letzte Eintrag ist der Verweis auf das Script, das ausgeführt werden soll. Diese Scripte befinden sich der Übersicht halber alle im Verzeichnis /etc/rc.d/ .
Ich benutze den Default-Runlevel 3, dh. Multiuserbetrieb ohne X-Window (grafische Oberfläche), da ich dieses selten benötige und bei Bedarf von Hand starte. Die Shellscripte sind alle Textdateien, die von Hand geändert werden können. Dazu sind nur ;-) Kenntnisse in der Shell-Programmierung notwendig. Die Shell ist ein Kommandointerpreter, vergleichbar mit der COMMAND.COM unter DOS/Windows. Der Funktionsumfang ist jedoch beträchtlich größer und man hat in LinuX verschiedene Shells zur Auswahl ( sh, bash, tsh, zsh ....) Eine recht gute on-board Hilfe findet man unter LinuX immer in den man-Pages, die durch das Kommando man Kommandoname aufgerufen werden können. Eine kurze Übersicht zu den Shell-Kommandos erhält man also durch den Aufruf man sh oder man bash. Um tiefer in die Materie einzudringen kommt man um ein gutes Buch wohl nicht herum.
Fehlerhafte Einträge in der Datei /etc/inittab können fatale Fehler zur Folge haben, da das System dann gar nicht oder falsch gestartet wird. Also besser vor dem Neustert alles genau kontrollieren und Rettungs-CD bereitlegen!
Hier nun ein Auszug aus der Datei /etc/inittab mit kurzen Erläuterungen zur Bedeutung der einzelnen Zeilen.

Es befinden sich noch weitere Zeilen in dieser Datei, mit denen z.B. Modemzugänge oder serielle Terminals eingerichtet werden können oder Reaktionen auf die Signale einer USV festgelegt werden und und und.
Der init-Daemon wird also beim Systemboot die Scripte /etc/rc.d/rc.S und /etc/rc.d/rc.M ausführen, und die Konsolen einrichten und der User erhält eine Login-Meldung, mit der Aufforderung, seinen Benutzernamen und das Passwort einzugeben.
Das System ist bereit.
Das Script /etc/rc.d/rc.S übernimmt grundlegende Initialisierungsaufgaben, wie z.B.

Damit ist eine grundlegende Funktionalität des Systems gegeben. Mit dem Script /etc/rc.d/rc.M werden nun spezielle Komponenten aktiviert. Dabei werden meist weitere Scripte, vergleichbar mit Unterprogrammen, aufgerufen, die jeweils für bestimmte funktionale Einheiten verantwortlich sind (z.B. /etc/rc.d/rd.pcmcia zum starten des PCMCIA-Systems). Diese Vorgehensweise hat den Vorteil, dass das System sehr flexibel ist und auch ohne Neukompilierung verändert werden kann. Besonders interessant ist das gerade für die Fehlersuche und Konfiguration.

slackware Startstruktur
 
LILO   Bootmanager  
 
Kernel
init /etc/rc.d/rc.S fsck Dateisystemcheck
swapon SWAP-Partition aktivieren
mount Dateisysteme mounten (einbinden)
rm temporäre Dateien löschen
hwclock Systemuhr stellen
/etc/rc.d/rc.module Kernelmodule laden
/etc/rc.d/rc.serial serielle Schnittstellen initialisieren
 
/etc/rc.d/rc.M hostname Rechnername festlegen
/etc/rc.d/rc.pcmcia start PCMCIA starten
/etc/rc.inet2 Netzwerk und Server starten
syslog Systemlogger starten
/etc/rc.d/rc.lpd start Drucksystem starten
/etc/rc.d/rc.sendmail start Sendmail starten
/etc/rc.d/apmd APM starten
/etc/rc.d/sound start Sound starten
 
/sbin/agetty
Konsolenstart
login User-Login

In den verschiedenen Distributionen sind schon eine Vielzahl solcher Scripte integriert. Leider haben die Scripte der Slackware-Distributionen noch nicht durchgängig eine start/stop-Funktionalität. Damit wä es möglich jeden Systemdienst mit dem selben Script zu starten und zu stoppen. Das funktioniert einigermassen gut z.B. mit dem PCMCIA-System. Durch Eingabe folgender Kommandos kann die PCMCIA-Unterstützung des System ein und wieder ausgeschaltet werden.
/etc/rc.d/rc.pcmcia start PCMCIA einschalten
/etc/rc.d/rc.pcmcia stop PCMCIA ausschalten
Ein solches Verhalten hat für die Fehlersuche und Konfiguration wesentliche Vorteile. Es können natürlich noch mehr Parameter festgelegt werden, z.B. check, info, eject, resume usw.. Alle von mir geschriebenen Scripte besitzen diese Funktionen und geben bei fehlenden Parametern einen kurzen Hilfstext aus. Diese Scripte können über Links heruntergeladen werden.
Diese Veränderung des Scriptverhaltens erfordert natürlich auch eine Anpassung der aufrufenden Scripte /etc/rc.d/rc.S und /etc/rc.d/rc.M.

TOP Der Systemstart Hilfsscripte Die Konfiguration

Die Konfiguration Die Konfiguration Konfiguration APM Die Kernelmodule

/etc/rc.d/rc.module
In diesem Script werden alle Kernelmodule aufgerufen, die von grundlegender Bedeutung sind und die nicht durch andere Startscripte gestartet werden. Für den libretto bleibt da nicht viel übrig, da die meisten Module aus dieser Datei mit gutem Gewissen entfernt werden können. Deshalb habe ich die auf dem System vorgefertigte Datei durch die folgende abgelöst.

Inhalt der Datei rc.modules
#!/bin/sh
# rc.modules 3.1  Thu Aug 28 14:01:35 PDT 2003  pjv <volkerdi@slackware.com>
# /etc/rc.d/rc.modules
# F. Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 16.02.2005
# letzte Aenderung am 18.02.2005

### Update module dependencies ###
RELEASE=`uname -r`
if [ -x /usr/bin/find -a -e /lib/modules/$RELEASE/modules.dep \
     -a /lib/modules/$RELEASE/modules.dep -nt /etc/modules.conf ]; then
  NEWMODS="`/usr/bin/find /lib/modules/$RELEASE -type f -newer /lib/modules/$RELEASE/modules.dep`"
  if [ ! "" = "$NEWMODS" ]; then
    echo "Es wurden folgende neue Kernelmodule in /lib/modules/$RELEASE/ gefunden."
    echo "$NEWMODS"
    echo "Es wird ein Update der Abhaengigkeiten durchgefuehrt"
    /sbin/depmod -a
  else
    echo "Keine neuen Module gefunden."
  fi
else 
  echo "Es wird ein Update der Modulabhaengigkeiten durchgefuehrt"
  /sbin/depmod -A
fi

case $1 in
 start|'')
  #### APM support ###
  /sbin/modprobe apm
  #### PC parallel port support ###
  /sbin/modprobe parport_pc io=0x378 irq=7
 ;;
 stop)
  /sbin/rmmod parport_pc
  /sbin/rmmod apm
 ;;
 *)
  echo "Benutze /etc/rc.d/rc.module start|stop"
 ;;
esac
 
>>>Download rc.modules

Mit diesem Script wird im ersten Teil getestet, ob neue Module im System aufgetaucht sind, um ein depmod durchzuführen. Dann werden die Module apm und parport_pc für die Unterstützung der APM-BIOS-Funktionen und der parallelen Schnittstelle geladen (start) oder entladen (stop). Das ist schon alles.

Die Konfiguration Die Kernel-Module PCMCIA Die Systemuhren

Im System laufen zwei Uhren getrennt voneinander. Die eine Uhr ist die BIOS-Uhr, die durch die BIOS-Batterie versorgt wird und auch bei abgeschaltetem System weiterläuft, solange die Batterie noch Saft hat :-).
Die zweite Uhr ist die Systemuhr von Linux.
Das Problem besteht nun darin, beide Uhren synchron zu halten und wenn das nicht der Fall ist zu entscheiden, welche Uhr denn nun richtig läuft. In den Standardscripten der Slackware wird beim Hochfahren des Systems die Linux-Uhr mit den Angaben aus der BIOS-Uhr geladen ( in /etc/rc.d/rc.S mit hwclock), da sie in diesem Moment das einzig verfügbare Zeitnormal ist. Wird das System nun irgendwann wieder heruntergefahren, so wird die BIOS-Uhr mit dem Inhalt der Systemuhr nachgestellt (in /etc/rc.d/rc.0 ebenfalls mit hwclock). Das macht auch Sinn, denn die Systemuhr könnte zwischenzeitlich von Hand oder durch einen Zeitserver (ntp) auf eine exakte (Welt)Zeit eingestellt worden sein. Damit dieser Zustand bis zum nächsten Systemstart weiterhin erhalten bleibt, muss diese Information in die BIOS-Uhr geschrieben werden.
Nun haben wir im Libretto jedoch den Hibernations-Modus, bei dem sich das System über unbestimmte Zeit schlafen legt und die Systemuhr natührlich ebenfalls stoppt. Nach dem Erwachen wird der alte RAM-Inhalt wieder restauriert und die Systemuhr läuft natürlich mit einer völlig falschen Zeit weiter, die beim shutdown oder reboot auch noch in die BIOS-Uhr geschrieben wird.
Die Uhr zeigt also letztendlich völligen Unsinn an.
Um Abhilfe zu schaffen, habe ich ein spezielles Startscript zur Behandlung der Systemzeiten geschrieben.
Dieses Script übernimmt das stellen der BIOS und Systemuhr und die Synchronisation mit Zeitservern. Dieses Script sorgt nun in Zusammenarbeit mit dem apmd dafür, dass die Uhren auch nach dem Hibernations-Modus mit der richtigen Zeit laufen.

Inhalt der Datei rc.systemzeit
#!/bin/sh
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 14.02.2005
# letzte Aenderung am 18.02.2005

# welcher zeitserver soll genutzt werden?
# ntp|html|all|none
USE_TIMESERVER="all"
NTPSERVER1=""
NTPSERVER2=""
HTMLSERVER="http://www.schlaefendorf.de/datum.php4"

# funktionsdefinitionen
LOGGER="/usr/bin/logger -i -t systemzeit "

biossetsystem(){
 if [ -x /sbin/hwclock ]; then
  if grep "^UTC" /etc/hardwareclock 1> /dev/null 2> /dev/null ; then
   echo "Setze die Systemuhr mit der BIOS-Zeit (UTC)."
   $LOGGER " BIOS->System(UTC) "
   /sbin/hwclock --utc --hctosys --directisa
  else
   echo "Setze die Systemuhr mit der BIOS-Zeit (localtime)."
   $LOGGER " BIOS->System(localtime) "
   /sbin/hwclock --localtime --hctosys --directisa
  fi
 fi
}

systemsetbios(){
 if [ -x /sbin/hwclock ]; then
  if grep "^UTC" /etc/hardwareclock 1> /dev/null 2> /dev/null ; then
   echo "Sichere die Systemzeit in der BIOS-Uhr (UTC)."
   $LOGGER " System->BIOS(UTC) "
   /sbin/hwclock --utc --systohc --directisa
  else
   echo "Sichere die Systemzeit in der BIOS-Uhr (localtime)."
   $LOGGER " System->BIOS(localtime) "
   /sbin/hwclock --localtime --systohc --directisa
  fi
 fi
}

ntpsetsystem(){
 FEHLER=0
 case ${USE_TIMESERVER} in
  ntp|all)  
   NTPSERVER="${NTPSERVER1} ${NTPSERVER2}"
   if [ "${NTPSERVER}" != "" ]; then
    ntpdate -s ${NTPSERVER}
    FEHLER=$?
    if [ "$FEHLER" != "0" ]; then
     echo "Der Zeitabgleich ueber den NTP-Server $NTPSERVER ist fehlgeschlagen"
     $LOGGER " NTP->System "
    fi
   fi
  ;;
  *)
   echo "Die Systemzeit darf nicht ueber einen NTPSERVER aktualisiert werden"
   FEHLER=2
  ;;
 esac
 return $FEHLER
}

htmlsetsystem(){
 FEHLER=0
 case ${USE_TIMESERVER} in
  html|all)
   if [ -e /etc/HTTP-PROXY ]; then
    http_proxy=$( cat /etc/HTTP-PROXY )
    export http_proxy
   fi
   TIME=$( lynx -source ${HTMLSERVER} 2> /dev/null )
   if [ "$?" == "0" ]; then
    date -u ${TIME}
    $LOGGER " HTML->System "
    FEHLER=$?
   else
    echo "Der Kontakt zum HTTP-Zeitserver ${HTMLSERVER} war fehlerhaft"
    FEHLER=3
   fi
   date
  ;;
  *)
   echo "Die Systemzeit darf nicht ueber einen HTMLSERVER aktualisiert werden"
   FEHLER=2
  ;;
 esac
 return $FEHLER 
}

allsetsystem(){
 ntpsetsystem
 if [ "$?" != "0" ]; then
  htmlsetsystem
 fi
 if [ "$?" != "0" ]; then
  echo "Die aktuelle Zeit konnte nicht ermittelt werden"
 fi
}

settime(){
 if [ "$1" != "" ]; then
  date $1
  if [ "$?" != "0" ]; then
   echo "Die Zeitangabe $1 ist fehlerhaft!"
   echo "Um die Uhr auf 23.15 Uhr am 12.02.2005 einzustellen geben Sie bitte ein"
   echo "/etc/rc.d/rc.systemzeit set 021223152005"
  fi
 fi
}

case $1 in
 start) biossetsystem ;;
 stopp) systemsetbios ;;
 biossetsystem) biossetsystem ;;
 systemsetbios) systemsetbios ;;
 ntpsetsystem) ntpsetsystem ;;
 htmlsetsystem) htmlsetsystem ;;
 serversetsystem) allsetsystem ;;
 set) settime $2 ;;
 *)
  echo "Benutze start|stop|biossetsystem|systemsetbios|ntpsetsystem|htmlsetsystem|set"
 ;;
esac
 
>>>Download rc.systemzeit

Mit diesem Script führt der Rechner alle Funktionen des Zeitabgleiches durch. Dazu kann das Script mit verschiedenen Parametern aufgerufen werden.

Das Script wird in die Scripte rc.S, rc.0 und in das APMD-Proxy-Script eingebunden.

Die Konfiguration Die Kernel-Module PCMCIA Der gpm-Maus-Server

Der gpm-Maus-Server dient der Mausunterstützung sowohl auf der Konsole als auch im X-Windows. Im Startscript habe ich die Aktivierung des PS/2-Mousepoints und einer seriellen Maus an COM1 vorgesehen. Dazu kann das Script mit unterschiedlichen Parametern aufgerufen werden.

Der gpm-Server wird in allen Fällen mit der Option -R msc gestartet. Dadurch wird gpm veranlasst, ein Device /dev/gpmdata zu erzeugen, das die Schnittstelle zum X-Server darstellt. Durch die entsprechenden Einstellungen in der Konfiguration des X-Servers wird erreicht, dass dieser nicht direkt auf die Maus-Schnittstelle zugreift, sondern die Daten von gpm benutzt. Dadurch kann durch einen entsprechenden Aufruf des Scripts /etc/rc.d/rc.gpm die Maus während des Betriebs gewechselt werden.

Inhalt der Datei rc.gpm
#!/bin/sh
# Start des gpm Mouse-Servers
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 14.02.2005
# letzte Aenderung am 18.02.2005
#
# der gpm-server wird mit der option -R msc gestartet. dadurch erzeugt er ein 
# spezielles device /dev/gpmdata auf das der X-Server zugreifen kann.
# damit kann man waehrend des betriebes die maus wechseln, ohne den X-Server
# neu zu konfigurieren oder starten zu muessen
# in die Datei /etc/X11/XF86Config ist die Mausunterstuetzung durch
#Section "Pointer"
#    Protocol    "MouseSystems"
#    Device      "/dev/gpmdata"
# zu ersetzen.

kill_gpm(){
 if [ -e /var/run/gpm.pid ]; then
  /usr/sbin/gpm -k
  sleep 1
 fi
}

case $1 in
 start|ps2)
  echo "Starte gpm mit PS/2-Maus"
  kill_gpm
  /usr/sbin/gpm -R msc -m /dev/psaux -t ps2
 ;;
 serial)
  echo "Starte gpm mit serieller Maus an COM1"
  kill_gpm
  /usr/sbin/gpm -R msc -m /dev/ttyS0 -t bare
 ;;
 stop)
  echo "Stoppe gpm-Maus-Server"
  kill_gpm
 ;;
 *)
  echo "Benutze /etc/rc.d/rc.gpm start|ps2|serial|stop " 
 ;;
esac


 
>>>Download rc.gpm

Die Konfiguration Der gpm-Maus-Server Parallel-IDE-CDROM PCMCIA

Das Startscript /etc/rc.d/rc.pcmcia habe ich unverändert gelassen. Man könnte zwar die Erkennung des Controllers ausbauen, da der Libretto über den i82365sl verfügt, aber da ich die Platte gelegentlich in einen Laptop mit Cardbus/yenta_socket einbaue, habe ich alles so gelassen.

Inhalt der Datei rc.pcmcia
##!/bin/sh
#
# rc.pcmcia 1.23 1998/07/18 18:49:26 (David Hinds)
# Modified for Slackware Sun Aug 25 22:29:14 PDT 2002 (pjv)
#
# This is designed to work in BSD as well as SysV init setups.  See
# the HOWTO for customization instructions.

usage(){
 echo "Usage: $0 {start|stop|restart}"
}

cleanup(){
 while read SN CLASS MOD INST DEV EXTRA ; do
  if [ "$SN" != "Socket" ] ; then
   /etc/pcmcia/$CLASS stop $DEV 2> /dev/null
  fi
 done
}

# Allow environment variables to override all options
if [ "$PCMCIA" ] ; then readonly PCMCIA ; fi
if [ "$PCIC" ] ; then readonly PCIC ; fi
if [ "$CORE_OPTS" ] ; then readonly CORE_OPTS ; fi
if [ "$CARDMGR_OPTS" ] ; then readonly CARDMGR_OPTS ; fi
if [ "$SCHEME" ] ; then readonly SCHEME ; fi

# Source PCMCIA configuration, if available
if [ -f /etc/pcmcia.conf ] ; then
 . /etc/pcmcia.conf
elif [ -f /etc/sysconfig/pcmcia ] ; then
 . /etc/sysconfig/pcmcia
 if [ "$PCMCIA" != "yes" ] ; then exit 0 ; fi
else
 PCIC=i82365
 PCICOPTS=" wakeup=100 async_clock=1"
# PCICOPTS=" cs_irq=10 wakeup=100 async_clock=1"
 # Put pcmcia_core options here
 CORE_OPTS=" cis_speed=500 "
 # Put cardmgr options here
 CARDMGR_OPTS=
 # To set the PCMCIA scheme at startup...
 SCHEME=default
fi

EXITCODE=1
for x in "1" ; do
 if [ "$PCIC" = "" ] ; then
  echo "PCIC not defined in rc.pcmcia!"
  break
 fi
 if [ $# -lt 1 ] ; then usage ; break ; fi
 action=$1
 case "$action" in
  'start')
   echo "Starting PCMCIA services:"
   SC=/var/run/pcmcia-scheme
   if [ -L $SC -o ! -O $SC ] ; then rm -f $SC ; fi
   if [ ! -f $SC ] ; then umask 022 ; echo > $SC ; fi
   if [ "$SCHEME" ] ; then umask 022 ; echo $SCHEME > $SC ; fi
   fgrep -q pcmcia /proc/devices
   if [ $? -ne 0 ] ; then
    if [ -d "/lib/modules/`uname -r`/pcmcia" ]; then
     PC="/lib/modules/`uname -r`/pcmcia"
    elif [ -d "/lib/modules/`uname -r`/kernel/drivers/pcmcia" ]; then
     PC="/lib/modules/`uname -r`/kernel/drivers/pcmcia"
    fi
    if [ -d $PC ] ; then
     /sbin/modprobe pcmcia_core $CORE_OPTS 2> /dev/null
     if [ "$PCIC" = "probe" ]; then # attempt to load both
      echo "  <Probing for PCIC: edit /etc/rc.d/rc.pcmcia>"
      /sbin/modprobe i82365 wakeup=1 2> /dev/null
      if [ ! $? = 0 ]; then # try tcic 
       /sbin/modprobe tcic 2> /dev/null
      fi
      if [ ! $? = 0 ]; then # try yenta_socket
       /sbin/modprobe yenta_socket 2> /dev/null
      fi
     else # PCIC has been selected manually
      /sbin/modprobe $PCIC $PCICOPTS 2> /dev/null
     fi
     /sbin/modprobe ds 2> /dev/null
    else
     echo "No PCMCIA kernel modules for `uname -r` found."
     break
    fi
   fi
   if [ -s /var/run/cardmgr.pid ] && \
    kill -0 `cat /var/run/cardmgr.pid` 2>/dev/null ; then
    echo " cardmgr is already running."
   else
    if [ -r /var/run/stab ] ; then
     cat /var/run/stab | cleanup
    fi
    /sbin/cardmgr $CARDMGR_OPTS
   fi
   if [ -d /var/lock/subsys ] ; then
    touch /var/lock/subsys/pcmcia
   fi
  ;;
  'stop')
   if [ -r /var/run/cardmgr.pid ]; then
    echo -n "Shutting down PCMCIA services:"
    PID=`cat /var/run/cardmgr.pid`
    kill $PID
    echo -n " cardmgr"
    # Give cardmgr a few seconds to handle the signal
    kill -0 $PID 2>/dev/null && sleep 2 && \
    kill -0 $PID 2>/dev/null && sleep 2 && \
    kill -0 $PID 2>/dev/null && sleep 2 && \
    kill -0 $PID 2>/dev/null
    if fgrep -q "ds  " /proc/modules ; then
     echo -n " modules"
     /sbin/modprobe -r ds
     if [ "$PCIC" = "probe" ]; then
      if grep i82365 /proc/modules 1> /dev/null 2> /dev/null ; then
       /sbin/modprobe -r i82365
      elif grep yenta_socket /proc/modules 1> /dev/null 2> /dev/null ; then
       /sbin/modprobe -r yenta_socket
      elif grep tcic /proc/modules 1> /dev/null 2> /dev/null ; then
       /sbin/modprobe -r tcic
      fi
     else
      /sbin/modprobe -r $PCIC
     fi
     /sbin/modprobe -r pcmcia_core
    fi
    echo "."
    rm -f /var/lock/subsys/pcmcia
   fi
   EXITCODE=0
  ;;
  'restart')
   $0 stop
   $0 start
   EXITCODE=0
  ;;
  *)
   usage
  ;;
 esac
done

# Only exit if we're in our own subshell
if [ "${0##*/}" = "rc.pcmcia" ] ; then
 exit $EXITCODE
fi
 
>>>Download rc.pcmcia

Das Startscript startet letztendlich den cardmgr (PCMCIA Kartenmanager). Die Konfigurationsscripte liegen im Verzeichnis /etc/pcmcia.

Im Managerscript network habe ich eine Anpassung vorgenommen. Dieses testet im Original eine Reihe von Abhängigkeiten (z.B. pump und netboot) ab, die im Libretto nicht nötig sind. Die Konfiguration ist recht unübersichtlich und Ethernet und Wlan sind aus meiner Sicht ungünstig und unübersichtlich miteinander verquickt. Deshalb habe ich das Script so verändert, dass es nur noch als Verteiler auftritt und die eigentliche Arbeit zur Konfiguration der Netzwerkkarten an spezielle Scripte weitergibt. Dazu habe ich ein Script /etc/rc.d/rc.ethernet zur Steuerung der Ethernetkarten und ein Script /etc/rc.d/rc.wireless für die WLAN-Karten geschrieben. Das Managerscript network testet nun einfach an der MAC-Hardwarenummer, um was für eine Karte es sich handelt und startet das entsprechende Script. Dabei werden die Parameter ACTION=(start|stop|restart|resume|suspend|check usw) DEVICE=(eth0...) und SCHEME mit dem PCMCIA-Scheme-Name übergeben.

Inhalt der Datei network
#! /bin/sh
# /etc/pcmcia/network
#
# Version:0.1
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 04.02.2005
# letzte Aenderung 29.03.2005
#

if [ -f /var/lib/pcmcia/scheme ]; then
 SCHEME=`cat /var/lib/pcmcia/scheme`
elif [ -f /var/run/pcmcia-scheme ]; then
 SCHEME=`cat /var/run/pcmcia-scheme`
fi
if [ -z $SCHEME ]; then
 SCHEME=default
fi
ACTION=$1
DEVICE=$2
HWADDR=`/sbin/ifconfig $DEVICE | sed -ne 's/.*\(..:..:..:..:..:..\).*/\1/p'`
ADDRESS="$SCHEME,$SOCKET,$INSTANCE,$HWADDR"
logger $ADDRESS

case "$ADDRESS" in
 *,*,*,00:05:5D:25:47:1B)
  /etc/rc.d/rc.wireless $ACTION $DEVICE $SCHEME
 ;;
 *,*,*,*)
  /etc/rc.d/rc.ethernet $ACTION $DEVICE $SCHEME
  exit $?
 ;;
esac

exit 0
 
>>>Download network

Was sonst zu tun bleibt erledigen die entsprechenden Scripte.
Die entsprechende Konfiguration für die einzelnen PCMCIA-SCHEME werden in der Datei /etc/rc.d/PCMCIA_SCHEME vorgehalten. Die Startscripte greifen auf diese Datei zu und lesen die Einstellungen zum gerade aktuellen SCHEME aus. Es sind somit verschiedene SCHEME denkbar, z.B. für zu Hause oder bei verschiedenen Kunden.

Inhalt der Datei PCMCIA_SCHEME
#!/bin/sh
# scheme-file fuer PCMCIA
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 23.03.2005
# letzte Aenderung 09.04.2005
#

if [ "$SCHEME" == "" ]; then
 SCHEME=default
fi

default_scheme(){
 USE_DHCP=yes
 DHCP_HOSTNAME="libretto"
 IPADDR=192.168.0.9
 NETMASK=255.255.255.0
 BROADCAST=192.168.0.255
 GATEWAY=""
 SUCHE_PROXY="yes"
 SETZE_ZEIT="yes"
# ESSID="BenQ"
 ESSID="Any"
 MODE="Managed"
 NICKNAME="libretto"
 NWID=""
 FREQ=""
 SENS=1
 RATE=11M
 KEY="XXXX-XXXX-XX"
 RTS=500
 FRAG=off
 POWER=off
}

# laden des PCMCIA-SCHEME
case $SCHEME in
 default|0) default_scheme ;;
 *) default_scheme ;;
esac
 
>>>Download PCMCIA_SCHEME

Die Konfiguration Konfiguration PCMCIA PCMCIA-Wireless PCMCIA-Ethernet

Das Startscript für die PCMCIA-Ethernetkarten habe ich aus dem Managerscript /etc/pcmcia/network herausgelöst, um die Konfiguration transparenter zu machen und die Karte auch unabhängig vom Cardcontroller zu konfigurieren. Das Script erwartet als Parameter ACTION=(start|stop|restart|resume|suspend|check usw) DEVICE=(eth0...) und SCHEME den aktuellen PCMCIA-Scheme-Name.
Zuerst wird getestet, ob die Datei /etc/rc.d/PCMCIA_SCHEME existiert, aus der die notwendige Netzwerkeinstellungen für das aktuelle PCMCIA-Scheme entnommen werden kann. Sollte diese Datei nich existieren, so werden default-Einstellungen vorgenommen. Danach wird zwischen den verschiedenen Aktionen unterschieden und die Karte initialisiert oder abgeschaltet. Bei der Initialisierung kann zwischen dhcp oder einer festen IP gewählt werden. Sollte der dhcp-Kontakt fehlschlagen, wird in jedem Fall eine feste IP vergeben. Zum Schluss besteht noch die Möglichkeit das Proxy-Suchscript zu starten, um einen verfügbaren HTTP-Proxy suchen zu lassen. Die Aktionen resume und suspend sind mit start und stop identisch, da nicht alle 16-bit-Karten diese Funktionen sicher unterstützen. Der Vorteil besteht auch darin, dass nach einem erwecken des Libretto (aufklappen des Displays) das Netz neu gescannt wird und ein aktueller HTTP-Proxy eingetragen wird.

Inhalt der Datei rc.ethernet
#! /bin/sh
# /etc/rc.d/rc.ethernet
#
# Version:0.1
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 16.02.2005
# letzte Aenderung 09.04.2005


ACTION=$1
DEVICE=$2
SCHEME=$3

if [ "$SCHEME" == "" ]; then
 SCHEME=default
fi

if [ -e /etc/rc.d/PCMCIA_SCHEME ]; then
 . /etc/rc.d/PCMCIA_SCHEME
else
 # Editiere die Angaben
 DEVICE=eth0
 # feste (Notfall)IP Konfiguration
 IPADDR="192.168.0.9"  
 NETMASK="255.255.255.0"
 # soll die IP ueber DHCP bezogen werden? yes/no
 USE_DHCP=yes
 #DHCP_HOSTNAME=`/bin/hostname`
 GATEWAY=""
fi

dhcp_start(){
 /sbin/ifconfig $DEVICE down
 /sbin/dhcpcd -k $DEVICE 2>&1 > /dev/null
 sleep 2
 echo "Konfiguration von $DEVICE ueber DHCP..."
 # Add the -h option to the DHCP hostname:
 if [ ! "$DHCP_HOSTNAME" = "" ]; then
   DHCP_HOSTNAME="-h $DHCP_HOSTNAME"
 fi
 /sbin/dhcpcd -t 10 ${DHCP_HOSTNAME} -d $DEVICE
 if [ $? -ne 0 ]; then
  echo "Es ist kein DHCP-Server erreichbar, statische IP $IPADDR wird konfiguriert "
  staticip_start
  return $?
 else
  return 0
 fi
}

staticip_start(){
 # set up IP statically:
 # Determine broadcast and network addresses from the IP address and netmask:
 BROADCAST=`/bin/ipmask $NETMASK $IPADDR | cut -f 1 -d ' '`
 NETWORK=`/bin/ipmask $NETMASK $IPADDR | cut -f 2 -d ' '`
 # Set up the ethernet card:
 echo "Konfiguriere $DEVICE:"
 echo "ifconfig $DEVICE ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}"
 /sbin/ifconfig $DEVICE down 2>&1 > /dev/null
 /sbin/ifconfig $DEVICE ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
 # ist ein fehler aufgetreten
 if [ ! $? = 0 ]; then
  echo "$DEVICE wurde nicht konfiguriert."
  echo "Das kann folgende Ursachen haben:"
  echo "1. Der Kernel unterstützt die Netzwerkkarte nicht, oder die"
  echo "   Hardware der Karte wurde falsch konfiguriert."
  echo "2. Der Rechner besitzt keine Netzwerkkarte."
  echo "3. Die Netzwerkkarte ist defekt...."
  return 1
 else
  return 0
 fi
}


if [ -z "`ifconfig $DEVICE 2>&1 | grep 'Device not found'`" ]; then
 case $ACTION in
  "start")
   if [ "$USE_DHCP" = "yes" ]; then
    dhcp_start
   else
    staticip_start
   fi  
   if [ "$?" == "0" ]; then
    # Setze den gateway:
    if [ ! "$GATEWAY" == "127.0.0.1" -a ! "$GATEWAY" == "" ]; then
     /sbin/route add default gw ${GATEWAY} metric 1
    fi
    if [ "$SUCHE_PROXY" == "yes" ]; then
     /etc/rc.d/rc.proxy_suche $DEVICE
     if [ "$?" == "0" -a "$SETZE_ZEIT" == "yes" ]; then
      http_proxy=`cat /etc/HTTP-PROXY`
      export http_proxy
      /etc/rc.d/rc.systemzeit serversetsystem
     fi
    fi
   fi
  ;;
  "stop")
   /sbin/ifconfig $DEVICE down
   if [ "$USE_DHCP" = "yes" ]; then
    /sbin/dhcpcd -k $DEVICE 2>&1 > /dev/null
   fi
  ;;
  "restart")
   /etc/rc.d/rc.ethernet stop $DEVICE $SCHEME
   sleep 1
   /etc/rc.d/rc.ethernet start $DEVICE $SCHEME
  ;;
  "status"|"check")
   /sbin/ifconfig $DEVICE
  ;;
  "suspend")
   /etc/rc.d/rc.ethernet stop $DEVICE $SCHEME
  ;;
  "resume")
   /etc/rc.d/rc.ethernet start $DEVICE $SCHEME
  ;;
  *)
   echo "Benutze /etc/rc.ethernet start|stop|restart|status device"
  ;;
 esac
 exit 0
else
 echo " $DEVICE existiert nicht "
 exit 1
fi

# End of /etc/rc.d/rc.ethernet
 
>>>Download rc.ethernet

Die Konfiguration PCMCIA-Ethernet Parallel-IDE-CDROM PCMCIA-Wireless-LAN

Die Konfiguration der Wireless Karten bereitete mir einiges Kopfzerbrechen, da einige Adapter, die in einem Vergleichsgerät (16bit-Slot, aber PCI-to-PCMCIA Bridge yenta-socket) unter LinuX ohne Probleme liefen nicht zur Zusammenarbeit mit dem Libretto zu bewegen waren. Die Erlösung kam mit der DLINK DWL-660. Sie funktioniert problemlos und das System bleibt stabil. Die Karte hat außerdem den Vorteil, dass eine externe Antenne angeschlossen werden kann und man so größere Distanzen überbrücken kann. Das entsprechende Script /etc/rc.d/rc.wireless nimmt nun die Wireless-Konfiguration vor und gibt die Arbeit dann an das Ethernet-Script /etc/rc.d/rc.ethernet ab, um das Ethernet-Device der Karte zu konfigurieren. Die notwendigen Einstellungen werden wieder in der Datei /etc/rc.d/PCMCIA_SCHEME gesucht und in die Karte eingetragen. Sollte diese Datei nich gefunden werden, so werden default-Einstellungen vorgenommen.

Inhalt der Datei rc.wireless
#! /bin/sh
# /etc/rc.d/rc.wireless
#
# Version:0.1
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 04.03.2005
# letzte Aenderung 09.04.2005

ACTION=$1
DEVICE=$2
SCHEME=$3

FEHLER=0

if [ -e /etc/rc.d/PCMCIA_SCHEME ]; then
 . /etc/rc.d/PCMCIA_SCHEME
else
 ESSID="BenQ"
 MODE="Managed"
 NICKNAME="libretto"
 NWID=""
 FREQ=""
 SENS=1
 RATE=11M
 KEY="XXXX-XXXX-XX"
 RTS=500
 FRAG=off
 POWER=off
fi

iwconf(){
 case $MODE in
  Managed|Ad-hoc|Master|Repeater|Secondary|Monitor|Auto)
   iwconfig $1 mode $MODE
  ;;
  *)
   echo "Unbekannter Mode $MODE"
   FEHLER=1
   exit 1
  ;;
 esac
 if [ "$NICKNAME" != "" ]; then 
  iwconfig $1 nick "${NICKNAME}"
 fi
 if [ "$NWID" != "" ]; then
  iwconfig $1 nwid "${NWID}"
 fi
 case $FREQ in
  2.422G)
   iwconfig $1 freq $FREQ
  ;;
 esac
 if [ "$SENS" != "" ]; then
  iwconfig $1 sens $SENS
 fi
 case $RATE in
  11M)
   iwconfig $1 rate 11M
  ;;
 esac
 if [ "$KEY" != "" ]; then
  iwconfig $1 key "${KEY}"
 fi
 if [ "$RTS" != "" ]; then
  iwconfig $1 rts $RTS
 else
  iwconfig $1 rts 500
 fi
 if [ "$FRAG" != "" ]; then
  iwconfig $1 frag $FRAG
 else
  iwconfig $1 frag off
 fi
 if [ "$POWER" != "" ]; then
  iwconfig $1 power $POWER
 else
  iwconfig $1 power off
 fi
 if [ "$ESSID" != "" ]; then
  iwconfig $1 essid "${ESSID}"
 else
  echo "Sie haben keine ESSID im SCHEME $SCHEME angegeben!"
  FEHLER=10
  exit 1
 fi
# logger ` iwconfig $DEVICE `
}

if [ -z "`ifconfig $DEVICE 2>&1 | grep 'Device not found'`" ]; then
 case $ACTION in
  "start")
   iwconf $DEVICE
   if [ "$?" != "0" ]; then
    exit 1
   fi
   /etc/rc.d/rc.ethernet start $DEVICE $SCHEME
  ;;
  "stop")
   /etc/rc.d/rc.ethernet stop $DEVICE $SCHEME
  ;;
  "restart")
   /etc/rc.d/rc.wireless stop $DEVICE $SCHEME
   sleep 1
   /etc/rc.d/rc.wireless start $DEVICE $SCHEME
  ;;
  "status"|"check")
   /usr/sbin/iwconfig $DEVICE
   /sbin/ifconfig $DEVICE
  ;;
  "suspend")
   /etc/rc.d/rc.wireless stop $DEVICE $SCHEME
  ;;
  "resume")
   /etc/rc.d/rc.wireless start $DEVICE $SCHEME
  ;;
  *)
   echo "Benutze /etc/rc.wireless start|stop|restart|suspend|resume|status device"
  ;;
 esac
 # Setze den gateway:
 if [ ! "$GATEWAY" = "127.0.0.1" -a ! "$GATEWAY" = "" ]; then
  /sbin/route add default gw ${GATEWAY} metric 1
 fi
 exit 0
else
 echo " $DEVICE existiert nicht "
 exit 1
fi

# End of /etc/rc.d/rc.wireless
 
>>>Download rc.wireless

Die Konfiguration PCMCIA-Wireless-LAN Parallel-IOMEGA-Zip-Laufwerk Parallel-IDE-CDROM

Für die Einbindung des externen CD-ROM habe ich ein kleines Startscript geschrieben. Mit diesem Script kann man es sehr einfach testen, welches Protokoll-Modul eingesetzt werden muss.

Inhalt der Datei rc.parcdrom
#!/bin/sh
#
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 21.02.2005
# letzte Aenderung am 21.02.2005
#
# Die verfuegbaren Protokoll-Module fuer paride. Welches Module das
# richtige ist, haengt vom Chipsatz im Parallellaufwerk ab.
# Ausprobieren!!!!
#
#        aten    ATEN EH-100                            (HK)
#        bpck    Microsolutions backpack                (US)
#        comm    DataStor (old-type) "commuter" adapter (TW)
#        dstr    DataStor EP-2000                       (TW)
#        epat    Shuttle EPAT                           (UK)
#        epia    Shuttle EPIA                           (UK)
#        fit2    FIT TD-2000                            (US)
#        fit3    FIT TD-3000                            (US)
#        friq    Freecom IQ cable                       (DE)
#        frpw    Freecom Power                          (DE)
#        kbic    KingByte KBIC-951A and KBIC-971A       (TW)
#        ktti    KT Technology PHd adapter              (SG)
#        on20    OnSpec 90c20                           (US)
#        on26    OnSpec 90c26                           (US)
#

DRIVERS="aten bpck comm dstr epat epia fit2 fit3 friq frpw kbic ktti on20 on26"
# Tragen Sie hier Ihren Protokolltreiber ein. Sie koennen das Script mit dem 
# Parameter test aufrufen und den passenden Treiber testen lassen. 
# Wenn ein passender Treiber gefunden wurde, tragen sie ihn hier ein, oder 
# uebergeben sie ihn als parameter z.B.
# /etc/rc.d/rc.parcdrom start epat
DRIVER=epat

is_modul(){
 # teste, ob der uebergebene Name ein gueltiger Modulname ist 
 ERG=1
 for driver in $DRIVERS
 do
  if [ "$driver" == "$1" ]; then
   ERG=0
   break
  fi
 done
 return $ERG
}

# wurde ein zweiter Parameter mit dem Treibernamen angegeben
if [ "$2" != "" ]; then
 if is_modul $2 ; then
  DRIVER=$2
 else
  echo "Der Treiber $2 ist unbekannt"
 fi
fi

test(){
 echo -n "Teste "
 ERG=1
 for driver in $DRIVERS
 do
  echo -n "$driver "
  modprobe $driver
  modprobe pd 2&>1 > /dev/null
  if [ "$?" == "0" ]; then
   echo "OK"
   echo "In diesem Laufwerk wird der Treiber $driver verwendet"
   ERG=0
   break
  else
   rmmod $driver
  fi
 done
 if [ "$ERG" == "1" ]; then
  echo "Es wurde leider kein passender Protokolltreiber gefunden"
 fi
 exit $ERG
}

case $1 in
 start)
  modprobe paride
  if is_modul $DRIVER ; then 
   echo "Das Protokoll-Modul $DRIVER wird geladen"
   modprobe $DRIVER
   modprobe pd 2&>1 > /dev/null
   if [ "$?" != "0" ]; then
    echo "Das Protokoll-Modul passt nicht zur Hardware und wird wieder entfernt"
    rmmod $DRIVER
    rmmod paride
   fi
  else
   test
  fi
 ;;
 test)
  modprobe paride
  test
 ;;
 mount)
  if [ ! -d /cdrom ]; then 
   mkdir /cdrom
  else 
   fuser -k /cdrom
   umount /cdrom
  fi
  mount /dev/pcd0 /cdrom
 ;;
 umount)
  fuser -k /cdrom
  umount /cdrom
 ;;
 stop)
  fuser -k /cdrom
  umount /cdrom
  rmmod pcd
  rmmod pd
  if [ "$DRIVER" != "" ]; then
   rmmod $DRIVER
  else
   for driver in $DRIVERS
   do
    rmmod $driver 
   done 
  fi
  rmmod paride
 ;;
 *)
  echo "Benutze /etc/rc.d/rc.parcdrom start|stop|test"
 ;;
esac
 
>>>Download rc.parcdrom

Das Script kann mit folgenden Parametern gestartet werden

Generell empfiehlt sich für die Verwendung von Wechselmedien der komfortable Automounter.

Die Konfiguration Parallel-IDE_CDROM Konfiguration APM Parallel-IOMEGA-Zip-Laufwerk

Die Unterstützung des Zip-Laufwerkes ist recht einfach zu erreichen. Das entsprechende Startscript läd einfach nur das Modul ppa in den Kernel und fertig. Für das Modul muss die SCSI_Unterstützung im Kernel aktiviert sein.

Inhalt der Datei rc.iomega
#!/bin/sh
case $1 in
 start)
  modprobe ppa
 ;;
 stopp)
  rmmod ppa
 ;;
esac
 
>>>Download rc.iomega

Nach dem Laden des Moduls ist das Zip-Medium als SCSI-Device mountbar. Die Ausgabe von dmesg zeigt an, welche Geräte verfügbar sind, sodass durch z.B.
mount /dev/sda1 /mnt -t vfat
eine Zip-Diskette mit Windows-FAT32 Dateisystem gemountet werden kann. Generell empfiehlt sich für die Verwendung von Wechselmedien der komfortable Automounter.

Die Konfiguration Parallel-IOMEGA-Zip-Laufwerk Der Automounter APM

Die Konfiguration von APM (Advaced Power Management) bezieht sich auf zwei Dateien. Die eine ist das Startscript /etc/rc.d/rc.apm, die andere ist das apmd-proxy-Script /etc/rc.d/rc.apmd_proxy.
Zuerst zum Startscript.

Inhalt der Datei rc.apmd
#!/bin/sh
# Frank Schlaefendorf <frank@schlaefendorf>
# erstellt am 12.02.2005
# letzte Aenderung am 19.02.2005
#
case $1 in
 start)
  # ist der apm-deamon installiert?
  if [ -x /usr/sbin/apmd ] ; then
   # unterstuetzt der kernel apm nicht ?
   if ! cat /proc/apm 2>&1 > /dev/null ; then
    # apm-Modul laden
    modprobe apm
   fi
   # unterstuetzt der kernel apm jetzt?
   if cat /proc/apm 2>&1 > /dev/null ; then
    echo "APMD wird gestartet!"
    /usr/sbin/apmd -w 13 -p 10 -P /etc/rc.d/rc.apmd_proxy 
   else
    echo "Achtung! Der Kernel unterstuetzt kein APM!"
   fi
  else
   echo "Der apmd-Daemon ist nicht installiert!"
  fi
 ;;
 stop)
  echo "APMD wird gestoppt"
  killall apmd
 ;;
 suspend)
  apm -s
 ;;
 standby)
  apm  -S
 ;;
 restart)
  /etc/rc.d/rc.apmd stop && sleep 3 && /etc/rc.d/rc.apmd start
 ;;
esac
 
>>>Download rc.apmd

Das Startscript kann mit den Parametern start,stop oder restart aufgerufen werden.
Bei start prüft das Script, ob der Kernel apm unterstützt und läd gegebenenfalls das Modul apm. Danach wird der apmd-Deamon gestartet Das apmd-proxy-Script legt nun die einzelnen Reaktionen fest, die durch den apmd ausgeführt werden sollen. Dabei handelt es sich um ein bash-Script, das ausführbar (chmod 700) sein muss. Dieses wird bei einem registrierten apm-Ereignis durch den apmd mit zwei Parametern aufgerufen und ausgeführt.

Scriptaufruf mit ParameternamenEreignis
apmd_proxy start Der APM-Daemon wurde gestartet
apmd_proxy suspend system Der APM-Daemon ruft den Suspend-Modus auf
apmd_proxy suspend user Der User hat den Suspend-Modus aufgerufen
apmd_proxy suspend critical Das APM-System ruft den critical-Suspend-Modus auf
apmd_proxy standby system Das APM-System ruft den Standby-Modus auf
apmd_proxy standby user Der User hat den Standby-Modus aufgerufen
apmd_proxy resume suspend Das System kehrt aus dem Suspend-Modus zurück
apmd_proxy resume standby Das System kehrt aus dem Standby-Modus zurück
apmd_proxy resume critical Das System kehrt aus dem critical-Suspend-Modus zurück
apmd_proxy change battery Das APM-System meldet "Batterie leer"
apmd_proxy change power Das APM-System meldet "Wechsel der Stromversorgung"
apmd_proxy change time Das APM-System wuenscht ein Zeitupdate
apmd_proxy change capability Das APM System meldet eine Änderung der Hardware
apmd_proxy stop Der APM-Daemon soll gestoppt werden

Im Proxyscript werden über Variablen die wichtigsten Einstellungen vorgenommen, dann folgen die Verweise auf die benötigten Programme. Die einzelnen Reaktionen habe ich in kleine Prozeduren geschrieben, um den Hauptteil des Scriptes am Ende der Datei übersichtlicher zu halten. Dort sind in einer CASE-Anweisung alle Reaktionen auf die einzelnen Parameter des apmd festgelegt.

Inhalt der Datei rc.apmd_proxy
#!/bin/sh
# Frank Schlaefendorf <frank@schlaefendorf>
# erstellt am 12.02.2005
# letzte Aenderung am 26.02.2005
#
# pcmcia karten bei standby ejecten, macht bei karten, die standby nicht beherrschen sinn
APMD_PCMCIA_EJECT_ON_STANDBY="yes"
# pcmcia karten bei suspend ejecten, viele karten beherrschen suspend nicht
APMD_PCMCIA_EJECT_ON_SUSPEND="no"
# soll das system in den suspend gehen, auch wenn der pc aus einem netzteil betrieben wird?
APMD_SUSPEND_ON_AC="yes"
# soll vor suspend vom X auf eine textconsole gewechselt werden, damit das 
# X stabil gesichert wird (nur waehlen, wenn noetig)
APMD_LEAVE_X_BEFORE_SUSPEND=no
# ab wieviel % batterieladezustand soll das geraet herunter gefahren werden
APMD_BATTERY_LOW_CAPACITY=10
# nach wievielen minuten soll der pc nach der warnung "batterie low" herunter gefahren werden
APMD_BATTERY_LOW_SHUTDOWN=0
# soll die hardwareuhr bei suspend gesichert und resume neu gelesen werden ?
APMD_SET_CLOCK_ON_SUSPEND_RESUME=yes
# soll die hardwareuhr bei standby gesichert und resume neu gelesen werden ?
APMD_SET_CLOCK_ON_STANDBY_RESUME=yes
# mit welchem timeout soll die festplatte laufen, wenn das Geraet ueber netzteil versorgt wird?
# TIMEOUT=$APMD_AC_DISK_TIMEOUT*5sekunden
APMD_AC_DISK_TIMEOUT=120
# mit welchem timeout soll die festplatte laufen, wenn das Geraet ueber batterie versorgt wird?
# TIMEOUT=$APMD_AC_DISK_TIMEOUT*5sekunden
APMD_BATTERY_DISK_TIMEOUT=12

# 
#   Rueckgabewerte des Scriptes
#     0 - normal, die events werden akzeptiert
#     1 - die events werden abgelehnt
#
# Verweise auf benoetigte Programme
CARDCTL=/sbin/cardctl
CHVT=/usr/bin/chvt
ONACPOWER=/usr/bin/on_ac_power
HDPARM=/usr/sbin/hdparm
SHUTDOWN=/sbin/shutdown
LOGGER="/usr/bin/logger -i -t apmd_proxy "
APM=/usr/bin/apm

# definierte prozeduren fuer die systemreaktionen

lichtaus(){
 #LCD Backlight ausschalten
 tbacklight -f
}

lichtan(){
 #LCD Backlight einschalten
 tbacklight -n
}

pcmcia_eject(){
 # entfernen der pcmcia-karten aus dem system, wenn gewuenscht
 case $1 in
  bysuspend)
   if [ "$APMD_PCMCIA_EJECT_ON_SUSPEND" = yes ] ; then 
    $CARDCTL eject
   fi
  ;;
  bystandby)
   if [ "$APMD_PCMCIA_EJECT_ON_STANDBY" = yes ] ; then 
    $CARDCTL eject
   fi
  ;;
 esac
}

pcmcia_insert(){
 # einfuegen der pcmcia-karte in das system, wenn gewuenscht
 case $1 in
  aftersuspend)
   if [ "$APMD_PCMCIA_EJECT_ON_SUSPEND" = yes ] ; then 
    $CARDCTL insert
   fi
  ;;
  afterstandby)
   if [ "$APMD_PCMCIA_EJECT_ON_STANDBY" = yes ] ; then 
    $CARDCTL insert
   fi
  ;;
 esac
}

save_X(){
 # wechsel auf konsole 1, um das X zu sichern
 if [ "$APMD_LEAVE_X_BEFORE_SUSPEND" = yes ] ; then
  $CHVT 1
  sleep 1
 fi
}

restore_X(){
 # wechsel auf die X-konsole
 if [ "$APMD_LEAVE_X_BEFORE_SUSPEND" = yes ] ; then
  $CHVT 7
  sleep 1
 fi
}

save_time(){
 # sichern der aktuellen systemzeit in der biosuhr
 case $1 in
  bysuspend)
   if [ "$APMD_SET_CLOCK_ON_SUSPEND_RESUME" = yes ] ; then
    /etc/rc.d/rc.systemzeit systemsetbios
   fi
  ;;
  bystandby)
   if [ "$APMD_SET_CLOCK_ON_STANDBY_RESUME" = yes ] ; then
    /etc/rc.d/rc.systemzeit systemsetbios
   fi
  ;;
 esac
}

restore_time(){
 # setzen der systemzeit durch die biosuhr
 case $1 in
  aftersuspend)
   if [ "$APMD_SET_CLOCK_ON_SUSPEND_RESUME" = yes ] ; then
    /etc/rc.d/rc.systemzeit biossetsystem
   fi
  ;;
  afterstandby)
   if [ "$APMD_SET_CLOCK_ON_STANDBY_RESUME" = yes ] ; then
    /etc/rc.d/rc.systemzeit biossetsystem
   fi
  ;;
 esac
}

##########-----------------------HAUPTPROGRAMM-----------------------

ACTION="$1,$2"
case $ACTION in
 # ------------------------------- START ----------------------------
 start,)
  $LOGGER $ACTION
  # Passe die festplatteneinstellung an die Stromversorgung an
  /etc/rc.d/rc.apmd_proxy change power
 ;;
 # --------------------------- SUSPEND -------------------------------
 suspend,system)
  $LOGGER $ACTION
  pcmcia_eject bysuspend
  save_time bysuspend
  sync
 ;;
 suspend,user)
  $LOGGER $ACTION
  pcmcia_eject bysuspend
  save_time bysuspend
  sync
 ;;
 suspend,critical)
  $LOGGER $ACTION
  save_time bysuspend
  sync             # up kritischer zustand, schnell ein sync
  shutdown -h now  # und sofort abwaerts
 ;;
 # --------------------------- STANDBY -------------------------------
 standby,system)
  $LOGGER $ACTION
  pcmcia_eject bystandby
  save_time bystandby
 ;;
 standby,user)
  $LOGGER $ACTION
  pcmcia_eject bystandby
  save_time bystandby
 ;;
 # ------------------------------- RESUME ---------------------------
 resume,suspend)
  $LOGGER $ACTION
  pcmcia_insert aftersuspend
  restore_time aftersuspend
 ;;
 resume,standby)
  $LOGGER $ACTION
  restore_time afterstandby
  pcmcia_insert afterstandby
 ;;
 resume,critical)
  $LOGGER $ACTION
  # nix, da shutdown ausgefuehrt wurde
 ;;
 # ------------------------ CHANGE in STATUS ------------------------
 change,power)
  $LOGGER $ACTION
  POWER=$( $ONACPOWER )
  case $POWER in
   '')
    $LOGGER "NETZTEIL an"
    if [ "$APMD_SUSPEND_ON_AC" == yes ]; then
     apm -n
    else
     apm -i
    fi
    # festplatte nach $APMD_AC_DISK_TIMEOUT*5sekunden in standby-modus
    $HDPARM -q -S$APMD_AC_DISK_TIMEOUT /dev/hda
   ;;
   *)
    $LOGGER "BATTERIE ${POWER}% LADEKAPAZITAET"
    apm -n
    # festplatte nach $APMD_BATTERY_DISK_TIMEOUT*5sekunden in standby-modus
    $HDPARM -q -S$APMD_BATTERY_DISK_TIMEOUT /dev/hda
   ;;
  esac
  if [ "$APMD_BATTERY_LOW_SHUTDOWN" -gt 0 -a -e /var/run/shutdown.pid ] ; then
   if [ -e $ONACPOWER -a "$ONACPOWER" == "" ] ; then
    $SHUTDOWN -c
    if [ -e /var/run/shutdown.pid ]; then
     echo "Warnung: Shutdown laeuft!"
    else
     echo "Das Netzteil ist eingeschaltet, Shutdown gestoppt!"
    fi | wall
   fi &
  fi
 ;;
 change,battery)
  $LOGGER $ACTION
  # das BIOS hat den batteriezustand als low erkannt, im libretto 50%
  POWER=$( $ONACPOWER )
  if [ "$POWER" != "" ]; then
   if [ $POWER -lt $APMD_BATTERY_LOW_CAPACITY ]; then
    if [ "$APMD_BATTERY_LOW_SHUTDOWN" -gt 0 ] ; then
     $SHUTDOWN -h +$APMD_BATTERY_LOW_SHUTDOWN &
    else
     $SHUTDOWN -h now &
    fi
   else
    exit 1
   fi
  else
   exit 1
  fi
 ;;
 change,time)
  $LOGGER $ACTION
  /etc/rc.d/rc.systemzeit serversetsystem
 ;;
 change,capability)
  $LOGGER $ACTION
  # neue hardware erkannt (hotplugging)
 ;;
 # ------------------------------- STOP -----------------------------
 stop,)
  $LOGGER $ACTION
 ;; 
esac

exit 0

 
>>>Download rc.apmd_proxy

Die Konfiguration Konfiguration APM Konfiguration SOUND Der Automounter

Der Automounter bietet unter Linux eine komfortable Möglichkeit mit Wechselmedien umzugehen. Dazu wird eine Mapliste erstellt, in der festgelegt wird, welches Gerät an welchen Mountpoints gemountet werden soll. Der Name dieser Mapliste ist frei wählbar und wird in das Startscript /etc/rc.d/rc.autofs in die Variable MAPDATEI eingetragen. Ich habe diese Mapliste in Anlehnung an die anderen Distributionen /etc/auto.misc genannt. Auf das Erstellen der Datei /etc/auto.master kann verzichtet werden, da ich die notwendigen Eintragungen in dem Startscript direkt vornehme. Diese Mapliste sieht nun so aus:

Inhalt der Datei auto.misc
# mapliste fuer den automounter
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 10.08.2005
# letzte Aenderung am 12.04.2006

# verzeichnisname  mountoptionen                        geraetedatei

# pcmcia-cdrom
cd		-fstype=iso9660,ro			:/dev/hdc
# parallel-cdrom
pcd		-fstype=iso9660,ro			:/dev/pcd0
# parallel-ide-hd , 4 partitionen vorbereitet
pda1		-fstype=auto				:/dev/pda1
pda3		-fstype=auto				:/dev/pda2
pda3		-fstype=auto				:/dev/pda3
pda4		-fstype=auto				:/dev/pda4
# parallel zip, 4 partitionen vorbereitet
zip1		-fstype=auto,uid=frank,user,rw,exec	:/dev/sda1
zip2		-fstype=auto,uid=frank,user,rw,exec	:/dev/sda2
zip3		-fstype=auto,uid=frank,user,rw,exec	:/dev/sda3
zip4		-fstype=auto,uid=frank,user,rw,exec	:/dev/sda4
# smartcard
smart1		-fstype=auto,uid=frank,user,rw,exec	:/dev/hdc1
# floppy-laufwerk
floppy		-fstype=auto,uid=frank,user,rw,exec	:/dev/fd0
# samba-freigabe frank vom server apis
mp3		-fstype=smbfs,username=frank%frank	://apis/frank
 
>>>Download auto.misc

Der Automounter wird z.B. angewiesen, das Floppy-Laufwerk /dev/fd0 an das directory floppy zu mounten. Im Startscript /etc/rc.d/rc.autofs wird mit der Variablen MOUNTPOINT der Pfad eines zentralen Mountpoints für den Automounter übergeben. In diesem Fall handelt es sich um das directory /auto, kann aber auch problemlos geändert werden. Wenn das Verzeichnis noch nicht existiert, muss es vor dem Start des Automounters angelegt werden. Schaut man sich nun nach dem Start des Automunters mit dem Kommando
/etc/rc.d/rc.autofs start
das Verzeichnis /auto mit
dir /auto
an, so wird man feststellen, das es leer ist. Selbst Dateien, die sich vor dem Start des Automounters hier befunden haben sind nicht mehr zu finden. Der Grund dafür liegt darin, dass der Automounter in das Verzeichnis gemountet ist (siehe Meldung des mount-Kommandos) und dort nach Bedarf virtuelle Einträge erzeugt. Greift nun ein User auf das (noch nicht existierende) Verzeichnis /auto/floppy zu, so versucht der Automounter eine Diskette im Floppy-Laufwerk zu mounten. Gelingt dies, so erzeugt der Automounter einen virtuellen Verzeichniseintrag floppy und gibt dieses, je nach den Zugriffsrechten an den User frei. Schlägt der Mountversuch fehl, so meldet der Automounter zurück, dass das Verzeichnis nicht existiert. Die Unterverzeichnisse im Pfad /auto für die einzelnen Geräte müssen vorher nicht extra angelegt werden!! Finden auf das gemountete Gerät keine Zugriffe mehr statt, so wartet der Automounter eine vorgegebene Zeitspanne (Variable TIMEOUT in der Startdatei /etc/rc.d/rc.autofs), z.B. 10 Sekunden und umountet das Gerät dann. Dadurch wird die Arbeit mit Wechselmedien wesentlich erleichtert, denn alle Geräte sind unter einem Pfad erreichbar und die lästige Eingabe von mount und umount entfällt vollkommen. Ein weiterer Vorteil besteht darin, das auch Netzwerk-Dateisysteme gemountet werden können. Damit ist es möglich, bei Bedarf z.B. NFS oder SAMBA-Filesysteme zu mounten. Ich habe das für mein MP3 Verzeichnis auf meinem Server apis in die Mapdatei eingetragen, sodass ich auf dem Libretto bei Bedarf MP3-Musik spielen kann. Das Startscript kann mit den Parametern start,stopp und status aufgerufen werden. Bei start wird das Modul autofs in den Kernel geladen und der Daemon automount mit den entsprechenden Optionen gestartet..
Bei stopp wird der automounter gestoppt.
Bei status wird die PID des automount-Daemonen angezeigt, sowie eine Liste der momentan gemounteten Geräte.

Inhalt der Datei rc.autofs
#! /bin/bash
#
# Datei /etc/rc.d/rc.autofs
# Frank Schlaefendorf <frank@schlaefendorf.de>
# Erstellt am 10.08.2005
# letzte Aenderung am 12.08.2005

# an welchem mountpoint soll der automounter die geraete mounten?
MOUNTPOINT=/auto
# mapdatei mit den mountoptionen fuer die einzelnen geraete
MAPDATEI=/etc/auto.misc
# nach wie vielen sekunden soll ein unbenutztes geraet ge-umountet werden?
TIMEOUT=10

DAEMON=/usr/sbin/automount
PIDFILE=/var/run/automount.pid

if [ ! -x $DAEMON ]; then
 echo "Automount ist nicht installiert!"
 exit 1
fi

if ! lsmod | grep autofs 2>&1 > /dev/null ; then
 echo "Lade das Modul autofs"
 modprobe autofs
 if [ $? != 0 ]; then
  echo "Das Module autofs konnte nicht geladen werden!"
  exit 2
 fi
fi

case "$1" in
 start)
  # Check if the automounter is already running?
  if [ ! -f ${PIDFILE} ]; then
   echo 'Starte den Automounter: '
   $DAEMON -p $PIDFILE -t $TIMEOUT $MOUNTPOINT file $MAPDATEI
  fi
 ;;
 stopp)
  if [ -f $PIDFILE ]; then
   kill -TERM $( cat $PIDFILE )
  fi
 ;;
 status)
  if [ -f $PIDFILE ]; then
   PID=$( cat $PIDFILE )
   if ps ax | egrep -e "^[ ]{0,7}$PID.*$DAEMON.*" 2>&1 > /dev/null ; then
    echo "Der Automounter ist mit PID ${PID} gestartet"
    echo "Aktive Mountpoints im Pfad $MOUNTPOINT sind:"
    ls -l $MOUNTPOINT
   fi
  else
   echo "Der Automounter ist nicht gestartet"
  fi
 ;;
 restart)
  /etc/rc.d/rc.autofs stopp
  /etc/rc.d/rc.autofs start
 ;;
 *)
  echo "Usage: /etc/rc.d/rc.autofs {start|stopp|status}"
 ;;
esac

exit 0
 
>>>Download rc.autofs

Die Konfiguration Der Automounter Konfiguration X-ServerIRDA SOUND

Die Soundinstallation funktioniert häufig mit dem ALSA-SOUND-System. Das Programm alsaconf versagt beim Libretto jedoch kläglich, da der eingebaute Chip YAMAHA YMF711 auf PCI-Soundkarten verbaut wird und durch den internen ISA-Bus des Libretto scheinbar nicht erkannt wird. Außerdem sind für die ALSA-Unterstützung extra libs zu instellieren. Ich nutze auf meinem Libretto den Kerneltreiber opl3sa2 zusammen mit dem esd Sound-Daemonen. Dieser ist in der Slackware mit ALSA-Support kompiliert, sodass er für meine Zwecke unbrauchbar ist. Ich habe mir deshalb das Paket esound-0.2.29.tar.gz heruntergeladen, nach /usr/src/ kopiert und kompiliert.
cd /usr/src
tar -xzf esound-0.2.29.tar.gz
cd esound-0.2.29
./configure
make
make install
ldconfig
Die kompilierten Programme liegen dann im Verzeichnis /usr/local/bin
Damit habe ich mir die Soundsteuerung aufgebaut, mit der Sounds auch per Fernzugriff abgespielt werden können. Das macht z.B. Sinn, wenn man einen X-Terminal auf dem Libretto betreibt.
Die Soundinstallation besteht aus zwei Schritten. Zuerst müssen die Kernelmodule für den Soundchip geladen werden. Dies geschieht durch das Programm /sbin/modprobe.
Die Daten für die IO-Adresse, und die IRQ und DMA-Einstellung müssen dem BIOS bei den Einstellungen zum SOUND SYSTEM entnommen werden. Nach dem Laden der Module wird der esd-Sound-Daemon gestartet. Damit können die Sounds unterschiedlicher Quellen (lokal auf dem Libretto oder von entfernten Rechnern) auf dem Libretto abgespielt werden. Das geschieht mit dem Startscript /etc/rc.d/rc.sound.
Beim Stoppen wird zuerst der esd-Daemon angehalten und dann die Module entladen.

Inhalt der Datei rc.sound
#!/bin/sh
# Frank Schlaefendorf <frank@schlaefendorf>
# erstellt am 12.02.2005
# letzte Aenderung am 22.02.2005
#
###################    ESD-Einstellungen    #####################
# sollen die sounds mit 16bit tiefe abgespielt werden? (achtung performance!)
SOUND16BIT=no
# sollen die sounds mit 11k, 22k oder 44kbit abgespielt werden? (achtung performance!)
SAMPLERATE=22
# soll der sound daemon als sound-server fungieren? (achtung performance!)
SOUNDSERVER=no
# auf welchem port soll er lauschen z.B. 16001 (xmms)
SERVERPORT=5001
# soll er auch tcp-zugriffe von entfernten rechnern zulassen
REMOTESERVER=yes
###################   SOUND-SYSTEM-BIOS-EINSTELLUNGEN   #########
CONTROLIOADRESS=370
WSSIOADRESS=530
IRQLEVEL=5
WSSDMA=1
SBProDMA=0
#################################################################

### prozeduren 
# defaultwerte
SOUNDSAM=""
SOUNDBIT=""

set_optionen(){
 FEHLER=0
 # einstellen der control adresse, die steht fest auf 0x370
 CONTROLIOADRESS=0x370
 # einstellen der wss-io-adresse, wahlweise 530,540,550,560
 case $WSSIOADRESS in
  530|540|550|560) WSSIOADRESS="0x${WSSIOADRESS}" ;;
  *) 
   FEHLER=1
   echo "Die WSS I/O Adresse $WSSIOADRESS ist unbekannt"
  ;;
 esac
 # einstellen des irq-level, wahlweise 5,7,9,11,15
 case $IRQLEVEL in
  5|7|9|11|15) IRQLEVEL=$IRQLEVEL ;;
  *)
   FEHLER=2
   echo "Der IRQ ${IRQLEVEL} ist unbekannt"
  ;;
 esac
 case $WSSDMA in
  0|1|3) WSSDMA=$WSSDMA ;;
  *)
   FEHLER=3
   echo "Der DMA-Kanal ${WSSDMA} ist unbekannt"
  ;;
 esac
 case $SBProDMA in
  0|1|3) SBProDMA=$SBProDMA ;;
  *)
   FEHLER=3
   echo "Der DMA-Kanal ${SBProDMA} ist unbekannt"
  ;;
 esac
 if [ "$WSSDMA" == "$SBProDMA" ]; then
  echo "Die DMA-Kanaele fuer SBPRO und WSS sind gleich, dadurch kann es zu konflikten kommen"
 fi 
 if [ "$SOUND16BIT" == "yes" ]; then
  SOUNDBIT=""
 else
  SOUNDBIT="-b"
 fi
 if [ "$SOUNDSERVER" == "yes" ]; then
  SOUNDSERVER=" -promiscuous -tcp"
  if [ "$REMOTESERVER" == "yes" ]; then
   SOUNDSERVER="$SOUNDSERVER -public" 
  fi
  if [ "$SERVERPORT" != "" ]; then
   SOUNDSERVER="$SOUNDSERVER -port $SERVERPORT"
  else
   SOUNDSERVER="$SOUNDSERVER -port 16001"
  fi
 else
  SOUNDSERVER=""
 fi
 case $SAMPLERATE in
  11) SOUNDSAM=11025 ;;
  22) SOUNDSAM=22050 ;;
  44) SOUNDSAM=44100 ;;
  *)  SOUNDSAM=22050 ;;
 esac
}

case $1 in
 start)
  if [ -x /usr/bin/esd ]; then
   set_optionen
   /sbin/modprobe opl3sa2 io=${CONTROLIOADRESS} mss_io=${WSSIOADRESS} irq=${IRQLEVEL} dma=${WSSDMA} dma2=${SBProDMA}
   /usr/local/bin/esd ${SOUNDBIT} -r ${SOUNDSAM} ${SOUNDSERVER} 2>&1 > /dev/null &
   aumix -w 95,95
  fi
 ;;
 local)
  if [ -x /usr/bin/esd ]; then
   set_optionen
   /sbin/modprobe opl3sa2 io=${CONTROLIOADRESS} mss_io=${WSSIOADRESS} irq=${IRQLEVEL} dma=${WSSDMA} dma2=${SBProDMA}
   /usr/local/bin/esd ${SOUNDBIT} -r ${SOUNDSAM} 2>&1 > /dev/null &
   aumix -w 95,95
  fi
 ;;
 stop)
  killall esd
  sleep 1
  /sbin/rmmod opl3sa2
  /sbin/rmmod ad1848
  /sbin/rmmod mpu401
  /sbin/rmmod sound
  /sbin/rmmod soundcore
 ;;
 restart)
  $0 stop && sleep 3 && $0 start
 ;;
 *)
  echo "Benutze /etc/rc.d/rc.sound start|local|stop|restart"
 ;;
esac
 
>>>Download rc.sound

Da die Klangqualität des eingebauten Miniaturlautsprechers als eher bescheiden zu bezeichnen ist, habe ich mir einen externen aktiven Lautsprecher zugelegt. Im Makro-Markt entdeckte ich den CD WALLET with PORTABLE SPEAKER von TDK. Es handelt sich um aktive Lautsprecher, die mit Batterie betrieben werden. Den 3,5mm Klinkenstecker habe ich durch einen 2,5mm Klinkenstecker ersetzt, damit er an die Kopfhörerbuchse des Libretto angeschlossen werden kann. Die Klangqualität ist gut und die Lautstärke reicht aus. Leider ist der Libretto ein wenig zu hoch und passt deshalb nicht ins Wallet hinein. Immerhin kann man dort ein paar CDs, Disketten, PCMCIA-Karten und das PCMCIA_Floppy unterbringen.

Libretto mit DLINK WLAN-Karte und Aktivlautsprecher

Der Libretto mit DLINK DWL-660 WLAN-Karte und Aktivlautsprecher spielt mit xmms MP3 Files vom Server ab

Die Konfiguration Konfiguration SOUND Konfiguration xdm Konfiguration des X-Servers

In der Slackware 9.1 ist das XFree Paket in Version 4.3.0 integriert. Die Konfigurationsdatei liegen im Verzeichnis /etc/X11/ oder sind dort hin verlinkt. Die entscheidende Konfigurationsdatei ist /etc/X11/XF86Config. Fehlkonfigurationen verhindern den Start des X-Servers oder machen das System instabil. Ich habe in der Konfiguration eine ganze Menge Funktionen abgeschaltet, da sie im Libretto nicht benötigt oder nicht unterstützt werden. In der Section "InputDevice" habe ich den gpm-Maus-Server eingetragen. Damit greift der X-Server nicht direkt auf das Maus-Device zu, sondern benutzt die Schnittstelle /dev/gpmdata des gpm-Maus-Servers. Dadurch kann man relativ schnell und während des Betriebs die Maus wechseln (z.B. eine "richtige" Maus an die serielle Schnittstelle anschliessen).

Inhalt der Datei XF86Config
#
# /etc/X11/XF86Config
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 14.02.2005
# letzte Aenderung 20.02.2005
#
Section "Module"
 Load "dbe" # Double buffer extension
 SubSection  "extmod"
  Option "omit xfree86-dga" # don't initialise the DGA extension
  Option "omit XVideo"
  Option "omit XVideo-MotionCompensation"
  Option "omit TOG-CUP"
  Option "omit MIT-SUNDRY-NONSTANDARD"
  Option "omit BIG-REQUESTS"
  Option "omit SYNC"
  Option "MIT-SCREEN-SAVER"
  Option "XC-MISC"
  Option "XFree86-Misc"
  Option "DPMS"
  Option "Extended-Visual-Information"
  Option "FontCache"
 EndSubSection

# This loads the Type1 and FreeType font modules
 Load "type1"
 Load "speedo"
# Load "freetype"
# Load "xtt"
EndSection

Section "Files"
 RgbPath "/usr/X11R6/lib/X11/rgb"
 FontPath "/usr/X11R6/lib/X11/fonts/local/"
 FontPath "/usr/X11R6/lib/X11/fonts/misc/"
 FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
 FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
 FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
 FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
# FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"
# FontPath "/usr/X11R6/lib/X11/fonts/freefont/"
 FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
 FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
# The module search path.  The default path is shown here.
#    ModulePath "/usr/X11R6/lib/modules"
EndSection

Section "ServerFlags"

# Uncomment this to cause a core dump at the spot where a signal is 
# received.  This may leave the console in an unusable state, but may
# provide a better stack trace in the core dump to aid in debugging

# Option "NoTrapSignals"

# Uncomment this to disable the <Crtl><Alt><Fn> VT switch sequence
# (where n is 1 through 12).  This allows clients to receive these key
# events.

# Option "DontVTSwitch"

# Uncomment this to disable the <Crtl><Alt><BS> server abort sequence
# This allows clients to receive this key event.

# Option "DontZap"

# Uncomment this to disable the <Crtl><Alt><KP_+>/<KP_-> mode switching
# sequences.  This allows clients to receive these key events.

# Option "Dont Zoom"

# Uncomment this to disable tuning with the xvidtune client. With
# it the client can still run and fetch card and monitor attributes,
# but it will not be allowed to change them. If it tries it will
# receive a protocol error.

 Option "DisableVidModeExtension"

# Uncomment this to enable the use of a non-local xvidtune client. 

# Option "AllowNonLocalXvidtune"

# Uncomment this to disable dynamically modifying the input device
# (mouse and keyboard) settings. 

# Option "DisableModInDev"

# Uncomment this to enable the use of a non-local client to
# change the keyboard or mouse settings (currently only xset).

# Option "AllowNonLocalModInDev"

EndSection

# **********************************************************************
# Input devices
# **********************************************************************

# **********************************************************************
# Core keyboard's InputDevice section
# **********************************************************************

Section "InputDevice"

 Identifier "Keyboard1"
 Driver "Keyboard"
 Option "AutoRepeat" "500 30"
 Option "XkbRules" "xfree86"
 Option "XkbModel" "pc105"
 Option "XkbLayout" "de"
 Option "XkbVariant" "nodeadkeys"
EndSection


# **********************************************************************
# Core Pointer's InputDevice section
# **********************************************************************

Section "InputDevice"
 Identifier "gpm-Mouse"
 Driver "mouse"
 Option "Protocol" "MouseSystems"
 Option "Device" "/dev/gpmdata"
 Option "Emulate3Buttons"
 Option "Emulate3Timeout" "50"
EndSection

# **********************************************************************
# Monitor section
# **********************************************************************

Section "Monitor"
 Identifier  "Libretto-LCD"
 HorizSync   31.5
 VertRefresh 50-70
 Modeline "640x480@16bpp" 25.20 640 656 752 800 480 490 492 525 -hsync -vsync
EndSection


# **********************************************************************
# Graphics device section
# **********************************************************************

# Any number of graphics device sections may be present

Section "Device"
 Identifier  "Libretto-VGA"
 Driver      "chips"
 Chipset     "ct65550"
 Option      "noaccel"
 Option      "nolinear"
 Option      "HWcursor"
 VideoRam    1024
 # Insert Clocks lines here if appropriate
EndSection


# **********************************************************************
# Screen sections
# **********************************************************************

Section "Screen"
 Identifier  "Libretto Screen"
 Device      "Libretto-VGA"
 Monitor     "Libretto-LCD"
 DefaultDepth 16
 Subsection "Display"
  Depth       8
  Modes       "640x480"
  ViewPort    0 0
 EndSubsection
 Subsection "Display"
  Depth       16
  Modes       "640x480"
  ViewPort    0 0
 EndSubsection
 Subsection "Display"
  Depth       24
  Modes       "640x480"
  ViewPort    0 0
 EndSubsection
EndSection

# **********************************************************************
# ServerLayout sections.
# **********************************************************************


Section "ServerLayout"
 Identifier  "Libretto Layout"
 Screen "Libretto Screen"
 InputDevice "gpm-Mouse" "CorePointer"
 InputDevice "Keyboard1" "CoreKeyboard"
EndSection
 
>>>Download XF86Config

Nach dem Abspeichern dieser Konfiguration unter /etc/X11/XF86Config (Installation des x-Paketes vorausgesetzt) müsste sich der X-Server nun mit X :0 oder besser startx aufrufen lassen. Bei X :0 erscheint, wenn alles klappt einfach nur ein grauer Bildschirm und auf der Konsole von der wir das Kommando aufgerufen haben sehen wir entsprechenden Ausgaben des X-Servers. Nach dem Wechsel auf die Konsole, von der wir das Kommando gestartet haben, kann das X durch die Tastenkombination <Strg><c> beendet werden. Sollte der Start nicht gelingen, so können wir auf der Konsole die Fehlermeldungen auswerten.
Bei startx wird nach dem X auch der (hoffentlich installierte) Window-Manager (z.B. blackbox, XFce, KDE ...) aufgerufen und man kann das System nutzen. Natürlich laufen unsere Textkonsolen weiter und ein Wechsel ist immer möglich. Wie ich nachher noch erkläre, sind auch mehrere X-Window-Konsolen möglich. Der Wechsel zwischen den einzelnen Konsolen wird mit speziellen Tastenkombinationen erreicht.
Dazu eine kurze Übersicht.

Die Konfiguration Konfiguration des X-Servers Konfiguration IRDA xdm Konfiguration

Der xdm (X-Display-Manager) ist zum starten des X-Windows nicht unbedingt notwendig, denn jeder User kann (wenn er darf) von einer Konsole aus mit startx ein X-Windows starten. Der xdm macht die Sache aber etwas komfortabler und ermöglicht den Fernzugriff über ein X-Terminal. Das ist sehr bequem und effizient, wenn man längere (Konfigurations)Arbeiten am Libretto zu Hause vor hat. Die kleine Tastatur und der winzige Bildschirm sind dann auf Dauer sehr ermüdend.
Auch hier haben wir wieder ein Startscript /etc/rc.d/rc.xdm und verschiedene Konfigurationsdateien im Verzeichnis /etc/X11/xdm . Das Startscript ist sehr einfach gehalten und sorgt eigentlich nur für den Start und das Beenden des xdm.

Inhalt der Datei rc.xdm
#!/bin/sh
case $1 in
 start)
  /usr/X11/bin/xdm
 ;;
 stop)
  killall xdm
 ;;
 restart)
  $0 stop && $0 start
 ;;
 status)
  if [ -e /var/run/xdm.pid ]; then
   if ps ax | grep "^`cat /var/run/xdm.pid`.*xdm$" 2>&1 > /dev/null ; then
    echo "XDM laeuft mit der PID$( cat /var/run/xdm.pid)"
   else
    echo "XDM laeuft nicht"
    rm /var/run/xdm.pid
   fi
  fi
 ;;
 *)
  echo "Benutze /etc/rc.d/rc.xdm start|stop|restart|status"
 ;;
esac

 
>>>Download rc.xdm

Wird der xdm nun mit /etc/rc.d/rc.xdm start gestartet, dann startet dieser den X-Windows-Server auf der 7.Konsole und erzeugt standardmäßig einen Login-Bildschirm an den man sich mit seinem Linux-Login anmelden kann.
Nun wollen wir noch den Fernzugriff auf das X-System einstellen. Dazu müssen wir zwei Dateien im Konfigurationsverzeichnis /etc/X11/xdm ändern.

  1. Öffne /etc/X11/xdm/xdm-config
    Die letzte Zeile der Datei lautet
    DisplayManager.requestPort: 0
    Da setzen wir einfach ein Doppelkreuz an den Zeilenanfang, so dass die Zeile so aussieht
    #DisplayManager.requestPort: 0
    Damit haben wir Fernzugriffe erlaubt. Nun müssen wir nur noch einstellen, wer zugreifen darf.
  2. Öffne /etc/X11/xdm/Xaccess
    Die Festlegung zur Zugriffserlaubnis stehen in dieser Datei. Dazu suchen wir die Zeile
    #*      #any host can get a login window
    Wenn wir das Doppelkreuz am Zeilenanfang entfernen, darf jeder!! Rechner unser X-System aus der Ferne kontaktieren. Das ist natürlich ein Sicherheitsrisiko. Sinnvoller ist es, bestimmten IP-Adressen den Zugriff zu erlauben. Dazu gibt man die IP-Adressen einfach der Reihe nach an. Bei mir sieht das dann so aus
    #*      #any host can get a login window
    192.168.0.8
    192.168.0.10

    Damit düfen nur die Rechner mit den IPs 192.168.0.8 und 192.168.0.10 mein X-System kontaktieren.

Nun probieren wir das aus. Von einer Textkonsole aus starten wir den neu konfigurierten xdm mit /etc/rc.d/rc.xdm restart neu. Das X-Windows auf dem Libretto wird geschlossen und erschein mit dem X-Login nach einiger Zeit neu. Nun können wir den Zugriff von einem entfernten (LinuX)Rechner mit installiertem X aus probieren. Dazu geben wir an dem entfernten Rechner (Netwerkkontakt mit dem Libretto vorausgesetzt) auf einer Textkonsole folgendes Kommando ein (als root)
X -query LibrettoIP :1
Für LibrettoIP muss natürlich die IP des Librettos eingetragen werden. Wenn alles klappt, sehen wir nach kurzer Zeit auf unserem entfernten Rechner das gleiche Login-Fenster wie auf dem Libretto. Wir können uns damit ganz normal auf dem Libretto anmelden und arbeiten jetzt aus der Ferne direkt auf dem Libretto. Durch das Netz werden alle Tastatur, Maus und Bildschirmaktionen übertragen.
Das :1 bedeutet, dass das X auf der 8 Konsole gestartet wird. Damit können wir auch mehrere X-Konsolen auf einem Rechner starten, die alle entweder auf den Rechner lokal zugreifen oder unterschiedliche Rechner über Fernzugriff kontaktieren. Ohne weitere Konfiguration können damit insgesamt 6 X-Terminals gestartet werden.

Alle X Konsolen laufen gleichzeitig und man kann zwischen ihnen wechseln. Das & am Ende des Befehls bewirkt, das das Kommando in den Hintergrund geschickt wird und die startende Textkonsole nicht blockiert wird. Es bleiben nur die Ausgaben des X Startes übrig. Wenn man auf der startenden Textkonsole einfach <Enter> drückt erscheint der Systemprompt wieder und man kann das nächste Kommando eingeben.

Die Konfiguration xdm Konfiguration Fazit IRDA

In Arbeit. Siehe die alte Beschreibung für die Slackware 8.1.

TOP Konfiguration Software Hilfsscripte

Hilfsscripte Hilfsscripte Software HTTP-PROXY-Scanner

Da ich den Libretto häufig in verschiedenen Netzen betreibe, besteht oft das Problem der Anpassung an die Netzwerkumgebung. Wenn in den Netzen DHCP verfügbar ist, erhält der Rechner automatisch seine IP zugewiesen. Ansonsten vergibt das Startscript der Ethernetkarte eine feste IP in der Hoffnung, dass alles gut geht. Bleibt noch die Konfiguration des Internetzugangs. Dazu habe ich mir dieses Script geschrieben, dass direkt in die Startdatei für die Ethernetkarte eingebunden wird.
Dieses Script geht nach folgender Strategie vor:

  1. Ermitteln der Daten der Ethernetkarte wie IP,Netzmaske,Hardwareadresse,Netzadresse...
  2. Test, ob die TESTURL mit den momentanen Einstellungen erreichbar ist.
    Wenn ja, beendet sich das Script.
  3. Sollte der erste Test fehlschlagen, sucht das Script in seiner PROXY-Datenbank nach einem Eintrag für dieses Netz. Wird ein solcher Eintrag gefunden, so testet das Script, ob mit diesen Proxys die TESTURL erreicht werden kann. Sollte dieser Test gelingen, so wird dieser Proxy in die Datei /etc/HTTP-PROXY eingetragen und das Script beendet sich.
  4. Sollte kein passender Proxy in der Datenbank gefunden werden, so scannt das Script das Netz automatisch nach Rechnern ab, die Dienste auf PROXY-Ports (8080,3128) anbieten. Wenn solche Proxys gefunden werden, so wird ein Zugriffstest auf die TESTURL durchgeführt und die dafür benötigte Zeit gemessen. Die ermittelten Daten werden in die PROXY-Datenbank eingetragen um den nächsten Start zu beschleunigen. Sollten mehrere Proxys erkannt werden, so wird der schnellste in die Datei /etc/HTTP-PROXY eingetragen.
  5. Sollte auch dieser Test fehlschlagen, so beendet sich das Script.

Als TESTURL verwende ich das PHP-Script zur Zeiteinstellung auf meiner Webseite. Diesem hänge ich noch einen Zufallswert als Parameter an, damit die Proxys gezwungen sind, die Testseite neu zu laden und nicht einfach den Inhalt ihres Caches wiedergeben. Damit wird die Messung der Zugriffszeit durch das Scriptes auch aussagekräftig.

Inhalt der Datei rc.proxy_suche
#!/bin/sh
# Frank Schlaefendorf <frank@schlaefendorf.de>
# erstellt am 12.02.2005
# letzte Aenderung am 27.02.2005
#
# nach welchen proxports soll gesucht werden?
PORTLISTE="3128,8080"
# wieviele sekunden soll maximal auf eine webseite gewartet werden?
ZEITGRENZE=15
# wo befindet sich die proxydatenbank?
PROXYDB="/etc/proxydb"
# mit welcher url soll der internettest durchgefuehrt werden?
TESTURL="http://www.schlaefendorf.de/datum.php4?zufall=$$"
# ist die dateigroesse der testseite bekannt? wenn ja, geben sie die
# groesse in bytes ein, damit die seite genau identifiziert werden kann
# und nicht faelschlicher weise statusseite des proxys als antwort
# gewertet werden.
# wenn die groesse unbekannt ist, leer lassen
# die datumantwort besteht immer aus 15 bytes
TESTURLLEN=15
# wo soll die testseite abgelegt werden
TESTSEITE="/tmp/testseite"
# systemproxy eintrag
SYSTEMPROXY="/etc/HTTP-PROXY"


#
DEVICE=$1
# vordefinierte werte
FOUNDPROXYADDR=""
FOUNDPROXYTIME=3600
IPADDR=""
BROADCAST=""
NETMASK=""
NETADDR=""
HWADDR=""
HOSTNAME=""
DOMAIN=""
NETMASK2=""

# die netzmaske wird von der schreibweise ***.***.***.***
# in die Notation /XX umgewandelt

conv_netmask(){
 NETMASKE=0
 for nummer in `echo $1 | tr '.' ' '`
 do
  for wert in 128 64 32 16 8 4 2 1
  do  
   if [ "$nummer" -ge "$wert" ]; then
    let "NETMASKE=NETMASKE+1"
    let "nummer=nummer-wert"
   else
    break
   fi
  done
  if [ "$nummer" -ne "0" ]; then
   NETMASKE=""
   break
  fi
 done 
 return $NETMASKE
}

# die proxydatenliste wird neu sortiert

proxydb_reorganisieren(){
 # existiert die proxydatenbank?
 if [ -e ${PROXYDB} ]; then
  sort -d -u -f +0 -7 ${PROXYDB} -o ${PROXYDB}.tmp
  mv ${PROXYDB}.tmp ${PROXYDB}
 fi
}

# testet die erreichbarkeit der seite $2 ueber den proxy $1
url_test(){
 http_proxy=$1
 TESTURL=$2
 TIMEFILE=${TESTSEITE}.time
 # proxy in die lynx umgebungsvariable eintragen
 export http_proxy
 # eventuell vorhandene testseite loeschen
 if [ -e ${TESTSEITE} ]; then
  rm ${TESTSEITE}
 fi
 # eventuell vorhandenen zeitstempel loeschen
 if [ -e ${TESTSEITE}.time ]; then
  rm ${TESTSEITE}.time
 fi
 # seite laden und notwendige zeit messen
 # lynx starten und in den hintergrund schicken
 # die testseite steht in $TESTSEITE und die zugriffszeiten in $TIMEFILE
 (time lynx -source ${TESTURL} 2> /dev/null 1> ${TESTSEITE}) 2> ${TIMEFILE} 1> /dev/null &
 ZEITGEBER=$ZEITGRENZE
 TIME=""
 # zeitgeber bis 0 herunterzaehlen
 while [ "$ZEITGEBER" -gt 0 ]
 do
  let "ZEITGEBER=ZEITGEBER-1"
  # ist lynx fertig?
  if [ -s ${TIMEFILE} ]; then
   sleep 1
   # zeit auslesen
   TIME=`cat ${TIMEFILE}`
   rm ${TIMEFILE}
   break
  else
   sleep 1
  fi
 done
 # hat die testseite mindestens ein zeichen und wurde eine antwortzeit gemessen?
 if [ -s ${TESTSEITE} -a "$TIME" != "" ]; then
  ACCEPT=1
  if [ "$TESTURLLEN" != "" ]; then
   if [ "$( ls -l ${TESTSEITE} | cut -c40-42 )" != " ${TESTURLLEN}" ]; then
    ACCEPT=0
   fi
  fi
  if [ "$ACCEPT" == "1" ]; then
   # realzeit auslesen
   TIME=`echo $TIME | egrep -o -e "real [0-9]{0,2}[h]{0,1}[0-9]{0,2}[m]{0,1}[0-9]{1,2}\.[0-9]{1,4}s" `
   # die einzelnen zeitangaben auslesen und in millisekunden umrechnen
   STUNDEN=`echo $TIME | egrep -o -e "[0-9]{1,2}[h]{1}"`
   if [ "$STUNDEN" == "" ]; then
    STUNDEN=0
   else
    STUNDEN=`echo $STUNDEN | cut -dh -f1`
   fi
   MINUTEN=`echo $TIME | egrep -o -e "[0-9]{1,2}[m]{1}"`
   if [ "$MINUTEN" == "" ]; then
    MINUTEN=0
   else
    MINUTEN=`echo $MINUTEN | cut -dm -f1`
   fi
   VSEKUNDEN=`echo $TIME | egrep -o -e "[0-9]{1,2}\.[0-9]{1,4}s" | cut -ds -f1`
   if [ "$VSEKUNDEN" == "" ]; then
    SEKUNDEN=0
    MSEKUNDEN=0
   else
    SEKUNDEN=`echo $VSEKUNDEN | cut -d. -f1`
    MSEKUNDEN=`echo $VSEKUNDEN | cut -d. -f2`
   fi
#  echo "${STUNDEN}h ${MINUTEN}m ${SEKUNDEN}s ${MSEKUNDEN}ms"
   let "ZEIT=STUNDEN*3600+MINUTEN*60+SEKUNDEN"
   if [ "$ZEIT" != "0" ]; then
    ZEIT="${ZEIT}${MSEKUNDEN}"
   else
    ZEIT=${MSEKUNDEN}
   fi
  else
   ZEIT=""
  fi
 else
  # lynx hat wahrscheinlich keinen kontakt und laeuft noch
  # killen des hintergrundprozesses lynx, falls dieser sich nicht beendet hat
  # eventuell anderes kommando !!!!!
  kill -9 %1
  # zeit=="" -> kein kontakt
  ZEIT=""
 fi
 # ZEIT enthaelt die ladezeit von lynx in millisekunden
 echo $ZEIT
}

#ermittelt die netzwrkdaten des devices

scanne_device(){
 DEVICE=$1
 if [ "$DEVICE" != "" ]; then
  IFCONFIG=`ifconfig $DEVICE 2> /dev/null `
  if [ "$?" == "0" ]; then
   # das device ist initialisiert
   IPADDR=`echo $IFCONFIG | egrep -o -e "inet addr:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" | cut -d: -f2`
   if [ "$IPADDR" != "" ];then
    BROADCAST=`echo $IFCONFIG | egrep -o -e "Bcast:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" | cut -d: -f2`
    NETMASK=`echo $IFCONFIG | egrep -o -e "Mask:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" |cut -d: -f2`
    HWADDR=`echo $IFCONFIG | egrep -o -e "HWaddr [0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}" | cut -d' ' -f2 `
    NETADDR=`/bin/ipmask $NETMASK $IPADDR | cut -d ' ' -f2 `
    HOSTNAME=`host -W3 ${IPADDR} | cut -d' ' -f5` 
    DOMAIN=`echo $HOSTNAME | cut -s -d. -f2-`
    if [ "$DOMAIN" == "" ]; then
     DOMAIN=none
    fi
    conv_netmask $NETMASK
    NETMASK2=$?
    return 0
   else
    return 1
   fi
  else
   # das device existiert nicht
   IPADDR=""
   BROADCAST=""
   NETMASK=""
   HWADDR=""
   NETADDR=""
   HOSTNAME=""
   DOMAIN=""
   NETMASK2=""
   return 1
  fi
 else
  return 2
 fi
}

# ueber das device wird ein verfuegbarer http proxy gesucht
suche_proxy(){
 if [ "$IPADDR" != "" ]; then
  FOUNDPROXYADDR=""
  FOUNDPROXYTIME=3600
  echo "Es werden am Device $DEVICE die Ports ${PORTLISTE} gescannt."
  HOSTLISTE=`nmap -sS -p T:${PORTLISTE} -n -e $DEVICE ${NETADDR}/${NETMASK2} | tr ' ' '_'`
  # echo $HOSTLISTE
  HOST=""
  PROXYLISTE=""
  #einlesen der hostliste von nmap 
  for eintrag in $HOSTLISTE
  do
#   echo $eintrag
   # suche nach einer zeile Interesting_ports_on_IP
   HOSTIP=`echo $eintrag | egrep -o -e "Interesting_ports_on_[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:"`
   if [ "$HOSTIP" != "" ]; then
    # eintragen der ip des hostes in FOUNDHOSTIP
    FOUNDHOSTIP=`echo $HOSTIP | egrep -o -e "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:"`
    echo "Der Host $FOUNDHOSTIP ist aktiv"
   else
    # enthaelt die folgezeile einen tcp open eintrag?
    PORTZEILE=`echo $eintrag | egrep -o -e "[0-9]{1,6}/tcp_open[_]{1,5}[0-9a-zA-Z\-]{1,10}"`
    if [ "$PORTZEILE" != "" ]; then
     # auslesen der portnummer
     PORT=`echo $PORTZEILE | cut -d/ -f1 `
     # auslesen des portnamen
     NAME=`echo $PORTZEILE | cut -d_ -f4 `
     ZEIT=`url_test "http://${FOUNDHOSTIP}${PORT}" $TESTURL`
     if [ "$ZEIT" != "" ]; then
      echo " Es wird der Proxyservice $NAME mit einer Antwortzeit von ${ZEIT}ms angeboten"
      # eintrag des Rechners in die proxydatenbank
      echo "${HWADDR} ${DOMAIN} ${NETMASK} ${NETADDR} ${NETMASK2} ${IPADDR} ${FOUNDHOSTIP}$PORT ${NAME} ${ZEIT} " >> ${PROXYDB}
      if [ "$ZEIT" -lt "$FOUNDPROXYTIME" ]; then
       FOUNDPROXYADDR=${FOUNDHOSTIP}${PORT}
       FOUNDPROXYTIME=$ZEIT
      fi
     else
      echo " Es wird der Proxyservice $NAME mit zu grosser Antwortzeit angeboten"
     fi
     rm ${TESTSEITE}
    fi
   fi
  done
  proxydb_reorganisieren
  return 0
 else
  return 1
 fi
}

suche_proxy_in_db(){
 # wurde das device schon gescannt?
 if [ "$IPADDR" != "" ]; then
  ZEIT=""
  # verfuegbare proxylisteneintraege auslesen
  if [ -e $PROXYDB ]; then
   LISTE=`cat $PROXYDB | grep "${HWADDR} ${DOMAIN} ${NETMASK} ${NETADDR} " | sort +8n | tr ' ' ';'`
#  echo $LISTE
   for eintrag in ${LISTE}
   do
#   echo "eintrag=${eintrag}"
    # proxyadresse heraustrennen
    PROXY=`echo $eintrag | cut -d';' -f7`
#   echo "proxy=${PROXY}"
    # proxykontakt testen
    ZEIT=`url_test "http://${PROXY}" $TESTURL 2> /dev/null`
    # konnte die testurl gelesen werden?
    if [ "$ZEIT" != "" ]; then
#    echo "KONTAKT OK"
     FOUNDPROXYADDR=$PROXY
     FOUNDPROXYTIME=$ZEIT
     break
    fi
   done
   if [ "$ZEIT" != "" ]; then
    # es wurde ein passender proxy in der db gefunden
    return 0
   else
    # es wurde kein passender proxy in der db gefunden
    return 2
   fi
  else
   # es exitiert noch keine datenbank
   return 3
  fi
 else
  # das device wurde noch nicht gescannt
  return 1
 fi
}

# eintragen des proxys in die systemdatei
save_proxy(){
 echo "${FOUNDPROXYADDR} ${FOUNDPROXYTIME}"
 echo "http://${FOUNDPROXYADDR}" > ${SYSTEMPROXY}
}

echo "Scanne Device $DEVICE"
scanne_device $DEVICE
case $? in
 0)
  ZEIT=`url_test "$http_proxy" $TESTURL`
  ZEIT=""
  if [ "$ZEIT" != "" ]; then
   echo "Die aktuelle Proxyeinstellung ist ausreichend."
   echo "Die Testseite $TESTURL wurde in ${ZEIT}ms geladen"
  else
   echo "IP=${IPADDR}/${NETMASK}"
   echo "IP=${IPADDR}/${NETMASK2}"
   echo "BROADCAST=${BROADCAST}"
   echo "NETZADRESSE=${NETADDR}"
   echo "HWADRESSE=${HWADDR}"
   echo "HOSTNAME=${HOSTNAME}"
   echo "DOMAIN=${DOMAIN}"
   echo "Suche in der Datenbank nach einem passenden Proxy"
   suche_proxy_in_db
   case $? in
    0) 
     echo "Treffer"
     save_proxy
     exit 0
    ;;
    1) 
     echo "Das Device $DEVICE ist nicht aktiv"
     exit 2
    ;;
    2)
     echo "Die Datenbank enthaelt keinen passenden Eintrag"
     echo "Scanne das Netz" 
     suche_proxy
     case $? in
      0)
       echo -n "Treffer"
       save_proxy
       exit 0
      ;;
      *)
       echo "Es wurde leider kein Proxyzugang gefunden!"
       exit 3
      ;;
     esac
    ;;
    3)
     echo "Es existiert keine Proxydatenbank"
     echo "Scanne das Netz" 
     suche_proxy
     case $? in
      0)
       echo -n "Treffer"
       save_proxy
       exit 0
      ;;
      *)
       echo "Es wurde leider kein Proxyzugang gefunden!"
       exit 3
      ;;
     esac
    ;;
   esac
  fi
 ;;
 1)
  echo "Das Device $DEVICE ist nicht aktiv"
  exit 1
 ;;
 2)
  echo "Sie haben kein Device angegeben"
  exit 2
 ;;
esac

# returncodes
# 0 proxy gefunden und eingetragen
# 1 das device ist nicht aktiv
# 2 es wurde kein device angegeben
# 3 kein proxy gefunden
 
>>>Download rc.proxy_suche

Das Script wird aufgerufen mit /etc/rc.d/rc.proxy_such DEVICENAME, also z.B. /etc/rc.d/rc.proxy_such eth0.

TOP Hilfsscripte Solid-State-Disk Software

Software Software Nedit Der WWW-Browser dillo

Der dillo-Browser ist ein kleiner, schlanker Browser. Er ist für den Libretto wie geschaffen, da er äußerst genügsam ist. Ab heute (02.05.2006) ist die Version 0.8.6 verfügbar. Nach dem Download des 432kByte großen tar.bz2-Sourcefiles von der dillo-Download-Seite gestaltet sich die Kompilierung als einfach. Wer will, kann für die Slackware auch ein vorkompiliertes tgz-Archiv installieren. Außerdem werden auch download-Links für Debian und NETBSD angeboten. Hier nun eine kurze Installationsbeschreibung für das Sourcenpaket auf dem Libretto:

  1. Mit cd /usr/local in das Verzeichnis /usr/local/ wechseln und das Sourcenpaket dort hin kopieren/downloaden.
  2. Entpacken des gepackten tar-Archivs mit tar -jxf dillo-0.8.6.tar.bz2
  3. Mit cd dillo-0.8.6 in das neue Verzeichnis dillo-0.8.6 wechseln
  4. Dort sollte man sich auf jeden Fall die INSTALL-Datei durchlesen, also less INSTALL
  5. Wie erwartet besteht die eigentliche Kompilierung nur aus wenigen Schritten, also los!
  6. Da ich auf dem Libretto GTK und nicht FLTK2 installiert habe, muss ich configure eine entsprechende Option mitgeben, da es sonst zu einem Fehler beim kompilieren kommt. Aufruf der automatischen Konfiguration starte ich also mit ./configure --disable-dlgui (Punkt und Slash vor configure nicht vergessen!!). Es wird nun getestet, ob sich alle notwendigen Pakete bereits auf dem Rechner befinden (gcc, glib>1.2.0, gtk>1.2.0, usw usf). Sollte configure mit einer Fehlermeldung abbrechen, so liegt das meist an fehlender Software, die dann nachzuinstallieren ist.
  7. Wenn configure ohne Probleme durchgelaufen ist, können wir uns an das kompilieren wagen. Dazu geben wir entweder make oder besser make check ein und schauen, was er uns zu sagen hat. Da das ganze eine Weile dauert (ca 25min auf dem Libretto), ist Pause angesagt.
  8. Wenn das glatt gegangen ist und keine Fehlermeldungen aufgetaucht sind, gehts ans installieren. Wir starten das ganze mit make install. Nach ein paar Sekunden ist alles installiert und wir können dillo starten. Rein ins X und ein xterm geöffnet. Mit /usr/local/bin/dillo müsste nun nach ca 4Sekunden dillo-0.8.6 gestartet sein. Das Gröbste ist erledigt, bleibt nun noch die Konfiguration.

Für die Konfiguration des dillo-Browsers sind die folgenden Dateien am wichtigsten:

  1. /usr/local/etc/dillorc für systemweite Einstellungen durch root
  2. ~/.dillo/dillorc im HOME-Verzeichnis des Users für benutzerdefinierte Einstellungen

Wenn der User eigene Einstellungen definieren möchte, muss er sich in seinem HOME-Verzeichnis ein entsprechendes Unterverzeichnis anlegen und die systemweite dillorc dort hineinkopieren. Das erreicht man folgendermaßen:

  1. Auf einer Konsole oder im X mit dem Userlogin anmelden. Im X muss noch ein xterm geöffnet werden.
  2. Zum Wechsel in das Homeverzeichnis cd eingeben.
  3. Verzeichnis anlegen mit mkdir .dillo, Punkt vor dem Verzeichnisnamen nicht vergessen. Unter Umständen kann es hier eine Fehlermeldung geben, weil das Verzeichnis bereits existiert. Das kann zwei Gründe haben. Entweder wurde der dillo durch den User schon einmal gestartet und dabei wurde das Verzeichnis automatisch angelegt oder es lief bereits eine Vorgängerversion von dillo. Dann sollte man die alte dillorc sichern oder an die neue dillo-Version ggf anpassen.
  4. Kopieren der Datei dillorc mit cp /usr/local/etc/dillorc .dillo/. Die Datei dillorc liegt jetzt im Verzeichnis ~/.dillo und kann durch den User angepasst werden.

Hier mal ein Abzug meiner dillorc

Inhalt der Datei dillorc
# dillorc
# Sample dillo initialization file.
# Copy this file to ~/.dillo/dillorc and edit to your taste.
# Lines that start with a '#' are comments.


#-------------------------------------------------------------------------
#                             FIRST SECTION                             :)
#-------------------------------------------------------------------------

# Set the desired initial browser size
geometry=640x440

# Dicache is where the Decompressed Images are cached (not the original ones).
# If you have a lot of memory and a slow CPU, use YES, otherwise use NO
use_dicache=YES


#-------------------------------------------------------------------------
#                           RENDERING SECTION
#-------------------------------------------------------------------------

# Fontname for variable width rendering (most of the text).
#   - some fonts may slow down rendering, some others not!
#   - try to tune a fontname/font_factor combination.
# Ex. {helvetica, lucida, times, "new century schoolbook", utopia, ...}
vw_fontname=helvetica

# Fontname for fixed width rendering (mainly <pre> quoted text)
fw_fontname=courier

# All fontsizes are scaled by this value (default is 1.0)
#font_factor=1.2

# If you prefer oblique over italic fonts, uncoment next line
#use_oblique=YES

# Show tooltip popup for images?
# Note: We use the "title" attribute and not "alt".
#       More info at: http://bugzilla.mozilla.org/show_bug.cgi?id=25537
show_tooltip=YES

# Set this to YES, if you want to limit the word wrap width to the vieport
# width (may be useful for iPAQ)
limit_text_width=NO


#-------------------------------------------------------------------------
#                            PARSING SECTION
#-------------------------------------------------------------------------

# If you prefer more accurate HTML bug diagnose, over better rendering
# (page authors and webmasters) set the following to "NO".
#
w3c_plus_heuristics=YES


#-------------------------------------------------------------------------
#                            NETWORK SECTION
#-------------------------------------------------------------------------

# Set the start page.
# Uncomment if you want to override the default start page.
#start_page="file:/home/user/custom.html"

# Set the home location
home="http://www.dillo.org/"

# Set search url to use with the search dialog.
# %s is replaced with urlencoded keywords, and %% by '%'.
search_url="http://www.google.de/search?q=%s"
#search_url="http://search.lycos.com/default.asp?query=%s"
#search_url="http://www.alltheweb.com/search?cat=web&query=%s"

# Set the proxy information for http
#http_proxy=http://localhost:8080/
http_proxy=http://192.168.1.1:3128
# if you need to provide a  user/password pair for the proxy,
# set the proxy user name here and Dillo will ask for the password later.
#http_proxyuser="joe"

# When using a proxy, this sets the domains to access without proxy.
# (separated with a single space -- see examples below)
#no_proxy = ".mynet.com"
#no_proxy = ".mynet.com .other.net .foo.bar.org"


#-------------------------------------------------------------------------
#                            COLORS SECTION
#-------------------------------------------------------------------------

# Here we can use the HTML (standard and extended) or C syntax.

# Set the background color
# bg_color=gray
# bg_color=0xd6d6c0
bg_color=0xdcd1ba

# Set the text color
text_color=black

# Set the link color
link_color=blue

# If your eyes suffer with white backgrounds, or you have headaches after
# lengthy computer sessions, and you don't need high contrast to see sharply,
# uncomment next line (it'll use 'bg_color' instead).   -- It works!
#allow_white_bg=NO

# Use the same colors with all documents?
force_my_colors=NO

# When set to YES, visited links will always have a contrasting color,
# independent of the page author's setting.
contrast_visited_color=YES

#-------------------------------------------------------------------------
#                        USER INTERFACE SECTION
#-------------------------------------------------------------------------

# Size of dillo panel (used to enlarge the browsing area)
# tiny   :  recommended for iPAQ (with small_icons)
# small  :  very nice! (it's "medium" without icon titles)
# medium :  nice!
# large  :  Traditional
panel_size=tiny
small_icons=YES

# Here you can choose to hide some widgets of the dillo panel...
#show_back=NO
#show_forw=NO
#show_home=NO   
#show_reload=NO
#show_save=NO
#show_stop=NO
#show_bookmarks=NO
#show_menubar=NO
#show_clear_url=NO
#show_url=NO
#show_search=NO
#show_progress_box=NO

# Start dillo windows with a hidden panel?
fullwindow_start=NO

# Enabling this will restrain OpenUrl and FindText, but may be required
# for the ION window manager.
transient_dialogs=NO

# When filling forms, our default behaviour is to submit on enterpress,
# but only when there's a single text entry (to avoid incomplete submits).
# OTOH, if you have to fill the same form lots of times, you may find
# useful to keep away from the mouse by forcing enter to submit.
enterpress_forces_submit=NO

# Some forms lack a submit button, and dillo can generate a custom one
# internally. Unfortunately there's no guarantee for it to work. :(
# (my experience is that forms that lack a submit rely on Javascript)
generate_submit=NO

#-------------------------------------------------------------------------
#                        DEBUG MESSAGES SECTION
#-------------------------------------------------------------------------

# Generic messsages (mainly for debugging specific parts)
# Uncomment the following line to disable them.
#show_msg=NO

# Soon we'll add the "show_debug_messages=NO" option...

#-------------------------------------------------------------------------
#                        HTML BUG MESSAGES SECTION
#-------------------------------------------------------------------------

# Accepted by the W3C validator but "strongly discouraged" by the SPEC.
# (As "TAB character inside <PRE>").
#show_extra_warnings=YES


# -----------------------------------------------------------------------
# dillorc ends here.
 
>>>Download dillorc

Bestimmte Einschränkungen muss man bei der Arbeit mit dillo leider hinnehmen. Er ist zwar schnell, klein und sehr ressourcenschonend, aber er unterstützt zB. keine Frames.

Hier rennt der dillo-Browser
DILLO spurtet

Software dillo Solid-State-Disk Der Editor Nedit

TOP Software Fazit Solid-State-Disk

Transcend SSD TS4GIFD25 Vor ein paar Tagen schoss es mir plötzlich durch den Kopf, dass der IDE-Anschluss ja extrem im Aussterben begriffen ist und entsprechende Platten bald entweder überhaupt nicht mehr zu bekommen sind oder nur noch Schrottwert besitzen und wenn nicht, mit Gold aufgewogen werden. Da ich vor langer Zeit meinen Libretto mal etwas hart aufsetzte, hatte die Festplatte seit dem einige defekte Sektoren auf der Hibernations-Partition am Ende der Platte. Dem wollte ich nun zu Leibe rücken.
Um das Problem generell zu lösen, entschloss ich mich für eine SSD, die folgende Mindestanforderungen erfüllen sollte:

Schaut man sich auf dem Markt um, so wird das Angebot an lieferbaren 2,5"-IDE-SSDs schon sehr dünn. Meine Wahl fiel letztendlich auf die TS4GIFD25 von Transcend mit ausreichenden 4GB Speichervolumen. Diese SSD erfüllt alle Bedingungen ausreichend und ist von der Datenrate schneller als der interne Bus des Libretto :-).
Zur Installation habe ich die Platte in einen anderen Laptop eingehängt und mit der Installations-CD der Slackware 9.1 partitioniert und formatiert. Ein Update auf Slackware 12.2 wollte ich nicht dürchführen, da ich sonst alle Anpassungen an die Libretto-Hardware erneut händisch durchführen müsste und dazu hatte ich weder Zeit noch Lust. Mittels tar habe ich das Dateisystem auf dem Libretto gepackt, per Netz übertragen und auf dem anderen Laptop auf der SSD wieder abgelegt. Fehlt nur noch Lilo. Also Laptop mit der SSD neu gebootet und von der Install-CD starten lassen. Am boot-Prompt habe ich dann mit
bare.i root=/dev/hda3 noinitrd ro
das System auf der SSD mit dem bare-Kernel der Install-CD gestartet und lilo ausgeführt. Nun musste die SSD nur noch in den Libretto eingebaut werden, fertig, läuft.
Den Libretto umgibt jetzt im Betrieb eine angenehme Totenstille, einfach toll. Nebenbei verbraucht die SSD ca 600mA weniger Strom als die vorher verbaute IDE-Festplatte und so dürften die Akkus wesentlich länger halten.

TOP Software Fazit Fazit

Ich nutze den Libretto nun schon viele Jahre. Er befindet sich in meinem Service-Koffer, der alle nötigen Dinge für den Vorort-Service enthält. Das System läuft extrem stabil und durch die Benutzung des Hibernations-Modus musste ich das Gerät auch über Jahre hinweg nicht neu booten. Als ich die SSD eingebaut habe, musste ich den Libretto mal neu starten, vorher lief er fast 2 Jahre ohne Neuboot. Mit der Zeit macht sich jedoch immer mehr das Fehlen eines USB-Anschlusses bemerkbar. Für den Zugriff über die ssh oder als serielles Terminal oder das Einspielen von Updates auf anderen Rechnern ist er immer noch meine erste Wahl, da er wegen seiner geringen Größe problemlos im Koffer Platz findet.
Das schafft kein anderes Gerät.

TOP Fazit Links Linkliste

TOP Links Hinweis Hinweis

Diese Seite ist nicht vollständig und wird es wohl auch nie werden, denn LinuX bietet viele Möglichkeiten :-).
Die vorgestellte Installationsanleitung erhebt deshalb keinen Anspruch auf Vollständigkeit sondern soll als Anregung, Hilfe und Unterstützung dienen. Alle hier beschriebenen Schritte beziehen sich auf den Toshiba Libretto 50CT und die Slackware 9.1 (Kernel 2.4.22) und wurden von mir auf einem solchen Gerät getestet. Trotzdem können sich natürlich Fehler eingeschlichen haben. Sollten Sie einen solchen Fehler feststellen oder einen Verbesserungsvorschlag haben, so bitte ich um eine kurze email. Für Beschädigungen oder Datenverluste die durch diese Installation oder die downloadbaren Scripte und Softwarepakete entstanden sind, kann keine Haftung übernommen werden. Die Lizenzbestimmungen (GPL) der Softwarepakete sind durch den Anwender zu beachten. Meine Scripte stelle ich zur freien Verfügung. Sie dürfen heruntergeladen, kopiert und verändert werden, wenn der Hinweis auf die ursprüngliche Urheberschaft im Dokumentenkopf erhalten bleibt.

Letzte Änderung am 23.12.2009
Die Tippfehler in dieser Seite sind nicht urheberrechtlich geschützt. Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.



Sollte jemand seine Rechte durch eine Veröffentlichung auf dieser oder einer anderen meiner Seiten verletzt sehen, bitte ich um sofortige Kontaktaufnahme. Ich werde die entsprechenden Inhalte umgehend entfernen. Somit sind sowohl ein anwaltlicher Rat als auch eine kostenpflichtige Abmahnung nicht erforderlich! Weiterhin weise ich darauf hin, dass der Inhalt verlinkter Seiten nicht in meiner redaktionellen Verantwortung liegt.
Vielen Dank

www.schlaefendorf.de 2011

www.linux-web.de