Terminals unter UNIX

Willemers Informatik-Ecke

Terminals bestehen aus einer Einheit aus Tastatur und einem Monitor, die unter UNIX normalerweise über eine serielle Leitung mit dem Rechner verbunden sind. Dabei beherrschen die einfachen Terminals nur die Fähigkeit mit festen Zeichen umzugehen. Da es Terminals verschiedener Hersteller gibt, liefern Terminals je nach Typ unterschiedliche Kodierungen für die Sondertasten und benötigen unterschiedliche Sequenzen, um den Bildschirm anzusteuern.

Echte Terminals gibt es kaum noch. Da Netzverkabelungen heute billiger sind als serielle Kabel und die PCs sowieso auf jedem Arbeitsplatz stehen, gehen immer mehr Terminals in Rente. An einer Stelle allerdings sind sie in manchen Fällen von unschätzbarem Wert: im Serverraum als Konsole. Denn im Falle eines Zusammenbruchs der Netzwerkkomponente ist es gut, einen Zugang zur Maschine zu haben, der nicht vom Netzwerk abhängig ist.

Konfiguration der Terminals

inittab und ttys

Bei Hochfahren des Systems liest der Prozeß init die Datei /etc/ttys (bei BSD-Systemen) oder /etc/inittab (bei System V), um festzustellen, welche Terminals verfügbar sein sollen. In beiden Systemen existiert für jedes Terminal eine Zeile.

/etc/ttys

Die Datei /etc/ttys unter BSD ist recht einfach aufgebaut. Zunächst kommt der Gerätename des Terminals, es folgt der Programmaufruf des getty, der für dieses Terminal zuständig ist. Anschließend kommt der Terminaltyp der termcap, der für dieses Terminal standardmäßig verwendet werden soll. Die beiden folgenden Spalten geben an, ob man sich als root anmelden kann oder nicht.

console none                            unknown off secure
ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure

Der Eintrag in der inittab sieht geringfügig anders aus, erfüllt aber den gleichen Zweck.

5:123:respawn:/sbin/mingetty tty5
6:123:respawn:/sbin/mingetty tty6
S0:123:respawn:/sbin/agetty -L 9600 ttyS0

Ein Eintrag in der inittab hat folgende Struktur:

ID:Runlevel:Aktion:Prozess

ID:
Dies ist die Kennung der Zeile, sie besteht maximal 2 oder 4 Zeichen.
Runlevel:
In welchem Runlevel die Aktion auszuführen ist. Im Beispiel sind die Aktionen in Runlevel 1, 2 und 3 aktiv.
Aktion:
Hier können verschiedene Schlüsselworte stehen. Im Falle eines Terminaleintrags steht hier immer respawn. Das bedeutet, dass wenn der Prozess stirbt, sofort ein neuer Prozess gestartet wird.
Prozess:
Der Prozess, der zu diesem Eintrag gehört und gestartet wird.

Um ein weiteres Terminal anzuschließen, ist ein neuer Eintrag notwendig. Anschließend muss der Prozess init dazu gebracht werden, die Datei erneut zu lesen. Man erreicht dies, indem man init das SIGHUP-Signal zusendet. Der Befehl lautet:

kill -1 1

Startup der getty

Der init-Prozess startet beim Hochfahren für jede Terminalleitung den entsprechenden Befehl, so wie er in /etc/inittab bzw. /etc/ttys aufgeführt ist. Normalerweise ist dies getty oder ein verwandtes Programm. getty bewacht die Leitung. Tut sich etwas, startet er login, welcher wiederum bei erfolgreicher Anmeldung die Shell startet. Beim Abmelden wird die Shell einfach beendet.

Aktion nach Ende des Prozesses

Ebenfalls in der inittab steht, was nach dem Tod des letzten Programmes passieren soll. Für Terminals steht hier respawn, da nach der Abmeldung bzw. der erfolglosen Anmeldung getty wieder in Aktion treten soll.

Kryptische Zeichen

Es ist bei vielen Systemen möglich, mehrere Baudraten für ein Terminal anzugeben. Eine falsche Baudrate zeigt sich am Terminal durch wilde Zeichen. Durch Drücken der Taste Break (In den meisten Terminalemulationen findet sich in den Menüs ein Kommando, um einen Break zu senden.) am Terminal wird getty veranlaßt, zyklisch die nächste Baudrate zu verwenden. Man drückt also Break, bis man das Login lesen kann und meldet sich dann an.

nur Großbuchstaben

Eine Anmeldung nur in Großbuchstaben interpretiert getty so, dass das Terminal nur Großbuchstaben beherrscht. Darum werden alle Groß­buch­sta­ben als Kleinbuchstaben interpretiert. Echte Großbuchstaben werden mit einem voranstehenden Backslash interpretiert. Da es heute keine Terminals mehr gibt, die keine Kleinschreibung beherrschen, hat man wahrscheinlich versehentlich die Caps-Lock-Taste bei der Anmeldung gedrückt. Meldet man sich einfach erneut an, ist alles ist wieder im Normalzustand.

Die Terminalvariable TERM

Das eingestellte Terminal ist in der Umgebungsvariablen TERM hinterlegt. Für kurzfristige Änderungen des Terminals kann man den Inhalt dieser Variablen verändern. Da Umgebungsvariablen nicht automatisch an die Kindprozesse weitervererbt werden, sollte TERM exportiert werden. Greift dies nicht, kann man das Terminal mit dem Aufruf von tset initialisieren.

TERM=vt100
export TERM
tset

Das aktuelle Terminal wird auf vt100 eingestellt.

termcap

In den BSD-Varianten wie beispielsweise Solaris oder FreeBSD werden in der Datei /etc/termcap (Terminal Capabilities) die Charakteristiken der verschiedenen Terminals mit den zugehörigen Steuersequenzen definiert. Diese Datei hat gewisse Analogien zur /etc/printcap bei BSD-Druckern.

Als Beispiel ist hier der Eintrag für ein VT52-Terminal herausgegriffen, da dieses nicht so kompliziert ist. Es kennt keine Funktionstasten oder Farbe. An diesen Einträgen kann man bereits ermessen, dass das Einrichten eines Terminals schnell zur Geduldsprobe werden kann. Wenn Sie also eine eigene Terminalanpassung brauchen, kopieren Sie sich ein möglichst ähnliches Terminal und führen Sie die notwendigen Anpassungen durch.

vt52|dec vt52:\
   :bs:\
   :co#80:it#8:li#24:\
   :ac=«aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
   :ae=\EG:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
   :cr=^M:do=\EB:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
   :le=\ED:nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA:

Es gibt drei Arten Variablen. Boolesche Variablen werden genannt, wenn sie zutreffen. Numerische Variablen verwenden ein Hashzeichen (#) und Zeichenfolgen werden mit einem Gleichheitszeichen gekennzeichnet. Bei den Zeichenketten wird das ESC-Zeichen als \E notiert. Kontrollzeichen wird ein ^ vorangestellt. Die Bedeutung der wichtigsten Variablen sind:

Kürzel Bedeutung
bs Backspace führt Rückschritt aus
co# Anzahl der Spalten
li# Anzahl der Zeilen
it# Tabulatorenweite
as= Startkennung des alternativen Zeichensatzes
ac= Zeichenpaare für Blockgrafik
ae= Endekennung des alternativen Zeichensatzes
bl= Zeichen, das einen Piep auslöst (bell)
cd= Löschen bis Bildschirmende
ce= Löschen bis Zeilenende
cl= Bildschirm komplett löschen, Cursor links oben
ho= Cursor eine Zeile nach links oben positionieren
cm= Cursor positionieren
do= Cursor eine Zeile nach unten bewegen
le= Cursor ein Zeichen nach links bewegen
nd= Cursor ein Zeichen nach rechts bewegen
up= Cursor eine Zeile nach oben bewegen

Kürzel Bedeutung
cr= Eingabezeichen für Wagenrücklauf
kb= Taste für Backspace
kd= Taste für Cursor unten
kl= Taste für Cursor links
kr= Taste für Cursor rechts
ku= Taste für Cursor oben
nw= Kommando Carriage Return
sf= Eine Zeile scrollen
sr= Rückwärts scrollen
ta= nächsten Tabulator anspringen

Weitere Variablenkürzel finden sich in der Manpage von termcap.

terminfo

System V und Linux verwenden die Datei /etc/terminfo zur Ansteuerung von Terminals. Diese Datei liegt nicht mehr als eine große Textdatei wie die termcap vor. Durch die vielen unterschiedlichen Terminals ist eine termcap derart groß, dass die Verwaltung schwierig wird.

terminfo compiler tic

Der Eintrag eines Terminals wird in einer eigenen Textdatei erstellt, dann mit dem Terminfo Compiler tic compiliert und anschließend unter dem Verzeichnis /usr/lib/terminfo abgestellt.

Um eine Terminalbeschreibung zu finden beginnt man mit der Terminalbezeichnung. Der Name (vt100, wyse370, etc.) führt zu einer Datei unterhalb des Verzeichnisses /usr/lib/terminfo. Dort finden sich Verzeichnisse mit einem Buchstaben. Diese Buchstaben sind der jeweils erste Buchstabe der Terminalbezeichnung. Auf diese Weise wird das Verzeichnis terminfo nicht überfüllt, was ansonsten zu einer langen Antwortzeit führen würde. Um auf die Beschreibung eines Terminals mit der Kennung vt100 zuzugreifen, sucht UNIX die Datei vt100 in dem Verzeichnis /usr/lib/terminfo/v.

terminfo lesbar machen

Diese Datei befindet sich wie gesagt im Binärformat, ist also nicht direkt lesbar. Um eine textuelle Darstellung der Terminfodatei zu erhalten, verwendet man den Befehl infocmp. Durch Umleiten der Ausgabe kann man sich eine Sourcedatei herstellen. In dieser Datei werden die Eigenschaften des Terminals beschrieben. Sie können geändert werden und mit tic wieder zu Terminfodateien kompiliert werden.

Die exakte Beschreibung der Einträge in terminfo, die Funktionsweise von tic und infocmp können den jeweiligen Manpages entnommen werden. Prinzipiell ähneln sich die Einträge in terminfo und termcap.

Wenn das Terminal durcheinander ist

Wie oben gezeigt wurde, werden Terminals durch die Ausgabe von Kontrollsequenzen gesteuert. Erhält das Terminal falsche Sequenzen, kann es passieren, dass man keine Ausgaben mehr erhält. Dies kann beispielsweise dadurch passieren, dass man versehentlich Binärdateien mit cat anzeigen lässt. Besonders unangenehm ist dies, wenn es bei den eingebauten Konsolen passiert, da man diese nicht einfach ein- und ausschalten kann, ohne den gesamten Computer herunterzufahren. Hier hilft oft der Befehl:

stty sane

Vor und hinter dem Befehl sollte man ctrl-J statt der Entertaste benutzen, da das Terminal eventuell so durcheinander ist, dass es zusätzlich zum ctrl-J ein ctrl-M erzeugt, was die Shell nicht richtig interpretieren kann. UNIX verwendet allein ctrl-J als Zeilenvorschub, während andere Systeme Kombinationen aus ctrl-M und ctrl-J benutzen.

Der Befehl stty dient an sich in erster Linie zur Einstellung von Terminaleigenschaften wie der Baudrate. Die Option sane ist allerdings wohl die wichtigste Anwendung des Befehls.

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing


Homepage (C) Copyright 2002 Arnold Willemer