Linux LPI Test 101

Werbung
Linux LPI Test 101
Linux Systemadministration
Linux Freifach
Version 1.2 Bühler/Haller/Schneider
BerufsBildungBaden
IT-School
Angaben zum Dokument
Dateiname:
Vorlage:
lpic101
LATEX
Verantwortliche(r):
Klassifikation:
Pascal Bühler <[email protected]>
Jürg Haller <[email protected]>
Michael Schneider <[email protected]>
keine
Builddatum:
19. September 2005
Änderungsnachweis
Datum
Version
12.07.2003 1.0
11.08.2004 1.1
02.2005
1.2
Status
fertig
fertig
in Arbeit
Firma
BBBaden
BBBaden
BBBaden
Autor
PB/JH/MS
JH/MS
JH
Bemerkungen
Initiales Dokument
Aktualisierung
Aktualisierung
Version 1.2 Bühler/Haller/Schneider
ii
Zusammenfassung
Dieses Dokument beinhaltet viele Texte und Bilder aus dem Internet und anderen Quellen. Die meisten sollten im Literaturverzeichnis aufgeführt sein. Ihnen gebührt Dank und
Ehre. Ich möchte sicher nicht willentlich ein Copyright verletzen und werde deshalb auf
Beschwerden sofort reagieren.
Dieser Text wurde mit LATEX erstellt http://www.latex-project.org. LATEX ist eine Seitenbeschreibungssprache, die auf Grund einer Textdatei mit Formatierungsanweisungen eine
Ausgabe als Postscript, Acrobat PDF, Webseite, etc ermöglicht. LATEX gibt es für verschiedene Plattformen und das reine Textformat für Dokumente erlaubt das Einchecken
und Bearbeiten der Dokumente über ein Versionierungssystem.
Der Autor stellt diese Texte allen berechtigten Personen gerne im Quellformat zur
Verfügung und ist mehr als Dankbar wenn Änderungen, Anregungen, Berichtigungen oder
Kommentare eingefügt und/oder an [email protected] zur Einarbeitung in
das Orginaldokument zurückgegeben werden.
ABSTRACT HERE
ToDo:
ˆ ABSTRACT
Inhaltsverzeichnis
1 Die IT-School Infrastruktur
2
2 Ablauf und Inhalt der Prüfung
6
I
9
Linux allgemein
3 Geschichtliches
10
4 Linux Kernel
15
II
25
103 - GNU & Unix Kommandos
5 Arbeiten auf der Kommandozeile
26
6 Texte mittels Filterprogrammen bearbeiten
38
7 Grundlagen des Datei-Managements
52
8 Benutzen von Unix Streams, Pipes und Umleitungen
59
9 Erzeugung, Überwachung und Terminierung von Prozessen
63
10 Modifizeren von Prozessprioritäten
71
11 Durchsuchen von Textdateien mittels regulärer Ausdrücke
73
12 Grundlagen der Dateibearbeitung mit VI
80
i
III 104 - Gerätedateien, Linux Dateisysteme und der Filesystem Hierarchy Standard
83
13 Erzeugen von Partitionen und Dateisystemen
84
14 Erhaltung der Dateisystemintegrität
95
15 Kontrolle des Ein- und Aushängen von Dateisystemen
102
16 Verwalten von Diskquotas
107
17 Zugriffskontrolle auf Dateien mittels Zugriffsrechten
114
18 Verwaltung von Dateieigentum
123
19 Erzeugen und Ändern von echten und symbolischen Links
126
20 Auffinden von Systemdateien und Platzieren von Dateien an den korrekten Ort
132
IV
102 - Linux Installation und Paketmanagement
143
21 Entwurf einer Festplattenaufteilung
144
22 Installation eines Bootmanagers
147
23 Erstellen und Installieren von im Sourcecode vorliegenden Programmen155
24 Verwaltung von Shared Libraries
161
25 Vor- / Nachteile des Paketmanagements
165
26 Verwendung des Debian Paketmanagements
166
27 Verwendung des Red Hat Package Managers (RPM)
173
ii
V
101 - Hardware und Systemarchitektur
177
28 Hardwaregrundlagen
178
29 Konfiguration Grundlegender BIOS Einstellungen
187
30 Konfiguration von Modems und Soundkarten
192
31 Einrichten von SCSI -Geräten
203
32 Einrichtung verschiedener PC-Erweiterungskarten
209
33 Konfiguration von Kommunikationsgeräten
217
34 Konfiguration von USB-Geräten
218
VI
110 - Das X Window System
225
35 Die Theorie hinter X11
226
36 Installation und Konfiguration von XFree86
228
37 Einrichten eines Display Managers
241
38 Installation und Anpassung eines Windowmanagers
246
VII
Anhang
252
A Glossar
253
B Lösungen
254
Literaturverzeichnis
255
Index
257
1
Kapitel 1
Die IT-School Infrastruktur
1.1
Distributionen
(MS) Das LPI versucht, möglichst distributionsunabhängig zu sein und ein grosser Teil der
Arbeit an den Prüfungen wurde dafür verwendet diese distributionsspezifischen Teile aus
der Prüfung zu entfernen.
Wichtig ist, dass die grundlegenden Konzepte verstanden werden. Die Eigenheiten der
jeweiligen Distribution können dann viel einfacher erforscht und begriffen werden.
Der Teil, welcher noch am meisten von einer Distribution abhängig ist, ist der Packetmanager (Siehe Teil IV). Das LPI meint dazu:
Zum Beispiel fragen wir 3 Arten der Paketverwaltung ab: tar/gzip, rpm und
deb. Das bedeutet aber nicht, dass man Experte in rpm und deb sein muss,
denn man wird den Test auch dann bestehen, wenn man nur eines von beiden
beherrscht.
– http://www.lpi.org/de/faq2.html#2.10
Es empfiehlt sich also, eine RPM- oder DEB-Basierte Distribution zu verwenden wie RedHat oder Debian.
1.2
1.2.1
Knoppix
Was ist Knoppix
Als Alternative zu einem fest installierten Linux kann in diesem Kurs auch ein Linux auf
CD, eine sogenannte LiveDistribution verwendet werden. Dies bedeutet, dass das gesamte
Betriebssystem von einem Datenträger gestartet werden kann, ohne die lokalen Disks zu
2
beeinflussen. Eine der berühmtesten LiveDistributionen ist das auf Debian aufgebaute
Knoppix (http://www.knopper.net/knoppix/).
[3]KNOPPIX ist eine komplett von CD lauffähige Zusammenstellung von GNU/LinuxSoftware mit automatischer Hardwareerkennung und Unterstützung für viele Grafikkarten, Soundkarten, SCSI- und USB-Geräte und sonstige Peripherie. KNOPPIX kann als
Linux-Demo, Schulungs-CD, Rescue-System oder als Plattform für kommerzielle SoftwareProduktdemos angepasst und eingesetzt werden. Es ist keinerlei Installation auf Festplatte
notwendig. Auf der CD können durch transparente Dekompression bis zu 2 Gigabyte an
lauffähiger Software installiert sein.
1.2.2
Knoppix cheat Codes
Beim Start von KNOPPIX wird ein Bootprompt angezeigt, der auch Parameter entgegennimmt. Eine komplette Liste aller Codes befindet sich auf http://download.linuxtag.
org/knoppix/knoppix-cheatcodes.txt, hier nur eine kurze Zusammenfassung:
knoppix lang=cn|de|da|es|fr|it|nl
pl|ru|sk|tr|tw|us
knoppix screen=1280x1024
knoppix no{apic,agp,apm,audio,ddc}
knoppix no{firewire,pcmcia,scsi}
knoppix no{swap,usb}
failsafe
knoppix wheelmouse
knoppix keyboard=us xkeyboard=us
knoppix myconf=scan
expert
1.2.3
Specify language/keyboard
Specify language/keyboard
Use specified Screen resolution for X
Skip parts of HW-detection (1)
Skip parts of HW-detection (2)
Skip parts of HW-detection (3)
Boot with (almost) no HW-detection
Enable IMPS/2 protocol for wheelmice
Use different keyboard (text/X)
Load a previously saved configuration
Interactive setup for experts
Knoppix Einrichten für die IT-School
Tastatur umstellen
Schweizer Tastatur für die Shell (Bash, ...):
# kbdsetup
und sg-latin1 auswählen
X-Windows:
1. Unten rechts auf Flagge rechtsklicken
2. Configure wählen
3
3. Bei Primary Swiss German einstellen
WLAN-PCMCIA
In der Shell:
# sudo su
# cd /etc/pcmcia
# vi wireless.opts
Und nun:
1. Runterscrollen bis unter die erste Zeile mit *,*,*,*)
2. o drücken
3. Folgendes eingeben:
ESSID="bbb1"
KEY="s:12345"
Es sollte dann so aussehen:
[?]
*,*,*,*)
ESSID="bbb1"
KEY="s:12345"
;;
[?]
4. <ESC> drücken
5. :w!<ENTER> eingeben
6. :q!<ENTER> eingeben
7. Karte entfernen, kurz warten, wieder einschieben
X-Windows:
1. Im Toolbar unten links eine Konsole öffnen
2. So verfahren wie bei der Shell
4
WLAN-Centrino
In der Shell:
# sudo su
# iwconfig
Bestimmen, welchen Namen die Wireless-Karte hat (wlan0, ath0, eth1)
# cd /etc/network
# vi interfaces
Und nun:
1. Runterscrollen zum entsprechenden Eintrag
2. o drücken
3. folgendes eingeben:
iface wlan0 inet dhcp
wireless_mode managed
wireless_essid bbb1
wireless_rate auto
wireless_key s:12345
4. <ESC> drücken
5. :wq!<ENTER> eingeben
1.2.4
Arbeitsauftrag
⇒ Lern- und Arbeitsauftrag 1000 ,,Installation“
1.3
Moodle
Zu finden unter: http://bbb-linux1.bbbaden.ch/moodle. Um sich zu registrieren,
müssen sie sich an der IT-School befinden. Anwendbar ist es aber von jedem Internetzugang aus.
Die Repetitionsquizzes werden wie folgt gehandhabt: In der Woche, in der ein Quiz aktuell
ist, wird die erste Antwort als Punktzahl gewertet und es werden keine Rückmeldungen
über korrekte Antworten gegeben. Erst in der Woche darauf können die eigenen Antworten
überprüft werden und der Beste aller Durchgänge wird in die Rangliste aufgenommen.
5
Kapitel 2
Ablauf und Inhalt der Prüfung
2.1
Unterrichtsplanung
[JH] Der folgende Ablaufplan ist auf der Basis der Lernziele der Prüfung 101 http://www.
lpi.org/de/obj_101.html erstellt.
6
Für den Semesterkurs mit dem Lernziel LPI 101 sieht der Ablauf folgendermassen aus:
Woche
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
Lernziele
Linux Installationsparty
1.103.1 Arbeiten auf der Kommandozeile
1.103.2 Texte mittels Filterprogrammen bearbeiten
1.103.3 Grundlagen des Datei-Managements
1.103.4 Benutzen von Unix Streams, Pipes und Umleitungen
1.103.5 Erzeugung, Überwachung und Terminierung von Prozessen
1.103.6 Modifizeren von Prozessprioritäten
1.103.7 Durchsuchen von Textdateien mittels regulärer Ausdrücke
1.103.8 Grundlagen der Dateibearbeitung mit vi
1.104.1 Erzeugen von Partitionen und Dateisystemen
1.104.2 Erhaltung der Dateisystemintegrität
1.104.3 Kontrolle des Ein- und Aushängen von Dateisystemen
1.104.4 Verwalten von Diskquotas
1.104.5 Zugriffskontrolle auf Dateien mittels Zugriffsrechten
1.104.6 Verwaltung von Dateieigentümerrechten
1.104.7 Erzeugen und Ändern von echten und symbolischen Links
1.104.8 Auffinden von Systemdateien und Platzieren von Dateien an
den korrekten Ort
Repetitionsübung 1: Backupskript
Repetitionsübung 2: Logdateien Durchsuchen
1.102.1 Entwurf einer Festplattenaufteilung
1.102.2 Installation eines Bootmanagers
1.102.3 Erstellen und Installieren von im Sourcecode vorliegenden
Programmen
1.102.4 Verwaltung von Shared Libraries
Repetitionsübung 4 (Apache Compilation, Honeypot)
1.102.5 Verwendung des Debian Paketmanagements
1.102.6 Verwendung des Red Hat Package Managers (RPM)
Repetitionsübung: Forensics-Übung
Forensics-Übung
1.101.1 Konfiguration Grundlegender BIOS Einstellungen
1.101.3 Konfiguration von Modems und Soundkarten
1.101.4 Einrichten von SCSI-Geräten
1.101.5 Einrichtung verschiedener PC-Erweiterungskarten
1.101.6 Konfiguration von Kommunikationsgeräten
1.101.7 Konfiguration von USB-Geräten
1.110.1 Installation und Konfiguration von XFree86
1.110.2 Einrichten eines Display Managers
1.110.4 Installation und Anpassung eines Windowmanagers
7
18
2.2
Allgemeine Repetition I (Postenlauf)
Allgemeine Repetition II (Puzzle)
Erfahrungen an der Prüfung
2.2.1
Erfahrungen von JÜRG HALLER
2.2.2
Andere Erfahrungen
Auf der Webseite http://www.linuxjournal.com/article.php?sid=4630 kann ein weiterer Erfahrungsbericht gelesen werden. Dieser ist allerdings aus dem Jahre 2001, und viel
wurde seit diesem Jahr verbessert.
Einige Tips und Tricks sind auf http://linux-praxis.de/lpitips.html zusammengestellt.
8
Teil I
Linux allgemein
9
Kapitel 3
Geschichtliches
3.1
Entstehung
Folgender Text wurde von [8] übernommen.
Setzt man sich heute vor einen Rechner, startet ein Programm, wartet einige Sekunden,
bis dieses endlich die erhofften Resultate präsentiert, dann blättert man alsbald durch
Prospekte der Computer-Discounter und liebäugelt mit neuer, leistungsfähigerer Technik.
Mit keinem Gedanken erinnert man sich an die monströsen Ungetüme aus Röhren und
Transistoren im Turnhallenformat, die noch in den 70er Jahren die Leistung kleiner Kraftwerke erforderten, um letztlich nur einen Bruchteil an heutiger Rechenleistung zu vollbringen.
Zu jener Zeit wurden die Rechengenies noch per Hand mit Daten gefüttert, vom Administrator, der den Lochkartenstapel einlegte und nach Stunden oder gar erst Tagen die
Resultate ebenfalls in Form von Lochkarten entnahm. Ein Betriebssystem kannte und
brauchte man damals noch nicht.
Die Rechner wurden kleiner, passten schon in einen einzigen Raum, ihre Verarbeitungsgeschwindigkeit stieg und übertraf bald die Fähigkeit des Administrators, die Magnetbänder
rechtzeitig zu wechseln. Es wurde Zeit, den Ballast der reinen Stapelverarbeitung (ein
Job nach dem anderen) aufzugeben und zur Timesharing-Verarbeitung überzugehen. Man
erweiterte den damals sündhaft teuren Arbeitsspeicher, so dass mehrere Jobs gleichzeitig
rechenbereit auf die CPU warten konnten und teilte jedem Job eine genau festgelegte Zeitscheibe an CPU-Zeit zu. Von einer Interaktion mit dem Nutzer war man noch meilenweit
entfernt.
MULTICS (Multiplexed Information and Computing System) wurde vom MIT (Massachusetts Institute of Technology), den Bell Laborities und General Electrics ins Leben gerufen,
in der Vorstellung, ein Betriebssystem für eine Maschine zu entwickeln, die über so viel
Rechenkapazität verfügen sollte, um alle Einwohner von Boston bedienen zu können. Auch
10
wenn das Projekt wegen seiner Komplexität nur zögernd voranschritt und nie zu einem
kommerziellen Erfolg wurde, brachte es für das spätere Verständnis des Aussehens von
Betriebssystemen wertvolle Erkenntnisse.
Nach dem Ausstieg der Bell Labs aus dem Projekt (1969) griffen Ken Thompson und
Denis Ritchie, zwei Mitentwickler von MULTICS, die Idee wieder auf und verwirklichten
Teile davon in UNICS. Der Name war gleichzeitig eine Anspielung auf die ungleich höhere
Komplexität des in vieler Hinsicht als Vorbild dienenden MULTICS. Warum CS später
zum X mutierte, ist leider in keiner Überlieferung verzeichnet.
Grundlegende Überarbeitung erfuhr das Betriebssystem durch Forschungen an amerikanischen Universitäten, nachdem AT&T die Source-Lizenzen preisgünstig an diese abgab (der
kommerzielle Vertrieb war AT&T zunächst per Gerichtsbeschluss untersagt worden).
Erstes kommerzielles Produkt war UNIX Version 7, das unter dem Namen System V vertrieben wurde. Es folgten zahllose weitere UNIX-Derivate mit mehr oder minder grossem
Erfolg (AIX vom IBM, HP-UX von Hewlett Packard, Xenix von Microsoft, Sinix von Siemens, Solaris von SUN, BSD der Berkely University, Parix von Parsytec, ...).
Professor Andrew S. Tanenbaum implementierte 1987 ein zu UNIX Version 7 kompatibles
System mit dem Namen Minix. Es diente ihm als Lehrsystem für seine Studenten und
wurde auch im Quelltext für ein gewisses Entgelt verfügbar. Grösstes Manko von Minix
waren die durch den Autor beschränkten Erweiterungsmöglichkeiten im Kernel, so dass
z.B. das X-System niemals unter Minix laufen kann.
Um seinen 386er genauer zu inspizieren, schrieb ein finnischer Student namens Linus Torvalds im Jahr 1991 einige Assemblerroutinen, die schliesslich ein minimales Betriebssystem
formten. Linux erblickte das Licht der Welt, und da Torvalds den Sourcecode an interessierte Minixer verschickte, fanden sich bald weltweit Interessenten zusammen, die fortan
über das Internet kommunizierten und ihre neuesten Erweiterungen zu Linux verbreiteten.
Von Anfang an stellte Torvalds seine Sourcen unter die Verantwortung der GPL, so dass diese frei kopiert werden konnten und jedem Interessenten zur Verfügung standen. Gleichzeitig
war man bei der Entwicklung auf Konformität zum POSIX-Standard bedacht, wodurch
Linux ohne grossen Aufwand auf andere Hardware-Plattformen portierbar wurde.
3.2
Chronik
1968 Gründung des ARPANET, dem Vorläufer des Internet.
1969 Beginn der Entwicklung des Multiuser- und Multitasking-Betriebssystems
UNIX durch Dennis Richie, Ken Thompson u.a. an den AT&T Bell Labs
als Alternative zu Multics. Die Weiterentwicklungen von AT&T firmieren
unter dem Begriff System V.
11
An der University of California in Berkeley (UCB) entsteht eine eine eigene
Unix-Variante, die sog. Berkeley Software Distribution (BSD),aus der sich
später das BSD-Unix herleitet.
Die Situation: Die meisten vorhandenen Systeme sind Closed-Shop, BatchSysteme.
UNIX Version 1 für PDP 7: Beginn der Arbeiten in Assembler.
1970 UNIX Version 2 für PDP 11/20: Übergang zur Sprache B.
1971 Beginn der Entwicklung der Sprache C aus BCPL und B.
Richard Stallman entwickelt am Massachusetts Institute of Technology (MIT)
den Texteditor Emacs und gründet 1983/84 das GNU-Projekt (”GNU’s Not
Unix”); aus dem Emacs wird der GNU Emacs.
1973 Der UNIX-Kernel wird in C geschrieben; etwa 95% der Systemsoftware von
UNIX werden in C geschrieben.
UNIX Version 5: Der Name UNIX entsteht. Übergang zur Sprache C.
Vinton Cerf und Bob Kahn von der Defense Advanced Research Projects
Agency (DARPA) entwickeln das TCP/IP-Protokoll.
1974 Das Computer Science Department der University of California in Berkeley
erhält eine eine Lizenz für UNIX Version 4.
1975 UNIX Version 6: Der Vertrieb von UNIX beginnt.
1977 Bill Joy stellt die die erste Berkeley Software Distribution zusammen, die
unter anderem einen Pascal-Compiler und den Editor namens ex enthält.
1978 Die zweite BSD-Distribution (2BSD) enthält u.a. vi und termcap.
UNIX Version 7 für PDP 11/70: Erste UNIX-Standardversion.
1979 Die Defense Advanced Research Projects Agency (DARPA) beauftragt
die CSRG mit der Erstellung einer UNIX-Referenzimplementation der
ARPANET-Protokolle. Hieraus entsteht das 4.2BSD, das erste allgemein
verfügbare UNIX, das TCP/IP enthält.
12
Eric Allman entwickelt an der University of California in Berkeley ein Programm zum Austausch von Nachrichten zwischen Rechnern im ARPANET;
das Programm wird später zu sendmail weiterentwicklet.
1980 UNIX Version 7 für Z8000 und M68000: UNIX-Implementation auf 16-BitMicroporozessoren.
1982 UNIX System III.
1983 AT&T kommerzialisiert UNIX mit der Veröffentlichung von System V und
deklariert System V zum ”UNIX-Standard”.
1984 Richard Stallman beginnt mit der Entwicklung einer freien Alternative zu
UNIX, dem GNU system; GNU steht für ”GNU is Not Unix”; Entwicklung
der General Public License (GPL; vgl. Geschichte von Open Source), unter
der später der Linux-Kernel veröffentlicht wird.
UNIX System V/2: Einheitliche UNIX-Version für unterschiedliche Prozessortypen. Veröffentlichung der System V Interface Definition (SVID), in denen die Betriebssystemschnittstellen von UNIX definiert werden.
Microsoft: Xenix 3.0.
BSD 4.2
1985 DEC veröffentlich Ultrix-32.
AT&T: System V Version 2 Release 2.
Start des Mach-Projekts an der Carnegie-Mellon University, Pittsburg
(CMU). Arbeitsziel ist ”a new kernel foundation of UNIX development”.
1986 AT&T: System V Validation Suite (SVVS).
Microsoft: Xenix 5.0: Kompatibilität mit UNIX System V.
IEEE: POSIX: Standardisierung von Systemschnittstellen.
Larry Wall entwickelt die Programmiersprache Practical Extraction and Report Language (Perl)
13
1987 Andrew Tanenbaum veröffentlicht Minix, ein UNIX-artiges Betriebssystem
für PC, Mac, Amiga und Atari ST, das mit vollständigem Quellcode ausgeliefert wird.
1989 Veröffentlichung des TCP/IP-Codes unter der Bezeichnung Networking Release 1, kurz Net/1.
1990 UNIX hat sich als Betriebssystem der ersten Wahl für Supercomputer und
Server – vor allem gegen VMS – durchgesetzt.
BSD 4.3
14
Kapitel 4
Linux Kernel
4.1
Einführung
[14]Der Kernel ist das eigentliche Betriebssystem. Er abstrahiert die Hardware und stellt
eine Vielzahl von Funktionen für die Software bereit. Der Kernel enthält alle Hardwaretreiber und da es sich bei Linux um ein Unix-ähnliches System handelt, enthält der Kernel
ebenfalls die für ein Netzwerk benötigte Funktionalität. Die Treiber für die Grafikkarte,
die erst beim Start der grafischen Oberfläche X11 benötigt werden, bilden eine Ausnahme
und sind nicht Teil des Kernels.
Abbildung 4.1: Abstaktion der Hardware
Alle Linux-Distributionen beinhalten einen fertig kompilierten und lauffähigen Kernel. Da
dieser aber immer nur für die niedrigste Architekturstufe, auf der die Distribution läuft,
kompiliert wurde, ist es oftmals sinnvoll, einen eigenen Kernel zu bauen. Das Kapitel 4.3
geht näher auf die Konfiguration und das Kompilieren eines eigenen Kernels ein.
Die eingesetzte Hardware entwickelt sich rasend schnell weiter, weshalb auch der Kernel einer ständigen Weiterentwicklung unterworfen ist. Um diese Weiterentwicklung zu
15
ermöglichen, den Anwender aber vor den Problemen neuer Treiber zu bewaren, teilt sich
die Kernelentwicklung von Linux in zwei Bäume: die Entwicklerkernel und die Produktivkernel. Zu welchem Baum ein Kernel gehört, erkennt der Benutzer an der Versionsnummer.
Eine ungerade Zahl an der zweiten Stelle (zum Beispiel 1.1.32, 1.3.10, 2.1.101) deutet auf
einen Entwicklungskernel, eine gerade Zahl auf einen Produktivkernel (zum Beispiel 1.0.9,
1.2.4, 2.0.35).
Die Produktivkernel sollten stabil laufen und werden für alle produktiven Umgebungen
empfohlen. Wird eine neue Majorrelease eines Produktivkernels herausgegeben (d.h. die
erste oder zweite Stelle der Versionsnummer hat sich geändert), so werden dieser Version
keine neuen Treiber und Features mehr hinzugefügt. Es werden hauptsächlich Fehler und
Sicherheitslücken beseitigt.
Die Entwicklerkernel dagegen dienen, wie der Name schon sagt, zur Entwicklung. Das
heisst, dass hier neue Features oder Treiber eingebracht und getestet werden können. Die
Entwicklerkernel laufen meist weniger stabil und sind schnelleren Änderungen unterworfen.
Entwicklerkernel sollten nur benutzt werden, wenn man experimentierfreudig ist und auch
ab und an einen Systemabsturz tolerieren kann. Produktivkernel sind für den Einsatz auf
Produktivsystemen getestet und sollten dementsprechend stabil laufen.
Der Linux-Kernel ist fast komplett in C geschrieben, wobei einige GNU C-Erweiterungen
benutzt werden. Eine Ausnahme bilden die Architekturabhängigen Teile des Codes
(/usr/src/linux/arch/), wie z.B. der Beginn des Bootvorganges, die in Assembler geschrieben sind.
4.2
4.2.1
Funktionsweise
Architektur
[15]Linux ist heute ein hybrid monolithischer Kernel. Dies bedeutet, dass man den grössten
Teil der Treiber, die nicht während der ersten Startphase (bevor ein Dateisystem eingebunden ist) benötigt werden, als Module konfigurieren kann, die dann dynamisch nachgeladen
oder auch während des Betriebs entladen werden können, wenn ihre Funktionalität nicht
mehr benötigt wird. Die Treiber im Kernel und die Kernel-Module laufen im Ring 0, haben
also unbeschränkten Zugriff auf die Hardware. Einige wenige Module des Kernels laufen
im eingeschränkten Ring 3 (Usermodus). Die Level 1 und 2 der x86-Architektur werden
vom Linux-Kernel nicht genutzt.
Die Tatsache, dass Linux kein Microkernel ist, war Thema eines berühmten Flame War
zwischen Linus Torvalds und Andrew S. Tanenbaum (Ein sehr berühmter Betriebssystemtheoretiker). Anfang der 1990er Jahre, als Linux entwickelt wurde, galten monolithische Kernels als obsolet (Linux war zu diesem Zeitpunkt noch rein monolithisch,
die Möglichkeit, auch Module verwenden zu können, wurde erst später nachgerüstet).
16
Eine Zusammenfassung der Diskussion zwischen Torvalds und Tanenbaum kann unter
http://www.dina.dk/~abraham/Linus_vs_Tanenbaum.html gefunden werden.
4.2.2
Treiber
Der Linux-Kernel enthält mit Ausnahme der Grafiktreiber die Treiber für die Hardware
eines Rechners. Neben der Unterstützung verschiedener Architekturen und der Optimierungsmöglichkeit für unterschiedliche Prozessoren, sind im Kernel Treiber für EIDE- und
SCSI-Controller, für verschiedene Netzwerkhardware (incl. ISDN), Soundkartentreiber und
Treiber für proprietäre Hardware (zum Beispiel CDROM mit eigener Controllerkarte) enthalten.
Die Konfiguration eines Kernel kann sehr umfangreich werden und ist nur bei genauer
Kenntnis der in einem Rechner installierten Hardware möglich. Die meisten der Treiber
können aber ebenfalls als Modul gebaut werden (siehe Abschnitt 4.3). Sie verfügen dann
meist über sogenannte autoprobing (Selbsterkennungs) -Mechanismen, durch die eine installierte Hardwarekomponente automatisch erkannt und der Treiber bzw. das Modul dafür
automatisch geladen werden kann.
Daneben können im Kernel Netzwerkprotokolle und -mechanismen (zum Beispiel IPFiltering), die Unterstützung verschiedenster Filesystemen und Netzwerkdienste konfiguriert werden.
Die meisten Linux-Treiber werden von Programmierern auf der ganzen Welt geschrieben
und sind frei verfügbar, also auch im Sourcecode. Dazu ist es nötig, dass der Hersteller der
Hardware die Schnittstellenbeschreibung verfügbar macht. Das ist leider nicht immer der
Fall so dass aus diesem Grund einige Geräte nicht unterstützt werden können. Deshalb
sollte man vor dem Erwerb der Hardware im Hardware-Compatibility-HOWTO nachschlagen ! In letzter Zeit gehen auch einige Hersteller dazu über, Treiber anzubieten, so dass
sich auch ein Blick auf dessen Homepage lohnen kann.
Nicht alle Hersteller sind so weit, dass sie quelloffene Treiber unter der GPL anbieten.
Entweder haben sie angst vor der Konkurrenz oder es wird ihnen gar verboten (Wie bei
den neusten 54 MBit WLAN Karten, die den Polizeifunk stören könnten wenn man sie so
Programmiert). Bindet man solche Treiber ein, spricht man von einem tainted Kernel.
4.3
Kompilieren eines eigenen Kernels
[16]Trotz der ausgereiften Installationsroutinen der einzelnen Distributionen, die inzwischen auch grosse Fortschritte in Sachen Hardware-Erkennung gemacht haben, ist es bei
exotischer Hardware manchmal nötig, einen eigenen Kernel zu kompilieren. Ein Beispiel
dafür ist die verbesserungsbedürftige ISDN-Unterstützung der Red Hat-Distribution.
Mit einem eigenen Kernel kann man solche Hardware eben doch zum Laufen bringen. Ein
17
weiterer Vorteil eines eigenen Kernels ist, dass er perfekt an das eigene System angepasst
werden kann. Ein solcher Kernel enthält nur die wirklich nötigen Treiber und ist daher
klein, flexibel und schnell.
4.3.1
Kernelkonfiguration
Die Kernel-Sourcen liegen definitionsgemäss im Verzeichnis /usr/src/. Dort kann man
sich die Quellen herunterladen von http://www.kernel.org oder über Debian apt-get.
Um damit arbeiten zu können, müssen die Quellen entpackt werden. Normalerweise wird
dabei ein Ordner kernel-source-VERSIONSNUMMER erstellt. Es hat sich eingebürgert, auf
die jeweils verwendeten Kernelquellen einen symbolischen Link mit dem Namen linux
zu erstellen, so dass die Sourcen des laufenden Kernels immer unter /usr/src/linux
erreichbar sind.
Abbildung 4.2: Hauptmenü von make menuconfig
Um den Kernel zu konfigurieren, wechselt man in dieses Verzeichnis. Dort gibt es drei
Möglichkeiten, das Konfigurationsprogramm aufzurufen. Von der ersten Methode make
config ist jedoch abzuraten, da man sich hier durch jede Option einzeln durchhangeln
muss. Besser ist hier make menuconfig das eine textbasierte Oberfläche zur Konfiguration
liefert oder unter X die Routine make xconfig zur grafischen Konfiguration.
Die Optionen sind in einzelne Kategorien unterteilt, wie etwa das SCSI-Subsystem, das
ISDN-Subsystem oder Netzwerkoptionen. Die Optionen können an- und abgewählt wer18
Abbildung 4.3: Hauptmenü von make xconfig
den und einige Optionen erlauben das komilieren als Modul (Bezeichnet mit einem M).
Ein Modul kann dynamisch zur Laufzeit hinzugeladen werden, wann immer die jeweilige
Funktion benötigt wird. Daher ist die Verwendung von Modulen sehr empfehlenswert, da
sie den Kernel klein und flexibel halten.
Hat man sich durch alle Konfigurationsmenüs durchgearbeitet, wird die Konfiguration abgespeichert und das Konfigurationsprogramm kann verlassen werden. Die Konfiguration
wird dabei in der Datei /usr/src/linux/.config gespeichert. Diese Datei wird in einem
späteren Schritt ebenfalls in das Verzeichnis /boot kopiert. Haben Sie eine neue Kernelversion heruntergeladen und entpackt, dann können sie .config in das neue Verzeichnis
kopieren und müssen mit der Konfiguration nicht von vorne beginnen.
Will man sich nur über neue Konfigurationsmöglichkeiten abfragen lassen, kann man mittels make oldconfig alle Fragen präsentiert bekommen, die es beim alten Kernel noch
nicht gab.
4.3.2
Kompilieren unter Nicht-Debiansystemen
Mit einem make clean können die Sourcen von alten Kompilationen (oder Kompoilationsversuchen) gereinigt werden. Der nächste Schritt ist make dep, womit die Abhängigkeiten
überprüft werden. Danach kann das eigentliche Übersetzen des Kernels in Angrif genommen werden; nach der Eingabe von make bzImage wird der Kernel generiert. Das kann
mitunter recht lange dauern (Grössenordnung von etwa zehn Minuten). Währenddessen
huschen haufenweise Meldungen über den Bildschirm welche Komponente gerade übersetzt
wird.
Ist dieser Schritt erfolgreich beendet, können die Module mit make modules übersetzt
19
Abbildung 4.4: Submenü der Kernelkonfiguration: Ext3 ist fest einkompiliert, DOS FAT
als Modul und Amiga FFS als Beispiel überhaupt nicht
werden. Anschliessend können sie mit make modules install im richtigen Verzeichnis
installiert werden.
Nachdem der Kernel erfolgreich generiert wurde, liegt er im Verzeichnis
/usr/src/linux/arch/i386/boot mit dem Namen bzImage.
Teilweise wird ein
make bzLilo unterstützt um den Kernel an das richtige Ort zu kopieren und den
Bootloader klar zu machren. Ist dies nicht möglich, kopiert man sich den Kernel nach
/boot/meinkernel. Verwendet man LILO als Bootmanager, muss noch die Datei
/etc/lilo.conf editiert werden. Folgende Zeilen müssen hinzugefügt werden:
image = /boot/meinkernel
root = /dev/hda2
label = MeinKernel
initrd = /boot/initrd
Anschliessend tippt man nur noch lilo ein und der Kernel kann bei einem Neustart mit
dem Label MeinKernel gestartet werden. Hat man bei der Konfiguration nichts falsch gemacht, dann bootet der Kernel und man hat sein eigenes Linux gebaut. Empfehlenswert
ist es allerdings, den alten Kernel nicht zu überschreiben und auch die LILO Konfiguration
für den alten Kernel beizubehalten. Sollte bei der Konfiguration nämlich etwas schiefgegangen sein, kann der alte Kernel immer noch gestartet und die Konfiguration von Neuem
20
begonnen werden.
Wenn sie den Kernel selber kompiliert und Linux damit gebootet haben, willkommen im
Club !
4.3.3
Kompilieren mit Debiansystemen
Grundsätzliches
Um die folgenden Schritte durchführen zu können, sollten folgende Pakete installiert sein:
ˆ libncurses5-dev
ˆ kernel-package
Quellen
Möchte man die Kernel-Quellen aus dem Debian-Archiv installieren, installiert man das
entsprechende kernel-source-Paket:
# apt-get install kernel-source-2.4.18
Jetzt
gibt
es
im
Verzeichnis
/usr/src
eine
Datei
namens
kernel-source-2.4.18.tar.bz2.
Wir wechseln in das Verzeichnis /usr/src und
entpacken die Kernel-Quellen:
# cd /usr/src
# tar xvfj kernel-source-2.4.18.tar.bz2
Damit die Bezeichnungsweise im folgenden übereinstimmt, legen wir noch einen symbolischen Link namens linux auf das entstandene Verzeichnis kernel-source-2.4.18:
# ln -s kernel-source-2.4.18 linux
Hat man noch weitere Sourcen die in den Kernel gehören (pcmcia, thinkpad Module,
NVidia Treiber, ...), so muss man die ebenfalls herunterladen und im Verzeichnis /usr/src
entpacken.
21
Konfiguration
Zuallererst muss in das Verzeichnis /usr/src/linux gewechselt werden. Die Konfiguration
eines älteren Kernels der auf dem Rechner gelaufen ist, kann man aus dem /boot Ordner
beziehen:
# cp /boot/config-2.4.17 .config
Und nun kann je nach Wunsch wie oben beschrieben loskonfiguriert werden.
Kompilation
Jetzt kommt das kernel-package zum Einsatz. Es verwandelt den kompilierten Kernel in
ein Debianpaket. make-kpkg clean räumt auf.
Bevor wir mittels kernel-package ein Debian-Paket unseres Kernels erstellen, ist es sinnvoll,
sich eine eigene Bezeichnung (z.B. custom.o) zu überlegen, die nebst eigener Versionsnummer (hier startend mit 0) dem Kernel-Paket mitgegeben wird, damit der Kernel bei Bedarf
wieder sauber aus dem System entfernt werden kann.
Also los... Kernel und Module kompilieren...
# make-kpkg --revision=custom.0 kernel_image
# make-kpkg --revision=custom.0 modules_image
Jetzt können die in /usr/src liegenden Debian-Archive bequem mit dpkg installiert werden:
# cd /usr/src
# dpkg -i kernel-image-2.4.18-custom.0_i386.deb
# dpkg -i pcmcia-modules-2.4.22_3.1.33-6+custom.0_i386.deb
# dpkg -i hinkpad-modules-2.4.22_4.8-1++custom.0_i386.deb
...
Dabei wird automatisch wird LILO konfiguriert und der Kernel am richtigen Ort abgelegt.
4.4
Umgang mit Modulen
Damit die gesamte im System installierte Hardware unterstützt wurde, musste der Kernel
frührer mit den entsprechenden Treibern konfiguriert und kompiliert werden. Seit Kernelversion 2.0 ist es möglich, fast alle Treiber auch als dynamisch ladbar bereitzustellen.
Diese dynamisch ladbaren Treiber heisen Module.
22
Die Module können von root mit Hilfe des Kommandos insmod geladen und mit dem
Kommando rmmod wieder aus dem Kernel entfernt werden. Das erheblich komfortablere Kommando, das neben Anderen beide Funktionalitäten enthält, ist modprobe. Dieses
Kommando lädt Module und erlaubt diesen das automatische Erkennen spezifischer Hardwareeinstellungen wie Interrupt oder Portadresse. Schlägt dieses Autoprobing fehl, kann
der Administrator die Werte dem Module fest in der Datei /etc/modules.conf1 zuordnen,
die ebenfalls von modprobe durchsucht wird. Ausserdem beachtet modprobe sogenannte
module-dependency, wenn diese mit dem Kommando depmod -a erzeugt wurden. Dieses
Kommando erstellt eine Datei, die die Zusammenhänge zwischen den Modulen enthält und
wird meist beim Booten automatisch ausgeführt.
Das folgende Beispiel zeigt das Laden des Modules für eine NE2000-Kompatinble Netzwerkkarte, die hier auf den Interrupt 11 und dem Port 300 konfiguriert wurde. Das Modul
heisst ne.o.
(din)@marvin:~> modprobe ne
Lädt das Modul ne.o und alle vom ihm benötigten weiteren Module mit den Parametern aus
der Datei /etc/conf.modules, wenn diese konfiguriert sind, bzw. mit der AutoprobingFunktion.
(din)@marvin:~> modprobe ne io=0x300 irq=11
Lädt das Modul ne.o und alle vom ihm benötigten weiteren Module mit den angegebenen
Parametern Portadresse 300 (io=0x300), Interrupt 11 (irq=11)
Die geladenen Module können mit dem Kommando lsmod angezeigt werden.
Um das Laden von Modulen vom Nutzer fernzuhalten und damit die Arbeit mit dem
System zu vereinfachen, wurde der kerneld-Daemon eingeführt. Dieser lädt die benötigten
Module automatisch nach. Der kerneld-Daemon arbeitet wie modprobe auf der Datei
/etc/conf.modules und der Autoprobing-Funktion der Module. Das folgende Beispiel
zeigt die Einstellung für die schon erwähnte Netzwerkkarte.
Beispiel:
# /etc/conf.modules on master
#
# Alias, unter dem die Funktionalit\"at des Modules verlangt wird.
alias eth0 ne
1
Debian hat dafür ein Verzeichnis /etc/modutils und benutzt update-modules um die Datei modules.conf zu erstellen.
23
# Optionen zum Modul
options ne io=0x300 irq=11
24
Teil II
103 - GNU & Unix Kommandos
25
Kapitel 5
Arbeiten auf der Kommandozeile
5.1
Kommandozeile als Interface
(MS) Jedes vernünftige Computersystem muss dem Anwender eine Möglichkeit geben, mit
ihm zu kommunizieren. Die ersten Grosscomputer benutzten Schalter, danach kamen die
Lochkarten, magnetische und optische Datenträger, Tastaturen und schliesslich Mäuse,
Trackballs und schliesslich Virtual Reality Handschuhe, etc.
Abbildung 5.1: Das Benutzerinterface des ENIAC (1946)
Trotz den heute üblichen grafischen Benutzerinterfaces ist die Kommandozeile für Verwaltungsaufgaben oftmals effizienter und weniger störungsanfällig. Nicht nur in UNIX,
sondern auch unter Windows gibt es Dinge, die man ohne Hilfe Kommandozeile nicht
realisieren kann.
Die Kommandozeile dient als Vermittlerin zwischen den Eingaben des Benutzers und dem
Betriebssystem. Es ist vorallem (aber nicht nur) textorient.
26
5.2
Wie kommt man zu einer Kommandozeile ?
Viele Wege führen nach Rom:
Loginterminal: Startet Linux die grafische Oberfläche nicht, so befindet man sich automatisch auf einem Loginterminal. Nach dem Usernamen und Passwort befindet man
sich auf der Kommandozeile. Normalerweise hat man mehr als ein Loginterminal zur
Verfügung welche über <Alt> + <F1> bis <Alt> + <F8> erreichbar sind.
Aus der grafischen Oberfläche: Mit der Tastenkombinationen <Ctrl> + <Alt> +
<F1> bis <Ctrl> + <Alt> + <F8> erreichbar sind. Normalerweise befindet
sich aber noch auf <F7> oder bei Knoppix auf <F5> wieder die grafische Oberfläche.
Console: Konsolen sind Programme die auf dem GUI eine Kommandozeile zur Verfügung
stellen (etwa wie das DOS-Fenster unter Windows). Es gibt viele davon: Konsole,
XTERM, ...
Versuchen sie alle drei Methodem um zu einer Kommandozeile zu gelangen.
Abbildung 5.2: Eine Eingabeeinforderung under X-Window
5.3
Die Shell
If you hold a Unix shell to your ear, do you hear the C?
– nadador
Die Kommandozeile an sich ist ein ganz normales Programm welches die Befehle entgegen
nimmt, für das Betriebssystem übersetzt und dessen Ausgaben aufbereitet an den Benutzer
27
zurückgibt. Normalerweise wird so ein Programm Shell genannt. Es gibt ganz verschiedene
Shells und je nach Geschmack kann man seine Lieblingsvariation auswählen. Die älteste
Shell heisst sh. Eine neuere Korn-Shell oder ksh. Für C-Spezialisten eignet sich die csh.
Unter Linux ist die Standardshell die Bourne-Again Shell oder Bash.
Da die Bash ein ganz normales Programm ist, kann man eine Bash in einer Bash starten.
5.4
Grundsätzliches zur Shell
Die Shell hat einen Eingabekanal mit Namen STDIN und zwei Ausgabekanäle: STDOUT
und STDERR. Normalerweise ist die Tastatur STDIN und der Bildschirm zeigt alle Ausgaben und Fehler von STDOUT und STERR an. Ist die Shell bereit für eine Eingabe, so
zeigt sie einen Prompt der aus mehreren Zeichen bestehen kann. Beispiele:
ˆ $>
ˆ #
ˆ mischneider@serafin:~$
ˆ root>
5.5
5.5.1
Eingabe von Kommandos
Kommandos
Ein Linuxkommando in einer Shell kann aus vier Komponenten bestehen:
1. Einem gültigen Kommando (Ein in die Shell eingebautes Kommando oder ein Programm oder Skript).
2. Optionen für das Kommando, normalerweise durch ein Abstand getrennt.
3. Die Argumente, auf was das Kommando einwirken soll.
4. Der Abschluss der Zeile, normalerweise die <Enter> Taste.
Jedes Kommando hat seinen eigenen Syntax und eigene Optionen. Wir werden das an
Hand des ls Befehls erläutern, welcher den Inhalt eines Ordners anzeigt. Die einfachste
Form ist:
# ls
28
Ohne Optionen und Argumente zeigt das Kommando den Inhalt des aktuellen Workingdirectories.
ls hat sehr viele Optionen. Zum Beispiel -l um alle Details einer Datei anzuzeigen:
# ls -l
Eine weitere Option ist -a um auch versteckte Dateien anzuzeigen. Diese Optionen können
auch gemeinsam angewendet werden: Entweder durch einen Leerschlag getrennt oder bei
oft verwendeten Kommandos auch direkt hintereinander.
# ls -l -a
# ls -la
Oftmals gibt es noch die long-Form der Optionen: -a kann auch als --all angegeben
werden.
# ls --all
Argumente können sehr vielfältig sein, einzeln oder mehrfach vorkommen oder auch ganz
weggelassen werden.
Beim ls befehl sind dies Verzeichnisse oder Dateien mit sogenannten Wildcards. Pfade
und Wildcards werden in Kapitel 7.4 behandelt.
# ls -l /e*
# ls -al /etc /var
5.5.2
Hilfe zu Kommandos
Zu den meisten Kommandos gibt es in Linux eine eingebaute Hilfe. Hier wird nur ein
kleiner Einblick gegeben, denn Dokumentation ist das Thema eines eigenen Kapitels.
Hilfe zu den Optionen und Argumenten eines Kommandos bekommt man mit der Option
--help oder -h.
# ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not hide entries starting with .
[...]
29
Hilfe zu Shell-Builtins gibt es mit dem Kommando help KOMMANDO.
# help export
export: export [-nf] [name[=value] ...] or export -p
NAMEs are marked for automatic export to the environment of
subsequently executed commands. If the -f option is given,
the NAMEs refer to functions. If no NAMEs are given, or if ‘-p’
[...]
Die wichtigste Hilfe sind aber die sogenannten Manual-Pages. Jedes Kommando hat ein
spezielle hilfe-Seite die mit dem Kommando man KOMMANDO aufgerufen werden kann. Der
Befehl Apropos liefert dabei alle Man-Pages und deren Kapitel die das System zu einem
bestimmten Thema kennt.
Zusätzlich ist noch zu erwähnen, dass die Manual-Pages in verschiedene Kapitel eingeteilt
sind, die mit der Option -S KAPITELNUMMER angegeben werden können. Hier ein Ausschnitt
aus der Manualpage von man, aufgerufen mit:
# man man
1: Executable programs or shell commands
2: System calls (functions provided by the kernel)
3: Library calls (functions within program libraries)
4: Special files (usually found in /dev)
5: File formats and conventions eg /etc/passwd
6: Games
7: Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8: System administration commands (usually only for root)
9: Kernel routines [Non standard]
Beispielhafte Anwendung:
# apropos files
[...]
# man ls
[...]
30
Rufen sie auf verschiedene Arten Hilfe zu folgenden Kommandos auf:
ˆ bash
ˆ ls
ˆ echo
ˆ env
ˆ set
5.5.3
Kommandoabfolgen und Sequenzen
Einige Kommandos brauchen unter Umständen mehrere Zeilen. Zum Beispiel eine Textausgabe mit echo oder eine for-Schlaufe. Dabei wird auf der neuen Zeile der Sekundäre
Prompt gezeigt:
mischneider@serafin:~$ echo "Mehrere Zeilen
> machen froh...
> Wie die Maus
> auf der Mausmatte"
Mehrere Zeilen
machen froh...
Wie die Maus
auf der Mausmatte
mischneider@serafin:~$
Mehrere Kommandos können auf eine Zeile geschrieben werden, wenn sie mittels Strichpunkt getrennt werden:
# ls; echo "hallo"; ls /
5.6
5.6.1
Umgebungsvariablen
Variablen
Eine Aufgabe einer Shell ist es, Umgebungsvariablen zu speichern. Umgebungsvariablen
beeinflussen das Verhalten der Shell selbst, der aufgerufenen Programme und ermöglichen
die Kommunikation zwischen den Prozessen. In der Bash können alle Variablen angezeigt
werden mit den Kommandos:
31
# export
oder:
# env
Den Inhalt einzelner Variablen wird ausgegeben mit:
# echo $PS1
Viele Variablen werden schon beim Start der Shell gesetzt, normalerweise in der Datei
.profile die bei jeder interaktiven Shell zu Beginn aufgerufen wird. Theoretisch kann
aber jederzeit eine Umgebungsvariable gesetzt oder gelöscht werden.
Eine lokale Variable (Shell-Variable) kann man erzeugen und anzeigen mittels set:
# set MEINEVAR="Foobar"
# echo $MEINEVAR
Wobei set auch weggelassen werden kann. set alleine zeigt alle Shellvariablen an.
Um sie aus der Shell zu exportieren und eine Umgebungsvariable daraus zu machen
benötigt man wiederum das export Kommando:
# export MEINEVAR
Kombiniert angewendet:
# export MEINEVAR="Foobar"
Das Löschen von Variablen geschieht in der Bash mittels der Option -n zu export oder für
Shell-variablen mit dem Kommando unset.
# export
# export -n MEINEVAR
# export
oder
# set
# unset MEINEVAR
# set
32
5.6.2
Weitere Kommandos für Umgebungsvariablen
Mit dem Kommando env können die lokalen Umgebungsvariablen nur für den Aufruf eines
Programmes geändert werden:
mischneider@serafin:~$
mischneider@serafin:~$
[...]
MEINEVAR=Hallo
[...]
mischneider@serafin:~$
[...]
MEINEVAR=Tschuess
[...]
mischneider@serafin:~$
[...]
MEINEVAR=Hallo
[...]
export MEINEVAR="Hallo"
env
env MEINEVAR="Tschuess" env
env
env alleine zeigt die Environmentvariablen.
5.6.3
Wichtige Variablen
PS1 und PS2
Eine wichtige Umgebungsvariable haben wir schon gesehen: PS1. Sie gibt das Aussehen des
normalen Prompts an. Der sekundäre Prompt bei mehrzeiligen Befehlen heisst übrigens
PS2.
Ändern sie ihren Prompt in Hallo>.
PATH
Eine weitere wichtige Variable ist PATH. Sie teilt der Shell mit, wo sie das Programm
suchen soll. Denn was macht die Shell mit einer Eingabe ?
1. Zuerst werden die Aliase1 ersetzt.
2. Es wird geprüft, ob die Shell selbst das Kommando versteht.
1
Wird hier nicht behandelt. Dem geneigten Studenten sei der Befehl alias ans Herz gelegt.
33
3. Es wird geschaut, ob sich ein Kommando in einem Pfad befindet der in der Umgebungsvariable PATH angegeben ist.
4. Das aktuelle Verzeichnis wird nach dem Kommando durchsucht.
5. ... Bash gibt auf ...
Somit finden sie die wichtigen Programme in einem Verzeichnis das in der PATH-Variable
angegeben ist. Tip: Das Kommando which gibt aus, welches Programm die Bash verwenden würde. Wenn which keine Ausgabe gibt, dann könnte es ein in die Shell eingebautes
(shell-builtin) Kommando sein.
PWD und OLDPWD
Das Verzeichnis, in welchem man sich gerade befindet wird Present Working Directory genannt oder PWD in Kurz. Die Umgebungsvariable PWD beinhaltet das aktuelle Verzeichnis, während OLDPWD das letzte aktuelle Arbeitsverzeichnis speichert. Darauf operieren
kann man mit dem Kommando pwd, welches das aktuelle Verzeichnis anzeigt.
Wo befinden sich folgende Programme:
1. ls
2. export
3. echo
4. groups
Sind Kommandos nicht in PATH, so müssen sie komplett angegeben werden, mit Pfad
(siehe Kap. 7.1.1). Ein blödes Beispiel ist:
# /bin/ls
5.7
5.7.1
Eingabehilfen
History
Die Shell stellt einige Werkzeuge zur Verfügung, um effizient zu arbeiten. Die Erfahrung hat
gezeigt, dass man beim Arbeiten mit der Kommandozeile immer wieder dieselben Dateien,
34
Optionen oder Kommandos braucht. Darum speichert die Shell eingegebene Befehle als
History. Standardmässig werden die letzten 500 Zeilen gespeichert. Diese Zahl kann über
die Umgebungsvariable HISTSIZE geändert werden. Gespeichert wird die History in der
Datei ~/.bash history, was über die Umgebungsvariable HISTFILE geändert werden kann.
Um die Kommandohistory anzusehen, gibt es das Kommando history. Jede Zeile ist
nummeriert. Diese Nummern sind wichtig für andere Kommandos. Folgende Anweisungen
können auf die History angewendet werden:
!!
!n
!-n
!STRING
!?STRING
ˆSTRING1ˆSTRING2
Führt das letzte Kommando nochmals aus.
Führt das n-te Kommando der History aus.
Führt das n-te Kommando vor dem aktuellen aus.
Führt das letzte Kommando aus, das mit STRING begonnen hat.
Führt das letzte Kommando aus, das STRING enthält.
Fürt das letzte Kommando aus und ersetzt STRING1 mit STRING2.
1. Geben sie folgendes Kommando ein: ls -al /etc
2. Lassen sie sich den Inhalt des Verzeichnisses var anzeigen ohne das Kommando ls einzugeben.
5.7.2
Tastaturhilfen
Standardmässig ist die Bash im EMACS-Mode und liefert so einige Vereinfachung. Die folgende Tabelle zeigt die wichtigsten wobei ,,C“ für den Controlkey (Normalerweise <Ctrl>)
und ,,M“ für den Metakey (Normalerweise <Alt>).
35
Kombination
C-p od. <⇓>
C-n od. <⇑>
C-b od. <⇐>
C-f od. <⇒>
C-a od. <Home>
C-e od. <End>
C-l
M-<
M->
C-d od. <Del>
C-k
C-y
M-d
C-rTEXT
C-sTEXT
<Esc>+
<Tab><Tab>
Beschreibung
Letzte Linie in der Historydatei.
Nächste Zeile in der Historydatei.
Ein Zeichen zurück.
Ein Zeichen nach vorne.
Anfang der Linie.
Ende der Linie.
Lösche den Bildschirm
Zum Anfang der History
Zum Ende der History
Lösche Zeichen rechts vom Cursor.
Schneide Text vom Cursor zum Ende der Zeile aus.
Füge den Text wieder ein.
Schneide Wort aus.
Suche TEXT nach hinten.
Suche TEXT nach vorne.
Letztes Argument der vorherigen Zeile.
Ergänze den Kommando- oder Dateinamen.
Versuchen sie diese Historykommandos und die Tastaturhilfen.
5.8
Kommandosubstitution
Die Bash hat ein weiteres, nettes Feature, die sog. Kommandosubstitution. Kommandosubstitution bedeutet, dass man die Ausgaben eines Kommandos als Argument eines
anderen verwenden kann. Die Kommandos müssen eingeschlossen werden in $( ... )
oder in Backticks (Apostrofen von oben links nach unten rechts).
mischneider@serafin:~$ echo ls /
ls /
mischneider@serafin:~$ echo ‘ls /‘
bin boot
cdrom
dev
etc
lib lost+found mnt
opt
proc
usr var
vmlinuz vmlinuz.old windows
mischneider@serafin:~$ export HALLO=$(pwd)
mischneider@serafin:~$ echo $HALLO
/home/mischneider
36
floppy
root
home
sbin
initrd
tmp
5.9
Kommandos rekursiv anwenden
5.9.1
Option Rekursiv
Einige Kommandos können nur sinnvoll, wenn sie nicht für jede betroffene Datei einzeln
ausgeführt werden müssen. Entweder sind es zuviele oder man kennt die Anzahl nicht,
weil mehrere Unterverzeichnisse und Unter-Unterverzeichnisse beteiligt sind. Typische
Anwendungen sind das Löschen, das Ändern eines Eigentümers oder das Kopieren eines
ganzen Verzeichnisbaumes.
Die meisten Kommandos bei denen dies sinnvoll ist, wird eine Option -r oder -R für
,,Rekursiv“ unterstützt. Beispiele:
ls -R
Zeigt rekursiv alle Unter-, Unterunter-, Unterunterunter-, ... Verzeichnisse an.
cp -R, cp -r Kopiert Verzeichnisbäume.
chmod -R
Ändert Zugriffsrechte.
chown -R
Ändert den Dateieigentümer.
rm -R, rm -r Löscht Verzeichnisbäume.
...
...
5.9.2
Rekursiv mit find
find [VERZEICHNIS] [OPTIONEN] [TEST] [AKTION] ist ein extrem mächtiger Befehl.
Unter ganz vielen anderen Anwendungen kann find auch jedes andere Kommando rekursiv
erweitern. find VERZEICHNIS gibt alle Unterverzeichnisse und Dateien unter VERZEICHNIS
an. Mit der Option -exec können auf alle diese Dateien Kommandos ausgeführt werden.
Dabei gibt es zwei Spezialzeichen: Zwei geschweifte Klammern ({}) werden mit dem aktuellen Dateinamen ersetzt und das Kommando muss abgeschlossen werden mit Backslash
und Strichpunkt (\;).
Beispiele:
find /etc -exec echo {} \; Blödes Beispiel: Gibt alle Dateien und Unterverzeichnisse
aus im Verzeichnis /etc.
find /etc -exec grep FooBar {} \; Sucht ,,FooBar” in allen Dateien im Verzeichnisbaum unter /etc.
37
Kapitel 6
Texte mittels Filterprogrammen
bearbeiten
6.1
Einführung
Die Philosphie von Unix ist es, möglichst aufgeblähte Programme zu produzieren mit viel
Schnickschnack, einer ausgefeilten Benutzeroberfläche die sich über das Internet updaten
und Benutzerdaten an den Hersteller senden und somit fehleranfällig sind, dafür neben
ihrer eigentlichen Aufgabe auch noch Eier kochen, Seilspringen und sich selber forpflanzen
könn... äh.. nein... Das war etwas anderes...
Unix- Kommandozeilenprogramme sind klein, konzentrieren sich auf ihre Aufgabe und
erledigen nur diese, dafür so gut wie möglich. Für komplexere Aufgaben werden mehrere
dieser kleinen Tools hintereinandergeschaltet. Wie man dies tut wird in Kapitel 8 erklärt.
Der interessierte Student sei auf die Manpages verwiesen, die teilweise sehr detailiert und
viel weiter auf die Anwendung des jeweiligen Kommandos eingehen.
In diesem Kapitel werden die wichtigsten kleinen Helfer vorgestellt.
Dieses Kapitel benutzt zwei Dateien:
a.txt:
b
a
c
a
b
b.txt:
333:444:555
38
666:777:888
000:111:222
6.2
Zusammenstellung der Kommandos
Fügt Daten zusammen.
Gibt die Spalten einer Datei aus.
Konvertiert Tabulatoren in Leerschläge.
Formatiert Texte um (Spaltenbreiten, ...).
Gibt die ersten Zeilen einer Datei aus.
Verknüpft Zeilen aus verschiedenen Dateien.
Anspruchsvolle Nummerierung von Zeilen.
Ausgabe einer Datei in oktal, hexadezimal oder in anderen Formaten aus.
paste
Fügt Spalten aus mehreren Dateien zusammen.
pr
Teilt Textdateien mehrspaltig auf verschiedene Seiten auf.
sort
Sortiert Zeilen der Eingabedateien.
split
Teilt Dateien in kleinere Fragmente auf.
tac
Gibt Dateien umgekehrt aus.
tail
Gibt das Ende einer Datei aus.
tr
Löscht oder übersetzt Zeichen in einem Text.
unexpand Konvertiert führende Leerschläge in Tabulatoren.
uniq
Enfernt mehrfach hintereinander vorkommende Zeilen.
wc
Zählt Zeichen, Wörter und Linien von Dateien.
sed
Der StreamEditor mit verschiedenen Fähigkeiten.
cat
cut
expand
fmt
head
join
nl
od
⇒ Lern- und Arbeitsauftrag 1001 ,,Filterprogramme“
6.3
6.3.1
cat
Beschreibung
cat [OPTIONEN] [DATEIEN] kommt von conCATenate, was soviel heisst wie ,,zusammenfügen“. Grundsätzlich fügt cat alles zusammen was man ihm präsentiert: Dateien,
Texteingaben, Textstreams, ...
39
6.3.2
Beispiele von Optionen
-n Nummeriere die Ausgabezeilen.
-s Nur eine Leerzeile, jede weitere in der Ausgabe löschen.
6.3.3
Anwendungsbeispiele
# cat a.txt b.txt
b
a
c
a
b
333:444:555
666:777:888
000:111:222
6.4
cut
6.4.1
Beschreibung
cut OPTIONEN [DATEIEN] gibt aus einer oder mehreren tabellarischen Dateien eine Spalte
aus. Dabei kann festgelegt werden, wie die ,,Zellen“ voneinander getrennt sind.
6.4.2
-ddelim
-flist
-blist
-clist
6.4.3
Beispiele von Optionen
Setzt das Trennzeichen (den Delimiter) auf delim.
Zeige die Spalten in list.
Nur diese Bytes ausgeben.
Nur diese Zeichen ausgeben.
Anwendungsbeispiele
# cut -d: -f2 b.txt
444
777
111
# cut -c3-5 b.txt
3:4
40
6:7
0:1
6.5
6.5.1
expand
Beschreibung
expand [OPTIONEN] [DATEIEN] konvertiert Tabulatoren in Leerschläge.
6.5.2
-i
-tnum
6.6
6.6.1
Beispiele von Optionen
Konvertiere nur Tabs zu Beginn einer Zeile.
Konvertiere Tabs in num Leerschläge.
fmt
Beschreibung
fmt [-ZIFFERN] [OPTIONEN] [DATEIEN] ForMaTiert Texte.
6.6.2
-u
-wnum
6.6.3
Beispiele von Optionen
Benutze ,,Uniform Spacing“. Ein Leerschlag zwischen Worten, zwei
zwischen Sätzen.
Formatiere die Zeilenlänge auf num Zeichen. Standard ist 75 Zeichen. w kann auch weggelassen werden (-100).
Anwendungsbeispiele
# fmt -100 b.txt
333:444:555 666:777:888 000:111:222
6.7
head
head [OPTIONEN] [DATEIEN] gibt die ersten Zeilen einer Datei aus. Werden mehrere
Dateien angegeben, dann Wird jeweils eine Einleitung gedruckt und die ersten Zeilen jeder
Datei.
41
6.7.1
Beispiele von Optionen
Gib die ersten num Zeilen aus.
Gib die ersten num Bytes aus.
Gib keine Dateinamen aus.
-nnum
-cnum
-q
6.7.2
Anwendungsbeispiele
# head -n2 a.txt b.txt
==> a.txt <==
b
a
==> b.txt <==
333:444:555
666:777:888
6.8
join
join [OPTIONEN] DATEI1 DATEI2 verknüpft Felder von mehreren Dateien, welche gleiche
Verknüpfungsfelder haben.
6.8.1
Beispiele von Optionen
-1FELD
-2FELD
-i
6.8.2
Benutzt dieses Feld von Datei 1 zur Verknüpfung.
Benutzt dieses Feld von Datei 1 zur Verknüpfung.
Vernachlässige Gross-Kleinschreibung.
Anwendungsbeispiele
one.txt:
000 Null
001 Eins
002 Zwei
two.txt:
001 ONE1
002 TWO2
42
# join one.txt two.txt
001 Eins ONE1
002 Zwei TWO2
6.9
nl
nl [OPTIONEN] [DATEIEN] nummeriert alle Zeilen einer oder mehrerer Dateien. Dabei
werden verschiedene Stile und verschiedene Formate berücksichtigt. Zusätzlich kann ein
Header, ein Body und ein Footer angegeben werden. Header, Body und Footer werden
durch die speziellen Zeilen \:\:\:, \:\:, respektive \: angegeben.
6.9.1
Beispiele von Optionen
-hstyle
-bstyle
-fstyle
-nformat
Benutze
Benutze
Benutze
Benutze
style
style
style
style
für
für
für
für
den Header.
den Body.
den Footer.
die Nummerierung.
Styles gibt es folgende:
a: Nummeriere alle Zeilen.
t: Nur nicht-leere Zeilen nummerieren.
n: Keine Zeilennummern.
pREGEXP: Nur Zeilen auf die REGEXP zutrifft nummerieren (Siehe Kapitel 11).
Formate gibt es folgende:
ln: Linksbündig, keine führenden Nullen.
rn: Rechtsbündig, keine führenden Nullen.
rz: Rechtsbündig, führenden Nullen.
6.9.2
Anwendungsbeispiele
mytext.txt:
\:\:\:
Der Header
43
\:\:
Bla Body Blabla
Blubbr Blabbr
Gnabbr Knabbr
\:
Der Footer
\:\:\:
Header der Seite 2
\:\:
If the label on your cable on the gable on your house,
says the network is connected to the button on your mouse,
but your packets want to tunnel to another protocol,
that’s repeatedly rejected by the printer down the hall.
\:
Der zweite Footer.
# nl -nrz -ba mytext.txt
Der Header
000001 Bla Body Blabla
000002 Blubbr Blabbr
000003 Gnabbr Knabbr
Der Footer
Header der Seite 2
000001 If the label on your cable on the gable on your house,
000002 says the network is connected to the button on your mouse,
000003 but your packets want to tunnel to another protocol,
000004 that’s repeatedly rejected by the printer down the hall.
Der zweite Footer.
6.10
od
od [OPTIONEN] [DATEIEN] gibt eine Datei oktal, hexadezimal oder in anderen Formaten
aus.
6.10.1
-ttype
-wwidth
Beispiele von Optionen
Gibt die Datei im Format type aus.
Gibt width Bytes pro Zeile aus.
44
Typen gibt es folgende:
a: Benannte Zeichen (Beispielsweise nl für Zeilenumbrüche).
c: ASCII Zeichen oder Backslash-Escape.
o: Oktal.
x: Hexadezimal.
d: Dezimal.
f: Gleitkommazahl.
6.11
paste
paste [OPTIONEN] [DATEIEN] fügt Spalten aus mehreren Dateien hintereinander zusammen, mit Tabulatoren getrennt.
6.11.1
-ddelim
-s
6.11.2
Beispiele von Optionen
Benutze das Zeichen delim anstelle von Tabulatoren.
Gibt Dateien nacheinander aus anstelle parallel.
Anwendungsbeispiele
one.txt:
000
001
002
two.txt:
AA
BB
CC
# paste one.txt two.txt
000
AA
001
BB
45
002
# paste
000@AA
001@BB
002@CC
# paste
000
AA
6.12
CC
-d@ one.txt two.txt
-s one.txt two.txt
001
002
BB
CC
pr
pr [OPTIONEN] [DATEIEN] teilt Textateien mehrspaltig auf verschiedene Seiten auf. Blanker Text wird mit einem Header versehen, so dass der Ausdruck etwas handlicher wird.
6.12.1
-htext
-lnum
-num
6.13
Beispiele von Optionen
Druckt text statt des Dateinamens im Header.
Setzt die Seitenlänge auf num Zeilen.
Drucke num Spalten.
sort
sort [OPTIONEN] [DATEIEN] sortiert die Eingabedatei nach verschiedenen Kriterien.
6.13.1
Beispiele von Optionen
-b Ignoriere führende Leerzeichen.
-f Vernachlässige Gross- und Kleinschreibung.
-r Kehre die Sortierreihenfolge um.
6.13.2
Anwendungsbeispiele
# sort a.txt
a
a
b
b
c
46
6.14
split
split [OPTIONEN] [EINGABE [PRFÄFIX]] teilt grosse Dateien in kleinere Fragmente auf,
die mit cat wieder zusammen gefügt werden können. Dabei spielt es bei richtiger Anwendung keine Rolle, ob die Datei Text oder binäre Daten enthält. Dieser Befehl ist sehr
nützlich um extrem grosse Dateien auf CD’s aufzuteilen.
Alle diese kleineren Dateien beginnen mit PRÄFIX welcher defaultmässig auf ,,x“ eingestellt
ist. Ein Beispiel der enstehenden Dateinamen wäre: MyLogaa, MyLogab, ....
6.14.1
Beispiele von Optionen
-bnum
-lnum
-Cnum
Gib num Bytes pro Teildatei aus.
Gib num Zeilen pro Teildatei aus.
Gib num Bytes pro Zeile aus.
6.15
tac
tac verhält sich genau wie cat, nur dass die Dateien umgekehrt ausgegeben werden. Bei
mehreren Dateien, wird zwar jede Datei umgekehrt, aber die Reihenfolge der Dateien wird
nicht verändert.
6.15.1
Anwendungsbeispiele
# tac b.txt
000:111:222
666:777:888
333:444:555
# tac a.txt b.txt
b
a
c
a
b
000:111:222
666:777:888
333:444:555
47
6.16
tail
tail [OPTIONEN] [DATEIEN] gibt die letzten Zeilen einer oder mehrerer Dateien aus.
Wenn mehrere Dateien angegeben werden, dann wird vor jeder Datei ein Header mit Dateinamen gedruckt.
6.16.1
-cnum
-nnum
-f
6.17
Beispiele von Optionen
Gib die num letzten Bytes der Datei aus.
Gib die num letzten Zeilen der Datei aus.
Gib kontinuierlich die an der Datei angehängten Zeilen aus. Nützlich um Logdateien zu beobachten.
tr
tr [OPTIONEN] [[MENGE1] [MENGE2]] löscht oder ändert Zeichen oder Zeichengruppen
aus dem Text Datei und gibt ihn aus. Bei diesem Kommando kann nicht direkt eine Datei
angegeben werden, darum der etwas gewohnungsbedürftige Syntax.
6.17.1
-d
-schar
6.17.2
Beispiele von Optionen
Läscht alle Zeichen der ersten angegebenen Menge.
Lösche mehrfach vorkommende Zeichen char.
Anwendungsbeispiele
# tr -d 145 < b.txt
333::
666:777:888
000::222
# tr -s 147 < b.txt
333:4:555
666:7:888
000:1:222
# tr 147 ABC < b.txt
333:BBB:555
666:CCC:888
000:AAA:222
48
6.18
unexpand
6.18.1
Beschreibung
unexpand [OPTIONEN] [DATEIEN] konvertiert führende Leerschläge in Tabulatoren.
6.18.2
-a
-tnum
6.19
Beispiele von Optionen
Konvertiere alle Leerzeichen, nicht nur führende.
Konvertiere num Leerschläge in einen Tabulator. Standardmässig sind es 8.
uniq
uniq [OPTIONEN] [EINGABE [AUSGABE]] entfernt mehrfach hintereinander vorkommende
Zeilen. ACHTUNG: Damit nur noch eindeutige Zeilen Vorkommen, muss die Datei zuerst
sortiert werden !
6.19.1
Beispiele von Optionen
-i Ignoriere Gross- Kleinschreibung.
-u Gib nur Zeilen aus, die nicht doppelt vorkommen.
6.19.2
Anwendungsbeispiele
# sort a.txt | uniq
a
b
c
6.20
wc
wc [OPTIONEN] [DATEIEN] bedeutet WordCount und zählt Zeichen, Wörter und Linien
einer oder mehrerer Dateien.
49
6.20.1
-c
-m
-l
-w
Nur
Nur
Nur
Nur
6.21
Beispiele von Optionen
Byteanzahl ausgeben.
Zeichenanzahlen ausgeben.
Zeilenanzahl ausgeben.
Anzahl Wörter ausgeben.
sed der Streameditor
sed [OPTIONEN] [DATEIEN] ist ein Mitglied des berühmt berüchtigten sed + awk Duos.
Beides sind extrem mächtige Programme die alle wünsche betreffend Textdateien abdecken
können. sed heisst StreamEDitor und er kann einen Textstrom bearbeiten.
Hier ein Auszug aus der SED(1) Manpage:
sed ist ein Editor zur automatischen Textbearbeitung.
Die Bearbeitung erfolgt mit Editorkommandos, die dem sed in einer separaten Scriptdatei
oder direkt in der Kommandozeile übergeben werden. Um in der Kommandozeile mehrere
Editorkommandos zu übergeben, kann die -e Option mehrfach verwendet werden. Die
Editorkommandos können auch durch ein Semikolon getrennt werden. Wird nur ein einziges Editorkommando in der Kommandozeile übergeben, kann die Kennzeichnung mit der
-e Option auch weggelassen werden. Damit die Shell keine Veränderungen an der Zeichenkette mit dem Editorkommando vornimmt, musssie in Hochkommata eingeschlossen
werden.
Eine Scriptdatei kann beliebig viele Editorkommandos enthalten, die durch Zeilenende oder
Semikolon von einander getrennt werden müssen.
Jedes Kommando besteht aus einem Adressteil und einem Funktionsteil. Der Adressteil
gibt an, welche Zeilen einer Textdatei mit diesem Kommando bearbeitet werden sollen,
und der Funktionsteil beschreibt die Veränderung, die an den im Adressteil bestimmten
Zeilen vorgenommen werden soll. Wenn kein Adressteil angegeben ist, wird die Funktion
mit jeder Zeile ausgeführt.
Die Bearbeitung eines Textes erfolgt, indem die Eingabe zeilenweise in einen Arbeitsspeicher gelesen wird, und dann die Adressteile aller Editorkommandos der Reihe nach mit dem
Text im Arbeitsspeicher verglichen werden. Die Funktionen der passenden Kommandos
werden in der Reihenfolge ihres Auftretens ausgeführt.
Hier nur Zwei von den vielen Kommandos um sed ein bisschen zu erläutern.
d Lösche Linien.
s Ersetzt gewisse Teile. Der Syntax ist s/Muster/Ersetzung/[Modus].
Für den Modus kann folgendes eingesetzt werden:
ZAHL: Ersetze nur das ZAHL’te Vorkommen des Musters.
50
g: Nicht nur das erste, sondern alle Vorkommen ersetzen.
p: Gib die Zeile aus if eine Ersetzung stattgefunden hat.
Lösche Zeilen 1 und 2 aus einer Datei:
# sed ’1,2d’ b.txt
000:111:222
Ersetze alle Doppelpunkte mit XAX:
# sed ’s/:/XAX/g’ b.txt
333XAX444XAX555
666XAX777XAX888
000XAX111XAX222
51
Kapitel 7
Grundlagen des Datei-Managements
Dieses Kapitel erklärt, wie man unter Linux mit Dateien umgeht. Wie sie bezeichnet, verschoben, kopiert und gelöscht werden können. Ebenfalls wird auf Wildcards und besondere
Verzeichnisse eingegangen.
7.1
7.1.1
Verzeichnisse
Pfade
Verzeichnisse entsprechen ,,Ordnern“ welche weitere Ordner und Dateien enthalten können
und somit eine Hierarchie (einen Baum) bilden. Diese Speichermethode hat sich bei fast
allen Betriebssystemen durchgesetzt1 .
Will man eine ganz bestimmte Datei oder einen Ordner ansprechen, so benutzt man dazu
einen Pfad . Es werden alle Verzeichnisse angegeben, getrennt durch einen Slash (/) und am
Schluss die Datei. Will man die Datei aufgaben.txt im Homeverzeichnis des Benutzers
hans genau angeben, so entsteht der Pfad /home/hans/aufgaben.txt.
Das oberste Verzeichnis (/) wird Root-Verzeichnis genannt2 . Unter dem Root-Verzeichnis
gibt es klar normierte Unterverzeichnisse, welche später ein Thema sein werden (Kapitel
III).
1
Aber noch nicht in allen Köpfen. Der Autor kennt einen Dozenzen der mehrere hundert Dateien ohne
Unterverzeichnisse im Homeverzeichnis hat.
2
Nicht mit dem speziellen Benutzer root zu verwechseln.
52
7.1.2
Spezielle Verzeichnisse
Es gibt einige ganz spezielle Verzeichnisse:
.
Das aktuelle Verzeichnis
..
Das Oberverzeichnis zum aktuellen Verzeichnis.
~
Das Homeverzeichnis des aktuellen Benutzers. Üblicherweise unter
/home/BENUTZERNAME.
~BENUTZERNAME Das Homeverzeichnis des Benutzers BENUTZERNAME.
7.2
Inodes
I-Nodes sind die eigentlichen Informationsträger. Sie speichern den Namen, den Ort, verschiedene Daten, Eigentümer, etc. eines Dateisystemobjekts. Die Namen sind nur Hilfen
für den Anwender.
7.3
7.3.1
Dateisystemkommandos
cp
cp [OPTIONEN] DATEI1 DATEI2 oder cp [OPTIONEN] DATEIEN VERZEICHNIS kopiert entweder die DATEI1 an den Ort DATEI2 wenn es in der ersten Form Benutzt wird, oder es
kopiert alle DATEIEN in ein VERZEICHNIS. Diese zweite Form wird auch automatisch benutzt wenn mehr als zwei Dateiargumente mitgegeben werden und cp reklamiert wenn das
letzte Argument kein Verzeichnis ist.
Beispiele von Optionen
Erzwinge (force) ein Überschreiben der Zieldatei.
Frage nach vor dem Überschreiben. Word oftmals automatisch vom
Administrator als Default definiert.
-p
Versuche auch Metainformationen wie Berechtigungen, Creationdate und Eigentümer zu kopieren.
-r, -R Kopiere rekursiv. Dann dürfen die Dateiargumente auch Verzeichnisse sein.
-v
Sei geschwätzig (verbose) und zeige, was du machst.
-f
-i
Anwendungsbeispiele
Kopiere die Einlognachricht in das aktuelle Verzeichnis
53
# cp /etc/modt .
Kopiere das Homeverzeichnis von User hans zu fritz
# cp -r /home/hans /home/fritz
7.3.2
find
find [VERZEICHNIS] [OPTIONEN] [TEST] [AKTION] Ist sehr mächtig und wird uns noch
ein paar mal begegnen. find kann nicht nur alle Kommandos rekursiv erweitern, sondern
auch Dateien finden. Dies ist einigermassen einleuchtend, denn wenn es Dateien nicht
finden, sondern verlieren sollte, würde es nicht find heissen.
Grundsätzlich kann man nicht nur nach Namen, sondern auch nach verschiedenen Metainformationen wie Änderungsdatum, Erstellungsdatum, Zugriffsrechten, inodes, etc. suchen
lassen.
Beispiele von Optionen
-namemuster
-regexregex
-aminnum
-groupname
-typeC
-username
-sizeN[{c,k}]
Sucht nach Dateien die dem Muster muster entsprechen. Diese
Muster werden im Kapitel 7.4 durchgenommen.
Sucht nach Dateien die dem Muster regex entsprechen. Diese Muster werden im Kapitel 11 durchgenommen.
Alle Dateien auf die in den letzten num Minuten zugegriffen wurde.
Die Datei gehört der Gruppe name.
Die Datei ist vom Typ C, zum Beispiel ein Verzeichnis, ein Link,
Ein Device, ... . Siehe unten für Werte von C.
Die Datei gehört dem Benutzer name.
Die Datei belegt N Datenblöcke zu 512 Bytes, bzw. N Bytes und
N Kilobytes mit nachgestelltem c oder k
Typen for die -type Option:
b Gepufferte Gerätedatei für ein blockorientiertes Gerät
c Ungepufferte Gerätedatei für ein zeichenorientiertes Gerät
d Verzeichnis
p Benannte Pipeline (FiFo)
f Normale Datei
l Symbolischer Link
s Socket
Anwendungsbeispiele
Alle Dateien in Unterverzeichnissen des aktuellen Verzeeichnissses die mit e beginnen:
54
# find . -name e*
Alle Dateien die MuX irgendwo im Dateinamen haben:
# find / -name *MuX*
Alle Dateien auf die der User hans in den vor 3 bis 16 Minuten zugegriffen hat:
# find / -user hans -amin +3 -amin -16
Alle Dateien die kleiner als 100 Kilo sind im Homeverzeichnis vom Benutzer sepp:
# find ~sepp size -100k
7.3.3
mkdir
mkdir [OPTIONEN] [VERZEICHNISSE] erstellt ein oder mehrere VERZEICHNISSE.
Beispiele von Optionen
-mmodus
-p
Erstelle Verzeichnisse mit den Berechtigungen modus.
Reklamiere nicht, wenn übergeordnete Dateien nicht bestehen sondern kreiere sie.
Anwendungsbeispiele
Erstelle dir3 in dir2 in dir1 im aktuellen Verzeichnis:
# mkdir -p ./dir1/dir2/dir3
Erstelle ein read-only Verzeichnis im Homeverzeichnis:
# mkdir -m 444 ~/nurlesbar
7.3.4
mv
mv [OPTIONEN] QUELLEN ZIEL verschiebt die QUELLEN zu ZIEL. Mit mv können so auch
Dateien umbenannt werden. QUELLEN können ein oder mehrere Dateien oder Verzeichnisse
sein. ZIEL muss wie bei cp ein Verzeichnis sein wenn mehrere QUELLEN angegeben wurden
oder eine Datei wenn QUELLE auch eine Datei ist.
55
Beispiele von Optionen
-f Erzwinge (force) ein Überschreiben der Zieldatei.
-i Frage nach vor dem Überschreiben. Word oftmals automatisch vom
Administrator als Default definiert.
Anwendungsbeispiele
Benenne das Homeverzeichnis von sepp in jakob um:
# mv ~sepp /home/jakob
7.3.5
rm
rm [OPTIONEN] DATEIEN Löscht Dateisystemobjekte. Um eine Datei zu löschen reichen
Schreibrechte auf das übergeordnete Verzeichnis. Benutzt man dieses Kommando rekursiv,
so kann man auch Verzeichnisse und Verzeichnisbäume löschen.
Beispiele von Optionen
-f
Erzwinge das löschen und frage nicht nach bei geschützten Dateien.
-i
Frage bei jeder Datei nach.
-r, -R Lösche rekursiv
Anwendungsbeispiele
DAS SCHLIMMSTE DAS ES ÜBERHAUPT GIBT:
# rm -rf /
7.3.6
rmdir
rmdir [OPTIONEN] VERZEICHNISSE löscht VERZEICHNISSE wenn man die Rechte dazu hat
und diese leer sind.
Beispiele von Optionen
-p Entfernen von VERZEICHNIS, dann versuchen, jede Verzeichniskomponente im Pfadnamen zu entfernen. Zum Beispiel ist rmdir -p
a/b/c das gleiche wie rmdir a/b/c a/b a.
56
7.3.7
touch
touch [OPTIONEN] DATEIEN ändert die Accesstime und/oder die Modificationtime einer
Datei. Wenn die Datei nicht existiert kann mit touch eine leere Datei erzeugt werden.
touch wird oftmals verwendet, um Dateien neu aussehen zu lassen beim Kompilieren von
Programmen, bei Codeverwaltungssystemen oder bei Konfigurationsdateien.
Beispiele von Optionen
-a
-c
-m
-rfile
-tmark
Nur die Accesstime ändern.
Keine Dateien erzeugen.
Nur die Modificationtime ändern.
Nimm die Zeiten der Datei file.
Verwende die Zeit mark im Format [[JJ]JJ]MMTThhmm[.ss] anstelle der aktuellen Zeit.
Anwendungsbeispiele
Erzeuge die Datei foobar auf die Schnelle:
# touch foobar
Ändere die Zeiten von foobar auf den 1. August 2003, 15:07:
# touch -t 200308011503 foobar
7.4
7.4.1
Wildcards
Wildcards und Globbing
(Siehe auch die Bash-Manpage) Bei den meisten Dateimanagement-Befehlen können sogenannte Wildcards verwendet werden. Wildcards sind symbolische Zeichen die für andere
Zeichen oder Zeichenketten stehen. Es handelt sich um die harmlose kleine Schwester der
Regulären Ausdrücke aus dem Kapitel 11.
Wildcards helfen wenn man sich Tipparbeit sparen will oder wenn man sich nicht mehr genau an gewisse Namen der Dateisystemobjekte erinnert. Es ist sehr wichtig zu wissen, dass
die Shell das ersetzen von Wildcards übernimmt und nicht das Kommando. Der Vorgang
des Ersetzens wird auch globbing genannt und Ausdrücke mit Wildcards dementsprechend
Globs.
57
Hier eine Liste der meistverwendeten Wildcards:
Wildcard
Beschreibung und Beispiel
*
Passt auf alles, sogar auf kein Zeichen: mic* passt auf
mic, michael, mickeymouse, mickrofon, ...
?
Passt genau auf ein Zeichen: mic?? passt auf micha und
micky, aber nicht auf mica.
[zeichen]
Passt auf jedes Zeichen zwischen den Klammern:
mic[ah5] passt auf mica, mich und mic5.
[!zeichen]
Passt auf jedes Zeichen nicht zwischen den Klammern:
mic[!ah] passt auf micu, mico aber nicht auf mica oder
mich.
[a-z]
Passt auf jedes Zeichen von a bis z: mic[a-z] passt auf
mica und mich, nicht aber auf mic1 oder micA3 . Auch
verwendbar: [a-zA-Z].
[!a-z]
Passt auf jedes Zeichen nicht im Bereich a bis z.
{f1, f2, f3, ...} Kreiert die Zeichenketten in den geschweiften Klammern: michael, krofon, hail passt auf michael, mickrofon
und michail.
7.4.2
Beispiele
Alle Dateien mit der Extension txt in das Verzeichnis Texte Kopieren:
# cp *.txt Texte
Alle dateien die mit p beginnen in den Homeverzeichnissen in das aktuelle Verzeichnis
verschieben:
# mv /home/*/p* .
Alle Freundinnen und Freunde anzeigen, egal ob gross oder klein:
# ls [Ff]reund{in,}
3
Für Schnellmerker: Die meisten Linux-Datesysteme achten auf Gross- und Kleinschreibung..
58
Kapitel 8
Benutzen von Unix Streams, Pipes
und Umleitungen
In UNIX wird fast alles als Datei in einem einzigen Verzeichnisbaum abgebildet. Die
Maus, das Terminal, die Soundkarte, der CD-Brenner, Windowsdateisysteme über das
Netz, sind alles Dateien im Dateisystem. Darum können die meisten Dinge auch über
die normalen Dateimanagementbefehle angesprochen werden. So ist es für ein Programm
möglich ein Terminal wie eine Datei zu öffnen und alle Tastatureingaben zu lesen und beim
Schreiben Rückmeldungen auszugeben. Dieses Kapitel behandelt das Zusammenschalten
und Umleiten von Dateiinhalten und Programmaus- und eingaben.
8.1
Standard I/O
Wie in Kapitel 5.4 bereits erwähnt, besitzt die Shell selber drei verschiedene Kanäle oder
Dateiseskriptoren, wie diese auch genannt werden:
Standard Input (stdin) ist der Kanal 0. Er ist der einzige Eingabekanal und liest standardässig von der Tastatur.
Standard Output (stdout) ist Kanal 1. Er dient den Kommandos und der Shell dazu
Daten auszugeben und ist normalerweise auf den Bildschirm oder das Terminalfenster
gehängt.
Standard Error (stderr) ist Kanal 2. Er ist ebenfalls standardmässig auf den Bildschirm gehängt und ist für Fehlernachrichten reserviert.
stdout und stderr können auf dem Bildschirm nicht unterschieden werden, aber es ist
durch geschicktes Umhängen zum Beispiel möglich, nur stdout anzuzeigen und stderr in
ein Logfile zu schreiben.
59
8.2
Pipes
Für ein Kommando spielt es an sich keine Rolle, ob die Daten die es verarbeiten soll aus
einer richtigen Datei auf dem Dateisystem, von der Tastatur, von einem Scanner oder gar
von einem anderen Programm geliefert werden; Schliesslich ist alles eine Datei.
Um die Ausgabe eines Kommandos direkt als Eingabe eines weiteren Kommandos zu benutzen, verwendet man Pipes. Praktischer ausgedrückt ist dies der lange, mittige vertikale
Strich (|).
Folgendes Beispiel liest den Inhalt der Datei passwd, sortiert ihn, entfernt Duplikate und
gibt es zweispaltig aus:
# cat /etc/passwd | sort | uniq | pr -2
Folgendes Beispiel nummeriert die Verzeichniseinträge des Elternverzeichnisses:
# ls .. | cat -n
genau so bekommen die vielen kleinen Tools einen Sinn, denn man kann beliebig viele von
ihnen über Pipes zusammenarbeiten lassen.
8.3
Redirection (Umleitungen)
Mit Umleitungen kann man die Standard I/O Kanäle auf Dateien Lenken. Das grösser-als
Zeichen > Leitet stdout auf eine Beliebige Datei. ls -al . > diesesdir.txt schreibt
somit den Inhalt des ganzen Verzeichnisses in die Datei diesesdir.txt. Benutzt man zwei
grösser-als Zeichen >> so wird die Zieldatei nicht überschrieben, sondern die neuen Daten
werden am Schluss angehängt. will man stderr in eine dateiumleiten, so muss man dessen
Dateideskriptor angeben wie in folgendem Beispiel, welches eventuell auftretende Fehler
an der Datei error.txt anhängen würde: cp a.txt b.txt 2>error.txt.
Das kleiner-als Zeichen < füttert den stdin eines Kommandos mit dem Inhalt einer Datei. Viele Kommandos stellen Dateinamen als Argumente zur Verfügung und somit
wäre diese Konstruktion nicht notwendig. Weil es so schön ist aber trotzdem ein Beispiel, welches die Passwortdatei mit dem Betreff ,,Unsere Passworte“ an Karlo sendet:
# mail -s "Unsere Passworte" karlo < /etc/passwd.
Es gibt noch raffiniertere Umleitungen. Es ist zum Beispiel möglich, stderr auf stdout
umzuleiten mittels 2>&1. Das Ampersand ist wichtig, denn sonst würde stderr in eine
Datei mit Namen ,,1“ geschrieben.
Sehr interessant ist die Datei /dev/null. Dies ist ein Gerät das alle Daten verschluckt
die man hineinschreibt und nur Nullen liefert, wenn man davon liest. Dies kann man dazu
verwenden um Fehler unsichtbar zu machen wenn der Tag schon so schlecht genug war:
60
# ls -ral / 2>/dev/null
Man kann auch stdout auf /dev/null leiten, wenn man ein bisschen Ruhe braucht...
Folgende Tabelle wurde von [1] übernommen:
Redirection Function
Send stdout to file.
Send stderr to file.
Send both stdout and stderr to file.
Send stdout to file1 and stderr to file2.
Receive stdin from file.
Append stdout to file.
Append stderr to file.
Append both stdout and stderr to file.
Pipe stdout from cmd1 to cmd2.
Pipe stdout and stderr from cmd1 to cmd2.
8.4
Syntax for Bash
# cmd > file
# cmd 1> file
# cmd 2> file
# cmd > file 2>&1
# cmd > file1 2> file2
# cmd < file
# cmd >> file
# cmd 1>> file
# cmd 2>> file
# cmd >> file 2>&1
# cmd1 | cmd2
# cmd1 2>&1 | cmd2
tee
tee [OPTIONEN] DATEIEN verhält sich wie ein T-Stück eines Rohres. Das Kommando liest
von stdin und gibt alles neben stdout auch in die DATEIEN die angegeben werden.
8.4.1
Beispiele von Optionen
-a Anhängen und nicht überschreiben.
-i Unterbrechungssignale ignorieren.
8.4.2
Anwendungsbeispiele
Sortiere das Verzeichnis, schreibe es in Datei dir.txt und gib es Zweispaltig aus
# ls | tee a.txt | pr -2
8.5
xargs
xargs [OPTIONEN] [KOMMANDO] [ANFANGSARGUMENTE] führe KOMMANDO mit den Optionen
uns Argumenten in ANFANGSARGUMENTEN aus. Zusätzlich dazu werden hinten alle Argumente angehängt die das Kommando auf stdin empfängt.
61
8.5.1
Beispiele von Optionen
-p
-nmaxargs
8.5.2
Interaktiver Modus: Frage den Benutzer vor der Ausführung jedes
KOMMANDOS.
Limitiere die Argumente für jeden Aufruf von KOMMANDO auf maxargs.
Anwendungsbeispiele
Zeige die Anzahl Linien aller Dateien die mit f beginnen:
# ls f* | xargs wc -l
Zeige alle Dateien in 2 Spalten:
# ls | xargs -n2 echo
62
Kapitel 9
Erzeugung, Überwachung und
Terminierung von Prozessen
9.1
Prozesse
Ein Prozess ist ein Programm in Ausführung. Also alles was ein Bisschen Bewegung
auf das Silizium bringt ist ein Prozess. Ihrer Rolle bewusst sind Prozesse auch spezielle
Bürschchen: Sie haben Nachkommen (dafür braucht es nur ein Prozess), Sie können zu
Zombies oder zu Waisen werden, sich Blockieren, nett oder nicht nett sein usw. Die Arbeit
eines Systemadministrators besteht nicht zuletzt darin, auf seine Prozesse aufzupassen,
ihnen ab und zu eins auf die Finger zu klopfen und eine Umgebung bereitzustellen, in der
sie sich wohlfühlen.
Jedes Kommando das ausgeführt wird, die Bash, etc., dies alles sind Prozesse. Ein Prozess
besteht nicht nur aus dem ausgeführten Code, sondern hat auch einige wichtige Attribute:
Process ID (PID): Jeder Prozess hat eine eindeutige, ganzzahlige Nummer.
63
Parent Process ID (PPID): Die Nummer der Elternprozesses. Wird ein Kommando
in der Bash gestartet, so wir sie zum Elternprozess. Der allererste Prozess der vom
Betriebssystem erzeugt wird heisst Init und hat die PID 1.
Kinderprozesse werden auch Subprozesse genannt.
User ID (UID) und Group ID (GID): Jeder Prozess wird unter einer bestimmten
Benutzer- und Gruppenberechtigung ausgeführt.
Environement: Dazu gehören die Shell- und Environementvariablen. Damit auch das
Present Working Directory.
9.2
Prozessüberwachung
Man kann sich gezielt alle Prozesse des Systems anzeigen lassen um sie zu überwachen. Je
nach Anforderung kann eines der folgenden Kommandos verwendet werden:
9.2.1
ps
ps [OPTIONEN] zeigt die momentan auf dem System vorhandenen Prozesse.
Beispiele von Optionen
Optionen müssen nicht unbedingt mit einem Minuszeichen eingeleitet werden.
-a Zeigt auch die Prozesse der anderen Benutzer.
-f Zeigt in einem Baum (forest) die Eltern- Kindbeziehungen.
-l Langes Format. Zeigt mehr Prozessattributte.
-u Zeigt den Usernamen und die Startzeit des Prozesses.
-w Weites Format. Es schneidet die Zeilen nicht ab. Mehrere w’s
können kombiniert werden um die Ausgabe noch breiter zu machen.
-x Zeige auch Prozesse an, die nicht direkt von einem Benutzer kontrolliert werden. Diese Prozesse werden oft Daemon-Processes oder
Prozesse ohne Terminal genannt. Sie sin ganz entfernte Verwandte
der Windows-Services.
Anwendungsbeispiele
Zeigt die Prozesse des Benutzers die mit dem aktuellen Terminal verbunden sind.
# ps
64
Üblicherweise will man alle Prozesse sehen (-a und -x) mit etwas interessanter Information
angereichert (-u):
# ps aux
# ps -aux
# ps -a -u -x
9.2.2
pstree
pstree [OPTIONEN] [[PID][USER]] Zeigt alle Prozesse als Baum an und verhält sich somit ähnlich wie ps -f. Dieses Kommando zeigt übersichtlich die Eltern-Kind Verhältnisse
aller laufenden Prozesse. Wird eine PID angegeben, so wird dieser als Wurzel dargestellt.
Wird USER angegeben, so werden nur dessen Prozesse angezeigt.
Beispiele von Optionen
-a
-c
-l
-p
Zeige alle Argumente mit denen der Prozess aufgerufen wurde.
Fasse gleichartige Unterbäume nicht zusammen.
Schneidet die Zeilen nicht ab.
Zeige PID’s an.
Anwendungsbeispiele
Ein Prozessbaum mit den PID’s anzeigen:
# pstree -p
init(1)-+-LCDd(362)
|-Xprt(533)
|-alarmd(736)
|-apache(569)-+-apache(580)
|
|-apache(581)
|
|-apache(582)
|
|-apache(583)
|
‘-apache(584)
|-apmd(366)
|-atd(559)
|-bash(528)-+-logger(532)
|
‘-tee(531)
|-bdflush(6)
|-cardmgr(449)
|-cron(563)
65
|-cupsd(379)
|-dhclient(1159)
|-elogd(409)
|-getty(596)
|-getty(597)
[...]
9.2.3
top
top [OPTIONEN] erlaubt das kontinuierliche Anzeigen von Prozessen und ihren Eigenschaften. Es baut einen übersichtlichen Bildschirm auf mit einigen generellen Systemdaten im
Header wie Load Average, welches zeigt wieviele Prozesse durchschnittlich auf die CPU
warten, anzahl User, Speicherauslastung etc. Ebenfalls werden die Zustände der Prozesse
summarisch angezeigt.
Beispiele von Optionen
Optionen müssen nicht unbedingt mit einem Minuszeichen eingeleitet werden.
-b
Batch Mode. Damit läuft das Programm einige Iterationen und
gibt die Daten untereinander aus. Sinnvoll wenn die Ausgaben von
anderen Kommandos weiterbearbeitet werden sollen oder wenn die
Bildschirmausgabe nicht schön aussieht.
-ddelay Wartet delay Sekunden bevor die Ausgabe erneuert wird.
-i
Keine idlen Prozesse. Also nur Prozesse, die auch die CPU benutzen.
-nnum Erneuert die Ausgabe num mal und beendet das Kommando.
-q
Kein Warten zwischen den Erneuerungen. top braucht dann extrem
viel CPU-Zeit.
-s
Sicherer Modus. Damit kann man nichts an den Prozessen
verändern.
Befehle
<CTRL>+L
h
k
q
r
s
die
top
während
dem
Laufen
Bildschirm neuzeichnen.
Hilfe.
kill Sende Signale an einen Prozess.
Programm beenden.
Prozesspriorität ändern.
Zeit zwischen den Bildschirmerneuerungen ändern.
Anwendungsbeispiele
Normale Anwendung, q um top abzubrechen:
66
entgegennimmt:
# top
5 Ausgaben aller nicht idlen Prozesse im Abstand von 1 Sekunde in eine Datei file1
schreiben:
# top bin 5 d 1 > file1
9.3
Signale an Prozesse senden
UNIX kennt das Prinzip von Signalen. Dies sind einfache, kleine Meldungen die an ein
Prozess gesendet werden. Auf einige kann der Prozess reagieren wenn er will, bei anderen
wird er gar nicht gefragt. Das Abbrechen eines Kommandos mittels <CTRL>+c sendet
dem Prozess ein kill signal und dagegen kann er nichts tun. Will man einen Prozess mittels
<CTRL>+z unterbrechen, so wird ihm TSTP signalisiert. Alle möglichen Signale können
mit dem Kommando kill -l ausgegeben werden.
wichtige Signale sind die folgenden:
1 Hängt ein Modem auf oder teilt dem Prozess mit, dass
er die Konfigurationsdatei neu lesen soll.
2 Unterbruch, gesendet vom Terminal.
INT
KILL
9 Unterbricht den Prozess sofort und gnadenlos. Der Prozess kann nicht darauf reagieren.
TERM 15 Bittet den Prozess ganz nett, sich zu terminieren.
CONT 18 Lässt einen gestoppten Prozess weiterfahren.
TSTP 20 Stoppt den Prozess, hält ihn aber bereit zum weiterfahren. (CTRL-Z vom Terminal)
HUP
9.3.1
kill
kill [-SIGNALNUMMER] PROZESS sendet dem Prozess PROZESS ein Signal (standardmässig
SIGTERM). kill -l listet alle möglichen, sendbaren Signale auf.
Anwendungsbeispiele
Verschiedene Möglichkeiten, den Prozessen 3000 und 3010 das Signal SIGTERM (15) zu
senden:
#
#
#
#
kill
kill
kill
kill
3000 3010
-15 3000 3010
-SIGTERM 3000 3010
-sigterm 3000 3010
67
# kill -TERM 3000 3010
# kill -s 15 3000 3010
# kill -s SIGTERM 3000 3010
Sind die Prozesse nett und noch lauffähig, so beenden sie sich nach diesem Signal. Stellen
sie sich stur, kann man seiner Forderung mehr Nachdruck verleihen mit
# kill -9 3000 3010
9.3.2
killall
killall [OPTIONEN] PROZESSNAME sendet allen Prozessen mit dem Namen PROZESSNAME
ein Signal (standardmässig SIGTERM). killall -l listet alle möglichen, sendbaren Signale auf.
Beispiele von Optionen
-i
-q
-v
-w
Fragt interaktiv nach, welche Prozesse bendet werden sollen.
Macht das Kommando ruhig.
Macht das Kommando geschwätziger.
Wartet bis alle Prozesse wirklich beendet sind.
Anwendungsbeispiele
Beenden aller Mozilla Instanzen.
# killall mozilla-bin
9.4
Prozesszustände
Manchmal sieht man bei ps oder top Prozesse im Zombie Status. Dies bedeutet, dass sie
beim beenden hängen geblieben sind. Sie laufen nicht, sind aber noch auf dem System.
Solche Probleme weisen oftmals auf Software- oder Konfigurationsprobleme hin.
Oftmals werden alle Kinderprozesse ebenfalls beendet, wenn deren Elternprozess terminiert. Können sie dies nicht, so spricht man von Orphans (Waisen).
68
9.5
Job Management
Multitasking kann auch von der Kommandozeile ausgenutzt werden. und ist ein mächtiges
Instrument. So kann jedes Kommando mit einem Ampersand (&) ein Prozess im den
Hintergrund ausgeführt werden. In einem X-Window Terminal wird mittels # mozilla &
ein Browser aufgerufen, aber die Konsole zeigt sofort wieder den Prompt.
Ein laufender Prozess kann mittels <CTRL>+z angehalten werden. nach dem start des
Browsers mittels # mozilla zeigt die Shell nach <CTRL>+z den Prompt, aber Mozilla ist
blockiert. Will man Mozilla im Hintergrund weiterlaufen lassen, kann bg (für BackGround)
Mozilla weiter ausgeführt werden, während auch in der Shell gearbeitet werden kann. fg
für ForeGround holt den Prozess wieder nach vorne.
Das Shell Builtin jobs zeigt alle Prozesse die im Hintergrung blockiert oder aktiviert sind.
fg und kill können direkt auf alle Jobs angewendet werden. Dabei wird als Argument
das Prozentzeichen und die Job-Nummer verwendet werden.
Beispiel:
# tail -f /mbox &
[1] 1069
BLABlabla
# sleep 1000
<CTRL>+z
[2]+ Stopped
# bg
# jobs
[1]- Running
[2]+ Running
# kill %2
[2]+ Beendet
# jobs
[1]+ Running
#
9.6
sleep 1000
tail -f mbox &
sleep 1000 &
sleep 1000
tail -f mbox &
nohup
[5]Mit dem Kommando nohup [KOMMANDO] (für NoHangup) lässt ein Programm die Signale
SIGHUP SIGINT SIGQUIT und SIGTERM ignorieren. nohup schützt ein Programm
vor den HANGUP-Signalen. Dadurch kann es im Hintergrund weiterlaufen, auch wenn
der Benutzer sich ausloggt. Normalerweise würden mit der Loginshell alle Prozesse des
Anwenders durch ein SIGHUP beendet.
69
Der Prozess geht nicht automatisch in den Hintergrund, sondern muss mit einem ‘&’ am
Ende der Kommandozeile dorthin gebracht werden. Die Schedulerpriorität eines mit nohup
gestarteten Programms wird um 5 erhöht. Wenn die Standardausgabe des Programms ein
Terminal ist, so wird sie automatisch gemeinsam mit der Standardfehlerausgabe in die
Datei nohup.out umgeleitet. Ist das aktuelle Verzeichnis schreibgeschützt, wird die Datei
im HOME-Verzeichnis angelegt.
Anwendungsbeispiele
Folgendes Kommando schreibt alle Dateien die mit foobar beginnen in die Datei
nohup.out, auch wenn der User ausloggt.
# nohup find / -name foobar* &
70
Kapitel 10
Modifizeren von Prozessprioritäten
Prozesse sind unterschiedlich wichtig und haben unterschiedliche Anforderungen an das
System. So sollte ein Prozess sofort reagieren wenn der Benutzer auf etwas klickt oder ein
Notsignal einer externen Steuerung gemeldet wird, kann sich aber mehr Zeit lassen um
eine Logdatei zu schreiben oder im Hintergrund neue Mails zu checken.
Zum einen gibt es dabei eine Priorisierung, die vom Betriebssystem selbständig vergeben
wird. Sie wird bei den top und ps Kommandos in der Spalte PRI angezeigt. Der Kern
vergibt diese Prioritäten auf Grund verschiedener Kriterien wie:
ˆ Wieviel Systemzeit der Prozess schon verbraucht hat
ˆ Ob er auf Ein- Ausgabegeräte wartet
ˆ ...
Prioritäten gehen von 0 bis 40, werden aber oft auch als von -20 bis +19 dargestellt.
Modifizieren kann man nur die nice-Number . Mit dieser Nummer kann man dem Kernel
Tips für seine Priorisierung geben. Normale Prozesse haben eine nice-Number von 0, sehr
wichtige eine von -20, weniger wichtige eine von +19. Normale User können die niceNumber nur erhöhen zwischen 0 bis +19, also ihre Prozesse als unwichtiger deklarieren.
Der Superuser (root) kann Prozesse auch wichtiger machen und nice-Numbers bis -20
verteilen.
10.1
nice
[4]Mit nice [OPTION] [BEFEHL [ARGUMENT]] kann ein Befehl oder eine Kette von Befehlen mit der angegebenen nice-Number ausgeführt werden. Im Normalfall ist die niceNumber bei Verwendung von nice auf den Wert 10 festgelegt. Mit dem Schalter -n ZAHL
71
kann eine nice-Number zwischen -20 und 19 angegeben werden. Dabei bedeutet resultiert
eine kleinere nice-Number in einer höheren, und eine grosse nice-Number in einer niedrige
Priorität. Nur der Superuser ist in der Lage einen negativen Wert, und damit eine höhere
resultierende Priorität als normal, einzustellen.
10.1.1
Beispiele von Optionen
-PRIO
-n PRIO
10.1.2
Erhöhe die Priorität um PRIO.
Erhöhe die Prioritöt um PRIO.
Anwendungsbeispiele
# nice -n 19 find / -name urmel* -print > urmelliste.txt
Dieser langwierige Prozess bekommt eine sehr niedrige Ausführungspriorität zugewiesen.
Er wird praktisch nur ausgeführt, wenn das System genug Zeit hat.
10.2
renice
[4]renice NICENUMBER [OPTIONEN] erlaubt eine Änderung der nice-Number im Gegensatz
zu nice für laufende Programme.
10.2.1
-gwho
-uwho
-pwho
10.2.2
Beispiele von Optionen
Setzt alle Prozesse der Gruppe who auf die neue NICENUMBER.
Setzt alle Prozesse des Users who auf die neue NICENUMBER.
Setzt den Prozess mit der PID who auf die neue NICENUMBER.
Anwendungsbeispiele
Das Kommando erniedrigt die Prozesspriorität der Prozesse 42 und 4711, sowie aller Prozesse von den Benutzern wwwrun und kingkong. Normale Benutzer können nur auf die
Priorität Ihrer eigenen Prozesse einwirken und dabei die Priorität, wie schon aus nice
bekannt, verringern.
#
renice +5 4711 -u wwwrun kingkong -p 42
72
Kapitel 11
Durchsuchen von Textdateien mittels
regulärer Ausdrücke
[6]Der Begriff Regulärer Ausdruck oder regular expression (Abgekürzt regexps) ist uns
schon bei einigen Kommandos begegnet. Reguläre Ausdrücke benutzt man um festzustellen, ob eine Zeichenkette einer bestimmten Form, einem Muster genügt, oder ob eine
passende Zeichenkette in einer anderen Zeichenkette enthalten ist.
Ob man nun prüfen will, ob eine Zeichenkette ihrer Form nach wirklich eine Email Adresse
sein kann, oder ob man bestimmte Zeichenfolgen in einer langen Zeichenkette suchen oder
gar ersetzen will - Reguläre Ausdrücke sind ein effizienter und intelligenter Weg um in
einem Shellskript diese Zeichenkettenoperationen durchführen zu lassen.
11.1
Suchmuster (Pattern)
[7]Das Suchmuster ist eine Zeichenkette mit vielen Stellvertreterzeichen. Die wichtigsten
seien in den folgenden Kapiteln kurz erläutert.
11.1.1
Op.
f
.
\
[]
[^ ]
[-]
Zeichenmuster
Name
Match-Self
Match-Any-Character
Backslash
Matching-List
Non-Matching-List
Range
Bsp.
foobar
fo.
bbbaden\.ch
[tT]anja
[^wl]eiter
[a-c]
73
Passt
foobar
foo, fof
bbbaden.ch
Tanja, tanja
heiter, meiter
a, b, c
Passt nicht
phoobar
fo, fuu
bbaden-ch
anja, Zanja
weiter, leiter
0, d, f
Match-Self
Alle Zeichen (ausser die reservierten Musterzeichen wie ., ?, *, ...) passen nur genau auf
sich selber. Besteht das Suchmuster aus base, so wird auch nur base gefunden. Diese
bedeutung nennt man auch ordinär
Match-Any-Character
Der . (.) steht für ein einziges, beliebige Zeichen. Das Suchmuster .. passt somit auf alles,
was zwei Zeichen hat (inklusive Leerschläge, Ziffern, ...).
Backslash
Der Backslash dient dazu, die Spezialzeichen von ihrer speziellen Bedeutung zu erlösen
und sie ordinär zu machen. Will man geht.net suchen, so würde das Muster geht.net
auch gehtanet und geht0net finden (siehe Abschnitt 11.1.1). Benutzt man aber einen
Backslash als escape Zeichen, so wird der Punkt zu einem ordinären Punkt: geht\.net.
Will man nach einem Backslash suchen, so braucht es in der shell vier Stück davon, um
einen zu finden. Warum wissen die Götter des Kernels... Das Muster \\\\\\\\ findet
somit den Text \\.
Matching-List
In eckigen Klammern eingeschlossen kann man einzelne Zeichen zur Auswahl geben. Ein
Text passt genau dann, wenn er aus einem dieser Zeichen besteht. Dies kann zum Beispiel
verwendet werden um die Gross-Kleinschreibung zu vernachlässigen ([fF]oobar passt auf
foobar und Foobar).
Non-Matching-List
Wird ein ,,Dach” (^) in die eckigen Klammern einer Matching-List geschrieben, so kehrt
sich deren bedeutung um: Ein Text passt genau dann, wenn er nicht aus einem dieser
Zeichen besteht. Will man keinen Hund oder Mund, sondern alles Andere wie etwa rund
oder Kund, so kann man den H und den M ausschliesen mittels: [^HM]und.
Range
Es ist auch möglich Zeichenbereiche von-bis anzugeben. Die regulären Ausdrücke orientieren sich dabei am ASCII-Alphabet:
74
[a-z]
[a-zA-Z]
[0-9]
[3-5]
Alle
Alle
Alle
Alle
Kleinbuchstaben
amerikanischen Buchstaben
Zahlen
Zahlen von 3 bis und mit 5
Um alle Informatikerklassen zu finden, welche nach dem Schema IN - Eintrittsjahr mit 2
Ziffern-Grossbuchstaben gespeichert sind (IN02A, IN03B, ...), genügt das Muster IN[0-9][09][A-Z].
11.1.2
Wiederholungsmuster
Es ist auch möglich, beliebige Zeichen oder Muster zu wiederholen.
Op.
*
+
?
{}
{9, }
{9,9}
Name
Match-Zero-Or-More
Match-One-Or-More
Match-Zero-Or-One
Interval
Interval
Interval
Bsp.
bar*
bar+
bar?
o{3}
o{2,}
o{2,3}
Passt
ba, barrr
bar, barr
ba, bar
ooo
oo, oooo
oo, ooo
Passt nicht
bo, baz
ba, baz
barr, baz
o, oooo
o
o. oooo
Match-Zero-Or-More
Mit dem Stern (Asteriks) Kann man die letze Gruppe (das letzte Zeichen) kein-, einoder mehrmals wiederholen lassen. Kombiniert mit einem Punkt kann man ein Muster
konstruieren, das auf so ziemlich alles passt: .* (Irgendein Zeichen, beliebige male).
Match-One-Or-More
Das Pluszeichen lässt die vorhergehende Zeichengruppe ein- oder mehrmals vorkommen.
Wenn es nicht vorkommt, passt das Muster auch nicht.
Match-Zero-Or-One
Mit dem Fragezeichen kann man auf kein. oder einfaches Vorkommen testen. Weissman
nicht mehr, ob man naemlich mit einem h nach naeh geschrieben hat, so kann man trotzdem danach suchen: naeh?mlich.
75
Interval
Es gib die möglichkeit, Wiederholungen genauer zu spezifizieren. Eine Zahl alleine in
geschweiften Klammern gibt die Wiederholung exakt an.
Eine Zahl mit einem Komma sagt aus, dass diese Zahl die untere Grenze darstellt und
nach oben die Wiederholungen offen sind. Das Beispiel T{3, } passt auf 3 oder mehr T’s.
Zwei Zahlen geben die Unter- und Obergrenze an. T{1, 3} passt auf T, TT und TTT.
11.1.3
Positionsmuster
Op. Name
^
Beginning-Of-Line
$
End-Of-Line
Bsp.
Passt
Passt nicht
^time time out last time
time$ last time time out
Beginning-Of-Line
Das Dach (^) steht für einen Zeilenanfang. Somit kann man alle Zeilen die mit einem A
beginnen suchen mit dem Muster ^A. Alle nichtleeren Zeilen findet man mittels ^..
End-Of-Line
Ein Dollarzeichen Markiert den Schluss einer Zeile. Es wird oftmals mit dem Beginning-OfLine kombiniert. Alle Zeilen die nur das Wort Mark enthalten findet man mittels ^Mark$,
alle leeren Zeilen mittels ^$.
11.1.4
Zeichenklassen
Man hat sich auf ein paar erweiterte Symbole geeinigt, die für ganz bestimmte Zeichen stehen. Neuere Programme, die reguläre Ausdrücke implementieren können damit arbeiten:
76
[:alnum:]
[:alpha:]
[:blank:]
[:cntrl:]
[:digit:]
[:graph:]
[:lower:]
[:print:]
[:punct:]
[:space:]
[:upper:]
[:xdigit:]
Einen Buchstaben oder eine Ziffer
Einen Buchstaben
Ein Leereichen oder Tab
Ein Kontrollzeichen (ASCII 177 oder < 040)
Eine Ziffer
Ein druckbares Zeichen (Tilde, ASCII 040-176)
Ein kleingeschriebener Buchstabe
Ein druckbares Zeichen (Leerzeichen, Tilde, ASCII 040-176)
Kein alphanumerisches Zeichen oder Kontrollzeichen
Ein Leerzeichen, Wagenrücklauf, Neue Zeile oder Seitenvorschub
Ein großgeschriebener Buchstabe
Eine hexadezimale Ziffer (0-9, a-f, A-F)
So kann eine Jahreszahl mit 4 Ziffern gesucht werden mittels: [:digit:][:digit:][:digit:][:digit:]1 .
Folgender Ausdruck sucht IP-Adressen (mit kleinen Fehlern):
[1-2]?[0-9]?[[:digit:]]\.[12]?[0-9]?[[:digit:]]\.[1-2]?[[:digit:]]?[[:digit:]]\.[12]?[0-9]?[[:digit:]]
11.1.5
Verschiedenes
Hier noch der Rest, der nicht in andere Kapitel gepasst hat.
Op.
()
|
\9
Name
Grouping
Alternation
Back-Reference
Bsp.
(br)+
and|und
(z)\1
Passt
br, brbrbr
and, und
zz
Passt nicht
r, rrr, b
ind, mnd
z, a, r
Grouping
Grouping erlaubt das Anwenden aller Operatoren nicht nur auf das letzte Zeichen, sondern auf eine Gruppe von Zeichen. So passt Welc(ome){1,3} auf die drei Texte Welcome,
Welcomeome und Welcomeomeome.
Alternation
Alternation ermöglicht zwei verschiedene reguläre Ausdrücke zur Auswahl zu geben. Entweder muss der Eine, oder der Andere passen.
1
Natürlich geht es auch kürzer !
77
11.2
grep
Neben vielen anderen Befehlen ist grep [OPTIONS] REGEX [FILES] der Regex-Befehl.
grep sucht in Dateien nach Zeilen, die den regulären Ausdruck REGEX enthalten. Beim
REGEX ist zu beachten, dass die Shell Zeichen wie ?, *, ( und ) speziell behandelt. Darum muss der REGEX in Anführungszeichen eingeschlossen und spezielle Zeichen mit einem
Backslash (\) geschrieben werden.
11.2.1
-c
-h
-i
-n
-v
-l
-E
Beispiele von Optionen
Zeige nur die Anzahl der Zeilen die passen, nicht die Zeilen selber.
Zeige nur die passenden Linien ohne Dateinamen.
Ignoriere die Gross- Kleinschreibung generell.
Zeige die Zeilennummern der passenden Zeilen.
Zeige alle Zeilen, auf die der REGEX nicht passt.
Zeige nur die Dateinamen an.
Benutze erweiterte Reguläre Ausdrücke. Diese Option wird für folgende Muster benötigt:
ˆ Match-Zero-Or-One
ˆ Match-One-Or-More
ˆ Alternation
11.2.2
Beispiele
Alle Zeilen in den Dateien abc1 und abc2 zeigen, in denen das Wort Windows vorkommt,
unabhängig von der Gross- Kleinschreibung.
# grep -i windows abc1 abc2
Probleme mit der Shell: Stellen Sie sich vor, sie haben die Dateien foobar, bases und
basic im gleichen Verzeichnis. nun wollen sie in der Datei foobar nach allen Zeilen suchen
die Worte beinhalten die mit bas beginnen.
# grep bas* foobar
Da gibt es ein Problem ! Die shell benutzt ihr globbing und bevor grep überhaupt in
Aktion treten kann, wandelt sie bas* um in bases basic. Testen können sie dies mittels
# echo bas*
78
Die lösung bieten Anführungszeichen. Damit kann man die shell von den meisten globbing
Operationen abhalten:
# grep "bas*" foobar
# grep ’bas*’ foobar
79
Kapitel 12
Grundlagen der Dateibearbeitung
mit VI
VI ist ein alter, gereifter Texteditor. Seine Bedienung ist mehr als nur gewöhgnungsbedürftig, doch die richtigen Cracks sind mit ihm viel schneller als die Könner auf anderen
Texteditoren. Jedem Systemadministrator sollten die Grundzüge des VI bekannt sein,
denn er ist auf fast jedem Unixsystem vorhanden und manchmal die letzte Rettung. Auch
wenn das System schon fast aufgegeben hat, der VI läuft meistens noch.
12.1
Grundlagen des VI
Wichtig sind zwei Dinge:
ˆ Unterschätzen sie VI nicht. Er kann mit der Zwischenablage arbeiten, rechtschreibung prüfen, den Text einfärben, Filter anwenden, ...
ˆ VI hat zwei Modi: den Kommandomodus und den Editiermodus. In den Kommandomodus wechselt man mittels <Esc>, in den Eingabemodus mittels den Tasten O,
o, A, a, ...
Gestart wird VI mittels vi datei1 datei2 datei3. Wenn sie sich im Kommandomodus
befinden, können sie das Editieren der aktuellen Datei auf folgende Arten beenden:
:n
Nächste Datei.
:q
Beenden, wenn nichts verändert wurde.
:q! Beenden, alle Änderungen verwerfen.
:wq Änderungen speichern und beenden.
:x
Änderungen speichern und beenden.
ZZ Änderungen speichern und beenden.
80
Abbildung 12.1: VI-Referenz auf einem T-Shirt. Auch eine Methode.
12.2
Navigieren
Normalerweise beherrscht der VI die Spezialtasten wie <PageUp> oder die Cursortasten.
Es kann aber manchmal nötig sein, im Kommandomodus mit folgenden Tasten zu navigieren:
<Ctrl>+b Eine Seite nach oben.
<Ctrl>+f Eine Seite nach unten.
0 (Null)
Zum Start der Zeile.
^
Zum ersten, nichtleeren Zeichen der Zeile.
$
Zum ende der Zeile.
b
Ein Wort zurück.
G
Zum Ende der Datei.
h
Ein Zeichen nach links.
H
Zum Beginn der Seite.
j
Eine Zeile nach unten.
k
Eine Zeile nach oben.
l
Ein Zeichen nach rechts.
L
Zum unteren Ende der Seite.
w
Ein Wort weiter.
81
12.3
Editieren
Hier ein paar Editierkommandos des VI. Die meisten wechseln vom Kommando in den
Editiermodus:
Einfügen
i
Text vor dem Cursor einfügen.
a
Text nach dem Cursor einfügen.
O
Eine leere Zeile oberhalb.
o
Eine leere Zeile unterhalb.
Editieren
C
Löschen bis zum Ende der Zeile.
R
Überschreibemodus.
c
Ersetze das aktuelle Zeichen.
Löschen
dl
Lösche nächstes Zeichen.
dw
Lösche ein Wort.
dG
Lösche bis zum Ende der Datei.
dd
Lösche die ganze Zeile.
D
Lösche bis zum Ende der Zeile (dasselbe wie d$).
Kopieren
yl
Kopiere ein Zeichen.
yw
Kopiere ein Wort.
yG
Kopiere bis zum Ende der Datei.
yy
Kopiere die ganze Linie.
Einfügen
P
Füge den gelöschten oder kopierten Text eine Zeile weiter unten ein.
p
Füge den gelöschten oder kopierten Text eine Zeile weiter oben ein.
Suchen
/Muster
Suche das Muster nach unten.
?Muster
Suche das Muster nach oben.
n
Letzte Suche wiederholen.
N
Letzte Suche in die andere Richtung wiederholen.
Ersetzen
%s/regex/Ersatz/g Ersetzt alle regex-Muster mit dem Ersatz.
Spezialitäten
:!Kommando
Führt das Kommando in der Shell aus.
82
Teil III
104 - Gerätedateien, Linux
Dateisysteme und der Filesystem
Hierarchy Standard
83
Kapitel 13
Erzeugen von Partitionen und
Dateisystemen
(PB) Linux unterstützt eine Vielzahl von Speichermedien und Formaten. Von Linux werden all SCSI und IDE Geräte unterstützt, sowie Disketten, CD-ROMs, CD-Rs, Zip, Jaz
und viele weitere Wechselmedien. Diese Speichermedien können das standard Linux Dateisystem (ext2 ) enthalten oder aber unter anderem auch FAT, FAT32 oder NTFS.
Der meistverbreitete Festplattentyp ist IDE, wobei an einen IDE-Controller zwei Festplatten (master und slave) angehängt werden können. Zumeist ist aber ein PC mit zwei
IDE-Controllern (einem primary und einem secondary) ausgerüstet, wodurch bis zu vier
IDE-Geräte betrieben werden können. Bei der Verwendung eines SCSI-Controllers können
bis zu 15 SCSI-Geräte an den Controller angeschlossen werden.
13.1
Benennung der Festplatten unter Linux
Linux bezeichnet die Festplatten standarmässig mit folgenden Gerätenamen:
IDE:
/dev/hda Primary master Festplatte
/dev/hdb Primary slave Festplatte
/dev/hdc Secondary master Festplatte
/dev/hdd Secondary slave Festplatte
usw.
84
SCSI:
/dev/sda Erste SCSI Festplatte
/dev/sdb Zweite SCSI Festplatte
/dev/sdc Dritte SCSI Festplatte
usw.
13.2
Festplatten Partitionen
Auf jeder Festplatte in einem PC können bis zu 16 Partition erstellt werden. Eine Partition
kann dabei als Container für ein Dateisystem (oder im Spezialfall für weitere Partitionen)
betrachtet werden. Anders als bei MS-DOS werden bei Linux keine Buchstaben für die
Bezeichnung verwendet sondern Zahlen. Diese Zahlen werden an den Geratenamen der
Festplatte angehängt.
13.2.1
Primäre Partitionen
Primäre Partitionen müssen immer ein Dateisystem beinhalten und mindestens eine
primäre Partition (von maximal vier möglichen) muss existieren. Falls alle vier primären
Partitionen existieren werden diese wie folgt benannt:
/dev/hda1
/dev/hda2
/dev/hda3
/dev/hda4
Eine dieser vier primären Partitionen kann als aktiv marktiert werden, wodurch das BIOS
diese zum Starten auswählen kann.
13.2.2
Erweiterte Partitionen
Eine erweiterte Partition ist eine Variante einer primären Partition, welche aber kein Dateisystem enthalten kann, sondern nur logische Partitionen. Pro Festplatte kann nur eine
erweiterte Partionen bestehen, welche den Platz einer primären Partition einnimmt. Die
Gerätenamen einer IDE-Festplatte mit einer primären und einer erweiterten Partition lauten deshalb wie folgt:
85
/dev/hda1 (primäre Partition)
/dev/hda2 (erweiterte Partition)
13.2.3
Logische Partitionen
Logische Partitionen existieren innerhalb einer erweiterten Partition. Es können bis zu
12 logische Partitionen erstellt werde wobei diese im Gerätenamen die Nummern 5 bis 16
bekommen. Eine IDE-Festplatte mit einer primären, einer erweiterten und vier logischen
Partitionen wird desshalb mit folgenden Gerätenamen versehen:
/dev/hda1 (primäre Partition)
/dev/hda2 (erweiterte Partition)
/dev/hda5 (logische Partition 1)
/dev/hda6 (logische Partition 2)
/dev/hda7 (logische Partition 3)
/dev/hda8 (logische Partition 4)
Obiges Beispiel zeigt eine typische Partitionierung für die Installation eines Linux-Systems.
Dadurch wird sichtbar, dass das Maximum von 15 Partitionen (3 primäre und 12 logische
Partitionen) völlig ausreichen für die Installation eines Linux-Systems ist.
13.3
Das root-Dateisystem und mount points
Beim Starten eines Linux-Systems wird als erstes das oberste Dateisystem, das sogenannte
root-Dateisystem1 , verfügbar, welches mit einem einfachen slash (,,/ “) bezeichnet wird. In
einer einfachen Installation kann dieses Dateisystem alles beinhalten, was aber zu Problemen führen kann, wenn die Speicherkapazität aufgebraucht ist. Desshalb werden oftmals
mehrere Partitionen definiert, welche je ein Verzeichnis unter ,,/ “ beinhalten. Beim Starten des Linux-Systems werden dann diese Partitionen an das root-Dateisystem eingehängt
(mounted ; siehe dazu Kapitel 15). Die eingehängten Dateisysteme sind dabei auf verschiedenen Partitionen und eventuell auch auf verschiedene Festplatten verteilt.
Die Entscheidung, welche Verzeichnisse auf separaten Partitionen platziert werden, ist
einerseites auf persönliche Ansichten sowie andererseites auf technische Vorgaben gestützt.
Folgende Hinweise zu den benötigten Verzeichnissen zeigen die technischen Vorgaben und
beeinflussen somit die Entscheidung, ob diese in einem separaten Dateisystem geführt
werden sollen.
1
Oft auch root-Verzeichnis genannt; nicht mit dem speziellen Benutzer root zu verwechseln.
86
/ (das root-Dateisystem) Da diese Dateisystem das einzige ist, welches von Beginn an
zur Verfügung steht, müssen einige für den Startvorgang notwendige Verzeichnisse
enthalten sein. Es sind dies:
/bin und /sbin Beinhalten benötigte Programme
/dev Beinhaltet die Gerätedateien
/etc Beinhalten die Konfigurationsdateien
/lib Beinhaltet Programmbibliotheken
/boot In diesem Verzeichnis wird der kernel (das ,,Hauptprogramm“ des Linux-Systems)
abgelegt. Wenn eigene kernels kompiliert werden oder am kernel programmiert wird,
macht es Sinn, dass dieses Verzeichis auf eine eigene Partition gelegt wird um zu
vermeiden, dass die kernel und die dazugehörenden Dateien auf dem root-Verzeichnis
herumliegen.
/home In diesem Verzeichnis werden üblicherweise die Dateien der Benutzer abgelegt.
Es hat sich bewährt eine eigene Partition dafür zu verwenden. Allenfalls kann sogar
eine eigene Festplatte dafür reserviert werden.
/tmp Hier werden die temporären Dateien abgelegt, die zwischenzeitlich sehr gross werden
können. Daher empfiehlt es sich auch hier eine eigene Partition zu verwenden.
/var In diesem Verzeichnis werden Log-Dateien abgelegt, die ebenso wie die temporären
Dateien, sehr gross werden können. Desshalb sollte auch hier eine eigene Partition
verwendet werden.
/usr Unter diesem Verzeichnis wird ein Vielzahl von Verzeichnissen angelegt, welche
Benutzer-Kommandos, Quelltexte von Programmen sowie Dokumentationen beinhalten. Da auch diese Daten sehr gross sein können empfiehlt sich hier ebenfalls eine
eigenständige Partition.
/swap Hier wird die sogenannt /swap-Partition angelegt, welche benötigt wird um virtuellen Speicher zur Verfügung zu stellen. Die Wahl der Grösse eine /swap-Partition
wird im Kapitel 21 behandelt.
Folgende Tabelle zeigt eine mögliche Aufteilung der Festplatten für ein LinuxSystem.
Es wird davon ausgegangen, dass zwei IDE Festplatten (2GB und
6GB), welche am primären IDE-Controller angeschlossen sind, zum Einsatz kommen.
87
Partition
/dev/hda1
/dev/hda2
/dev/hda5
/dev/hda6
/dev/hda7
/dev/hda8
/dev/hda9
/dev/hdb1
13.4
Typ
Primär
Erweitert
Logisch
Logisch
Logisch
Logisch
Logisch
Primär
Dateisystem
/
/boot
/tmp
/usr
/var
/swap
/home
Grösse
300MB
300MB
300MB
600MB
300MB
128MB
6GB
Partitionen verwalten
Linux bietet grundsätzlich zwei Möglichkeiten um Partitionen zu verwalten. Als Erstes
das textbasierte Programm fdisk, welches bei allen Linux-Distrubutionen existiert, und
zweitens das Programm cfdisk welches mit einer grafischen Ausgabe (aber immer noch
textbasiert) ausgestattet ist.
13.4.1
fdisk
fdisk [DEVICE]
Zeigt oder ändert die Partitionstabelle des Gerätes DEVICE über ein interaktives Menü.
DEVICE muss ein physikalischer Datenträter (also zum Beispiel /dev/hda) sein. Wird
DEVICE nicht angegeben wird /dev/hda verwendet. Die Steuerung von fdisk geschieht
über einzelnen Buchstaben, welche im interkativen Dialog eingegeben werden. fdisk führt
keine Änderungen an der Partitionstabelle durch, bis es das Kommando write bekommt.
ACHTUNG: Bei der Verwendung von fdisk an einem laufenden System kann die Festplatte zerstört werden. Bei einem laufenden System ist grösste Vorsicht bei Arbeiten an
der Partitionstabelle geboten. Stellen Sie sicher, dass Sie genau wissen was Sie planen und
wie Sie dies erreichen!
88
Beispiele von Kommandos
a Setzen/Zurücksetzen des bootable-Flag einer primären Partition.
d Löschen einer Partition. Interaktiv wird die zu löschende Partition
abgefragt und eine Bestätigung verlangt.
l Listet alle bekannten Partitionstypen auf.
m Zeigt ein kuzes Hilfemenü.
n Erstellt eine Partition. Interaktiv werden die Angaben zu der zu
erstellenden Partition abgefragt.
p Zeigt die aktuelle Partitionstabelle wie sie im Speicher besteht. Diese kann von der bestehenden Partitionstabelle auf der Festplatte
abweichen, wenn bereits Änderungen vorgenommen wurden.
q Verlässt das Programm ohne die Partitionstabelle zu speichern.
t Ändert den Dateisystem auf einer Partition.
w Schreibt die Partitionstabelle mit den getätigten Änderungen auf
die Festplatte. Ohne diesen Aufruf werden keinen Änderungen gespeichert.
Anwendungsbeispiele
# fdisk /dev/sda
Command (m for help): m
Command action
a
toggle a bootable flag
b
edit bsd disklabel
c
toggle the dos compatibility flag
d
delete a partition
l
list known partition types
m
print this menu
n
add a new partition
o
create a new empty DOS partition table
p
print the partition table
q
quit without saving changes
s
create a new empty Sun disklabel
t
change a partition’s system id
u
change display/entry units
v
verify the partition table
w
write table to disk and exit
x
extra functionality (experts only)
Command (m for help): p
89
Disk /dev/sda: 255 heads, 63 sectors, 1106 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot
/dev/sda1
/dev/sda2
/dev/sda3
Start
1
8
74
End
7
73
1106
Blocks
56196
530145
8297572+
Id
83
82
83
System
Linux
Linux swap
Linux
Command (m for help): q
#
13.5
Dateisysteme erstellen
Sobald eine Festplatte partitioniert ist, können auf den einzelnen Partitionen Dateisysteme erstellt werden. Um diese Aufgabe zu erledigen wird das Programm mkfs benötigt.
Normalerweise werden mit mkfs Dateisysteme vom Type ext2 erstellt. Allerdings können
aber auch andere Dateisysteme wie zum Beispiel: MSDOS, ReiserFS, XFS, usw. angelegt
werden. Genauer betrachtet ist das Programm mkfs nur ein ,,Frontend“ für eigenständige
Programme im Hintergrund. Zur Erstellung eines ext2 Dateisystems ist diese Programm
im Hintergrund mke2fs und für ein MSDOS Dateisystem mkdosfs.
Um eine Linux Swap Partition zu erstellen oder eine zweite Swap Partition für den Einsatz
vorzubereiten wird das Programm mkswap benötigt.
13.5.1
Das Ext2 Dateisystem
Das Dateisystem liegt über der physischen Struktur des Datenträgers. Zwischen dem Dateisystem und einem Anwendungsprogramm liegt das Virtuelle Dateisystem (VFS, Virtual
File System), bei dem sich das tatsächliche Dateisystem anmeldet, um benutzt werden zu
können. Die dem VFS bekannten Dateisysteme listet die Datei /proc/filesystems auf.
Das ext2-Dateisystem spricht den Datenträger in Blöcken an. Eine bestimmte Anzahl
Blöcke werden in einer Blockgruppe zusammengefasst. Der erste Block jeder Blockgruppe
ist der Superblock . Dort befinden sich notwendige Daten für die Verwaltung des Dateisystems.
90
Der Superblock
Der Superblock in der ersten Blockgruppe einer ext2-Partition wird beim Mounten des
Dateisystems gelesen. Er beinhaltet Informationen die für das ganze Dateisystem gelten:
ˆ Anzahl der belegten und freien Inodes und Blöcke
ˆ Anzahl der Blöcke und Inodes je Blockgruppe
ˆ Nutzungsinformationen, wie Zeitpunkt des letzten mount-Befehls, letzter schreibender Zugriff und Anzahl der Mountvorgänge seit dem letzten Überprüfen des Dateisystems
ˆ Das Label des Dateisystems, verschiedene Einstellungen zum Verhalten, eine eindeutige ID des Dateisystems.
Da jede Blockgruppe eine Kopie des Superblocks enthält, liegen diese Informationen mehrfach auf dem Datenträger vor, so dass auch bei zerstörtem ersten Superblock ein Abfragen
dieser Informationen möglich ist. Bei der Benutzung von Standardeinstellungen, in der
eine Blockgruppe 8192 Blöcke umfasst, liegt der zweite Superblock bei Blocknummer 8193.
Inodes
Inodes sind der Schlüssel zu den Dateien, wobei im ext2-Dateisystem der Begriff der Datei
recht weit gefasst ist. Ein Dateieintrag kann sowohl eine reguläre Datei darstellen, als auch
ein Verzeichnis, ein Link, eine Gerätedatei, eine Pipe oder ein Socket. Die Inodes enthalten
wichtige Informationen über die jeweilige Datei. Hier seien zum Beispiel genannt:
ˆ Inode-Nummer
ˆ Referenzzähler
ˆ Dateityp
ˆ Eigentümer, Gruppe
ˆ Berechtigungen
ˆ Grösse
ˆ Zeiten (Erstellung, Zugriff, Änderung)
ˆ Zeiger auf die belegten Datenblöcke
91
Über die Inode kann auf den Inhalt einer Datei zugegriffen werden. In ihnen sind die
Blöcke gelistet, die die Anwendungsdaten der Datei enthalten. Diese Blöcke werden bei
kleinen Dateien direkt addressiert. Bei grösseren Dateien liegt anstatt einer Blocknummer
ein Verweis auf eine weitere Blockadresstabelle vor. Bei wirklich grossen Dateien kann diese
zusätzliche Blockadresstabelle anstatt der Adressen der Datenblöcke weitere Verweise auf
weitere Blockadresstabellen enthalten.
Der Zugriff auf eine Datei findet statt, indem ausgehend von der Inode anhand der
Blockadressen die Daten der Datei zusammengesucht werden. Da das ext2-Dateisystem
immer versucht, aufeinander folgende Blöcke für eine Datei zu belegen, können so die
Schreib/Lese-Kopfbewegungen der Festplatte minimiert werden.
Bei jedem Zugriff auf eine Datei wird die Inode aktualisiert. Allerdings ist zu beachten,
dass der schreibende Zugriff auf einen Datenträger in der Regel gepuffert wird und so die
geänderten Daten nicht sofort auf dem Datenträger gespeichert werden. Aus diesem Grund
ist es sehr wichtig, dass ein Linux-System nicht einfach im laufenden Betrieb abgeschaltet,
sondern ordnungsgemäss heruntergefahren wird. Die Shutdown-Sequenz beinhaltet Befehle
(umount), die für das Aktualisieren des Datenträgerinhalts und das korrekte Abhängen des
Dateisystems sorgen.
13.5.2
mkfs
mkfs [-t TYPE] [FSOPTIONS] DEVICE
Erstellt auf dem Gerät DEVICE ein Dateisystem des Typs TYPE. Wird der Typ weggelassen
wird ext2 verwendet. Falls FSOPTIONS angegeben sind, werden diese an das Programm im
Hintergrund (mke2fs, mkdosfs, usw.) weitergeggeben.
Beispiele von Dateisystem-Typen
ext2
msdos oder vfat
ext3
reiserfs
xfs
Erstellt ein Linux ext2 (second enhanced ) Dateisystem.
Erstellt ein MSDOS Dateisystem.
Erstellt ein Journaling-fähiges Linux ext3 Dateisystem. Das Journaling muss mit der Option -j bei den FSOPTIONS angegeben werden.
Erstellt ein Reiser Dateisystem.
Erstellt ein XFS Dateisystem.
92
Beispiele von Optionen
-b Blockgrösse
-c
-L label
-N num
-q
-v
Spezifiziert die Grösse der Blocks in Byte. Gültige Grössen sind
1024, 2048 und 4096.
Prüft das angegebene DEVICE vor dem Erstellen des Dateisystems
auf fehlerhafte Blöcke.
Setzt den Titel für die Partition aud label (nur mit den Typen etx2
und ext3 ).
Setzt die Anzahl zu erstellenden Inodes (nur mit den Typen etx2
und ext3 ).
Unterdrückt fast alle Ausgaben von mkfs.
Setzt mkfs in den gesprächigen Modus.
Anwendungsbeispiele
# mkfs -V -t ext2 /dev/fd0
mkfs version 2.11z (Mar 21 2003)
mkfs.ext2 /dev/fd0
mke2fs 1.34-WIP (21-May-2003)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
184 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
184 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkfs -V -t msdos /dev/fd0
mkfs version 2.11z (Mar 21 2003)
mkfs.msdos /dev/fd0
mkfs.msdos 2.8 (28 Feb 2001)
93
13.5.3
mkswap
mkswap DEVICE
Bereitet das Gerät DEVICE auf den Einsatz als Swap Partition vor. Auf dem benannten
Gerät sollte bereits eine Partition vom Typ swap erstellt sein.
94
Kapitel 14
Erhaltung der Dateisystemintegrität
Nach einer gewissen Zeit des Betriebs eines Dateisystems können Probleme auftreten wie:
ˆ Der verfügbare Speicherplatz wird knapp und das System arbeitet nicht mehr korrekt.
ˆ Ein Dateisystem wird beschädigt durch einen Stromausfall oder eine Systemabsturz.
ˆ Es sind keine Inodes mehr verfügbar um neue Dateien zu erstellen.
Regelmässiges kontrollieren des Dateisystems hilft, diesen Probleme vorzubeugen oder diese
erst gar nicht entstehen zu lassen.
14.1
Überwachung von freiem Speicherplatz und freien Inodes
Ein Dateisystem ist unbrauchbar, wenn es über keinen freien Speicherplatz mehr verfügt
oder die verfügbaren Inodes aufgebraucht sind.
Es ist wichtig, dass auf den Systempartitionen kein Mangel an Speicherplatz und Inodes
auftritt. Um dies zu überwachen wird das Programm df verwendet.
14.1.1
df
df [OPTIONS] [DIRECTORIES]
Ermittelt die Belegung einzelner Dateisysteme (oder aller eingehängthe Dateisysteme).
Wird df ohne DIRECTORIES angewandt, so zeigt es alle in der Datei /etc/fstab aufgeführten Dateisysteme. Wird der Befehl df mit einem bestimmten Dateisystem aufgerufen,
95
entweder durch die Nennung des mount points oder durch die Angabe der entsprechenden Gerätedatei, so werden nur die Angaben über dieses Dateisystem ausgegeben. Dies
Ausgabe von df könnte wie folgt aussehen:
Filesystem
/dev/sda3
/dev/sda1
/dev/sdb1
1k-blocks
8167196
54416
8744304
Used Available Use% Mounted on
1496300
6256020 20% /
3834
47773
8% /boot
2540564
5759548 31% /webhome
Beispiele von Optionen
-h Die Ausgabe wird in einer lesbareren Form (human-readable) in
Mega- bzw. Gigabytes dargestellt.
-i Stellt anstatt des Speicherplatzes Informationen über die verfügbaren Inodes dar.
Hinweis für moderne Journaling-Dateisysteme: Diese Systeme speichern ihre Daten in einer
völlig anderen Struktur (in sogenannten B-Bäumen) ab. Das hat zur Folge, dass solche
Systeme keinen reservierten Platz für die Inodes aufweisen, und daher Inodes dynamisch
anlegen können, wenn sie benötigt werden. Aus diesem Grund zeigt df -i bei solchen
Dateisystemen keine realen Werte für die Inodes an.
Anwendungsbeispiele
# df -hi
Filesystem
/dev/sda3
/dev/sda1
/dev/sdb1
14.2
Inodes
1014k
14k
1.1M
IUsed
88k
27
7.9k
IFree IUse% Mounted on
926k
9% /
13k
1% /boot
1.0M
1% /webhome
Überwachung der Speicherplatzbelegung
Oftmals stellt sich die Frage ,,Wodurch wird bloss soviel Speicherplatz verbraucht?“. Um
dies zu klären kann das Programm du verwendet werden, welches detailiert Auskunft über
die Belegung gibt.
14.2.1
du
du [OPTIONS] [DIRECTORIES]
96
Zeigt den Platzbedarf einzelner Dateien beziehungsweise Verzeichnisse an. Dies ist wichtig,
wenn es darum geht, herauszufinden, welches Verzeichnis besonders viel Platz benötigt auf
einem Dateisystem, von welchem der df-Befehl gezeigt hatte, dass der Platz langsam knapp
wird. Ohne die Angabe von OPTIONS und DIRECTORIES zeigt du rekursiv die Belegung aller
Verzeichnisse im aktuellen Arbeitsverzeichnis.
Beispiele von Optionen
-a Zeigt alle Dateien, nicht nur Verzeichnisse.
-c Zeigt ein Gesamttotal an. Nur sinnvoll wenn mehrere DIRECTORIES
angegeben werden.
-h Die Ausgabe wird in einer lesbareren Form (human-readable) in
Mega- bzw. Gigabytes dargestellt.
-s Gibt ein Total für alle angegebenen DIRECTORIES aus.
Anwendungsbeispiele
# du -s
51560
54316
4
12
4
24
13732
5724
93204
209404
108
261604
1396
6816
227096
312552
0
/usr/*
/usr/X11R6
/usr/bin
/usr/dict
/usr/doc
/usr/etc
/usr/games
/usr/include
/usr/kerberos
/usr/knox
/usr/lib
/usr/libexec
/usr/local
/usr/local2
/usr/sbin
/usr/share
/usr/src
/usr/tmp
# du -chs /var/run/* /var/spool/*
4.0k
/var/run/apache.pid
4.0k
/var/run/apache2.pid
4.0k
/var/run/apmd.pid
32k
/var/run/atd.pid
4.0k
/var/run/crond.pid
97
4.0k
4.0k
4.0k
4.0k
4.0k
4.0k
4.0k
4.0k
8.0k
32k
4.0k
16k
8.0k
8.0k
4.0k
4.0k
500k
40k
4.0k
4.0k
4.0k
716k
14.3
/var/run/gpm.pid
/var/run/klogd.pid
/var/run/netreport
/var/run/runlevel.dir
/var/run/sendmail.pid
/var/run/sshd.pid
/var/run/sudo
/var/run/syslogd.pid
/var/run/utmp
/var/run/xfs.pid
/var/run/xinetd.pid
/var/spool/anacron
/var/spool/at
/var/spool/cron
/var/spool/fax
/var/spool/lpd
/var/spool/mail
/var/spool/mqueue
/var/spool/rwho
/var/spool/up2date
/var/spool/vbox
total
Überprüfen der Dateisystem-Integrität
Wie schon beim Anlegen von Dateisystemen, so ist auch beim Reparieren beziehungsweise
Prüfen der Systeme für jedes Dateisystem ein spezielles Programm vorhanden, das genau
das jeweilige Dateisystem kennt. Ebenso wie beim Anlegen gibt es auch wieder ein sogenanntes Frontend, das dann die jeweiligen Programme aufruft. Dieses Frontend heisst
fsck. Beispiel dafür sind:
e2fsck oder fsck.ext2 Second Extended Dateisystem (ext2 )
fsck.ext3 Third Extended Dateisystem (ext3 )
reiserfsck Reiser Dateisystem
fsck.minix Minix Dateisystem
fsck.msdos MS-DOS FAT Dateisystem
fsck.vfat Windows VFAT Dateisystem
fsck.xfs XFS Dateisystem
98
Grundsätzlich ist jedes dieser Programme dafür gedacht, die Konsistenz eines Dateisystems
zu überprüfen und gegebenenfalls zu reparieren.
14.3.1
fsck
fsck [OPTIONS] [-t TYPES] [FSOPTIONS] FILESYSTEMS
Überprüft die angegebenen FILESYSTEMS auf Fehler und korrigiert diese auf Wunsch. TYPES
wid standardmässig als ext2 angenommen. Die FSOPTIONS werden an die im Hintergrund
aufgerufenen Programme, welche anhand der TYPES ausgewählt werden, weitergegeben.
Die Überprüfung und Reparatur von Journaling-Dateisystemen läuft grundsätzlich anders
ab, als die von herkömmlichen Dateisystemen. Hier wird im Falle einer Inkonsistenz das
Transaction-Log (das Journal) zurückverfolgt und alle Transaktionen rückgängig gemacht,
bis das System wieder konsistent ist. Dieser Vorgang ist wesentlich schneller, als der bei
einem traditionellen Dateisystem, da nicht die ganze Platte überprüft werden muss.
Beispiele von Optionen
-A
-N
-t TYPES
Führt eine Prüfung für alle in /etc/fstab eingetragenen Dateisysteme durch.
Prüft die angegebenen FILESYSTEMS führt aber keine ReparaturOperationen durch.
Legt eine Liste von zu prüfenden Dateisystem-Typen fest. Die TYPES werden kommasepartiert angegeben und können wahlweise
mit einem no oder ! versehen werden, was dazu führt, dass diese Typen nicht geprüft werden. Weiter können typenspezifische
Optionen hinter den einzelnen TYPES mit opts=... angegeben
werden (zum Beipiel opts=ro für readonly Dateisysteme).
99
Beispiele von FSOPTIONS für e2fsck
-b superblock
-c
-f
-n
-p
-y
Verwendet den angegebenen superblock anstelle des ersten Blocks.
Überblicherweise wird -b 8193 verwendet um einen defekten superblock zu reparieren.
Prüft auf defekte Blöcke.
Erzwingt einen Überprüfung auch wenn das Dateisystem nicht als
fehlerhaft erkannt wird.
Beantwortet alle interaktiven Fragen mit no wodurch man sieht,
was bei einer ,,normalen“ Ausführung passieren würde.
Repariert das Dateisystem ohne nachzufragen.
Beantwortet alle interaktiven Fragen mit yes wodurch eine nichtinteraktive Ausführung erlaubt wird.
Anwendungsbeispiele
# fsck -v /dev/fd0
# floppy is a ext2 filesystem
fsck 1.34-WIP (21-May-2003)
e2fsck 1.34-WIP (21-May-2003)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
177 inodes used (96%)
0 non-contiguous inodes (0.0%)
# of inodes with ind/dind/tind blocks: 6/0/0
659 blocks used (45%)
0 bad blocks
0 large files
134
28
0
0
0
0
6
0
-------168
regular files
directories
character device files
block device files
fifos
links
symbolic links (6 fast symbolic links)
sockets
files
100
# fsck -v /dev/fd0
# floppy is a msdos filesystem
fsck 1.34-WIP (21-May-2003)
dosfsck 2.8 (28 Feb 2001)
dosfsck 2.8, 28 Feb 2001, FAT32, LFN
Boot sector contents:
System ID "mkdosf2"
Media byte 0xf0 (5.25" or 3.5" HD floppy)
512 bytes per logical sector
512 bytes per cluster
1 reserved sector
First FAT starts at byte 512 (sector 1)
2 FATs, 12 bit entries
4608 bytes per FAT (= 9 sectors)
Root directory starts at byte 9728 (sector 19)
224 root directory entries
Data area starts at byte 16896 (sector 33)
2847 data clusters (1457664 bytes)
18 sectors/track, 2 heads
0 hidden sectors
2880 sectors total
Reclaiming unconnected clusters.
/dev/fd0: 1 files, 3/2847 clusters
14.4
Weitere Werkzeuge für den Umgang mit ext2
Dateisystemen
Nachfolgend werden weitere Werkzeuge aufgelistet, mit welchen Einfluss auf ein Second
Extended Dateisystem genommen werden kann.
mke2fs Erstellt ein ext2 Dateisystem auf einer Partition. Siehe dazu Kapitel (13.5.2).
debugfs Mit Hilfe dieses Programms können die Einstellungen eines ext2 Dateisystems
interaktiv verändert werden.
dumpe2fs Gibt den Superblock und Block-Gruppeninformationen eines ext2 Dateisystems
auf stdout aus. So kann diese wichtige Information zwischengespeichert werden um
damit ein Dateisystem manuell wiederherzustellen.
tune2fs Erlaubt die Anpassung der Parameter eines ext2 Dateisystems.
101
Kapitel 15
Kontrolle des Ein- und Aushängen
von Dateisystemen
Unter Linux werden die verschiedenen Laufwerke nicht wie unter Windows als einzelne
Dateisysteme mit eigenem Laufwerksbuchstaben verwaltet, sondern sie werden zu einem
einzigen Baum zusammengebaut der beim root direcory (,,/”) beginnt. Der englische Begriff mount (anbringen, montieren) steht für das Einhängen der verschiedenen Dateisysteme
in den Dateibaum. Dieses Einhängen geschieht entweder automatisch beim Systemstart
(gesteuert über die Datei /etc/fstab), oder einzelne Dateisysteme werden manuell während
des Betriebs mit dem Befehl mount eingehängt. Dieses manuelle Einhängen bezieht sich
in der Regel auf Wechselmedien, wie etwa Disketten, CD-ROMs oder auch Netzlaufwerke. Das Aushängen von zuvor eingehängten Dateisystemen kann mit dem Befehl umount
erledigt werden.
Verzeichnisse, welche als mount point vorgesehen sind, enthalten üblicherweise keine Dateien oder Unterverzeichnisse, da beim Einhängen eines Dateisystems an einen mount point
allenfalls vorhandene Dateien oder Verzeichnisse darin nicht mehr verfügbar sind, bis das
Dateisystem wieder ausgehängt wird. Typische mount points sind /usr, /home, /var, usw..
15.1
Die Datei /etc/fstab
Die Datei /etc/fstab ist sozusagen die Bauanleitung des Systems, in der steht, welches
Dateisystem an welchen Punkt eingehängt werden soll. Es obliegt dem Systemadministrator, diese Datei zu erstellen und zu pflegen. Jedes Dateisystem wird durch eine separate
Zeile mit sechs Feldern in /etc/fstab repräsentiert. Innerhalb einer Zeile werden die Felder
durch Tabs oder Leerzeichen getrennt. Die Reihenfolge der Zeilen in der fstab ist wichtig,
da fsck(8), mount(8), und umount(8) diese Datei sequentiell abarbeiten.
Ein Beispiel einer /etc/fstab Datei, für ein einfaches Linux-System, könnte wie folgt aussehen:
102
/dev/hda1
/dev/hda3
/dev/hda5
/dev/cdrom
/dev/fd0
/
swap
/usr
/cdrom
/floppy
ext2
swap
ext2
auto
auto
defaults 1 1
defaults 0 2
defaults 1 2
ro,noauto,user 0 0
defaults,noauto,user 0 0
Die einzelnen Felder bedeuten folgendes:
1: device Diese Feld gibt den Gerätenamen der Festplatten-Partition an, welche das einzuhängende Dateisystem beinhaltet (zum Beispiel /dev/hda1 ). Es darf keine gesamte
Festplatte (zum Beispiel /dev/hda) angegeben werden.
2: mount point In diesem Feld wird das Verzeichnis eingetragen, in welches das Dateisystem eingehängt werden soll.
3: filesystem type Der Typ des einzuhängenden Dateisystems. Die möglichen Typen
sind im Kapitel 15.1.1 aufgelistet.
4: mount options In diesem Feld wird eine kommseparierte Liste von Optionen abgegeben, welche beim einhängen berücksichtigt wird. Mögliche Optionen sind im Kapitel
15.1.2 aufgelistet.
5: dump frequency In diesem Feld wird angegeben, ob das Dateisystem in ein mit dem
Programm dump erstelltes Backup einbezogen werden soll. Ein Wert von 1 bedeutet
eine Einbeziehung, 0 lässt es aus.
6: pass number for fsck In diesem Feld wird angegeben in welcher Reihenfolge eine
automatische Überprüfung aller Dateisysteme mit fsck durchgeführt wird. Der Wert
0 bedeutet keine Prüfung, 1 sollte für das root-Dateisystem angegeben werden und 2
für alle weiteren Dateisysteme, welche an das root-Dateisystem angehängt sind.
15.1.1
Dateisystem Typen
Unter anderem können in einem Linux-System folgende Dateisystem-Typen eingehängt
werden:
ext2 Das Standard Linux Second Extended Dateisystem.
ext3 Das Linux Third Extended Journaling-Dateisystem.
iso9660 Das CD-ROM Dateisystem.
ignore Durch diese Angabe wird die Zeile nicht beachtet, wodurch zur Zeit unbenutze
Dateisysteme nicht vollständig aus der Datei /etc/fstab entfernt werden müssen.
103
msdos Das MS-DOS Dateisystem FAT, welches auf das Dateinamen-Format ,,8.3“ limitiert ist.
vfat Windows-Dateisystem Virtual FAT welches lange Dateinamen unterstützt.
ntfs Das ntfs Dateisystem von WindowsNT/2000/XP.
nfs Das Network File System, welches für Dateisysteme auf entfernten Rechnern verwendet wird.
swap Bezeichnet ein Linux swap Dateisystem.
15.1.2
Mount-Optionen
Folgende Optionen können in der vierten Splate von /etc/fstab eingegeben werden;
async Alle Ein-/Ausgabe Operationen des Dateisystems werden asynchron vorgenommen.
atime Die Zugriffszeit der Inodes (atime) werden bei jedem Zugriff gesetzt. Diese Option
ist als Voreinstellung gesetzt.
auto Wenn diese Option in /etc/fstab steht, wird das Dateisystem eingehängt, wenn mount
mit der Option -a aufgerufen wird (siehe Kapitel 15.3).
defaults Entspricht den voreingestellten Optionen: rw, suid, dev, exec, auto, nouser
und async.
dev Gerätedateien auf dem Dateisystem sind gültig und werden interpretiert.
exec Erlaubt die Ausführung von Binärdateien auf dem Dateisystem.
grpquota Erlaubt das Setzen von Gruppen-Quotas auf diesem Dateisystem (siehe Kapitel 16).
noatime Die Inode-Zugriffszeiten (atime) werden nicht bei jedem Zugriff gesetzt.
noauto Wenn ein Eintrag in /etc/fstab diese Option gesetzt hat, so wird dieses Dateisystem nicht durch den Befehl mount -a eingehängt (siehe Kapitel 15.3). Dies bedeutet,
dass diese Dateisystem beim Systemstart nicht automatisch eingehängt wird.
nodev Gerätedateien auf diesem Dateisystem werden nicht interpretiert.
noexec Verbietet die Ausführung von Binärdateien auf diesem Dateisystem.
nosuid Die SUID und SGID Bits von Programmen auf diesem Dateisystem werden ignoriert (siehe Kapitel 17.1).
104
nouser Ein normaler Benutzer (nicht der root Benutzer) darf dieses Dateisystem nicht
einhängen.
remount Ein bereits eingehängtes Dateisystem soll neu eingehängt werden. Das wird
meist benutzt, um die Optionen eines bereits eingehängten Dateisystems neu zu
setzen, insbesondere um ein readonly Dateisystem wieder beschreibbar einzuhängen.
ro readonly - Das Dateisystem wird nur zum Lesen eingehängt.
rw readwrite - Das Dateisystem wird zum Lesen und Schreiben eingehängt.
suid SUID und SGID Bits werden interpretiert (siehe Kapitel 17.1).
sync Alle Ein- und Ausgabeoperationen werden synchron durchgeführt.
user Erlaubt einem normalen Benutzer, das Dateisystem einzuhängen.
usrquota Erlaubt das Setzen von Benutzer-Quotas auf diesem Dateisystem (siehe Kapitel 16).
15.2
Die Datei /etc/mtab
Die Datei /etc/mtab enthält eine aktuelle Liste aller zur Zeit eingehängten Dateisysteme.
Diese Datei darf niemals von Hand editiert werden; sie ist ausschliesslich von den Programmen mount und umount zu beschreiben. Es existieren zwar für beide Befehle jeweils
die Option -n, welche verhindert, dass dieser Eintrag in /etc/mtab gemacht wird, was aber
nur dazu dient, dass auch auf Systemen deren /etc-Verzeichnis nur zum Lesen eingehängt
ist, diese beiden Befehle funktionieren.
15.3
mount
mount [OPTIONS] [DEVICE] [DIRECTORY]
Hängt das Dateisystem auf DEVICE an den mit DIRECTORY angegebenen mount point. Falls
nur DEVICE oder DIRECTORY angegeben wird, so versucht mount die fehlende Information
aus der Datei /etc/fstab zu lesen.
105
15.3.1
Beispiele von Optionen
-a
-h
-o mountoptions
-r
-t type
-v
-w
15.3.2
Hängt alle Dateisysteme, welche in /etc/fstab eingetragen sind, ein,
ausser diejenigen, welche mit noauto bezeichnet sind.
Zeigt die Hilfe zu mount an.
Setzt die Optionen zum einhängen auf mountoptions. Mögliche
Optionen sind im Kapitel 15.1.2 aufgelistet.
Hängt das Dateisystem nur zum Lesen ein.
Spezifiziert den Typ des einzuhängenden Dateisystems. Mögliche
Typen sind im Kapitel 15.1.1 aufgelistet.
Setzt den geschwätzigen Modus, wodurch zusätzliche Informationen
asugegeben werden.
Hängt das Dateisystem zum Lesen und Schreiben ein.
Anwendungsbeispiele
# mount /dev/fd0 /floppy
# mount -o ro /dev/fd0 /floppy
15.4
umount
umount [DEVICE | DIRECTORY]
Hängt das Dateisystem auf dem Gerät DEVICE, oder das Dateisystem welches an den mount
point DIRECTORY angehängt ist, aus. Die jeweils fehlende Information (DIRECTORY oder
DEVICE) wird aus der Date /etc/mtab bezogen.
15.4.1
-a
-t type
15.4.2
Beispiele von Optionen
Hängt alle Dateisysteme aus, welche in der Datei /etc/mtab verzeichnet sind.
Hängt nur Dateisysteme vom Typ type aus. Mögliche Typen sind
im Kapitel 15.1.1 verzeichnet.
Anwendungsbeispiele
# umount /dev/fd0
# umount /floppy
106
Kapitel 16
Verwalten von Diskquotas
Das Verwalten des zur Verfügung stehenden Speicherplatzes kann eine schwierige Aufgabe
sein. Der Speicherplatz ist eine begrenzte Resource und somit wertvoll. Der Verbrauch
an Speicherplatz ist, insbesondere in einem Multi-Benutzer Umfeld, unnötig hoch. Egal
wieviel Speicherplatz auch zur Vefügung steht werden die Benutzer ohne geeignete Einschränkungen einen Weg finden, den Speicherplatz aufzubrauchen, was zu systemweiten
Problemen führen kann. Durch das Einrichten von Quotas, welche den Speicherplatzverbrauch auf Benutzer- oder Gruppenebene limitieren, kann diesem ungewollten Prozess
Einhalt geboten werden.
Quotas können für alle Dateisysteme in /etc/fstab definiert werden und müssen zu diesem
Zweck unter den mount options in /etc/fstab angegeben werden (siehe Kapitel 15.1.2).
16.1
Limiten bei Diskquotas
Jedes Dateisystem auf welchem Quotas zum Einsatz kommen hat bis zu fünf unterschiedliche Limiten. Diese Limiten werden in Blocks zu 1024 Bytes angegeben. Die verschiedenen
Limiten sind:
Harte Limite pro Benutzer Diese Limite bezeichnet den maximalen Speicherplatz,
welcher ein Benutzer belegen kann. Ist diese Limite erreicht, kann der Benutzer
keine weiteren Dateien mehr speichern, bis er wieder genügend Platz geschaffen hat
um eine zu speichernde Datei, ohne Erreichung der Limite, abzulegen.
Weiche Limite pro Benutzer Die weiche Limite hat keine direkten Implikationen auf
die Arbeit des Benutzers. Allerdings wird diesem, sobald er die weiche Limite erreicht
hat, eine Warnung ausgegeben. Der Benutzer kann aber weiter Dateien absichern
sofern er die harte Limite nicht erreicht.
Harte Limite pro Gruppe Mit dieser Limite wird das Maximum an Speicherplatz für
107
eine Gruppe festgelegt. Sobald die Limite überschritten wird, ist es keinem Benutzer
der zu dieser Gruppe gehört, mehr erlaubt, Dateien abzuspeichern. Dies gilt auch,
wenn die Limiten der einzelnen Benutzer noch nicht erreicht sind.
Weiche Limite pro Gruppe Diese Limite funktioniert gleich wie die weiche Limite eines
Benutzers wobei aber natürlich die Limite auf alle Dateien der Gruppe bezogen wird.
Gnadenfrist Wenn ein Benutzer oder eine Gruppe die weiche Limite erreicht haben, so
beginnt eine Gandenfrist zu laufen. In dieser Frist muss der Benutzer beziehungsweise
die Gruppe genügen Platz schaffen um die weiche Limite zu unterschreiten. Geschieht
dies nicht, so wird nach dem Ablauf der Gnadenfrist die weiche Limite zu einer
harten Limite umgewandelt und diese bleibt bestehen bis die ehemals weiche Limite
unterschritten wird. In dieser Zeit ist es natürlich dem Benutzer beziehungsweise der
Gruppe nicht mehr möglich neue Dateien zu speichern, da nun ja eine harte Limite
besteht.
Diese Limiten können mit dem Programm edquota gesetzt und verändert werden, welches
im nachfolgenden Kapital behandelt wird.
16.2
Kommandos für Diskquotas
16.2.1
quota
quota [-u] [OPTIONS] USER
quota -g [OPTIONS] GROUP
Zeigt die Quotas für einen mit USER angegebenen Benutzer oder für eine mit GROUP angegebene Gruppe an. Die Option -u wird standardmässig angenommen, sofern nicht -g
angegeben ist. Nur der root-Benutzer kann die Option -u benutzen um andere Benutzer
zu überwachen. Normale Benutzer können mit der Option -u ihre eigenen Limiten sowie
mit der Option -g die Limiten der Gruppen, in welchen Sie Mitglied sind, anschauen.
16.2.2
quotaon
quotaon [OPTIONS] [FILESYSTEMS]
Aktiviert die zuvor eingerichteten Quotas auf den mit FILESYSTEMS angegebenen Dateisystemen.
108
Beispiele von Optionen
-a Aktiviert die Quotas für alle in /etc/fstab angegebenen Dateisysteme, welche über eine Quota Regelung verfügen und im Lese- und
Schreibmodus eingehängt sind.
-g Schaltet die Gruppen-Quotas ein. Diese Option ist bei -a bereits
enthalten.
-u Schaltet die Benutzer-Quotas ein. Diese Option ist Standard.
-v Geschwätziger Modus. Es wird für jedes Dateisystem bei welchem
die Quotas aktiviert werden eine Zeile ausgegeben.
16.2.3
quotaoff
quotaoff [OPTIONS] [FILESYSTEMS]
Deaktiviert die Quotas auf den mit FILESYSTEMS angegebenen Dateisystemen.
Beispiele von Optionen
-a Deaktiviert die Quotas für alle Dateisysteme in /etc/fstab.
-g Schaltet die Gruppen-Quotas aus. Diese Option ist bei -a bereits
enthalten.
-u Schaltet die Benutzer-Quotas aus. Diese Option ist standard.
-v Geschwätziger Modus. Es wird für jedes Dateisystem bei welchem
die Quotas deaktiviert werden eine Zeile ausgegeben.
16.2.4
quotacheck
quotacheck [OPTIONS] [FILESYSTEMS]
Überprüft die Speicherplatzlimiten auf den mit FILESYSTEMS angegebenen Dateisystemen
und führt die Quota-Dateien nach, sofern die Quotas zum Zeitpunkt der Überprüfung ausgeschaltet sind. Es sollte regelmässig (zum Beispiel jede Woche) ein quotacheck durchgeführt werden.
109
Beispiele von Optionen
-a Prüft die Quotas für alle Dateisysteme in /etc/fstab, welche mit
Quotas versehen sind.
-g Prüft nur Gruppen-Quotas.
-u Prüft Benutzer-Quotas. Diese Option ist standard.
-v Geschwätziger Modus. Es wird für jedes Dateisystem welches überprüft wird detailierte Information ausgegeben.
16.2.5
edquota
edquota [-p PROTOUSER] [OPTIONS] NAMES
Modifiziert die Gruppen- oder Benutzer-Quotas. Dieses interaktive Kommando benutzt
zum Editieren dev vi-Texteditor, ausser in den Variablen EDITOR oder VISUAL ist ein
anderer Editor angegeben. Nach der Eingabe des Kommandos wir der Editor mit einer
temporären Datei gestartet, in welcher die momentan bestehenden Quota Einstellungen
eingetragen sind. Beim abspeichern werden die geänderten Informationen in die QuotaDatenbank übernommen.
Mit den NAMES kann eine Liste von Benutzern oder Gruppen (bei der Verwendung von -g)
angegeben werden, für welche die anschliessenden Modifikationen gelten sollen. Mit der
Option -p PROTOUSER kann ein Benutzer angegeben werden, von welchem die QuotaEinstellungen initial übernommen werden sollen, wodurch kein Editor gestartet wird, sondern nur die Kopie der Einstellungen durchgeführt wird. Die Einstellungen des PROTOUSER
werden nicht verändert.
Beispiele von Optionen
-g
-p protouser
-t
-u
16.2.6
Modifiziert die Gruppen-Quotas. Alle angegebenen Namen werden
als Gruppennnamen interpretiert.
Dupliziert die Quota-Einstellungen vom Benutzer oder der Gruppe
protouser für die angegebenen Benutzer oder Gruppen.
Modifiziert die weichen Limiten für alle Dateisysteme mit aktivierten Quotas
Modifiziert die Benutzer-Quotas. Diese Option ist standard, wird
aber ignoriert falls die Option -g angegeben ist.
repquota
repquota [OPTIONS] [FILESYSTEMS]
Erstellt einen Bericht über die aktivierten Quotas.
110
Dieser Bericht wird für die mit
FILESYSTEMS anegegebene Dateisysteme entweder auf Benutzer- oder Gruppen-Basis erstellt. Mit der Option -a wird über alle mit Quotas versehenen Dateisysteme in /etc/fstab
berichtet.
Beispiele von Optionen
-a Berichtet über alle Dateisysteme in etc/fstab welche über eine Quota-Regelung verfügen.
-g Rapportiert über die Gruppen-Quotas.
-u Rapportiert über die Benutzer-Quotas, was der Standardaktion entspricht.
-v Schaltet den geschwätzigen Modus ein, wodurch erklärende Spaltenbeschriftungen ausgegeben werden.
16.3
Diskquotas einrichten
Um Quotas zu benutzen, müssen diese zuerst eingerichtet werden. Voraussetzung für diesen
Prozess ist, dass der kernel Quotas unterstützt. Falls dies unglücklicherweise nicht der Fall
ist, muss zuerst ein kernel mit Quota-Unterstützung kompiliert werden. Dieser Prozesss
wird im Rahmen des LPIC 102 behandelt.
Nachfolgend soll ein Beispiel zeigen wie auf einem ext2 Dateisystem auf /dev/hda6, welches
als /home fungiert, Benutzer- und Gruppen-Quotas eingerichtet werden.
1. Als erstes wird in der Datei /etc/fstab eingetragen, dass für das Dateisystem auf
/dev/hda6 Benutzer- und Gruppen-Quotas benötigt werden. Die Zeile aus /etc/fstab
könnte dann so aussehen:
/dev/hda6
/home
ext2
defaults,usrquota,grpquota 1 2
2. Nun müssen die Dateien quota.user und quota.group erstellt werden, welche die Quota-Einstellungen sowie die aktuelle Belegung der Benutzer beziehungsweise Gruppen
beinhaltet. Diese Dateien werden auf der obersten Ebene des Dateisystems angelegt,
welches mit Quotas ausgerüstet werden soll.
$ touch /home/quota.user /home/quota.group
$ chmod 600 /home/quota.user /home/quota.group
Mit dem zweiten Befehl wird sicher gestellt, dass nur der Benutzer root Zugriff auf
diese Dateien hat. Siehe dazu Kapitel 17. Falls dem Benutzer erlaubt werden soll,
seine Quotas abzufragen muss der Modus der Dateien auf 644 anstelle von 600 gesetzt
werden.
111
3. Um die Quota-Datenbanken in den soeben erstellten Dateien zu initialisieren wird
der Befehl quotacheck aufgerufen, was wie folgt aussieht:
$ quotacheck -avug
Scanning /dev/hda6 [/home] done
Checked 236 directories and 1695 files
Using quotafile /home/quota.user
Using quotafile /home/quota.group
4. Nun wird überprüft, ob die Dateien richtig initialisiert wurden:
$ ls -l /home quota.*
-rw------- 1 root root 16192 Aug 25 07:37 /home/quota.group
-rw------- 1 root root 16192 Aug 25 07:37 /home/quota.user
Da nun beide Dateien eine Grösse von 16192 Bytes aufweisen kann davon ausgegangen
werden, dass dies geklappt hat.
5. Natürlich muss nun noch das Quota-System eingeschaltet werden:
$ quotaon -a
6. Damit das System nicht nur im Moment auf die Quotas achtet, sollte im SystemInitialisierungs Skript noch eingetragen werden, dass beim Starten zuerst die Quotas
geprüft und anschliessend eingeschaltet werden. Üblicherweise geschieht dies in der
Datei /etc/rc.d/rc.sysinit und der entsprechende Skript-Teil könnte etwa so aussehen:
if [ -x /sbin/quotacheck ]
then
echo "Checking quotas."
/sbin/quotacheck -avug
echo " Done."
fi
if [ -x /sbin/quotaon ]
then
echo "Enabling quotas."
/sbin/quotaon -avug
echo " Done."
fi
7. Als Letztes wird noch sichergestellt, dass die Quotas auf einer regulären Basis geprüft
werden. Dazu wird eine Datei quota.cron im cron-Verzeichnis /etc/cron.weekly die
folgendes enthalten sollte:
112
#!/bin/bash
quotacheck -avug
Diese Datei wird nun automatisch von dem Programm cron wöchentlich ausgeführt.
Mit den soeben gezeigten Schritten sind die Quotas auf dem Dateisystem /home eingerichtet. Um Modifikationen der Limiten für Benutzer und Gruppen vorzunehmen, kann mit
dem Programm edquota operiert werden.
113
Kapitel 17
Zugriffskontrolle auf Dateien mittels
Zugriffsrechten
Zugriffskontrolle ist eine grundlegende Anforderung an jedes Multi-Benutzer Betriebssystem. Insbesondere müssen die System-Dateien vor unerlaubtem Zugriff von minderprivilegierten Benutzern geschützt werden. Natürlich müssen aber auch die Dateien der Benutzer
geschützt werden, sodass nicht jedermann Einsicht in persönlichen Dateien und Verzeichnisse nehmen kann. Allgemein gesagt, muss eine Zugriffskontrolle bestehen, welche es
erlaubt, detailierte Zugriffsrechte zu setzten.
17.1
Aufbau der Zugriffsrechte
Die im Linux eingebauten Zugriffskontrolle basiert auf einer Menge von Attributen, welche
separat für jede Datei und jedes Verzeichnis geführt wird. Diese Menge von Attributen zu
einer Datei oder einem Verzeichnis wird access-mode oder kurz mode genannt und wird in
den Inodes zu den jeweiligen Dateien beziehungsweise Verzeichnissen abgelegt.
Der access-mode regelt den Zugriff auf eine Datei oder ein Verzeichnis auf der Basis folgender drei Gruppen:
user Der Benutzer, dem die Datei oder das Verzeichnis ,,gehört“ (Eigentümer).
group Der Gruppe, welcher die Datei oder das Verzeichnis ,,gehört“.
others Alle anderen Benutzer des Systems.
114
17.1.1
Grundsätzliche Berechtigungen
Wie auch der access-mode sind die Besitzer-Attribute für Benutzer und Gruppe in der
Inode gespeichert. Überlicherweise ist der Eigentümer auch der Ersteller einer Datei und
die Eigentümer-Gruppe wird auf die Hauptgruppe des Erstellers gesetzt. Alle Benutzer,
die nicht selbst Ersteller einer Datei sind sowie nicht zu der Gruppe gehören, welcher eine
Datei oder ein Verzeichnis zugeordnet ist, werden mit others bezeichnet. Für jede dieser
drei Gruppen definiert der access-mode drei Typen von Berechtigungen, welche nachfolgend
mit ihrer Bedeutung aufgelistet sind:
Berechtigung
Lesen (r)
Schreiben (w)
Ausführen (x)
Bedeutung für Dateien
Inhalt der Datei anschauen
In Datei schreiben
Bedeutung für Verzeichnisse
Inhalt des Verzeichnisses anschauen
Dateien im Verzeichnis Erstellen
und Löschen
Datei als Programm ablau- In das Verzeichnis wechseln
fen lasssen
Die grundsätzlichen Berechtigungungen bestehen also aus drei Dreiergruppen. Dies kann
schematisch so dargestellt werden:
user
group
others
r w x r w x r w x
Üblicherweise werden die Berechtigungen einer Datei oder eines Verzeichnisses mit den
Abkürzungen (siehe obenstehende Tabelle) ausgegeben. Dies ist zum Beispiel bei der
Ausgabe von ls -l zu sehen:
# ls -l /home/joe/
-rw-r----1 joe
autors
1556 2003-07-19 18:51 biographie.txt
Am Anfang der ausgegebenen Zeile ist zu erkennen, dass die Berechtigungen aufgelistet
werden. Das erste Zeichen steht für den Typ der Datei (siehe unten) gefolgt von den neun
Berechtigungen, jeweils drei für Eigentümer, Gruppe und Andere. Ist eine Berechtigung
erteilt, so erscheint die entsprechende Abkürzung der Berechtigung ansonsten ein ,,−”.
Für unser Beispiel bedeutet das nun, dass die Datei biographie.txt (welche dem Benutzer
joe und der Gruppe autors gehört) vom Benutzer joe gelesen und geschrieben und von den
anderen Gruppenmitgliedern der Gruppe autors nur gelesen werden darf. Alle anderen
Benutzer haben gar keinen Zugriff.
Wie bereits erwähnt, bezeichnet die erste Stelle der Ausgabe von ls -l den Dateityp.
Nachstehende Tabelle zeigt die Abkürzungen dieser Dateitypen:
115
d
l
b
c
p
s
Normale Datei
Verzeichnis
Symbolischer Link (siehe Kapitel 19)
Blockorientierte Gerätedatei
Zeichenorientierte Gerätedatei
Feste Programmverbindung (named pipe)
Netzwerk Kommunikationsendpunkt (socket)
Zur numerischen Darstellung einer Berechtigung wird eine Codierung im Oktal-System
verwendet. Für jede Gruppe (Eigentümer, Gruppe, Andere) wird dazu eine Oktalziffer,
welche Werte von 0-7 annehmen kann, verwendet. Folgende Tabelle zeigt die Zuordnung
der Bitwerte für diese drei Oktalzahlen zu den Berechtigungen:
user
group
others
r w x r w x r w x
4 2 1 4 2 1 4 2 1
Ein Zugriffsrecht von rw-r----- wäre also numerisch darstellbar als 640. Die 6 errechnet sich aus dem r (4) plus w (2) des Eigentümerrechtes, die 4 ist das Leserecht (r) für
Gruppenmitglieder und die 0 entspricht keinem gesetzten Recht für die anderen Benutzer.
17.1.2
Spezielle Berechtigungen
Neben diesen sichtbaren Rechten existieren noch drei weitere, die vor den grundsätzlichen
Berechtigungen eingefügt werden. Dabei handelt es sich um das Substitute UserID Bit
(SUID), das Substitute GroupID Bit (SGID) und das Sticky Bit.
Die Tabelle für die numerische Angabe von Rechten sieht daher inklusive den speziellen
Rechten wie folgt aus:
special
user
group
others
SUID SGID Sticky r w x r w x r w x
4
2
1
4 2 1 4 2 1 4 2 1
Eine numerische Berechtigung von 2755 für ein Verzeichnis bedeutet also, dass das SGIDBit gesetzt ist, dass der Eigentümer alle Rechte besitzt, und die Gruppenmitglieder sowie
die übrigen Benutzer in das Verzeichnis wechseln dürfen aber nur Lesezugriff haben.
Substitute UserID Bit (SUID)
Dieses Recht gilt ausschliesslich für ausführbare Dateien. Hat eine ausführbare Datei dieses
Recht gesetzt, so erscheint in der Darstellung durch das ls -l Kommando anstelle des x
beim Eigentümerrecht ein s. Jeder Benutzer, der dieses Programm ausführt, tut dies unter
116
der Benutzer-ID des Benutzers, welchem das Programm gehört und ,,erbt” somit dessen
Berechtigung.
So hat zum Beispiel das Programm /usr/bin/passwd die Aufgabe, dass auch normale
Benutzer damit ihr eigenes Passwort ändern können. Dieses Passwort wird aber in der
Datei /etc/passwd gespeichert, welche nur von Benutzer root beschrieben werden darf.
Das Programm /usr/bin/passwd hat als Eigentümer root und hat das SUID-Bit gesetzt.
Jeder Benutzer, der dieses Programm ausführt tut dies unter der Benutzer-ID von root und
hat daher die Rechte von root während der Ausführung. Das ermöglicht es dem Programm,
das veränderte Passwort in die Datei /etc/passwd zu speichern.
Dieses Verhalten ist beim Passwort-Programm nicht weiter problematisch, allerdings entsteht eine gravierende Sicherheitslücke, wenn eine Shell oder ein Texteditor mit dieser
Berechtigung ausgestattet ist und als Eigentümer root hat. Dann kann jeder Benutzer, der
die entsprechende Shell oder den Texteditor ausführt, mit den Rechten von root operieren!
Substitute GroupID Bit (SGID)
Dieses Recht gilt einerseits für ausführbare Dateien und andererseits für Verzeichnisse.
Hat ein ausführbares Programm dieses Recht gesetzt, so gilt der gleiche Mechanismus wie
beim SUID-Bit, nur hier natürlich der Gruppenmitgliedschaft betreffend. Ein Benutzer,
der dieses Programm ausführt, tut dies als Gruppenmitglied der Gruppe, welcher das
Programm gehört, statt seiner eigentlichen Gruppenkennung. Er bekommt also die Rechte
eines Gruppenmitglieds dieser Gruppe, auch wenn er selbst nicht Mitglied dieser Gruppe
ist. Statt dem x beim Gruppenrecht stellt das ls -l Kommando hier ein s dar.
Hat ein Verzeichnis dieses Recht gesetzt, dann verhält es sich etwas anders. Legt ein
Benutzer eine Datei an, so erhält diese Datei normalerweise die Gruppenmitgliedschaft der
primären Gruppe des Benutzers, der sie angelegt hat. Das führt schnell zum Chaos, wenn
zum Beispiel mehrere Benutzer zusammen an einem Projekt arbeiten. Alle diese Benutzer
sind Gruppenmitglieder einer bestimmten Gruppe, aber sie haben diese Gruppe nicht als
primäre Gruppe. Das heisst, es kann sein, dass die einzelnen Benutzer die Dateien der
jeweils anderen Projektmitarbeiter nicht lesen können. Wenn dieses Verzeichnis aber der
gemeinsamen Gruppe gehört und das Substitute GroupID Bit darauf gesetzt ist, werden
Dateien in diesem Verzeichnis grundsätzlich unter der Gruppen-ID abgespeichert, der das
Verzeichnis gehört. Mit diesem Mechanismus sind Arbeitsverzeichnisse für Projektgruppen
realisierbar.
Sticky Bit
Das Sticky Bit (sticky=klebrig) hat unterschiedliche Auswirkungen für ausführbare Dateien
und Verzeichnisse. Bei ausführbaren Dateien sorgt es dafür, dass ein Programm nach der
Ausführung resistent im Speicher bleibt und somit bei einer erneuten Ausführung nicht
mehr vom ursprünglichen Speicherort geladen werden muss. Diese Verhalten beschleunigt
117
insbesondere die Startzeit von grossen Programmen. Mit den heutigen ausgeklügelten
Cache-Mechanismen wird diese Anwendung allerdings beinahe hinfällig.
Wenn das Sticky Bit für ein Verzeichnis gesetzt wird, so sorgt es für zusätzliche Sicherheit betreffend den Dateien in diesem Verzeichnis. Ungeachtet der Berechtigungen für die
Dateien in diesem Verzeichnis wird es nur noch dem Datei-Eigentümer, dem VerzeichnisEigentümer und natürlich dem root-Benutzer erlaubt die betreffenden Dateien umzubenennen oder zu löschnen.
Ein Verzeichnis in dem jeder Benutzer Schreibrecht haben sollte, wie zum Beispiel das
/tmp-Verzeichnis, muss unbedingt das Sticky Bit gesetzt haben. Ansonsten kann ein
böswilliger Benutzer dort die Dateien anderer Benutzer löschen.
Das gesetzte Sticky-Bit wird vom ls -l Kommando durch ein t anstelle des x bei den
others-Rechten dargestellt.
17.2
Setzen der Zugriffsrechte
In diesem Kapitel werden die Programme besprochen, um die zuvor erläuterten Zugriffsrechte zu manipulieren. Das Setzen der Berechtigungen für Dateien und Verzeichnisse
wird mit dem Programm chmod erledigt. Zudem existiert mit dem Programm umask eine
Möglichkeit Standard-Berechtigungen für neu erstellte Dateien oder Verzeichnisse einzustellen.
17.2.1
chmod
chmod [OPTIONS] MODE[,MODE] ITEMS
chmod [OPTIONS] OCTAL-MODE ITEMS
chmod [OPTIONS] --reference=RITEM ITEMS
Setzt die Berechtigungen für die mit ITEMS angegebenen Dateien oder Verzeichnisse. In der
ersten Variante kann der Modus mittels einer symbolischen Notation (siehe unten) angegeben werden. Es können mehrere symbolische Modi kommagetrennt angegeben werden.
Bei der zweiten Notation wird der Modus mittels 1-4 Oktalziffern angegeben (fehlende
Oktalziffern werden als führende Nullen behandelt) und bei der letzten Variant wird der
Modes der ITEMS von der angegebenen Referenz (RITEM) übernommen.
118
Beispiele von Optionen
-c Listet alle Dateien auf, bei welchen der Modus neu gesetzt wurde.
-R Rekursiver Modus. Ausgehend von ITEMS wird die gesamte darunterliegende Struktur abgearbeitet.
-v Geschwätziger Modus. Zeigt die ausgeführte Aktion für alle ITEMS.
Symbolische Modi
Bei der Angabe eines Modus als Oktahlzahl wird immer die gesamten Berechtigungen
ersetzt. Mit einem symbolischen Modus kann dagegen auch eine teilweise Modifikation
der bestehenden Berechtigungen durchgeführt werden. Ein symbolischer Modus wird aus
einem Konstrukt folgender Art zusammengesetzt:
<KLASSEN><OPERATION><BERECHTIGUNGEN>
Folgende Tabelle zeigt die verfügbaren Klassen, Operationen und Berechtigungen:
Klasse
Operationen
Berechtigungen
Zeichen
u
g
o
a
+
=
r
w
x
X
s
t
Beschreibung
Eigentümer
Gruppenmitglieder
Andere
Alle
Fügt Berechtigung hinzu
Entzieht Berechtigung
Setzt Berechtigung exakt
Leseberechtigung
Schreibberechtigung
Ausführungsberechtigung
Ausführungsberechtigung für alle Verzeichnisse sowie
Dateien welche bereits eine andere Ausführungsberechtigung haben.
SUID- oder SGID-Bit je nachdem welche Klassen angegeben sind.
Sticky Bit
Beispiele:
u+w
Schreibberechtigung für den Eigentümer hinzufügen
go-w Gruppenmitglieden und allen anderen Benutzern Schreibberechtigung entziehen
o+t
Sticky Bit setzen
a=rw Erlaubt allen Klassen das Lesen und Schreiben
119
Anwendungsbeispiele
$ ls -l
-rw-r--r-1 pbuehler pbuehler
0 2003-09-07
-rw-r--r-1 pbuehler pbuehler
0 2003-09-07
$ chmod -v 666 text*
Modus von text1.txt nach 0666 (rw-rw-rw-) geändert
Modus von text2.txt nach 0666 (rw-rw-rw-) geändert
$ ls -l
-rw-rw-rw1 pbuehler pbuehler
0 2003-09-07
-rw-rw-rw1 pbuehler pbuehler
0 2003-09-07
$ chmod go-rw text2.txt
$ ls -l
-rw-rw-rw1 pbuehler pbuehler
0 2003-09-07
-rw------1 pbuehler pbuehler
0 2003-09-07
$ chmod ug+s text1.txt
$ ls -l
-rwSrwSrw1 pbuehler pbuehler
0 2003-09-07
-rw------1 pbuehler pbuehler
0 2003-09-07
17.2.2
16:32 text1.txt
16:32 text2.txt
16:32 text1.txt
16:32 text2.txt
16:32 text1.txt
16:32 text2.txt
16:32 text1.txt
16:32 text2.txt
umask
umask MODE[,MODE]
umask OCTAL-MODE
Mit Hilfe des Programmes umask wird der access mode für neu erstellte Dateien und Verzeichnisse festgelegt. In der ersten Variante können mit MODE ein oder mehrere symbolische
Modi (siehe Kapitel 17.2.1) angegeben werden, welche so interpretiert werden, dass neue
Dateien und Verzeichnisse den angegeben Modus annehmen. Bei der zweiten Variante wird
eine Oktalzahl angegegben, die aber subtraktiv, ausgehend von einer vollen Berechtigung,
betrachtet wird. Das heisst, dass bei der Angabe eines Oktalmodus von 022 neue Dateien
und Verzeichnisse für den Eigentümer mit allen Rechten sowie für die Gruppenmitglieder
und anderen Benutzer mit Lese- und Ausführungsrecht erstellt werden.
Weiter wird beim Erstellen unterschieden ob es sich um eine Datei oder ein Verzeichnis
handelt. Bei Dateien wird das Ausführungsrecht immer weggelassen. Das bedeutet, dass
bei Verzeichnissen von einer vollen Berechtigun von 777 und bei Dateien von 666 ausgegangen wird.
Wird umask ohne Angabe eines Modus aufgerufen, so wird der aktuell gesetzte Wert ausgegeben.
Folgende Tabelle zeigt die resultierenden Berechtigungen für neu erstellte Dateien und
Verzeichnisse mit einer umask von 022:
120
Vollberechtigung
umask
Resultierene Berechtigung
Dateien
symbolisch oktal
rw-rw-rw- 666
----w--w- 022
rw-r--r-- 644
Verzeichnisse
symbolisch oktal
rwxrwxrwx 777
----w--w- 022
rwxr-xr-x 755
Anwendungsbeispiele
Setzen der umask auf 027 (alles erlaubt für Eigentümer, für die Gruppenmitglieder kein
Schreibrecht und für die anderen Benutzer gar nichts):
$ umask 027
oder:
$ umask u=rwx,g=rx,o=
Erstellen einer neuen Datei und eines Verzeichnisses zum Testen der umask :
$ umask 027
$ touch myfile
$ mkdir mydir
$ ls -l
drwxr-x--2 pbuehler pbuehler
-rw-r----1 pbuehler pbuehler
17.3
4096 2003-09-07 18:21 mydir
0 2003-09-07 18:21 myfile
Erweiterte Dateiattribute beim ext2 Dateisystem
Das ext2 Dateisystem, welches von Linux standardmässig verwendet wird, verfügt noch
über eine ganze Anzahl von erweiterten Dateiattributen. Diese können mit dem Programm
lsattr angezeigt und dem Programm chattr gesetzt werden. Folgende Tabelle listet die
wichtigsten dieser erweiterten Attribute auf:
a Sofern dieses Attribut gesetzt ist, kann die Datei nur zum Anhängen von Daten
geöffnet werden.
i Das i-Attribut (immutable) erlaubt, sofern es gesetzt ist, keine Änderungen an
der betroffenen Datei. Es können keine Daten geschrieben werden, die Datei
kann nicht umbenannt oder gelöscht werden und es können auch keine Links
auf die Datei erstellt werden. Dieses Attribut kann nur vom root-Benutzer
gesetzt werden.
s Bei einem gesetzten save-delete Attribut wird beim Löschen der gesamte Speicherplatz den eine Datei belegt hat, mit Nullen überschrieben. Dadurch wird
eine Wiederherstellung der Datei verunmöglicht.
121
Beispiel:
nephthys:~/tmp/ooo# chattr +i myFile
nephthys:~/tmp/ooo# lsattr
----i------------ ./myFile
nephthys:~/tmp/ooo# touch myFile
nephthys:~/tmp/ooo# rm myFile
rm: reguläre Datei (schreibgeschützt) ,,myFile" entfernen? y
rm: Entfernen von ,,myFile" nicht möglich: Die Operation ist nicht erlaubt
122
Kapitel 18
Verwaltung von Dateieigentum
Die Veränderung des Eigentümers und der Gruppekennung von Dateien oder Verzeichnissen ist im Normalfall nicht nötig. Wenn man aber Dateien zwischen den Benutzern
verschiebt, Arbeitsgruppen mit Daten ausstaffieren will oder als root in einem Benutzerverzeichnis arbeiten durchführt wird diese Operation notwendig. Um den Eigentümer oder
die Gruppenkennung zu ändern steht das Programm chown zur Verfügung. Ein weiteres
Programm chgrp steht zur Verfügung, falls nur die Gruppenkennung geändert werden soll.
Nachfolgend werden diese beiden Programme genauer erläutert.
18.1
chown
chown [OPTIONS] OWNER[:[GROUP]] FILES
chown [OPTIONS] :GROUP FILES
chown [OPTIONS] --reference=RFILE FILES
Das Programm chown ändert den Eigentümer und/oder die Gruppenkennung von FILES
auf OWNER beziehungsweise GROUP. In der ersten Variante wird der OWNER der neue Besitzer
der FILES. Falls eine GROUP (getrennt durch Doppelpunkt oder Punkt) angegeben wird so
wird auch die Gruppenkennung der FILES auf die angegegebene GROUP gesetzt. Ist nur
das Trennzeichen (Doppelpunkt oder Punkt) nach dem OWNER aber nicht die Gruppe angegegeben, so wird die Gruppenkennung auf die primäre Gruppe des angegebenen OWNER
gesetzt. Die zweite Variante erlaubt eine Änderung der Gruppenkennung auf GROUP, ohne dass der Eigentümer verändert wird. Diese Variante entspricht auch dem Verhalten
des Programmes chgrp. Die letzte Variante erlaubt es, den Eigentümer und die Gruppenkennung der bestehenden Datei RFILE für die FILES zu übernehmen. Bei der ersten
und zweiten Variante kann der OWNER und die GROUP jeweils mit dem Namen oder mit
der entsprechenden Nummer angegeben werden. Das Ändern des Eigentümers wird dem
root Benutzer vorbehalten. Die Änderung der Gruppenkennung hingegen kann von allen
123
Benutzern durchgeführt werden.
18.1.1
Beispiele von Optionen
-c Listet alle FILES auf, bei denen eine Änderung gemacht wurde.
-R Rekursiver Modus. Führt die gewünschten Veränderungen rekursiv für alle
Dateien und Verzeichnisse ab FILES durch.
-v Geschwätziger Modus. Für alle FILES wird ausgegeben was gemacht wurde.
18.1.2
Anwendungsbeispiele
# chown -v ftp adir
changed ownership of ‘adir’ to ftp
# chown -vR ftp. bdir
changed ownership of ‘bdir’ to ftp:ftp
changed ownership of ‘bdir/file4’ to ftp:ftp
changed ownership of ‘bdir/cdir’ to ftp:ftp
changed ownership of ‘bdir/cdir/file5’ to ftp:ftp
changed ownership of ‘bdir/cdir/file6’ to ftp:ftp
changed ownership of ‘bdir/ddir’ to ftp:ftp
changed ownership of ‘bdir/ddir/file7’ to ftp:ftp
# chown -vR ftp.nobody bdir/cdir/
changed ownership of ‘bdir/cdir’ to ftp:nobody
changed ownership of ‘bdir/cdir/file5’ to ftp:nobody
changed ownership of ‘bdir/cdir/file6’ to ftp:nobody
# chown -vR ftp.nobody bdir/cdir/
ownership of ‘bdir/cdir’ retained as ftp:nobody
ownership of ‘bdir/cdir/file5’ retained as ftp:nobody
ownership of ‘bdir/cdir/file6’ retained as ftp:nobody
18.2
chgrp
chgrp [OPTIONS] GROUP FILES
chgrp --reference=RFILE FILES
Ändert die Gruppenkennung von FILES auf GROUP. In der ersten Variante werden alle FILES
der Gruppe GROUP zugeordnet. Die zweite Variante übernimmt die Gruppenkennung von
RFILE für die angegebenen FILES.
124
18.2.1
Beispiele von Optionen
-c Listet alle FILES auf, bei denen eine Änderung gemacht wurde.
-R Rekursiver Modus. Führt die gewünschten Veränderungen rekursiv für alle
Dateien und Verzeichnisse ab FILES durch.
-v Geschwätziger Modus. Für alle FILES wird ausgegeben was gemacht wurde.
18.2.2
Anwendungsbeispiele
# chgrp -cR nobody bdir/ddir
changed group of ‘bdir/ddir’ to nobody
changed group of ‘bdir/ddir/file7’ to nobody
125
Kapitel 19
Erzeugen und Ändern von echten
und symbolischen Links
Links sind eine Spezialität von Unix-Dateisystemen, die gerne und häufig verwendet werden. Der Umgang mit ihnen ist eine wichtige Aufgabe, die ein Systemverwalter sicher
beherrschen muss.
Die sogenannten Links erlauben es, dass Dateien (oder Verzeichnisse) an mehreren Orten
innerhalb eines Dateisystems (in Spezialfällen sogar über die Grenzen des Dateisystems
hinweg) zugreifbar sind. Es sind demnach Verweise oder Verknüpfungen. Die Hauptvorteile
der Links bestehen insbesondere darin, dass keine Redundanzen erzeugt werden sowie in
der Vereinfachung des Zugriffs auf Dateien oder Verzeichnisse.
19.1
Typen von Links
In der Unix-Welt werden zwei Arten von Links, die auch über unterschiedliche Charakteristika verfügen, unterschieden. Folgende Kapitel widmen sich diesen beiden Arten.
19.1.1
Echte Links (Hardlinks)
Ein Hardlink ist nichts weiter als ein weiterer Verzeichniseintrag, der sich ausser des Namens in nichts von dem Original unterscheidet. Dies wird dadurch erreicht, dass dieselbe
Inode verwendet wird wie bei der Originaldatei. Mit anderen Worten umschrieben ist ein
Hardlink ein Zeiger auf einen Inode. Da die Inode nur einmal vorhanden ist, impliziert
dies, dass alle darin gespeicherten Informationen (wie zum Beipiel der Eigentümer, des Erstellungsdatum, den Verweis auf die Datenblöcke, usw.) auch nur einmal vorhanden sind
und bei einer Änderung dieser Daten sind somit auch alle darauf verweisenden Hardlinks
,,betroffen”. Die Nachteile von Hardlinks sind, dass diese auf ein Dateisystem limitiert
126
sind, weil die Inodes nur in einem Dateisystem eindeutig sind und dass keine Hardlinks auf
Verzeichnisse erstellt werden können.
Folgendes Beispiel zeigt, dass die Hardlinks ausser über den Dateinamen und die Position
im Verzeichnisbaum nicht zu unterscheiden sind. Hinweis: Das Erstellen von Links mittels
ln wird im Kapitel 19.2 genauer betrachtet.
#
#
#
#
touch /tmp/afile
touch /tmp/bfile
ln /tmp/bfile /tmp/cfile
ls -il /tmp
6861 -rw-r--r-1 root
6862 -rw-r--r-2 root
6862 -rw-r--r-2 root
root
root
root
0 Sep
0 Sep
0 Sep
9 21:47 afile
9 21:47 bfile
9 21:47 cfile
Nach diesen Operationen bestehen zwei reguläre Dateien (afile und bfile) sowie ein Hardlink mit dem Namen cfile, der auf bfile zeigt. Beim Aufruf von ls -il (-i bedeutet, dass
die Inode-Nummer angezeigt wird) ist zu sehen, dass bfile und cfile dieselbe Inode haben.
Weiter ist in der Spalte nach den Berechtigungen der sogenannte Link count aufgezeichnet,
der bei den beiden verlinkten Dateien 2 ist. Der Link count sagt aus, wieviele Verzeichniseinträge auf die Inode zeigen und erlaubt dem Dateisystem festzustellen, wann eine Datei
,,echt” gelöscht werden soll. Das Löschen der Datenblöcke einer Datei und der Inode wird
nämlich erst ausgeführt, wenn der Link count der Datei 1 beträgt.
19.1.2
Symbolische Links (Symlinks, Softlinks)
Symbolische Links sind kleine Dateien, die über keine Datenblöcke verfügen. Sie beinhalten
nur einen Zeiger auf eine andere Datei, welchem beim Zugriff auf den Link gefolgt wird.
Symbolische Links können nach belieben zwischen verschiedenen Dateisystemen und auch
auf Verzeichnisse erstellt werden. Wird das Ziel eines symbolischen Links gelöscht so zeigt
der Link ins Niemandsland und kann nicht mehr gebraucht werden. Wird das Ziel aber
wieder erstellt, so ist auch der symbolische Link wieder gültig.
Symbolische Links können anhand eines l (kleines L) an erster Stelle einer Auflistung
mit ls -l erkennt werden. Folgendes Beispiel zeigt das Erstellen von symbolischen Links
(siehe auch Kapitel 19.2):
# cat >afile
hello world!
<CTRL-C>
# ln -s afile bfile
# ln -s bfile cfile
# ls -l
127
-rw-r--r-lrwxrwxrwx
lrwxrwxrwx
# cat cfile
hello world!
1 pbuehler pbuehler
1 pbuehler pbuehler
1 pbuehler pbuehler
13 2003-09-10 13:36 afile
5 2003-09-10 13:36 bfile -> afile
5 2003-09-10 13:36 cfile -> bfile
Hier ist eine ,,Kette” von zwei Links auf afile erstellt worden und am Ende ergibt die
Ausgabe von cfile dasselbe wie diejenige von afile. Es ist auch festzustellen, dass bei
symbolischen Links der Link count nicht erhöht wird, da es ja eigenständige Dateien sind.
Symbolische Links werden zum Beispiel beim Systemstart eingesetzt. Betrachten wir dazu
folgendes:
# ls -l /etc/init.d | head -10
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
-rwxr-xr-x
1 root
root
# ls -l /etc/rc2.d/
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
lrwxrwxrwx
1 root
root
760
1569
1074
2698
2026
894
4569
4402
868
782
2002-06-11
2003-04-26
2002-01-18
2003-07-09
2003-07-09
2001-10-05
2003-06-26
2003-07-17
2001-03-28
2003-02-19
17:38
13:45
09:13
12:40
12:41
14:12
15:38
17:49
01:22
16:20
anacron
apache
atd
bootmisc.sh
bootmisc.sh.old
checkfs.sh
checkroot.sh
console-screen.sh
cron
devpts.sh
17
18
18
15
17
13
14
13
15
13
17
15
13
20
17
13
14
16
19
19
2002-12-25
2002-12-26
2002-12-24
2002-12-25
2002-12-24
2002-12-24
2002-12-25
2002-12-25
2002-12-24
2002-12-25
2002-12-24
2002-12-25
2002-12-25
2002-12-25
2002-12-25
2002-12-25
2002-12-25
2002-12-25
2002-12-25
2002-12-24
00:52
22:25
17:24
00:52
17:24
17:24
00:49
16:32
17:24
00:50
17:24
16:32
00:51
00:50
00:52
00:49
00:47
00:52
01:56
17:24
K11anacron -> ../init.d/anacron
S01firewall -> ../init.d/firewall
S10sysklogd -> ../init.d/sysklogd
S11klogd -> ../init.d/klogd
S12kerneld -> ../init.d/kerneld
S14ppp -> ../init.d/ppp
S20exim -> ../init.d/exim
S20gpm -> ../init.d/gpm
S20inetd -> ../init.d/inetd
S20lpd -> ../init.d/lpd
S20makedev -> ../init.d/makedev
S20mysql -> ../init.d/mysql
S20ssh -> ../init.d/ssh
S21nfs-common -> ../init.d/nfs-common
S89anacron -> ../init.d/anacron
S89atd -> ../init.d/atd
S89cron -> ../init.d/cron
S91apache -> ../init.d/apache
S99fetchmail -> ../init.d/fetchmail
S99rmnologin -> ../init.d/rmnologin
Im ersten Verzeichnislisting (abgekürzt mit head) ist zu sehen, dass unter /etc/init.d verschiedene Programme liegen. Diese werden zum Starten und Stoppen der verschiedenen
Systemdienste benötigt. Da nun aber für jeden Betriebsmodus (runlevel ) andere Dienste gestartet werden sollen, existiert für jeden runlevel ein Verzeichnis (/etc/rc0.d bis
/etc/rc6.d ). In diesen Verzeichnissen sind symbolische Links auf die in /etc/inid.d liegenden Skripte platziert (siehe zweites Verzeichnislisting). Die Links sind nach dem Schema
benannt, dass zuerst ein S (Starten) oder K (Stoppen) steht, gefolgt von einer zweistelligen
Zahl (Sortiernummer) und dann der Skriptname aus /etc/init.d. Beim Starten eines runlevels wird den Links, welche mit S beginnen, in der durch die Sortiernummer gegebenen
128
Reihenfolge gefolgt, womit ein kontrolliertes Starten des runlevels ermöglicht wird. Genauso werden beim Verlassen eines runlevels die Skripte, welche mit K beginnen aufgerufen.
19.2
Erstellen von Links
Links werden, wie bereits im vorangegangenen Kapitel angetönt, mit dem Programm ln
erstellt. Diese wird nun genauer vorgestellt.
19.2.1
ln
ln [OPTIONS] TARGET [LINKNAME]
ln [OPTIONS] TARGETS DIRECTORY
Die erste Variante erstellt einen Link mit dem Namen LINKNAME auf das angegebene
TARGET. Wird der LINKNAME weggelassen wird der Name von TARGET übernommen. Mit der
zweiten Variante können Links auf mehrere TARGETS erstellt werden, welche dann in dem
angegebenen DIRECTORY platziert werden. Bei beiden Varianten werden standardmässig
echte Links (Hardlinks) erstellt, wobei das TARGET existieren muss und kein Verzeichnis
sein darf. Symbolische Links können mit der Option -s erstellt werden.
Beispiele von Optionen
-f
-i
-s
-v
Überschreibt allfällig existierende Dateien.
Interaktiver Modus. Fragt vor dem Überschreiben von Dateien.
Erzeugung von symbolischen Links.
Geschwätziger Modus.
Anwendungsbeispiele
# cat >afile
Hello World!
<CTRL-C>
# ln -v afile bfile
Erzeugen der harten Verknüpfung bfile zu afile
# ln -vs afile cfile
Erzeugen der symbolischen Verknüpfung cfile zu afile
# ls -l
-rw-r--r-2 pbuehler pbuehler
13 2003-09-10 15:14 afile
-rw-r--r-2 pbuehler pbuehler
13 2003-09-10 15:14 bfile
lrwxrwxrwx
1 pbuehler pbuehler
5 2003-09-10 15:14 cfile -> afile
129
19.3
Auffinden und Erhalten von Links
19.3.1
Erkennen von echten Links (Hardlinks)
Da bei den echten Links nur eine Datei existiert, welche einfach mehrere Verzeichniseinträge hat, ist die Erkennung schwierig. Bei der Auflisting der Dateien mit ls -l können die
Dateien, auf welche ein echter Link besteht, dadurch erkannt werden, dass der Link count
(in der Spalte nach den Berechtigungen) grösser als 1 ist. Ist dies der Fall so kann durch geschickte Anwendung von find herausgefunden werden wo die weiteren Verzeichniseinträge
sind, was folgendes Beispiel zeigt:
# ls -li
98437 -rw-r--r-2 pbuehler pbuehler
13 2003-09-10 13:36 afile
# find / -inum 98437 -exec ls -li {} \; 2>/dev/null
98437 -rw-r--r-2 pbuehler pbuehler
13 2003-09-10 13:36 /tmp/versteckterlink
98437 -rw-r--r-2 pbuehler pbuehler
13 2003-09-10 13:36 /home/pbuehler/afile
Eine weitere Möglichkeit ohne Verwendung von find besteht mit ls und grep, welche aber
viel langsamer ist:
# ls -ilR / 2>/dev/null | grep "^ *98437" 2>/dev/null
98437 -rw-r--r-2 pbuehler pbuehler
13 2003-09-10 13:36 afile
98437 -rw-r--r-2 pbuehler pbuehler
13 2003-09-10 13:36 versteckterlink
Unschön bei dieser Lösung ist, dass das Verzeichnis in welchem sich die gefundenen Dateien
befinden nicht ausgegeben wird.
19.3.2
Auffinden von symbolischen Links
Da symbolische Links schon bei der Auflistung mit ls -l so angezeigt werden, dass die
Originaldatei zu sehen ist, ist die Identifikation der Originaldatei einfach. Wenn man aber
gar nicht weiss, wo sich symbolische Links befinden kann wie folgt vorgegangen werden:
# find / -type l -user pbuehler -exec ls -l {} \; 2>/dev/null
lrwxrwxrwx
1 pbuehler pbuehler
20 2003-09-10 14:32 /tmp/verstecktersymlink -> /home/pbuehler/afile
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/12823/fd/0 -> /dev/pts/0
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/12823/fd/1 -> /dev/pts/0
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/12823/fd/2 -> /dev/pts/0
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/12823/fd/255 -> /dev/pts/0
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/12823/cwd -> /home/pbuehler
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/12823/root -> /
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/12823/exe -> /bin/bash
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/13035/fd/0 -> /dev/pts/0
lrwx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/13035/fd/1 -> /dev/pts/0
l-wx-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/13035/fd/2 -> /dev/null
lr-x-----1 pbuehler pbuehler
64 2003-09-10 14:36 /proc/13035/fd/3 -> /home/pbuehler
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/13035/cwd -> /proc/13035
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/13035/root -> /
lrwxrwxrwx
1 pbuehler pbuehler
0 2003-09-10 14:36 /proc/13035/exe -> /usr/bin/find
130
Diese Ausgabe zeigt alle symbolischen Links des Benutzers pbuehler. Unter den vielen
gefunden Links der Prozessverknüpfungen ist auch der versteckte symbolische Link unter
/tmp zu sehen.
19.3.3
Kopieren von Links
Das Kopieren von echten Links ist unproblematisch, da die Originaldatei im üblichen Sinne
kopiert wird. Das heisst, dass beim Kopieren kein weiterer Hardlink erstellt wird, sondern
die echte Datei kopiert wird.
Symbolische Links bereiten mehr Probleme beim kopieren. Ohne spezielle Angabe kopiert
cp nähmlich nicht den Link, sondern die Datei auf welche verlinkt wird. Mit der Option -d
kann aber cp so verwendet werden, dass keine Dereferenzierung stattfindet und der Link
kopiert wird. Die Dereferenzierung kann zu Problemen führen wenn ein symbolischer Link
mit einer relativen Zielangabe kopiert wird, da dann vom Zielverzeichnis aus die relative Pfadangabe zum Ziel stimmen muss um die gewünschte Verhaltensweise zu erreichen.
Folgendes Beispiel zeigt uns dies nochmals:
# ln -s /var/log/lastlog
# cp lastlog lastlog2
# cp -d lastlog lastlog3
# ls -l
lrwxrwxrwx
1 pbuehler
-rw-r--r-1 pbuehler
lrwxrwxrwx
1 pbuehler
#
lastlog
pbuehler
pbuehler
pbuehler
16 2003-09-10 14:56 lastlog -> /var/log/lastlog
294628 2003-09-10 14:56 lastlog2
16 2003-09-10 14:57 lastlog3 -> /var/log/lastlog
Durch das Kopieren mit -d wird erreicht, dass nicht die ganze (grosse) Datei lastlog kopiert
wird, sondern nur ein neuer Link erstellt wird.
Übrigens: cp kann mit den Optionen -l echte Links und mit -s symbolische Links anstelle
von Kopien erstellen.
131
Kapitel 20
Auffinden von Systemdateien und
Platzieren von Dateien an den
korrekten Ort
20.1
Filesystem Hierarchy Standard (FHS )
Der Filesystem Hierarchy Standard enstand aus einem Projekt einer Linux Benutzergruppe und definiert die Anordnung der wichtigsten Verzeichnisse eines Linux Systems. Der
Zweck der Definition besteht darin, dass so aufgesetzte Systeme weniger Pflegeaufwand verursachen und auch einfach von Benutzern und Administratoren, die mit dem spezifischen
System nicht vertraut sind, bedient und gewartet werden können.
Als diese Definition auch bei den Herstellern von anderen Unix-Systemen auf Anklang
stiess, wurde die Definition so ausgeweitet, dass sie auch für diese Anwendung finden konnte. Heute halten sich die meisten Linux-Distributionen und Unix-Systeme weitestgehend
an diesen Standard.
Nachfolgende Kapitel widmen sich der Verzeichnisstruktur, die durch den Filesystem Hierarchy Standard definiert wird.
20.1.1
Das root-Dateisystem
Dieses Dateisystem bildet die oberste Ebene des gesammten Systems. In einem professionellen System wird versucht, dieses Dateisystem möglichst klein zu halten. Es sollte
aber mindestens die Verzeichnisse enthalten, die notwendig sind, um ein System auch nach
einem Ausfall anderer Partitionen zu starten und zu reparieren. Viele der Unterverzeichnisse dieses Dateisystems sind nur mount points, um andere Dateisysteme einzuhängen.
Einige Verzeichnisse sollten aber unter keinen Umständen auf anderen Dateisystemen lie132
gen, da sie sonst während des Startvorganges, bei welchem nur das root-Dateisystem zur
Verfügung steht, nicht zur Verfügung stehen. Ein simples Beispiel ist das Programm mount
selbst. Dieses Programm muss natürlich auf dem root-Dateisystem liegen, da es sonst in
dem Moment nicht zur Verfügung steht, wo andere Dateisysteme eingehängt werden sollen.
In der folgenden Beschreibung der einzelnen Verzeichnisse wird auch immer beschrieben,
ob ein Verzeichnis geeignet ist, auf eine andere Partition ausgelagert zu werden, oder ob es
zwingend auf der root-Dateisystem sein muss. Weiter stellt sich die Frage, ob ein Verzeichnis statische oder dynamische Dateien enthält. Wenn in einem Verzeichnis ausschliesslich
statische Dateien liegen (also Dateien, die im laufenden Betrieb nicht verändert werden
müssen) so besteht die Möglichkeit, dieses Verzeichnis nur zum Lesen einzuhängen. Das
root-Dateisystem enthält zwingend sowohl statische, als auch dynamische Dateien, und
muss deshalb zum Lesen und Schreiben eingehängt sein.
/bin Grundlegende Programmdateien
Das Verzeichnis /bin enthält grundlegende Programmdateien, die während des Startvorgangs und zur Reparatur des Systems zwingend notwendig sind. Es muss auf dem
root-Dateisystem positioniert sein.
/boot Statische Dateien für den Boot-Loader
Das Verzeichnis /boot enthält die statischen Dateien, die für den Boot-Loader notwendig sind, um das System überhaupt zu starten. Es ist möglich, dieses Verzeichnis
auf eine eigene kleine Partition zu positionieren. Bei Festplatten mit mehr als 1024
Zylindern und einem älteren Bootloader ist es sogar notwendig, dieses Verzeichnis
auf eine Partition vor dem Zylinder 1024 zu legen. Es macht in der Regel keinen
Sinn, diese Partition über das Netzwerk zu teilen.
/dev Gerätedateien
Dieses Verzeichnis enthält die Gerätedateien, die notwendig sind, um auf jede Art
von Hardware zugreifen zu können. Es muss zwingend auf dem root-Dateisystem
angelegt sein, ansonsten sind Hardwarezugriffe während des Bootvorgangs unmöglich,
was sofort zum Abbruch führen würde. Die hier liegenden Dateien benötigen keinen
physikalischen Speicherplatz auf der Partition, wohl aber Inodes.
/etc Rechnerspezifische Konfigurationsdateien
Auch dieses Verzeichnis enthält Informationen, die notwendigerweise beim Start des
Systems gebraucht werden, und muss demnach auch auf dem root-Dateisystem liegen.
Hier finden sich alle wichtigen Konfigurationsdateien des Systems, unter anderem
auch die Datei fstab, die beschreibt, welche Dateisysteme wohin eingehängt werden
müssen.
/home Die Basisverzeichnisse der Benutzer
Hier liegen die Basisverzeichnisse der einzelnen Benutzer. Dieses Verzeichnis ist geradezu dafür vorgesehen, auf einer eigenen Partition zu liegen, damit die Benutzer
133
nicht durch füllen der Festplatte das System zum Absturz bringen können. Da hier
die Daten der Benutzer abgelegt werden, gilt es als dynamisch. Sehr sinnvoll ist es
auch, dieses Verzeichnis über das Netzwerk unter mehreren Systemen zu teilen, so
dass die Benutzer auf jedem System ihre Daten vorfinden.
/lib Grundlegende Programmbibliotheken und kernel -Module
Dieses Verzeichnis muss beim Systemstart zur Verfügung stehen, darf also auf keinen
Fall auf einem anderen Dateisystem als dem root-Dateisystem liegen. Es enthält sowohl wichtige shared libraries (Programmbibliotheken), ohne welche die Programme
des Systems nicht arbeiten können, als auch die kernel -Module, mit anderen Worten
die Gerätetreiber. Alle diese Informationen müssen beim Systemstart zur Verfügung
stehen.
/mnt Ein leerer mount point
Ein leeres Verzeichnis, um temporär andere Dateisysteme einzuhängen. Die meisten
modernen Linux-Distributionen enthalten neben diesem Verzeichnis noch mindestens
/cdrom und /floppy, die auch nur leere Verzeichnisse sind, gedacht um ein CD-ROM
beziehungsweise eine Diskette einzuhängen.
/opt Platz für grosse zusätzliche Programmpakete
Was früher in /usr abgelegt wurde, wird heute standardmässig in dieses Verzeichnis
abgelegt. Es sind dies haupsächlich grosse zusätzliche Programmpakete wie zum
Beispiel: Netscape, StarOffice, KDE, Postgres, usw. Diese Programme sind nicht
zum Starten des Systems notwendig und können deshalb auf einem eigenen, grossen
Dateisystem geführt werden.
Dieses Verzeichnis enthält zumeist statische Daten, und kann im normalen Betriebsablauf so eingehängt werden, dass es nur gelesen werden kann. Es enthält keine
rechnerspezifischen Daten, ist also auch geeignet, um gemeinsam im Netz genutzt zu
werden.
/proc Prozessinformationen
In diesem Verzeichnis finden sich Dateien, die eigentlich gar keine sind. Es handelt
sich um Schnittstellen zum kernel, die es ermöglichen, bestimmte Informationen vom
kernel zu erhalten und bestimmte Einstellungen im laufenden Betrieb des kernels zu
setzen.
Ausserdem besitzt hier jeder laufende Prozess ein Unterverzeichnis, das den Namen
der Process-ID trägt und prozessspezifische Informationen bereitstellt.
/root Basisverzeichnis des Administrators
Dieses Verzeichnis ist das Basisverzeichnis des Administrators. Weil der Administrators im Notfall, etwa bei einer Reparatur des Systems im single user mode auf seine
Dateien zugreifen können muss, ist dieses Verzeichnis nicht unter /home, sondern
auf dem root-Dateisystem direkt abgelegt. Es eignet sich also nicht dazu, auf eine
anderes Dateisystem ausgelagert zu werden.
134
Bei älteren Unix-Systemen hatte der Administrator kein Basisverzeichnis, sondern
das root-Verzeichnis diente ihm als solches. Das führte aber dazu, dass unter / einige
Dateien lagen, die den Überblick über die Konsistenz des Systems erschwerten. Aus
diesem Grund wurde dieses Verzeichnis eingeführt.
/sbin Grundlegende Systemprogramme
Hier liegen wichtige Systemprogramme, die im Gegensatz zu den Programmen in
/bin nicht für alle Benutzer, sondern nur für den Systemverwalter notwendig sind.
Alles, was hier liegt ist für den Startvorgang nötig, darf also nicht ausserhalb des
root-Dateisystem liegen.
/tmp Temporärer Speicherplatz
Dieses Verzeichnis ist ein Ort, in dem alle Benutzer Temporärdateien anlegen können.
Es sollte das Sticky-Bit auf diesem Verzeichnis gesetzt sein, damit boshafte Benutzer
nicht die Dateien anderer Benutzer löschen können. Es ist kein Problem, dieses
Verzeichnis auf ein anderes Dateisystem zu legen, denn es enthält nichts, was für
den Startvorgang benötig wird. Das Verzeichnis wird nur für dynamische Dateien
benötigt, und muss daher zum Lesen und Schreiben eingehängt werden.
/usr Die zweite Dateihierarchie
Das /usr -Verzeichnis ist die zweite Hauptsektion eines Unix-Dateisystems. Es enthält
über das Netzwerk teilbare, statische Daten. Es ist übliche Praxis, dieses Verzeichnis
auf ein eigenes Dateisystem zu legen, welche im Netzwerk geteilt verwendet wird und
nur zum Lesen eingehängt wird. Grosse Programmpakete sollten - mit Ausnahme
des X11-Systems - nicht hier, sondern unter /opt abgelegt werden. Der genaue Inhalt
dieses Dateisystems wird im nächsten Abschnitt (20.1.2) dargestellt.
/var Variable Daten
Frühere Unix-Derivate haben bestimmte variable Daten, wie etwa ein Temporärverzeichnis, die Systemlogbücher, Spoolverzeichnisse, usw. im /usr Verzeichnis abgelegt. Da dieses Verzeichnis heute meist nur noch zum Lesen eingehängt wird, wurde
es nötig, einen Platz für variable (dynamische) Daten zu schaffen. Diese Aufgabe
übernimmt heute das Verzeichnis /var.
Damit auch ältere Programme, die noch immer ins /usr -Verzeichnis schreiben wollen,
nicht abstürzen, existieren heute zumeist die folgenden symbolischen Links im /usr Verzeichnis, die ins /var -Verzeichnis verweisen:
ˆ /usr/spool -> /var/spool
ˆ /usr/tmp -> /var/tmp
Es ist durchaus möglich, dieses Verzeichnis auf ein eigenes Dateisystem zu legen und
auch der zumindest teilweisen gemeinsamen Nutzung im Netzwerk steht nichts im
Wege. Allerdings enthält das /var -Verzeichnis einige systemspezifische Daten, die
im Netzwerk nicht umbedingt geteilt werden sollten wie zum Beispiel: /var/lock (die
135
Lock-Dateien) oder /var/run (die Prozessnummern verschiedener Programme). Sie
dazu auch Kapitel 20.1.3.
Abbildung 20.1: Filesystem Hierarchie Standard
20.1.2
Das /usr Dateisystem
Die zweite Ebene der Dateisystemhierarchie liegt im /usr Verzeichnis. Hier finden sich
sehr ähnliche Verzeichnisse, wie auf dem Hauptverzeichnis des Systems. Allerdings sind
alle Daten, die hier liegen statisch, müssen also im normalen Systembetrieb nicht verändert
werden. Nachfolgend die wichtigsten Unterverzeichnisse:
/usr/X11R6 Das X-Window System, Version 11, Release 6
Hier liegen verschiedene Verzeichnisse, die wiederum die Binärdateien (/usr/X11R6/bin),
die Libraries (/usr/X11R6/lib),
Include-Dateien
(/usr/X11R6/include) und vieles mehr beinhalten, aber alle zum X11-System
gehören. Das ist das einzige grosse Programmpaket, dass immer noch unter /usr
liegt und nicht unter /opt.
/usr/bin Die meisten Benutzer Kommandos
Hier liegen die Benutzerkommandos, die nicht unbedingt während des Systemstarts
oder einer Notfallreparatur benötigt werden.
136
/usr/include Include-Dateien des C-Compilers
Hier finden sich die ganzen Include-Dateien, die sowohl für den C-, als auch für den
C++ Compiler notwendig sind. Das Verzeichnis enthält auch viele Unterverzeichnisse, die wiederum Includedateien enthalten.
/usr/lib Bibliotheken für Programme und Pakete
Dieses Verzeichnis enthält Objektdateien, Programmbibliotheken und interne
Binärdateien, die nicht direkt von den Benutzern aufgerufen werden sollen. Anwendungen können unter /usr/lib ein eigenes Verzeichnis haben, um ihre Daten dort
abzulegen.
/usr/local Die dritte, lokale Hierarchie
Dieses Verzeichnis sollte nach der Hauptinstallation leer sein. Hier ist Platz für eine
weitere Dateisystemhierarchie, mit dem gleichen Inhalt wie /usr selbst. Nur sollten
hier die lokalen Besonderheiten des Systems abgelegt sein, an Stelle der systemspezifischen Standards.
/usr/sbin Nicht lebensnotwendige Systemprogramme
In diesem verzeichnis lagern die Systemprogramme, die nur für den Administrator
gedacht sind und die nicht während des Start- oder Reparaturvorgangs benötigt
werden.
/usr/share Gemeinsame Daten
Hier liegen architekturunabhängige Daten, wie etwa Handbuchseiten, Dokumentationen oder Wörterbücher.
/usr/src Quelltexte von Programme
Alle Quelltext für Systemprogramme, inklusive der des Systems selbst, sind hier zu
finden. Um diese Quelltexte zu übersetzen muss natürlich Schreibmöglichkeit existieren. Aus diesem Grund wird dieses Verzeichnis entweder als eigenes Dateisystem,
welches zum Lesen und Schreiben eingehängt wird, realisiert, oder der Administrator
hängt das /usr -Verzeichnis, für den Prozess des Übersetzens, kurzzeitig zum Lesen
und Schreiben ein.
20.1.3
Das /var Dateisystem
Vereinfacht gesagt gehört alles, was nicht statische Daten ist aber eigentlich unter /usr zu
finden wäre, heute in dieses Verzeichnis. Insbesondere ist hier zu finden:
/var/lib Variable Statusinformationen der Programmbibliotheken.
/var/lock Lockfiles, die anzeigen, dass ein bestimmtes Gerät gerade in Benutzung ist.
/var/log Die Systemlogbücher und Unterverzeichnisse für die Logdateien einzelner Anwendungen (zum Beispiel Webserver, Mailsystem, usw.).
137
/var/run Prozessinformationen über laufende Prozesse. Viele Daemon-Prozesse schreiben hier eine Datei, welche die Prozessnummer des laufenden Daemons enthält.
/var/spool Das Spoolverzeichnis für alle Dienste, die mit Warteschlangen arbeiten. Dazu zählen unter anderem: Druckerdienste, Faxdienste, Maildienste und Programme
wie at oder cron.
/var/tmp Das Temporärverzeichnis, das eigentlich in /usr liegt, dort aber nur ein symbolischer Link auf dieses Verzeichnis ist.
20.2
Auffinden von Dateien und Programmen
Der Filesystem Hierarchy Standard definiert zwar an welchen Orten welche Arten von Dateien und Programmen abgelegt werden, aber dennoch braucht es geeignete Mechanismen
um einzelne Dateien und Programme aufzufinden.
Beim Auffinden von Objekten wird grundlegend zwischen Programmen und Dateien
unterschieden. Programme sind ausführbare binäre Dateien oder Skripte. Wie der
FHS zeigt, sind einige Verzeichnisse dafür vorgesehen, Programme zu enthalten. Diese
Verzeichnisse enden meist mit bin. Damit die darin gelagerten Programme von jedem Pfad
aus aufgerufen werden können ohne den absolten Pfad des Programmes voranzustellen,
existiert ein sogenannter Programmssuchpfad, der in der Variable $PATH gespeichert ist.
Bei der Eingabe eines Kommandos werden die darin enthaltenen Verzeichnisse (von links
nach rechts) nach dem angegebenen Befehl durchsucht. Folgende Beispiel zeigen einen
übliche Inhalt der Variable $PATH für den Administrator sowie einen normalen Benutzer:
Administrator: /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:
/usr/X11R6/bin:/bin:/opt/gnome/bin:/opt/kde/bin
Normaler
Benutzer:
.:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/opt/gnome/bin:/opt/kde/bin
Es ist zu sehen, dass $PATH beim Administrator zusätzlich noch die jeweiligen sbinVerzeichnisse enthält dafür aber das aktuelle Verzeichnis (.) nicht enthalten ist. Dies rührt
unter anderem daher, dass damit einfache Hackerattacken unterbunden werden können.
Ein Eindringling auf dem System könnte ansonsten ein Skript erstellen, dass ihm zum
Beispiel die Passwort-Datei (/etc/passwd ) mailt (auf die er sonst keinnen Zugriff hätte),
anschliessend das ls Programm aufruft und sich dann selber löscht. Dieses Skript platziert der Hacker nun in /tmp und nennt es ls. Falls der Administrator dies nicht bemerkt
und im Verzeichnis /tmp das Kommando ls ausführt wird das vom Hacker eingeschleuste
Skript ls ausgeführt und er bekommt die Passwort-Datei. Verherend dabei ist, dass der
Administrator dies auch nun nicht bemerkt, da sich das Skript selbst löscht und danach
alles wieder regulär funktioniert. Natürlich wäre es auch möglich, das aktuelle Verzeichnis
138
(.) am Ende des Suchpfades hinzuzufügen, wodurch eine derartige Attacke (durch die Abarbeitung des Suchpfades von links nach rechts) unterbunden werden könnte. Allerdings
wird dies oft aus Vorsicht unterlassen.
In den nachfolgende Kapitel werden die Programme zum Auffinden von Objekten vorgestellt und deren Anwendung illustiert. Das Programm find, dass zum Auffinden von
Dateien dient, wird an dieser Stelle nicht mehr behandelt, da dies bereits ausfürlich im
Kapitel 5.9.2 gemacht wurde. Weiter wird die Zentrale Dateidatenbank, die von den Programme locate und slocate benutzt wird besprochen.
20.2.1
which
which [-a] COMMANDS
Gibt das Erste der gefunden COMMANDS, welches bei einem entsprechenden Aufruf ausgeführt
würde, aus. Dabei wird nur der Programmsuchpfad $PATH durchsucht. Mit der Option -a
kann angegeben werden, dass alle gefundenen Objekte ausgegeben werden sollen.
Anwendungsbeispiele
# which mount
/bin/mount
# ls /sbin >/tmp/sbin
# ls /usr/sbin >>/tmp/sbin
# cat /tmp/sbin | sort | uniq -d
cfdisk
fdisk
nwmsg
pxinitrd
rmt
sfdisk
termwrap
xfsdump
xfsrestore
# which -a fdisk
/sbin/fdisk
/usr/sbin/fdisk
20.2.2
whereis
whereis [OPTIONS] NAMES
139
Mit whereis können Programme, Quelltexte und Hilfeseiten gefunden werden. Dazu werden die angegebenen NAMES von einem allfälligen führenden Pfadnamen und der Dateierweiterung (zum Beispiel .cpp) befreit. Die Suche wird dann über eine Liste von möglichen
Lokationen ausgeführt.
Beispiele von Optionen
-b Sucht nur nach binären Dateien.
-m Sucht nur nach Hilfeseiten (man-pages)
-s Sucht nur nach Quelltexten.
Anwendungsbeispiele
# whereis mount
mount: /bin/mount /sbin/mount.ncp /sbin/mount.ncpfs /sbin/mount.smb /sbin/
mount.smbfs /usr/share/man/man2/mount.2.gz /usr/share/man/man8/mount.8.gz
# whereis -b include
include: /usr/local/include
# whereis -s include
include: /usr/src/linux/include /usr/src/linux-2.4.21-xfs/include
20.2.3
whatis
whatis [OPTIONS] NAMES
Durchsucht die Namen der Hilfeseiten (man-pages) nach den angegebenen NAMES
und listet die gefundenen Resultate auf. Bei der Suche wird eine statische IndexDatenbank durchsucht, die auf der obersten Ebene der Hilfeseiten-Struktur (normalerweise
/usr/share/man/ ) liegt.
Beispiele von Optionen
-r Erlaubt reguläre Ausdrücke in den NAMES (Achtung: ,,escapen”).
-w Erlaubt Wildcards in den NAMES.
Anwendungsbeispiele
# whatis less
less (1)
# whatis -w mount
- opposite of more
140
mount (2)
mount (8)
mount.ncp (8)
mount.smb (8)
mount.smbfs (8)
mountd (8)
20.2.4
-
mount and unmount filesystems.
mount a file system
mount volume(s) from a specified NetWare fileserver.
mount a smbfs filesystem
mount a smbfs filesystem
NFS mount deamon
apropos
apropos [OPTIONS] KEYWORDS
Durchsucht die Namen und Kurzbeschreibungen der Hilfeseiten (man-pages) nach den
angegebenen NAMES und listet die gefundenen Resultate auf. Bei der Suche wird eine
statische Index-Datenbank durchsucht, die auf der obersten Ebene der Hilfeseiten-Struktur
(normalerweise /usr/share/man/ ) liegt.
Beispiele von Optionen
-e Exakte Suche.
-r Erlaubt reguläre Ausdrücke in den NAMES (Achtung: ,,Escapen”).
-w Erlaubt Wildcards in den NAMES.
Anwendungsbeispiele
# apropos opposite
less (1)
- opposite of more
pager (1)
- opposite of more
# apropos -r "^socket$"
socket (2)
- create an endpoint for communication
socket (7)
- Linux socket interface
20.2.5
Die zentrale Dateidatenbank
Unter Linux wird eine zentrale Datenbank geführt, die alle Dateien, die auf dem System
gespeichert sind als Namenseintrag mit komplettem Pfad speichert und die so auch das Suchen nach Dateien ermöglicht. Damit diese Datenbank auf einem aktuellen Stand gehalten
wird, muss diese regelmässig auf den neusten Stand gebracht werden.
Diese Datenbank wird üblicherweise in der Datei /var/cache/locate/locatedb abgelegt und
mit dem Programm updatedb, das regelmässig (zum Beispiel täglich) ausgeführt wird,
aktualisiert. Ein entsprechender Aufruf ist meist als cron-Job realisiert und mit einem
141
Eintrag in /etc/cron.daily vertreten. Das Programm updatedb wird über die Konfigurationsdatei /etc/updatedb.conf gesteuert. Diese Datei könnte in etwa folgenden Inhalt
haben:
# This file sets environment variables which are used by updatedb
# filesystems which are pruned from updatedb database
PRUNEFS="NFS nfs afs proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs"
export PRUNEFS
# paths which are pruned from updatedb database
PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /amd /alex /var/spool /sfs"
export PRUNEPATHS
# netpaths which are added
NETPATHS=""
export NETPATHS
Darin ist zu sehen, dass mit der Variable $PRUNEFS die nicht zu beachtenden Dateisystemtypen, und mit der Variable $PRUNEPATHS die nicht zu beachtenden Verzeichnisse definiert
werden. Weiter können in $NETPATHS zu durchsuchende Netzwerkverzeichnisse angegeben
werden.
locate
locate PATTERN
Sucht in der Datenbank der Dateinamen nach dem PATTERN und gibt die gefundenen
Resultate aus. Im PATTERN können folgende Wildcards gebraucht werden: *, ?, []. Wenn
allerdings Wildcards im PATTERN vorkommen muss der gesamte gespeicherte Dateinamen
(inklusive Pfad) auf das PATTERN passen. Ansonsten kann PATTERN an einer beliebigen
Stelle des Dateinamens auftreten.
slocate
slocate PATTERN
Diese Programm arbeitet gleich wie locate ausser, dass die Benutzerrechte des Ausführenden so einbezogen werden, dass nur Dateien gefunden werden, auf welche dieser Zugriff hat.
Diese Programm steht nicht auf allen Systemen zu Verfügung und benötigt eine erweiterte
Dateinamen-Datenbank in welcher die Benutzerrechte mitgespeichert werden.
142
Teil IV
102 - Linux Installation und
Paketmanagement
143
Kapitel 21
Entwurf einer Festplattenaufteilung
[JH]Grundsätzlich stellt sich bei der Installation eines System die Frage wieviele und wie
grosse Partitionen zu erstellen sind. Diese Frage kann nicht global beantwortet werden, da
verschiedene Faktoren diese Entscheidungen beeinflussen.
Faktoren welche die Festplattenaufteilung beeinflussen:
ˆ Die Grösse des verfügbaren Speichers
ˆ Die Grösse des ganzen Systems
ˆ Das Einsatzgebiet des Systems
ˆ Das Backup Konzept
21.1
Swap
Grundsätzlich ist es eine gute Idee eine separate Swap-Partition zu erstellen. Der SwapSpace ist eine Erweiterung des RAM und wird auch als virtual Memory bezeichnet. Dorthin
werden temporär Programme oder Daten gespeichert, welche nicht konstant gebraucht werden, um mehr Prozesse gleichzeitig ausführen zu können. Für die Wahl der angemessenen
Grösse des Swap-Space gibt es nur ungefähre Richtlinien, welche sich je nach Anwendung
im Bereich 1 - 3 x dem eingesetzten RAM bewegen. Um einen möglichst schnellen Zugriff
zu erhalten ist der Swap-Bereich auf schnelle Platten mit vielen Köpfen und verteilt über
mehrere Disks anzuordnen.
144
21.2
Backup
Die Wahl der Backupform kann die Grösse von Filesystemen erzwingen, da die zu sichernde
Datenmenge pro Tag oder Device nicht grösser sein sollte als das Backupmedium. Optionen
sind das Sichern von Partitionen, oder das inkrementelle sichern von veränderten Dateien
über eine oder mehrere Partitionen.
21.3
kleine Systeme
Bei einem einfachen, kleinen System genügen prinzipiell zwei Partitionen(/ und /swap).
Eine Standardinstallation besteht jedoch aus drei Partitionen wie im folgenden gezeigt .
/boot Die erste Partition ist die boot Partition. Sie ist meistens eine primäre Partition
(/dev/hda1 oder /dev/sda1) und enthält die zum booten benötigten Daten. Dies sind
LILO oder GRUB-Boot Loader Informationen und natürlich den Linux Kernel (es
können auch mehrere Kernels sein.) Sie ist dementsprechend relativ klein (50 MB)
und liegt typischerweise am Anfang der Disk, obschon dies heute technisch nicht
mehr zwingend nötig ist. Früher konnte LILO Kernels von Filesystemen welche sich
über die 1024-Zylinder Grenze erstreckten nicht laden. Normalerweise ist es aus
Sicherheitsgründen ratsam die Boot-Partition während des Betriebs unmounted zu
haben.
/swap Die zweite Partition wird als Swap Space gebraucht. Sie kann sowohl eine primäre,
als auch eine logische Partition sein. Ihre Grösse sollte ungefähr 1 - 2 x RAM betragen. Es sind bis zu acht Swap Partitionen (auf verschiedenen drives) erlaubt .
/ Die dritte Partition ist die root Partition, belegt den restlichen Speicherplatz und enthält
das Linux Filesystem, mit Ausnahme der Daten im /boot.
21.4
grössere Systeme
Bei grösseren Systemen sind zusätzliche Überlegungen zum Disklayout notwendig. Einerseits kann es sein, dass der Speicherplatz für gewisse Filesysteme (/tmp oder /var) eingeschränkt werden soll, damit Spooler, Error-Logs oder temporäre Daten nicht den ganzen
Speicherpaltz auffressen können und so die Systemleistung zusammenbricht. Andererseits
hat die gewählte Backup-Strategie massgeblich Einfluss auf die Grösse der Filesysteme und
der Partitionen. Eine Unterteilung in mehr als drei Partitionen ist daher unumgänglich.
Ein mögliches Disklayout eines 100 GB Fileservers könnte wie folgt aussehen:
/boot Die boot Partition kann wie in kleinen Systemen gestaltet werden.(50 MB)
145
/swap Je nach geplantem Einsatz, sollte die Grösse des Swap 1 - 3 x dem eingesetzten
RAM entsprechen. Um die Geschwindigkeit zu erhöhen kann der Swap auf verschiedene Disks verteilt werden. (1 GB)
/ Das root Filesystem wird klein gewählt (100 MB)
/var Das var Filesystem enthält die spool Directories unter anderm für Mail und Druck,
sowie das Error Log Directory. Wird das Filesystem gefüllt, beeinträchtig dies die
Stabilität des Systems nicht.(500 MB)
/usr Enthält fast alle ausführbaren Dateien, den Kernel Source Tree und die Dokumentation. (1 GB)
/tmp Enthält temporäre Daten von Programmen. Vor allem Simulationen oder andere
rechenintensive Programme können diesen Speicherplatz kurzfristig füllen. Für die
Systemstabilität lohnt sich daher eine Trennung.Die Grösse ist sehr von den eingesetzten Anwendungen abhängig.(200 MB)
/home Die User Daten, sollten, sofern keine Quotas verwendet werden immer auf einem
separaten Filesystem geführt werden, da dieses Filesystem notorisch voll ist.
Die Definition von Mount Points ist im Kapitel 15 behandelt.
146
Kapitel 22
Installation eines Bootmanagers
22.1
Verteilung der Zylinder
Abbildung 22.1: Schematisches Layout einer HD
Auf der Hardware-Ebene von industriestandardkompatiblen Computern (und um die geht
es hier) ist der Bootvorgang von Betriebssystemen klar vorgegeben. Das BIOS (Basic
Input Output System) im ROM jedes Computers sucht auf der Platte, von der es booten
147
soll/will nach dem äussersten Zylinder (Nr.0). Dieser Zylinder ist selbst nicht Teil von
Partitionen, sondern er enthält z.B. die Partitionstabelle, die erstmal festlegt, wo denn
überhaupt welche Partitionen beginnen und enden. Neben dieser Information befindet
sich auf der Spur 0 jedes physikalischen Laufwerks der sogenannte Master Boot Record
(MBR). Dieser MBR enthält gewöhnlich einfach einen Verweis auf die erste Partition der
Platte und der dort abgelegten Bootinformation.
Jede Partition der Platte besitzt nämlich wiederum auf ihrem ersten Zylinder einen lokalen
Bootsektor, der Informationen enthalten kann (bei DOS/Win-Systemen) wie das auf dieser
Partition befindliche Betriebssystem gebootet werden soll. Diese Information besteht aus
einem kleinen Programm, dem sogenannten Bootstrap-Loader.
Wenn auf einem System mehrere Betriebssysteme vorhanden sind, dann kann im Master
Boot Record ein kleines Programm installiert werden, das den User entscheiden lässt,
von welcher Partition welches System gebootet werden soll. Dieses Programm wird als
Bootmanager bezeichnet.
Auf dem MBR ist aber nur sehr wenig Platz (weniger als 512 Byte). Das dort abgelegte Programm ist also zwangsläufig sehr klein. Meist wird das Programm nichts anderes tun, als
ein zweites Programm zu laden, das das eigentliche Menü des Bootmanagers enthält. Dieses zweite Programm befindet sich zwangsläufig schon auf einer Festplattenpartition. Der
Bootmanager muss also - unter Umgehung des Betriebssystems, das ja noch gar nicht geladen ist - Zugriff auf das Dateisystem dieser Partition haben und das gewünschte Programm
dort laden. Dieser Vorgang wird als erste Stufe (Stage 1) des Bootloaders bezeichnet.
Das Programm, das das eigentliche Menü enthält, ist also die zweite Stufe (Stage 2) des
Ladevorganges. Hier kann der/die BenutzerIn also aussuchen, welches Betriebssystem von
welcher Partition gebootet werden soll. Es befindet sich normalerweise in einer eigenen
/boot Partition in den unteren 1024 Zylindern, da der first-stage loader in Kombination
mit einem alten BIOS unter Umständen nicht mit mehr als 1024 Zylindern umgehen kann.
Erst nach dieser Auswahl wird das eigentliche System geladen (Stage 3).
Der klassische Bootmanager unter Linux war jahrelang das Programm lilo (Linux Loader).
Neuerdings existiert eine zweite Möglichkeit, der GRand Unified Bootloader grub.
22.2
Der Boot-Prozess
Der Boot Prozess ist für alle Systeme ähnlich, unabhängig von der jeweiligen Distribution.
1. Zuerst liest das BIOS die ersten paar Sektoren der Harddisk, den sogenannten Master
Boot Record (MBR). Im MBR stehen nur 446 Bytes zur Verfügung. Reichlich wenig
für ein richtig schönes Bootmenü und ein flexibles booten. Darum hat dieser firststage nur die Aufgabe, den zweiten Teil (second-stage loader ) nachzuladen.
2. Das Erste was beim Laden des Kernels sichtbar ist, ist eine Zeile ähnlich:
148
Linux version 2.4.21 (root@zagyg) (gcc version 3.3.2 20030908 (Debian
prerelease)) #1 SMP Fri Oct 10 12:53:07 CEST 2003
3. Anschliessend folgen Statusmeldungen der Hardwarekomponenten, wie Prozessor,
PCI-Bus, Disk-Controller, Harddisks, serielle Ports, Floppy, USB Komponenten,
Netzwerkkarten,Soundkarten usw.
4. Wenn der Kernel fertig geladen ist, startet dieser das Programm /sbin/init, welches bis zum herunterfahren des Systems läuft und die PID 1 besitzt. Das init
Programm bootet den Rest des Systems, indem es diverse Skripts aufruft. Diese liegen typischerweise in den Directories /etc/rc.d/init.d oder /etc/init.d. Zu den
Aufgaben, welche unter init erfüllt werden, gehören unter anderem das Setzen des
Hostnamens, das Überprüfen der Filesysteme auf Fehler, das zusätzliche mounten
von Filesystemen oder das Starten des Netzwerks.
5. Am Ende startet init getty, welches den login prompt anzeigt.
22.3
LILO
LILO der LInux LOader, ist der ältere und häufiger vorkommende Boot Loader. Ob das
System mit LILO startet kann am
LILO:
Prompt erkannt werden.
Möglicherweise muss jedoch während des Bootens die
Shift-Taste gedrückt werden, um den Prompt angezeigt zu bekommen, da viele Systeme
so konfiguriert sind, das sie ohne zu warten direkt den Standardkernel laden. Nach drücken
der tab-Taste erscheint eine Liste der verfügbaren Kernel-Images, welche gebootet werden
können. Dabei ist es möglich dem Kernel Optionen für den Ladevorgang mitzugeben.
22.3.1
LILO Spezialitäten
LILO besteht aus zwei Teilen
Boot Loader Der LILO Boot-Loader wird in zwei Stufen ausgeführt. Zuerst lädt das
BIOS die erste Stufe von LILO, welche den zweiten grösseren Teil lokalisiert und
ausführt.
lilo Befehl lilo ist der sogenannte map installer.
Immer wenn Änderungen an
/etc/lilo.conf gemacht werden, oder ein neuer Kernel installiert wird, muss lilo
ausgeführt werden. Lilo speichert die Änderungen des Konfigurationsfiles, wie auch
der physische Ort des Kernels im MBR.
149
# lilo -v
LILO version 22.5.8, Copyright (C) 1992-1998 Werner Almesberger
Development beyond version 21 Copyright (C) 1999-2003 John Coffman
Released 10-Oct-2003, and compiled at 15:58:18 on Oct 11 2003
Compiled for Debian GNU/Linux.
Reading boot sector from /dev/hda
Using MENU secondary loader
Calling map_insert_data
Boot image: /vmlinuz -> boot/vmlinuz-2.4.21
Added Linux *
Boot image: /vmlinuz.old -> /boot/vmlinuz-2.4.21
Added LinuxOLD
Boot other: /dev/hda1, on /dev/hda, loader CHAIN
Added Windows(hda1)
Writing boot sector.
/boot/boot.0300 exists - no boot sector backup copy made.
22.3.2
lilo
Beschreibung
lilo [Optionen] liest das Konfigurationsfile und schreibt ein Map-File, welches Informationen für den Boot-Loader zum lokalisieren und ausführen des Linux Kernels oder anderer
Betriebssysteme enthält.
Beispiele von Optionen
-C config file
-m map file
-q
-v
Lies das config file anstelle der Standarddatei /etc/lilo.conf .
Schreibe map file anstelle des von der Konfigurationsdatei spezifizierte Standardfile.
Lies die aktuelle Konfiguration aus.
Erhöhe die Geschwätzigkeit.
150
lilo.conf
LILO’s Konfigurationsdatei enthält Optionen und Kernel Image Informationen. Die
verfügbaren Optionen unterteilen sich in Globale, welche LILO als Ganzes beeinflussen,
und in Lokale welche nur für ein einzelnes Kernel-Image gelten.
Beispiel eines /etc/lilo.conf Files.(Englische Kommentare im File sind herausgeschnitten)
lba32
boot=/dev/hda
root=/dev/hda5
install=/boot/boot-menu.b
map=/boot/map
# password=tatercounter2000
prompt
timeout=150
vga=normal
append="apm=on apm=power-off"
default=Linux
image=/vmlinuz
label=Linux
read-only
image=/vmlinuz.old
label=LinuxOLD
read-only
other=/dev/hda1
label="Windows(hda1)"
lba 32 Bei aktuellen Harddisks normal, ist das Logical Block Adressing (LBA). Durch
die Übersetzung der physikalischen in eine logische Harddiskgeometrie, kann die 1024
Zylinder Beschränkung umgangen werden.[10]
boot Sagt LILO wo der Bootblock zu installieren ist. Dies kann eine Partition oder eine
Raw-Device sein.
root Sagt welche Device als root ’/’ zu mounten ist.
install Installiert das spezifizierte File als neuen Boot Sektor.
map Definiert den Ort des Map-Files.
vga Spezifiziert den VGA-Text Mode beim Booten.
151
prompt Weisst LILO an dem User die Auswahl anzuzeigen
timeout Zeit in Zehntelssekunden, nach welcher das Standard Image geladen wird, falls
keine Eingabe erfolgt.
append Ist ein Beispiel für eine Globale Option, welche bei allen Images verwendet wird.
image Definiert das zu bootende Kernel Image. Dies knnen wie im Beispiel ersichtlicht
mehrere sein und allenfalls auch andere Betriebs systeme beinhalten.
label Die Beschreibung des Images
read-only Das Root Filesystem wird während des Bootvorgangs als Read-Only gemountet.
22.3.3
Lilo Fehlermeldungen
Beim Booten wird das Wort LILO Zeichen für Zeichen auf den Schirm geschrieben. Falls
es zu einem Fehler während des Bootmanager-Vorgangs kommt, so kann dieser Fehler
anhand der Tatsache eingekreist werden, wieviele Buchstaben schon geschrieben wurden.
Die folgenden Schritte werden jeweils durchgeführt, wenn ein Buchstabe geschrieben wurde:
nichts Kein Teil von Lilo wurde geladen. Entweder ist lilo nicht installiert oder er sitzt
auf einem Bootsektor einer Partition, die nicht aktiviert ist.
LFehlernummer Der erste Teil des Bootloaders wurde lokalisiert und geladen, aber er
kann den zweiten Teil nicht laden. Die zweistellige Fehlernummer gibt genauere
Hinweise auf den Grund an. In der Regel deutet dieser Fehler auf ein Problem mit
der Plattenoberfläche oder falschen Plattenparametern im BIOS hin.
LI Der erste Teil des Bootloaders hat den zweiten Teil geladen, kann ihn aber nicht
ausführen. Das kann daran liegen, dass es entweder eine Inkompatibilität mit der
Plattengeometrie gibt, oder die Datei /boot/boot.b wurde von der Stelle bewegt, an
der sie lag, als lilo installiert (aufgerufen) wurde.
LIL Der zweite Teil des Bootloaders wurde gestartet, kann aber die Beschreibungstabelle
des map-files nicht laden. Typischerweise ein Medien-Fehler (Oberflächenbeschädigung) oder unpassende Plattengeometrie.
LIL? Der zweite Teil des Bootloaders wurde an eine falsche Adresse geladen. Auch hier
ist die wahrscheinlichste Ursache, dass die Datei /boot/boot.b verändert oder bewegt
wurde.
LIL- Die Beschreibngstabelle ist beschädigt. Entweder ein Oberflächenfehler, oder die
Datei /boot/map wurde verändert oder bewegt.
LILO Alle Teile von lilo wurden ordnungsgemäss geladen.
152
22.4
GRUB
Der GRand Unified Bootloader (GRUB) ist jünger und hat einige Unterschiede zu LILO .
ˆ GRUB bietet sowohl eine Menügeführte, als auch eine OS-unabhängige Kommandozeile , mit mehr Optionen als LILO
ˆ GRUB unterstützt mehr Betriebssysteme als LILO
ˆ GRUB’s Konfigurationsfile (boot/grub/grub.conf) wird bei jedem Boot direkt von
der Disk gelesen, so dass kein wiederholtes überschreiben des MBR, wie bei LILO
notwendig ist.
22.4.1
grub-install
Beschreibung
grub-install <location> installiert den Bootloader an den angegebenen Ort (z.B.
/dev/hda1)
grub.conf
Die Konfigurationsdatei von GRUB ist normalerweise unter /boot/grub/grub.conf zu
finden.
Beispiel eines grub.conf Files:
default=1
fallback 0
timeout=120
splashimage=(hd0,8)/boot/grub/splash.xpm.gz
title Windows 2000
unhide (hd0,0)
hide (hd0,1)
hide (hd0,2)
rootnoverify (hd0,0)
chainloader +1
makeactive
title Red Hat Linux (2.4.18-19.8.0.19mar2003)
root (hd0,8)
kernel /boot/bzImage.2.4.18-19.8.0.19mar2003 ro root=LABEL=/ hdd=ide-scsi
153
initrd /boot/initrd-2.4.18-19.8.0custom.img.19mar03
title Partition 2 (floppy)
hide (hd0,0)
unhide (hd0,1)
hide (hd0,2)
chainloader (fd0)+1
22.5
Boot Meldungen
Da die Meldungen während des Bootvorgangs meistens viel zu schnell über den Bilschirm
flitzen, sollte man wissen, wie man diese in aller Ruhe auch später anschauen kann.
22.5.1
dmesg
Beschreibung
dmesg [Option] Zeigt den Kernel Log an. Dies ist geeignet für Fehler welche während des
Ladens des Kernels, oder beim initialisieren von Hardware auftreten.
22.5.2
/var/log/messages
Dieses File wird vom syslog daemon aufgezeichnet und erhält Eingaben von Libraries, daemonen und dem Kernel. Jede Zeile hat einen Timestamp. Fehler welche beim Ausführen
des init Skripts auftreten werden hier gespeichert.
Ausschnitt aus /var/log/messages
Nov
Nov
Nov
Nov
Nov
Nov
Nov
Nov
Nov
Nov
Nov
25
25
25
25
25
25
25
25
25
25
25
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
11:40:37
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
zagyg
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
kernel:
CPU serial number disabled.
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
256K L2 cache (8 way)
CPU: L2 Cache: 256K
CPU: Intel Pentium III (Coppermine) stepping 06
Checking 386/387 coupling... OK
Checking ’hlt’ instruction... OK.
Checking for popad bug... OK.
POSIX conformance testing by UNIFIX
mtrr: v1.35a (19990819) Richard Gooch
154
Kapitel 23
Erstellen und Installieren von im
Sourcecode vorliegenden
Programmen
Um Applikationen auf einem System installieren zu können, welche nicht, oder noch nicht
in einer Packetversion vorliegen, müssen die entsprechenden Programme aus dem Sourcecode kompiliert und installiert werden. Ebenso sind systemspezifische Anpassungen oder
Änderungen an Programmen nur durch manuelles kompilieren möglich. Die ganze Prozedur wir im Folgenden Schritt für Schritt erklärt.
1. Download
2. Entpacken
3. Installationshilfe und Konfiguration
4. Kompilieren und Installieren
5. Mögliche Fehler
23.1
Download
Als erstes werden die gewünschten Sources zum downloaden gesucht. Häufig sind
sie in einem Archiv verpackt und noch komprimiert.
Dies kann an den Endungen erkannt werden und zeigt mit welchen Befehlen entpackt werden muss.
.tar.gz, .tar.Z, .tar.tgz
.tar.bz2
Archive mit tar verpackt und gzip komprimiert.
sind Archive mit tar verpackt und bzip2 komprimiert.
155
Es lohnt sich übrigens auf der Download-Site nach Installationsanleitungen und, oder Dokumentationen Ausschau zu halten, welche häufig dort ebenso verfügbar sind.
Ebenso sind mögliche Abhängigkeiten des zu installierenden Programms von anderen, eventuell auf dem System ebenfalls noch nicht vorhandenen Programmen angegeben. In einem
solchen Fall müssten zuerst diese anderen Programme, oder Bibliotheken heruntergeladen
und installiert werden. Diese gibt es dann möglicherweise schon in Paketform, womit es
aber sowieo wieder zurück zum Start geht.
23.2
Entpacken
Die eben heruntergeladenen, getarten und gezippten Files nennt man tarballs. Um sie
entpacken und dekomprimieren zu können, sollte man folgende Befehle kennen.
23.2.1
tar
Beschreibung
tar [Optionen] Filenamen Ist ein Archivierungstool, welches Files in ein Archiv speichert und wieder entpackt.
Anwendungsbeispiele
tar
tar
tar
tar
-xvf foo.tar entpacke das Archiv foo.tar
-xvzf foo.tar.gz dekomprimiere und entpacke foo.tar.gz
-xvjf foo.tar.bz2 dekomprimiere und entpacke foo.tar.bz2
-cvf foo.tar foo/ archiviere den Inhalt des Ordner foo/ in foo.tar
Es kann sich lohnen vor dem Entpacken das Archiv anzuschauen (-t Option), um zu sehen
in welcher Directory Struktur die Files archiviert sind, um nicht einen Haufen Dateien in
den falschen Pfad zu entpacken.
156
Beispiele von Optionen
-A
-c
--d
-r
-t
-u
-x
-z
-j
-v
hänge .tar Files an ein Archiv an.
kreiere ein neues Archiv.
lösche Files aus dem Archiv.
füge zusätzliche Files ins Archiv ein.
zeige den Inhalt des Archivs an.
aktualisiere Files im Archiv, falls die Version auf dem Filesystem
neuer ist.
entpacke Files aus dem Archiv.
dekomprimiere die Files mit gunzip.
dekomprimiere die Files mit bunzip2.
Erhöhe die Geschwätzigkeit.
23.2.2
gzip
Beschreibung
gzip [Optionen] Filenamen komprimiert oder dekomprimiert Files. gzip -d entspricht
den Befehlen gunzip und zcat.
Beispiele von Optionen
-d
-r
-v
-#
dekomprimiere Files
rekursives Verhalten.
Erhöhe die Geschwätzigkeit.
Komprimierungsregulierung; Werte zwischen 1 (schnellste,aber
nicht so starke Komprimierung) und 9 (stärkste, aber nicht sehr
schnelle Komprimierung).
23.2.3
gunzip
Beschreibung
gunzip [Optionen] Filenamen dekomprimiert Files mit folgenden Endungen .gz, -gz, .z,
-z, z oder .Z. Dateien welche mit gzip, zip, compress, oder pack erstellt wurden, können
mit gunzip dekomprimiert werden. Der Befehl zcat ist identisch zu gunzip -c.
157
Beispiele von Optionen
-l
-t
-c
-v
zeige statistische Werte zu jedem komprimierten File.
teste die Integrität der komprimierten Files.
schreibe den Output auf stdout.
Erhöhe die Geschwätzigkeit.
23.2.4
bzip2, bunzip2
Beschreibung
bzip2 [Optionen] Filenamen oder bunzip2 [Optionen] Filenamen komprimiert oder
dekomprimiert Dateien. Der von bzip2 verwendete Algorithmus ist zwar relativ langsam,
komprimiert aber deutlich besser als derjenige von gzip. bzip2, bunzip2 und bzcat sind
grundsätzlich das gleiche Programm, welches mit unterschiedlichem Verhalten aufgerufen
werden kann. Daher daher kann bzip2 -d auch dekomprimieren und bunzip2 -z komprimieren. Standard-Endungen sind: .bz2, .bz, .tbz2, oder .tbz.
Beispiele von Optionen
-d
-z
-c
-v
dekomprimiere die angegebenen Files.
komprimiere die angegebenen Files.
schreibe den Output auf stdout. (entspricht bzcat)
Erhöhe die Geschwätzigkeit.
23.3
Installationshilfe und Konfiguration
Auch für erfahrene Pinguine sind README und INSTALL Dateien nicht nur
Platzverschwendung!
Falls kein standard Makefile existiert, ist neben den Hilfedateien ein Konfigurationsskript
vorhanden, welches vor der Installation ausgeführt werden muss. Dieses Skript heisst
häufig configure. Beim Ausführen wird das aktuelle System überprüft und ein angepasstes
Makefile erzeugt.
23.3.1
Ausführen eins autoconf Konfigurationsskripts
Beschreibung
./configure [Optionen] führt das Konfigurationsskript aus. Das nach Beendigung des
Programms geschriebene configure.cache File enthält alle Konfigurationsdaten und sollte,
158
vor einem erneuten Start des Konfigurationsskripts bei veränderten Systemdaten, oder bei
Unsicherheit gelöscht werden.
häufig erscheinende Optionen
--help
zeigt die verfügbaren Konfigurations-Optionen an.
--prefix definiert den Installationspfad.
23.4
Kompilieren und Installieren
23.4.1
make
make kompiliert und installiert im Sourcecode vorliegende Programme. Das dazu bentigte
Makefile heisst meistens makefile oder MAKEFILE und enthält Anweisungen für make wie
die Sourcefiles zu kompilieren und die resultierenden binären Dateien, Manual Seiten und
andere Dateien zu installieren sind. Falls nur:
# make
aufgerufen wird, wird das Standardziel kompiliert. Meistens ist in jedem Directory, das
Sourcefiles enthält ein Makefile anzutreffen. Das Makefile im Hauptverzeichnis des Sourcecodes, sollte aber alle anderen ansprechen können und so den ganzen Code kompilieren.
Falls das Makefile kein Standardziel definiert hat, muss dies beim Aufruf mitgegeben werden.
# make
all
Ist das Programm ohne Fehler kompiliert, kann es installiert werden.
23.4.2
make install
Für eine korrekte Installation müssen nun alle Dateien aus dem Source Directory an ihre
entsprechenden Stellen des Systems kopiert werden. Dies sollte kein Problem sein, falls
sich der Programmierer und ihre Distribution an den Linux Filesystem Hierarchy Standard
(FHS) halten.
# make
install
Im Hauptverzeichnis des Sourcecodes ausgeführt, weist make an das im Makefile definierte
Install Ziel zu erfüllen. Dies bedeutet, dass die neu kreierten ausführbaren Source-Files
an die entsprechenden Stellen kopiert werden und dass Eigentümer und Berechtigungen
richtig gesetzt werden.
159
23.5
Mögliche Fehler
Häufige mögliche Fehlerquellen, welche nicht mit Fehlern des Programmierers zu tun haben
1. Fehlende Bibliotheken
2. Versionskonflikte
3. Source nicht für dieses System gedacht
Die ersten zwei Fehler lassen sich relativ leicht beheben durch installieren, oder updaten
der fehlenden, oder alten Bibliotheken und Programme. Der Grund für den dritten Fehler
wäre meistens im README oder einer Installationsanleitung am Ort des Downloads zu
finden....
160
Kapitel 24
Verwaltung von Shared Libraries
Auf einem Linuxsystem existieren zwei verschiedene Arten von ausführbaren Programmen
statisch verknüpfte Programme (statically linked) enthalten den gesamten für die
Ausführung notwendigen Code im Programm selber und benötigen keine zusätzlichen
Bibliotheksfunktionen. Sie weisen jedoch zwei grosse Nachteile auf, was an folgendem
Beispiel gezeigt werden soll. Enthält ein statisch verknüpftes Programm die Funktion
printf(), wird beim Kompilieren die Bibliotheksfunktion in den ausführbaren Code
kopiert. Es ist somit leicht ersichtlich, dass dies zu einem grossen Programmfile führt.
Ausserdem werden Standardfunktionen beim Ausführen mehrerer statisch verknüpfter Programme ebenfalls mehrmals in den Speicher geladen. Daher trifft man diese
Art Programm kaum mehr an.
dynamisch verknüpfte Programme (dynamically linked) greifen bei der Ausführung
auf Bibliotheksfunktionen (shared Libraries) zurück, welche sie zur Laufzeit dynamisch laden. Dies behebt die Nachteile der statisch verknüpften Programme. Falls
die benötigte Bibliothek beim Starten nicht gefunden werden kann, bricht das Programm mit einer Fehlermeldung ab. Dieses Problem kann jedoch durch einfaches
Nachinstallieren der Bibliothek behoben werden.
24.1
Abhängigkeiten von shared Libraries
Jedes dynamisch verknüpfte Programm benötigt für die Ausführung einige Bibliotheken.
Diese Bibliotheken werden shared Libraries genannt, da verschiedene Programme auf die
gleichen Funktionen zugreifen können. Bibliotheken welche von einem Programm gebraucht werden, lassen sich mit ldd auflisten.
161
24.1.1
ldd
Beschreibung
ldd Programme listet für jedes der angegebenen Programme die benötigten Bibliotheken
und deren erwarteter Ort auf.
Beispiele
istus@zagyg:~\$ ldd /bin/se*
/bin/sed:
libc.so.6 => /lib/libc.so.6 (0x40023000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/bin/setpci:
libpci.so.1 => /usr/lib/libpci.so.1 (0x40023000)
libc.so.6 => /lib/libc.so.6 (0x4002a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/bin/setserial:
libc.so.6 => /lib/libc.so.6 (0x40023000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
24.2
Dynamic Loader
Der sogenannte dynamic Loader sucht zur Laufzeit des Programms nach allfälligen Verknüpfungen zu Systembibliotheken und versucht die Entsprechenden zu laden. Falls dies
nicht gelingt, kann das Programm nicht ausgeführt werden. Der dynamic Loader ist die
lib/ld-linux.so.2 Bibliothek, welche beim obigen Beispiel bei jedem Befehl erscheint.
Aufgrund der zwei folgenden Dateien weiss der dynamic Loader wo er die zu suchenden
Bibliotheken findet.
/etc/ld.so.conf
/etc/ld.so.cache
24.2.1
ld.so.conf
Die Datei ld.so.conf enthält eine Liste aller Verzeichnisse in welchen der Loader nach Bibliotheken suchen soll. Die Verzeichnisse /lib und /usr/lib erscheinen nicht in dieser
Liste, da sie schon automatisch eingeschlossen sind. Diese Datei knnte wie folgt aussehen:
istus@zagyg:~\$ cat /etc/ld.so.conf
162
/usr/X11R6/lib
/usr/local/lib
24.2.2
ld.so.cache
ld.so.cache ist ein binäres File, welches einen schnellen Lesezugriff erlaubt und in dem
die Pfade der ld.so.conf Datei gespeichert sind. Um Änderungen im Konfigurationsfile,
durch konvertieren ins Cachefile wirksam werden zu lassen muss zuerst ldconfig ausgeführt werden.
24.2.3
ldconfig
Beschreibung
ldconfig [Optionen] Bibliotheks Directory Aktualisiert das ld.so.cache File mit den
Bibliotheken in den Pfaden /lib, /usr/lib und den Pfaden aus dem ld.so.conf File.
häufig verwendete Optionen
-p zeigt den Inhalt der Cache Datei an
-v geschwätziger Modus
Beispiele
Um zu kontrollieren ob eine spezielle Bibliothek eingetragen ist kann folgender Befehl
verwendet werden:
zagyg:/home/istus# ldconfig -p | grep printf
libasprintf.so.0 (libc6) => /usr/lib/libasprintf.so.0
libasprintf.so (libc6) => /usr/lib/libasprintf.so
Eine komplette Liste empfiehlt sich in den less zu pipen:
zagyg:/home/istus# ldconfig -p | less
650 libs found in cache ‘/etc/ld.so.cache’
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libz.so.1 (libc6) => /usr/lib/libz.so.1
libz.so (libc6) => /usr/lib/libz.so
libyafxplayer.so.0 (libc6) => /usr/lib/libyafxplayer.so.0
libyafcore.so.0 (libc6) => /usr/lib/libyafcore.so.0
libx11globalcomm.so.0 (libc6) => /usr/lib/libx11globalcomm.so.0
.....................................
163
24.2.4
LD LIBRARY PATH
Bevor der dynamic Loader die Datei ld.so.cache liest, überprüft er die Pfade in der Shell
Variablen LD LIBRARY PATH, sofern diese existiert und darin auch Pfade angegeben sind.
Dies kann interessant sein, wenn Applikationen getestet werden sollen, welche andere Library Versionen benutzen, als die die auf dem laufenden System verwendet werden.
Die Variable kann durch folgenden Befehl gesetzt und exportiert werden:
# export LD LIBRARY PATH=’’/usr/lib/old:/opt/lib’’
Die einzelnen Pfadangaben werden durch Doppelpunkte getrennt.
164
Kapitel 25
Vor- / Nachteile des
Paketmanagements
Nebst der Möglichkeit Programme von Hand zu kompilieren und installieren, enthält jede
Linux Distribution eine Art des Paketmanagements. Dieses unterstützt den Anwender
bei der Installation, dem Upgrade und der Deinstallation von Software und bietet klare
Vorteile gegenüber dem manuellen Handling.
Dies sind:
ˆ Vereinfachung der De- / Installation
ˆ Vereinfachung des Upgrades von installierten Paketen
ˆ Schutz der Konfigurationsfiles
ˆ Gute Übersicht über installierte Programme
Selbstverstndlich lassen sich auch gewisse Nachteile aufzählen, welche aber individuell behebbar sind:
ˆ Für ein spezifisches System kompilierte Software läuft schneller (Pakete können auch
systemspezifisch optimiert werden)
ˆ Paketabhängigkeiten auflösen ist äusserst mühsam (Paketmanager können Abhängigkeiten automatisch auflösen, falls gewünscht)
ˆ Eine fehlerhafte Paket Datenbank kann ein System unpflegbar machen (Diese Tabellen können anhand anderer Files wieder hergestellt werden)
ˆ Es ist mühsam Pakete zu kreieren (Was der Zeitgewinn beim updaten und löschen
wieder mehr als wettmacht)
165
Kapitel 26
Verwendung des Debian
Paketmanagements
Das Debian Paketmanagement ist aus mehreren Tools aufgebaut. dpkg ist ein Kommandozeilen Tool, welches auf bereits herunter geladene .deb Pakete angewendet werden kann.
apt-get wird ebenfalls in der Shell ausgeführt, arbeitet mit den Paketnamen, und bezieht
sie von einem vordefinierten Ort (CD-ROM, FTP, HTTP). dselect bietet ein Menüinterface, in welchem Pakete zum Installieren oder Löschen markiert werden können. Mit dem
alien Tool schliesslich können auch Red Hat Pakete im rpm Format installiert werden.
26.1
Paketaufbau
Jedes Debian Paket enthält Programm- und Konfigurationsfiles, Dokumentation und aufgelistete Abhängigkeiten von anderen Paketen. Die Nomenklatur folgt den unten aufgeführten Richtlinien:
Paketname Jedes Paket hat einen kurzen und den Inhalt möglichst gut zu beschreibenden
Namen. Falls mehrere Wörter gebraucht werden, sind die durch einen Bindestrich
verbunden. (z.B. kernel-source, kdessh, binutils)
Versions-Nummer An den Paketnamen wird durch einen Unterstrich die VersionsNummer angehängt. Die entspricht meistens der Version der enthaltenen Programme
und hat kein einheitliches Format. (z.B. 2.4.21-5, 2.2.2-4.1, 2.14.90.0.6)
Paketrelease-Nummer Falls in der Versionsnummer eine durch einen Bindestrich angehängte Zahl erscheint ist dies die Paketrelease -Nummer. So z.B. das -5, oder -4.1
im Beispiel oben.
Dateiendung Alle Debian Pakete haben die .deb Endung
166
Ein Debian Paket besteht aus einem ar-Archiv, das wiederum zwei komprimierte tarArchive und eine Versionsdatei beinhaltet. Das erste tar-Archiv (data.tar.gz) enthält die
zu installierenden Dateien, das zweite (control.tar.gz) enthält die Metainformationen über
das Paket, die Scripts, die zum Installieren und Deinstallieren benötigt werden sowie eine
Prüfsumme.
Jedes Debian-Paket enthält vier Scripte, je eines das vor und nach der Installation bzw.
vor und nach der Deinstallation abgearbeitet wird.
Wird ein Debian-Paket installiert, so werden die Informationen über dieses installierte
Paket in mehrere Dateien im Verzeichnis /var/lib/dpkg abgelegt, so dass jederzeit eine
Überprüfung der bereits installierten Pakete und Dateien stattfinden kann. Die Informationen werden folgendermassen aufgeteilt:
ˆ In der Datei /var/lib/dpkg/available werden die Paketinformationen aller zur
Verfügung stehender (installierbarer) Pakete abgelegt.
ˆ In der Datei /var/lib/dpkg/status werden die Informationen über den Status der
Installation abgelegt, so dass unterschieden werden kann zwischen korrekt oder nur
teilweise installierten Paketen.
ˆ Im Verzeichnis /var/lib/dpkg/info liegen zu jedem installierten Paket die vier Scripte
(*.preinst, *.postinst, *.prerm, *.postrm), eine Liste aller enthaltener Dateien (*.list),
die md5-Prüfsummendatei (*.md5sums) und eventuell noch andere Informationen wie
die zur Verfügung gestellten Libraries (*.shlibs).
Mit Hilfe dieser Informationen sind sowohl Installation, als auch Deinstallation von Paketen
sehr sicher und umfassend möglich. Man kann das Verzeichnis /var/lib/dpkg also als
Systemdatenbank der installierten Pakete betrachten. In der Regel sind keine manuellen
Zugriffe auf dieses Verzeichnis notwendig, alle Zugriffe werden mit den Hilfsprogrammen
erledigt, die im Folgenden näher besprochen werden.
26.2
apt - Advanced Package Tool
Das apt-Tool arbeitet nicht direkt mit .deb Dateien, wie dies dpkg tut, sondern apt-get
unterhält eine Datenbank, in welcher Paketinformationen gespeichert sind. Diese werden
dann zum automatischen upgrade genutzt, wenn neuere Pakete vom definierten Bezugsort
vorhanden sind.
Zur Beherrschung des apt-Tools sind folgende Befehle und Files wichtig:
ˆ apt-cache
ˆ apt-get
167
ˆ apt.conf.d
ˆ sources.list
26.2.1
apt.conf.d
Im apt.conf.d Verzeichnis sind Einstellungen für apt-get gespeichert. Beispiel apt.conf.d
Verzeichnis
istus@zagyg:/etc/apt/apt.conf.d\$
debmix (enthält)
APT::Default-Release "testing";
debconf (enthält)
DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt || true";};
26.2.2
sources.list
Die Datei sources.list enthält eine Liste der Bezugsquellen für Pakete. Beispiel:
#
# DEBIAN Base
#
deb http://sunsite.cnlab-switch.ch/ftp/mirror/debian/ testing
main contrib non-free
deb http://sunsite.cnlab-switch.ch/ftp/mirror/debian/ unstable
main contrib non-free
deb-src http://sunsite.cnlab-switch.ch/ftp/mirror/debian/ sid
main contrib non-free
# Non US
deb http://sunsite.cnlab-switch.ch/ftp/mirror/debian-non-US testing/non-US
main contrib non-free
deb http://sunsite.cnlab-switch.ch/ftp/mirror/debian-non-US unstable/non-US
main contrib non-free
deb-src http://sunsite.cnlab-switch.ch/ftp/mirror/debian-non-US woody/non-US
main contrib non-free
# Security Updates
deb ftp://security.debian.org/debian-security testing/updates
168
main contrib non-free
deb ftp://security.debian.org/debian-non-US testing/non-US
main contrib non-free
deb ftp://security.debian.org/debian-non-US sid/non-US main contrib non-free
26.2.3
apt-get
Beschreibung
apt-get [Optionen] [Befehl] [Paketname] Ist das Kommandozeilen Tool für das Paketmanagement
häufig verwendete Optionen und Befehle
lade Dateien herunter ohne sie zu installieren.
gibt an von welcher Distribution die Pakete geholt werden sollen.
(apt-get -t unstable ...)
-b
kompiliere Sourcepakete nach dem Download.
check
aktualisiert den Paket-Cache und schaut nach fehlerhaften
Abhängigkeiten.
update
aktualisiert die Liste der verfügbaren Pakete.
upgrade installiert die neusten Versionen aller auf dem System installierten
Pakete.
install installiert das angegebene Paket samt abhängigen anderen Paketen.
remove
deinstalliert das angegebene Paket.
-d
-t
26.2.4
apt-cache
Beschreibung
apt-cache [Optionen] [Befehl] [Paketname] Manipuliert die im Cache gespeicherten
Daten.
häufig verwendete apt-cache Befehle
apt-cache showpkg zeigt Informationen zu den angegebenen Paketnamen.
zagyg:/home/istus# apt-cache showpkg kdessh
Package: kdessh
Versions:
169
4:2.2.2-4.1(/var/lib/dpkg/status)
Reverse Depends:
kde,kdessh
Dependencies:
4:2.2.2-4.1 - kdelibs3 (2 4:2.2.2-1) libc6 (2 2.2.4-4) libjpeg62 (0 (null))
libpng2 (2 1.0.12) libqt2 (2 3:2.3.1-1) libstdc++2.10-glibc2.2
(2 1:2.95.4-0.010810) xlibs (4 4.1.0) zlib1g (2 1:1.1.4) ssh (0 (null))
kdebase-libs (0 (null))
Provides:
4:2.2.2-4.1 Reverse Provides:
apt-cache unmet zeigt eine Liste der nicht erfüllten Abhängigkeiten an.
Package d4x version 2.4.1-1 has an unmet dep:
Suggests: d4x-gnome-applet
Package libglide2 version 2002.04.10-4 has an unmet dep:
Suggests: device3dfx-module
Package libglide3 version 2002.04.10-4 has an unmet dep:
Suggests: device3dfx-module
apt-cache search regexp sucht im Cache nach passenden Paketen.
zagyg:/home/istus# apt-cache search gcc-3.0
gcc-3.0-base - The GNU Compiler Collection (base package)
gcc-3.0 - The GNU C compiler.
26.3
dpkg- Debian Paketmanager
dpkg ist ein medium-level Tool zur Installation, Kompilation, Deinstallation und zur Handhabung von Debian Paketen. Paketinformationen werden im Verzeichnis /var/lib/dpkg
gespeichert. Interessant sind vor allem folgende zwei Dateien:
available Enthält die Liste aller verfügbaren Pakete.
status Enthält Statusinformationen, wie installiert, zum Löschen vorgesehen usw.
Diese Dateien müssen jedoch nicht von Hand geändert werden, da sie automatisch von
dpkg, dselect oder apt-get geändert werden.
170
26.3.1
dpkg
Beschreibung
dpkg [Optionen] Aktion führt die angegebenen Aktionen mit .deb Dateien aus
häufig verwendete Optionen
Vor jedem der besprochenen Befehle können verschiedene Optionen gesetzt werden,
die den Ablauf des Befehls modifizieren können. Diese Optionen beziehen sich z.B.
auf den Umgang mit Abhängigkeiten, oder ab wievielen Fehlern sich dpkg weigert,
weiterzuarbeiten. Diese Optionen können entweder direkt an der Kommandozeile
eingegeben werden, oder in die Datei /etc/dpkg/dpkg.cfg eingetragen werden. In letzterem Fall, werden die Optionen für jeden dpkg Befehl angewandt. Wichtige Optionen sind:
-E | --skip-same-version installiere das Paket nicht, falls bereits die gleiche Version installiert
ist. (--skip-same-version)
-G | --refuse-downgrade
installiere das Paket nicht, falls bereits eine neuere Version installiert ist. (--refuse-downgrade)
-R | --recursive
behandle alle *.deb Files rekursiv im angegebenen Verzeichnis und
dessen Unterverzeichnisse.
häufig verwendete Aktionen
installiere die angegebenen Pakete. Dies beinhaltet das Entfernen
alter Pakete und die Konfiguration der Neuen.
-r | --remove
entferne die angegebenen Pakete. Konfigurationsfile bleiben aber
bestehen.
-P | --purge
entferne die angegebenen Pakete komplett, inklusive der Konfigurationsfiles.
--unpack
entpacke die angegebenen Pakete, konfiguriere sie aber nicht.
--configure
rekonfiguriere die angegebenen entpackten Pakete.
--update-avail
erneuere die Liste der verfügbaren Pakete.
-p | --print-avail zeige die verfügbaren Pakete an.
-l | --list
zeige die dem Suchmuster entsprechenden Pakete an.
-s | --status
zeige die Statusinformation des gegebenen Pakets an.
-L | --listfiles
zeige die Files an, welche das gegebene Paket installiert hat.
-S | --search
Zeige das Paket an, zu dem eine Datei gehört.
-i | --install
26.4
dpkg-reconfigure
dpkg-reconfigure PAKETNAME ermöglicht das umkonfigurieren von installierten Paketen.
171
26.5
dselect
dselect ist ein simples Frontend-Tool für das Debian Paketmanagement dpkg. Es lassen
sich Menügeführt Pakete zur Installation, Deinstallation und Konfiguration auswählen. Die
Liste der verfügaberen Pakete kann in dselect ebenfalls erneuert werden. Paket-Aktionen
werden mit dpkg ausgeführt.
Debian ‘dselect’ package handling frontend.
* 0.
1.
2.
3.
4.
5.
6.
[A]ccess
[U]pdate
[S]elect
[I]nstall
[C]onfig
[R]emove
[Q]uit
26.6
Choose the access method to use.
Update list of available packages, if possible.
Request which packages you want on your system.
Install and upgrade wanted packages.
Configure any packages that are unconfigured.
Remove unwanted software.
Quit dselect.
Installation von Nicht-Debian Paketen
Für die Konversion und Installation von Nicht-Debian Paketen existiert der Befehl alien.
Pakete welche erkannt werden sind unter anderem Red Hat .rpm, Slackware .tgz, und
normale .tar.gz Dateien. Falls ein RPM-Paket konvertiert werden soll, muss rpm ebenfalls
installiert sein.
26.6.1
alien
Beschreibung
alien [Optionen] Datei erzeugt als Ausgabe ein Paket in .deb Format.
häufig verwendete Optionen
-i installiert automatisch das erzeugte Paket und entfernt das konvertierte Paketfile.
172
Kapitel 27
Verwendung des Red Hat Package
Managers (RPM)
RPM hat sich seit der Einführung 1995 zum de facto Standard für das Open Source Paketmanagement entwickelt. Es sind viele GUI und Webbasierte Tools vorhanden, welche das
Handling erleichtern. Sie basieren alle aber auf dem Kommandozeileninterface, für welches
unten die häufigsten Kommandos erklärt werden. Wie auch bei Debian führt RPM eine
Datenbank mit den verfügbaren Paketen und ihrem aktuellen Status. Die Nomenklatur
folgt den unten aufgeführten Richtlinien.
Paketname Jedes Paket hat einen kurzen und den Inhalt möglichst gut zu beschreibenden
Namen. Falls mehrere Wörter gebraucht werden, sind die durch einen Bindestrich
verbunden. (z.B. kernel-source, kdessh, binutils)
Versions-Nummer An den Paketnamen wird durch einen Bindestrich die VersionsNummer angehängt. Die entspricht meistens der Version der enthaltenen Programme
und hat kein einheitliches Format. (z.B. 2.4.21-5, 2.14.90.0.6)
Paketrelease-Nummer Falls in der Versionsnummer eine durch einen Bindestrich angehängte Zahl erscheint ist dies die Paketrelease -Nummer. So z.B. das -5, im Beispiel
oben.
Architektur Die durch einen Punkt abgetrennte Information .i386, .sparc bezieht sich
auf die Systemarchitektur für welche ein Programm kompiliert wurde, wobei i386
alle Intel80386 und weiterführende, sowie kompatible Modelle meint.
Dateiendung Alle RPM Dateien enden mit .rpm
173
27.1
rpm
Die beim Aufruf des rpm Befehls verwendeten Optionen hängen vom Modus ab, und werden
auch so sortiert aufgelistet. Die möglichen Modi sind:
rpm -i
rpm -U
rpm -e
rpm -q
rpm -V
rpm -b | -t
rpm --addsign
rpm --rebuild
Neu: rpmrebuild
rpm --checksig
27.1.1
Installationsmodus (auch rpm --install)
Upgrademodus (auch rpm --upgrade)
Deinstallationsmodus (auch rpm --uninstall)
Abfragemodus (auch rpm --query)
Verifikationsmodus
Erstellmodus
Signieren eines Pakets
erneutes Erstellen eines Pakets
Neue Variante von rpm --rebuild1
Überprüfen der Signatur
Installation/Upgrade Modus
Beschreibung
rpm -i|--install [Installations-Optionen] Paket installiert ein neues Paket rpm
-U|--upgrade [Installations-Optionen] Paket Aktualisiert ein bereits installiertes
Paket auf eine neuere Version.
häufig verwendete Optionen
ermöglicht das erneute Installieren bereits vorhandener Pakete,
oder das Ersetzen eines Pakets mit einer älteren Version.
-h
zeigt den Arbeitsfortschritt mit # an.
--nobuild installiere das Paket nicht wirklich, zeige nur mögliche Fehler und
Konflikte.
--nodeps
überprüfe die Abhängigkeiten vor der Installation nicht.
--force
27.1.2
Deinstallationsmodus
Beschreibung
rpm -e|--erase Paketname entfernt die angegebenen Pakete
1
Dank an Herrn Florian Schrag für diesen Hinweis.
174
häufig verwendete Optionen
deinstalliere das Paket nicht wirklich, zeige nur mögliche Fehler und
Konflikte.
--nodeps überprüfe die Abhängigkeiten vor der Deinstallation nicht.
--test
27.1.3
Abfragemodus
Beschreibung
rpm -q|--query [Select-Optionen] [Query-Optionen] Paketinformationen abfragen
häufig verwendete Optionen
liste alle installierten Pakete auf.
Zeige das Paket, welches eine spezifische Datei enthält.
wähle die gegebene Paketdatei für die Anfrage.
zeige Informationen zu einem gegebenen Paket, oder mit -p zu einer
Paketdatei.
-l liste alle in einem Paket, oder einer Paketdatei, enthaltenen Files
auf.
-a
-f
-p
-i
27.1.4
Verifikationsmodus
Beschreibung
rpm -V|--verify [Select-Optionen] Dateiname vergleicht die Eigenschaften der angegebenen Datei mit den Angaben in der RPM Datenbank
Ausgabe des Befehls
Beispiel:
# rpm -V xsnow
S.5....T /usr/X11R6/bin/xsnow
missing /usr/X11R6/man/man1/xsnow.1x.gz
Die Resultate der überprüften Dateien werden mit einem 8-stelligen Code angegeben. Dabei stellen Punkte Kriterien dar, welche erfüllt sind und Buchstaben oder
175
Zahlen,
Code
5
S
L
T
D
U
G
M
?
welche Kriterien nicht erfüllt wurden. Detailliert sieht dies wie folgt aus:
Beschreibung
die MD5 Checksumme ist unterschiedlich
die Dateigrösse hat geändert
Symlink Attribute haben geändert
Die Änderungszeit der Datei hat geändert
Gerätedatei wurde geändert
User/Owner der Datei wurden geändert
Das Gruppenattribut der Datei wurde geändert
Der Dateimodus wurde geändert
unbekanntes Resultat
27.1.5
übrige Modi
Erstellen,Rebuild
rpm -bSTAGE|-tSTAGE [Build-Optionen] Datei ermöglicht das Erstellen eines Pakets.
-b oder -t geben an ob ein Spezifikationsfile vorliegt, oder bei -t, in einem tar File gesucht
werden muss. STAGE, was direkt auf den ersten Buchstaben folgt, gibt an welche Stufe
beim Erstellen und Packen ausgeführt werden muss.
rpm --rebuild Sourcepaket installiert das angegebene Sourcepaket, und generiert ein
neues Binary-Paket.
Signieren
RPM Pakete können mit PGP Signaturen versehen werden. Die zum signieren und überprüfen der Signatur zuständigen Befehle lauten wie folgt:
rpm --addsign Signieren eines Pakets
rpm --checksig Überprüfen der PGP Signatur eines Paketfiles
176
Teil V
101 - Hardware und
Systemarchitektur
177
Kapitel 28
Hardwaregrundlagen
(PB) [9] In diesem Teil geht es darum, verschiedene Einstellungen vorzunehmen, die als
Grundvoraussetzung gelten, damit Linux überhaupt auf einem Computer arbeiten kann,
beziehungsweise damit die angeschlossene Hardware angesprochen werden kann.
In diesem Zusammenhang sind bestimmte Grundlagenkenntnisse von hardwarespezifischen
Einstellungen notwendig, die sich sowohl auf die Einstellungen der Erweiterungskarten beziehen, als auch auf die Möglichkeiten diese Einstellungen unter Linux zu überprüfen. Diese
Grundlagen werden in diesem Kapitel vorbeitet und in den folgenden Kapiteln, welchen
den Zielen der LPIC Prüfung entsprechen, verwendet.
28.1
Hardwareparameter
Jede an einem Computer installierte Hardwarekomponente benötigt bestimmte Parameter,
damit das Betriebssystem darauf zugreifen kann. Diese Parameter sind auf die verschiedensten Art und Weisen einstellbar, sowohl aus der Sicht des Betriebssystem, als auch aus
der Sicht der Hardware selbst. Moderne Erweiterungskarten die den PCI -Bus nutzen,
kümmern sich selbst um die Einstellungen dieser Parameter, ältere Erweiterungskarten für
den ISA-Bus müssen von Hand konfiguriert werden.
Damit unter Linux Hardwareerweiterungen korrekt installiert werden können, ist es notwendig ein Basiswissen über die grundlegende Funktion der Erweiterungen zu besitzen.
Diese Grundlageninformation soll hier zusammenfassend vermittelt werden. Im Rahmen
dieser Ausführungen ist es natürlich nicht möglich, einen umfassenden Überblick über die
verschiedenen Mechanismen der Erweiterungskarten abzuhalten. Viel mehr soll versucht
werden, sich auf die wesentlichen Grundlagen zu beschränken. Das gezeigte bezieht sich
auf die Architektur von IBM-kompatiblen Rechnern, die heute den sogenannten Industriestandard bestimmen. Andere Architekturen unterscheiden sich in Kleinigkeiten von den
hier dargestellten Mechanismen.
178
28.1.1
Funktionsweise des Mainboards
Das Herz jedes Computers ist der Prozessor. Er verarbeitet die Befehle, die er aus Programmen erhält. Programme sind in diesem Zusammenhang natürlich nicht nur die Anwenderprogramme, sondern auch das Betriebssystem und die von ihm verwendeten Gerätetreiber
sowie das BIOS (Basic Input Output System), die Sammlung grundlegender Ein- und Ausgaberoutinen. Der Prozessor muss also in der Lage sein, sowohl die jeweiligen Befehle zu
verstehen, als auch auf bestimmte Hardware zuzugreifen. Für beide dieser Handlungen
greift er auf sogenannte Bussysteme zurück. Dabei handelt es sich vereinfacht gesagt um
elektrische Verbindungen zwischen dem Prozessor und anderen Teilen des Computers.
Der wichtigste Teil des Computers - neben dem Prozessor - ist der Arbeitsspeicher. Er
besteht aus einer grossen Menge von Speicherbausteinen, die Daten während des laufenden
Betriebs aufnehmen und speichern können. Der Zugriff auf diesen Arbeitsspeicher läuft
wiederum über ein Bussystem. Damit der Prozessor genau bestimmen kann, auf welchen
Teil des Speichers er zugreifen will, benötigt er ein Adressierungsschema. Jede Speicherzelle
hat also eine Adresse. Will der Prozessor jetzt etwas in eine bestimmte Speicherzelle
schreiben oder aus ihr lesen, so muss er zunächst einmal die Adresse dieser Speicherzelle auf
den Adressbus schreiben. Dadurch öffnet sich ein Kanal vom Prozessor zu der angegebenen
Speicherzelle auf dem Datenbus. Erst jetzt können Daten auf diesem Weg übertragen
werden.
28.1.2
Hardwareadressen
Aus der Sicht des Prozessors sind alle Zugriffe auf die Hardware wie Speicherzugriffe zu
behandeln. Das bedeutet, dass auch die anderen Hardwarekomponenten des Computers
entsprechende Adressen besitzen müssen. Will der Prozessor etwa ein Byte auf die serielle
Schnittstelle schreiben, so ist das aus seiner Sicht kein Unterschied zu einem Schreibvorgang in den Speicher. Deshalb benötigt er die genaue Adresse der seriellen Schnittstelle (die
sogenannte IO-Adresse). Er kann diese Adresse auf den Adressbus legen, dadurch öffnet
sich ein Kanal des Datenbusses vom Prozessor zu dem Baustein, der die serielle Schnittstelle steuert. Der Prozessor schreibt das Byte jetzt auf den Datenbus, auf der anderen
Seite empfängt das entsprechende Bauteil jetzt das Byte und übernimmt die tatsächliche
Ausgabe auf die Schnittstelle.
Diese Adresse einer Hardwarekomponentne ist sozusagen der Schlüssel für die Kommunikationsmöglichkeit zwischen Prozessor und Hardware. Es ist zwingend erforderlich, dass der
Prozessor die richtige Adresse einer Hardware kennt, die er benutzen soll. Bei zusätzlich
installierter Hardware (Erweiterungskarten) ist diese Adresse meist einstellbar, so dass es
zu keinen Doppelbelegungen von Adressen kommen kann, was zwangsläufig zu Fehlfunktionen führen würde. Eine wichtige Aufgabe bei der Installation neuer Hardware ist es
also, dafür zu sorgen, dass neue Hardware eine eindeutige Adresse zugewiesen bekommt,
und der Prozessor diese Adresse kennt.
179
28.1.3
Das Interrupt-System
In einem Computersystem arbeitet der (oder die) Prozessor(en) die einzelnen Programmanweisungen ab, die aus dem Speicher gelesen werden und die dann Ein- oder Ausgaben
auf Adressen vornehmen können. Nun ist es aber notwendig, dass die Abarbeitung dieser
Programmanweisungen zu bestimmten Gelegenheiten unterbrochen werden kann um eine
andere Aufgabe auszuführen. Diese Unterbrechnungen werden Interrupts genannt. Sowohl
das BIOS als auch das Betriebssystem stellen jeweils viele hundert solcher Unterbrechungen zur Verfügung. Alle dieser Interrupts sind in einer sogenannten Interrupt-Tabelle
zusammengefasst.
Wenn jetzt eine bestimmte Hardware eine Eingabe an den Prozessor schicken will, so muss
sie den Prozessor benachrichtigen, dass auf ihrer IO-Adresse neue Daten liegen, die zu lesen
sind. Drückt der Anwender eines Computers beispielsweise eine Taste auf der Tastatur,
so liegt der Wert dieser Taste jetzt auf der IO-Adresse der Tastatur. Nur leider weiss der
Prozessor das noch nicht und hat somit keinerlei Veranlassung, ein Byte von dieser Adresse
zu lesen.
Aus diesem Grund muss jedes Gerät, das Eingaben an den Computer zulässt die Möglichkeit haben, eine Unterbrechungsanforderung (Interrupt-Request) an den Prozessor zu
schicken. Wenn der Prozessor eine solche Anforderung erhält, unterbricht er seine Arbeit
und führt das zu dieser Anforderung passenden Programm (Interrupt-Handler ) aus.
Wenn eine Hardware installiert wird, die nicht nur Ausgaben, sondern auch Eingaben
an den Prozessor ermöglicht, dann muss dieser Hardware ein sogenannter Interrupt Request Channel (IRQ) zugewiesen werden. Einige IRQs sind bereits standardmässig von
Systemhardware belegt, andere stehen für Erweiterungen zur Verfügung. Die folgende Tabelle zeigt die gängigste Belegung eines Standard-Systems:
180
IRQ
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Belegung
Timerbaustein
Tastatur
Kaskadierende Verbindung mit zweitem IRQ-Controller (dort 9)
zweite und vierte serielle Schnittstelle
erste und dritte serielle Schnittstelle
Frei (früher zweite parallele Schnittstelle)
Diskettenlaufwerk
Frei (früher erste parallele Schnittstelle)
RealTimeClock
Frei
Frei (Diskettenlaufwerk)
Frei
Frei (meist PS/2-Maus)
Frei
Erster IDE -Controller
Zweiter IDE -Controller
Wenn zwei Geräte auf ein- und demselben IRQ liegen, so ist die Gefahr eines Konfliktes
sehr gross. COM2 und COM4 liegen zum Beispiel standardmässig auf dem IRQ 3. Wird
also versucht mit einem Modem an COM4 und einer Maus an COM2 gleichzeitig zu arbeiten, kann dies nicht richtig funktionieren. Moderne Rechner sind in der Lage sich IRQs
zwischen mehreren Erweiterungen zu teilen (IRQ-sharing).
28.1.4
Das DMA-System
Unter dem Begriff DMA versteht man den direkten Speicherzugriff (Direct Memory Access)
von Hardware auf den Arbeitsspeicher, ohne den Umweg über den Prozessor. Hardware, die
schnellen und häufigen Zugriff auf den Arbeitsspeicher benötigt, kann über die Verwendung
von DMA den Prozessor merklich entlasten.
Um dies zu ermöglichen sind sogenannte DMA-Channels vorgesehen, von denen ein
Standard-Rechner acht Stück besitzt. Einer dieser acht ist allerdings stets belegt (DMA4 ).
Auch für die DMA-Channels gilt, dass jeder Kanal nur von einer Hardwareinstanz belegt
sein darf, da es sonst zu Konflikten kommt.
28.1.5
Einstellmöglichkeiten der Hardwareparameter
Die drei Hardwareparameter IO-Adresse, IRQ und eventuell DMA-Kanal müssen für jede
neu installierte Hardware eingestellt werden. Wichtig ist dabei, dass grundsätzlich jede
Hardware eine IO-Adresse benötigt, Hardware, die auch Eingaben zulässt zudem einen
IRQ braucht und Hardware, die über direkten Speicherzugriff verfügt auch noch einen
181
DMA-Kanal benötigt. Die Parameter müssen sowohl hardwareseitig eingestellt werden, als
auch softwareseitig. Nur wenn diese beiden Einstellungen übereinstimmen, ist es möglich
mit der Hardware zu arbeiten.
Die hardwareseitige Einstellung wird auf unterschiedliche Art und Weise vorgenommen, je
nach Generation der verwendeter Erweiterungskarte. Im folgenden werden die drei üblichen
Verfahren kurz aufgezeitg:
Feste Hardware auf dem Mainboard Fest auf dem Mainboard integrierte Hardware
wie zum Beispiel serielle Schnittstellen bekommen ihre Einstellungen über das BIOS -Setup Programm. Dort kann eingestellt werden, welche IO-Adressen und welche
IRQs diese Schnittstellen benutzen. In der Regel sind hier zwei oder drei feste Einstellungsmöglichkeiten vorgegeben.
Alte ISA-Erweiterungskarten Auf sehr alten Karten müssen sämtliche Einstellungen
hardwaremässig vorgenommen werden. Das heisst auf diesen Karten müssen die
Adressen mit Jumpern oder Dip-Schaltern eingestellt werden. In der Regel ist das
nur mit einem passenden Handbuch möglich, es sei denn die Karten besitzen einen
Aufdruck, der die jeweiligen Einstellungen erklärt.
Moderne ISA-Erweiterungskarten Etwas modernere Karten besitzen kleine Festspeicher (EEPROMS, Flash-EPROMS) die softwaremässig eingestellt werden können.
Dazu benötigt man ein spezielles kleines Programm, das der Hersteller solcher Karten mitliefert. Meist ist dieses Programm auf einer Diskette beigelegt und muss
unter DOS gestartet werden. Es sind dann alle Einstellungen (IO-Adressen, IRQs
und DMA-Kanäle) softwaremässig einstellbar.
Die genannten drei Methoden bedingen, dass auch das Betriebssystem und der Prozessor
erfahren, welche Einstellungen getroffen wurden. Desshalb muss die getätigte Einstellung
auch noch im Betriebsystem nachgeführt werden. Modernere Systeme versuchen den Einbau von Erweiterungskarten dahingehend zu vereinfachen, dass die Karte und das Betriebssystem sich gegenseitig einigen, welche Parameter sie benutzen. In diesem Zusammenhang
ist häufig das Schlagwort Plug And Play. Folgende zwei Varianten gibt es dabei:
ISA Plug And Play Karten Diese Karten haben genügend Eigenintelligenz, um sich
mit dem System die notwendigen Parameter auszutauschen, wenn das verwendete
Betriebssystem Plug And Play-fähig ist. Im Kapitel 32.1 wird besprochen, wie diese
Art von Karten unter Linux eingbunden werden können.
PCI Erweiterungskarten PCI -Karten sind die modernen Erweiterungskarten, die in
den letzten Jahren die ISA-Karten völlig vom Markt gedrängt haben. Der PCI -Bus
ist ein intelligenter Bus, der bestimmte Mindestanforderungen an seine Erweiterungskarten stellt. PCI -Karten können grundsätzlich ihre Parameter mit dem Betriebssystem selbständig aushandeln, so dass hier keine manuellen Einstellungen mehr
notwendig sind.
182
28.1.6
Erweiterungskarten mit Speicher
Manche Erweiterungskarten besitzen einen eigenen Speicher auf der Karte, entweder einen
wirklichen Arbeitsspeicher, wie etwa der Bildschirmspeicher auf der Grafikkarte oder einen
EPROM mit eigenem BIOS, wie zum Beispiel SCSI -Hostadapter. Auch diese Speicherbereiche haben eine Anfangsadresse, die dem System bekannt sein muss, damit es auf
den entsprechenden Speicher zugreifen kann. Man spricht in diesem Zusammenhang von
Memory-Base oder kurz MemBase (Basisadresse des Kartenspeichers).
28.2
Das /proc-Verzeichnis
Das /proc-Verzeichnis ist kein wirkliches Dateisystem, sondern eine Schnittstelle zum Kernel. Die Dateien, die in diesem Verzeichnis liegen, benutzen keinen Speicherplatz auf der
Platte, sind aber trotzdem lesbar und in manchen Fällen auch beschreibbar.
Seinen Namen trägt dieses Verzeichnis daher, dass es für jeden laufenden Prozess ein Unterverzeichnis bereithält, welches Informationen über diesen Prozess zur Verfügung stellt.
Das Unterverzeichnis trägt als Namen die ProzessID (PID) des jeweiligen Prozesses. Es
enthält unter anderem folgende Dateien:
cmdline Die Kommandozeile, mit der der Prozess gestartet wurde, mit allen verwendeten
Parametern.
cwd Ein symbolischer Link auf das Verzeichnis, das beim Aufruf des Prozesses das aktuelle
Arbeitsverzeichnis war (current working directory).
environ Die komplette Umgebung des Prozesses (Variablen, Funktionen, usw.) sofern er
eine Umgebung hat.
exe Ein symbolischer Link auf das aufgerufene Programm, dass den Prozess ausmacht.
root Ein symbolischer Link auf das Verzeichnis, das für den Prozess das root-Verzeichnis
darstellt.
Zusätzlich befinden sich Informationen zu den verwendeten Ressourcen (Speicher, Libraries, usw.) und ein Unterverzeichnis fd, dass die Datei-Descriptoren aller vom Prozess
verwendeten Ein- und Ausgabekanäle enthält, in diesen Verzeichnissen.
28.2.1
Die Hardwareparameter im /proc-Verzeichnis
Wie schon im Kapitel 28.1 ausgeführt wurde, benötigt man um bestimmte Hardware anzusprechen, Einstellungen, die sowohl auf der Hardwareseite vorgenommen, als auch dem
183
Betriebssystem bekannt sein müssen. Um diese Angaben anzuzeigen, bietet uns das /procVerzeichnis mehrere Dateien, die diese Information beinhalten.
Zur Erinnerung: Es handelt sich hierbei nicht um reale Dateien, sondern um Schnittstellen zum Kernel. Es sind also keine statischen Informationen sondern die gegenwärtigen
Informationen des Kernels, welche Parameter von welcher Hardware benutzt werden.
Diese Dateien sind hervorragende Diagnosewerkzeuge, die bei der Fehlersuche meist gute Dienste leisten. Ihr Inhalt ist mit Programmen wie cat, more oder less einsehbar.
Folgende Dateien sind dabei besonders erwähnenswert:
/proc/interrupts Zeigt eine Liste der im Augenblick benötigten IRQ-Kanäle an, zusammen mit der Information, wer diese IRQs benutzt (wem sie zugewiesen sind) und wie
oft die jeweiligen IRQs schon ausgelöst wurden.
/proc/ioports Zeigt eine Liste der IO-Adressen an, die gegenwärtig in Benutzung sind
und die Information, wem sie zugeordnet sind. Die Adressen werden als Adressbereich
angegeben, der zeigt, wie breit der Zugriff auf eine solche Adresse ist. Die Angabe:
0170-0177 : ide1
zeigt somit, dass auf den Controller der zweite IDE -Schnittstelle mit 8 Bit Breite
(170-177 = 8 Bit) zugegriffen wird.
/proc/dma Hier finden sich die Angabe der benutzten DMA-Kanäle zusammen mit der
Information, wer sie benutzt.
/proc/iomem Anzeige der Speicherbereiche und der verschiedenen Speicherarten. Dazu zählen neben dem normalen Arbeitsspeicher (System RAM) auch die Bereiche
des Bildschirmspeicher der Grafikkarte (Video RAM) und die jeweiligen ROMs der
Hauptplatine (System ROM) und der Erweiterungskarten (z.B. Video ROM), sowie
der Speicher des PCI -Systems, in dem die Bus-Informationen abgelegt sind. Alle
Angaben sind als Adressbereiche (Startadresse - Endadresse) angegeben.
28.2.2
Andere Hardwareinformationen im /proc-Verzeichnis
Neben den verwendeten Hardwareparametern finden sich im /proc Verzeichnis noch einige
andere interessante Informationen über die verwendete Hardware, die für Diagnosezwecke
sehr brauchbar sind. Dazu zählen die Dateien:
/proc/cpuinfo Alle Informationen, die der Kernel über den/die verwendeten Prozessor(en) hat, sind hier nachzulesen. Dazu zählen Prozessortyp und Prozessormodell,
Prozessorname, Taktrate, Cache-Grösse, usw. .
184
/proc/devices Eine Liste der block- und zeichenorientierten Geräte, die der Kernel aktuell unterstützt. Neben der jeweiligen Angabe des Gerätenamens ist auch die verwendete Major-Number angegeben.
/proc/partitions Eine Liste aller dem System bekannten Plattenpartitionen, mitsamt
Major- und Minornummern. Je nachdem, ob der Kernel das devfs Dateisystem unterstützt oder nicht, werden die Angaben in folgender Form angezeigt:
major minor
#blocks
3
0
16617888
3
1
1028128
(alte Darstellung)
name
hda
hda1
oder
major minor
#blocks name
3
0
19925880 ide/host0/bus0/target0/lun0/disc
3
1
4200966 ide/host0/bus0/target0/lun0/part1
(neue Darstellung bei Verwendung von devfs)
/proc/pci Informationen, die das Durchsuchen des PCI -Busses ergeben haben. Hier sind
alle Informationen über die am System angeschlossenen PCI -Geräte zu finden. Auch
der AGP -Bus (der in Wahrheit nur ein extra PCI -Bus mit nur einem Steckplatz ist)
ist hier zusammen mit allen gefundenen Karten angegeben.
28.2.3
Kernel- und Softwareinformationen im /proc-Verzeichnis
Neben der Hardware-Information hält das /proc-Verzeichnis auch noch einige Details über
den Kernel selbst und seine Fähigkeiten zur Verfügung, sowie Informationen über aktuelle
Systemzustände. Dazu zählen folgende Dateien:
/proc/cmdline Die Kommandozeile, mit der der Kernel selbst gestartet wurde. Hier sind
auch die entsprechenden Kernelparameter nachzulesen, die beim Booten mitgegeben
wurden. Ausserdem ist der Dateiname des aktuellen Kernels genannt.
/proc/filesystems Eine Liste aller Dateisystemtypen, die der Kernel im Augenblick
kennt.
/proc/meminfo Informationen über die gegenwärtige Belegung des Arbeitsspeichers.
/proc/modules Eine Liste der aktuell geladenen Kernel-Module.
/proc/mounts Eine Liste aller gemounteter Dateisysteme. In dieser Liste sind auch die
Dateisysteme enthalten, die mit mount -n gemountet wurden und somit weder in
der Datei /etc/mtab stehen, noch durch den Befehl df anzeigbar sind.
185
/proc/version Die aktuelle Kernelversion.
28.2.4
Weitere wichtige Unterverzeichnisse in /proc
Neben den besprochenen Dateien finden sich auch noch eine Menge Unterverzeichnisse im
/proc-Verzeichnis, die weitere Informationen über angeschlossene Geräte und Möglichkeiten
des Kernels enthalten. Dazu zählen insbesondere:
/proc/bus Informationen über die gefundenen Bussysteme (PCI, USB, usw.).
/proc/ide Informationen über IDE -Geräte und -Schnittstellen.
/proc/scsi Informationen über SCSI -Geräte und Schnittstellen.
/proc/net Informationen über netzwerkrelevante Einstellungen, wie zum Beispiel die
Routing-Tabellen und die ARP-Informationen, die der Kernel im Augenblick besitzt.
28.2.5
Aktive Veränderungsmöglichkeiten unter /proc/sys
Bisher wurde nur gezeigt, wie das /proc-Verzeichnis genutzt wird, um Informationen über
bestimmte Eigenschaften anzuzeigen. Im Verzeichnis /proc/sys können aber auch die Einstellungen bestimmter Kernelfähigkeiten verändert werden. Das geschieht dadurch, dass
die gewünschten Werte in die Dateien geschrieben werden, statt diese nur zu lesen. In der
Regel enthalten diese Dateien nur einzelne Werte, meist eine 1 oder 0, die ein ,,wahr” oder
,,falsch” repräsentieren.
Ein einfaches Beispiel für diese Fähigkeit ist die Einstellung, ob der Kernel in der Lage
ist, als Router zu arbeiten oder nicht. Ob diese Fähigkeit aktiviert ist oder nicht, erfährt
man, wenn man sich den Inhalt der Datei /proc/sys/net/ipv4/ip forward anzeigen lässt.
Normalerweise findet man hier eine 0. Um nun das Routing zu aktivieren ersetzt man diese
0 einfach durch eine 1 und schon ist der Kernel in der Lage zu routen.
186
Kapitel 29
Konfiguration Grundlegender BIOS
Einstellungen
Das Basic Input Output System (BIOS ) eines PC ist eine kleine Softwareschicht, die sich
zwischen die Hardware und das Betriebssystem legt, um eine einheitliche Schnittstelle
gegenüber der Hardware zur Verfügung zu stellen. Bei der Vielfältigkeit der Mainboards
wäre ansonsten jedes Betriebssystem gezwungen, die verschiedensten Architekturen der
Boards alle genau zu kennen.
Vereinfacht kann man sagen, dass das BIOS die wesentliche Funktionalität des Mainboards
für das Betriebssystem zugänglich macht. Dazu gehören natürlich auch die verschiedenen
Schnittstellen, die auf einem Mainboard integriert sind. Standardmässig zählen dazu:
ˆ Tastaturschnittstelle
ˆ PS/2 Maus-Schnittstelle (psaux)
ˆ Zwei serielle Schnittstellen
ˆ Eine parallele Schnittstelle
ˆ Zwei E-IDE Schnittstellen (für bis zu 4 IDE -Geräte)
ˆ Ein Floppy-Controller (für bis zu zwei Diskettenlaufwerke)
Optional sind auch noch Schnittstellen enthalten wie:
ˆ USB Schnittstellen
ˆ Sound
ˆ SCSI Schnittstelle
187
ˆ Game-Port
Das BIOS ist also eine Sammlung von Software, die sich physikalisch in einem Speicherbaustein (ROM) auf der Hauptplatine selbst befindet. Die Software passt genau zu dem jeweiligen Board und ist entsprechend nicht einfach austauschbar. In der Praxis hat das BIOS
ein paar unterschiedliche Aufgaben zu bewältigen, von denen Linux einige aus Geschwindigkeitsgründen umgeht. Von daher sind einige Einstellungen, die wir machen können für
den täglichen Gebrauch mit Linux gar nicht wichtig, andere hingegen sind unumgänglich,
da sie den Ladevorgang selbst betreffen.
Jedes BIOS hat die Möglichkeit, bestimmte Einstellungen vom Benutzer verändern zu
lassen. Dazu stellt es ein kleines Setup-Programm zur Verfügung, dass beim Systemstart
geladen werden kann. Verschiedene BIOS -Hersteller gehen dabei unterschiedliche Wege,
meist wird durch eine bestimmte Taste oder ein Tastenkombination während des Startvorganges - vor dem Booten des Betriebssystems - dieses Programm aktiviert. Typische
Tasten beziehungsweise Tastenkombinationen sind:
ˆ <DEL>
ˆ <F2>
ˆ <CTRL>-<ALT>-<ESC>
In der Regel erscheint daraufhin ein Menü, das verschiedene Auswahlmöglichkeiten bietet.
Die optische Aufmachung dieses Menüs variiert von Hersteller zu Hersteller und von Version
zu Version. Nachfolgend wird auf die wichtigsten Untermenüs, die auch in den meisten
Setup-Programmen vorhanden sind, eingegangen.
29.1
Standard Setup
Dieses Menü bietet die Möglichkeit, grundlegende Einstellungen zu tätigen. Dies sind unter
anderem:
ˆ Einstellung des Datums und der Uhrzeit
ˆ Einstellung, welche Diskettenlaufwerke angeschlossen sind.
ˆ Einstellungen welche Festplatten angeschlossen sind. Es können nur Festplatten konfiguriert werden, die über Controller der Hauptplatine angeschlossen sind.
ˆ Primäre Grafikkarte. Stammt aus der Zeit, als es noch Grafikkarten mit unterschiedlichen Speicheradressen gab (Hercules, MDA). Heute wird praktisch grundsätzlich
VGA/EGA verwendet.
188
ˆ Fehlerbehandlung beim Systemstart
Die wichtigsten Einstellungen sind hier die der Festplatten und die Fehlerbehandlung. Auf
diese beiden wird nun kurz eingegangen.
29.1.1
Allgemeine Resourcenverteilungen
Die folgenden Resourceverteilungen sind standardisiert und sollten bekannt sein:
Gerät
ttyS0 (COM1)
ttyS1 (COM2)
ttyS2 (COM3)
ttyS3 (COM4)
lp0 (LPT1)
lp1 (LPT2)
fd0, fd1 (Floppies 1 und 2)
fd2, fd3 (Floppies 2 und 4)
VGA RAM
29.1.2
I/O Adresse IRQ DMA
3f8
4
2f8
3
3e8
4
2e8
3
378-37f
7
278-27f
5
3f0
6
2
2f0
10
3
0xA0000-0xBFFFF
-
Festplatteneinstellungen
Die üblichen Hauptplatinen verfügen über zwei IDE Kanäle, und können somit bis zu
vier IDE Festplatten (oder CDROMs, DVDs, usw.) betreiben. Die Einstellungen für
die Festplatten sind für Linux eigentlich unerheblich, da der Kernel die Controller direkt
anspricht und nicht über das BIOS. Trotzdem sind ein paar Einstellungen hier von grosser
Bedeutung.
Festplatten werden traditionell über drei Grössen klassifiziert: Die Anzahl der Zylinder,
die Anzahl der Sektoren und die Anzahl der Lese- und Schreib-Köpfe. Die Kapazität einer
Festplatte berechnet sich folgendermassen:
Kapazit"at = Zylinder * K"opfe * Sektoren * 512 Byte
Physikalisch sind die Platten zwar heute intern etwas anders aufgebaut (so haben etwa die
inneren Spuren weniger Sektoren als die äusseren), aber logisch werden sie immer noch so
verwaltet. Das Problem liegt jetzt darin, dass das BIOS sich schwertut, Betriebssysteme
von Festplatten zu booten, die mehr als 1024 Zylinder besitzen (intern wird ein 10-Bit
Wert für die Speicherung der Anzahl Zylinder verwendet). Aus diesem Grund bieten ein
modernes BIOS die Möglichkeit einer alternativen Berechnung an. Wenn zum Beispiel die
Anzahl der Zylinder halbiert, aber dafür die Anzahl der Köpfe verdoppelt wird (rechnerisch,
nicht physikalisch), dann resultiert das exakt gleiche Ergebnis für die Kapazität. Als
189
Nebeneffekt haben wir aber jetzt weniger als 1024 Zylinder und können problemlos booten.
Dieser Modus heisst Large Block Architecture oder einfach LBA-Modus.
Obwohl Linux das BIOS bei Plattenzugriffen umgeht, sollten wir für Festplatten mit mehr
als 1024 Zylindern den LBA Modus wählen, weil wir sonst Probleme bekommen können
mit:
ˆ Partitionierungssoftware (fdisk), die immer noch auf den BIOS -Einstellungen basieren
ˆ Bootmanagern (LILO, GRUB ), die vom BIOS geladen werden müssen
29.1.3
Fehlerbehandlung
Die Einstellungen für die Fehlerbehandlung sind relativ trivial. Hier kann eigentlich nur
festgehalten werden, bei welchen Fehlern das System gar nicht erst bootet. In der Regel
bietet ein Setup-Programm folgende Alternativen:
ˆ Halt bei allen Fehlern
ˆ Halt bei allen Fehlern ausser Festplattenfehlern
ˆ Halt bei allen Fehlern ausser Tastaturfehlern
ˆ Halt bei allen Fehlern ausser Festplatten- oder Tastaturfehlern
Normalerweise ist es sinnvoll die Einstellung ,,Halt bei allen Fehlern” sinnvoll. Für den
Betrieb von Rechnern ohne eigene Tastatur (zum Beispiel Server, welche die Tastatur
über eine Wechselbox teilen), empfiehlt sich die Einstellung ,,Halt bei allen Fehlern ausser
Tastaturfehlern”, womit eine Unterbrechung des Starvorganges vermieden wird, wenn die
Tastatur gerade einem anderen Rechner zugeteilt ist.
29.2
Einstellungen für Peripheriegeräte
Meist steht ein eigenes Untermenü zur Verfügung umd die Einstellungen für die auf der
Hauptplatine integriert Geräte und Schnittstellen vorzunehmen. Dieser Menüpunkt heisst
oft integrated peripherals.
Die angebotenten Einstellmöglichkeiten unterscheiden sich auf Grund der Art der Peripeherie. Für Schnittstellen (seriell oder paralell) kann eingestellt werden ob diese überhaupt
aktiviert werden oder nicht und mit welcher Geschwindigkeit sie arbeiten sollen. Für die
Geräte können die im Kapitel 28.1 besprochenen Angaben (IO-Adresse, IRQ und eventuell
DMA-Kanal) eingegeben werden.
190
Um Konflikte zwischen Geräten auf der Hauptplatine und externen Geräten zu beheben
können die verwendeten Werte in den entsprechenden Dateien im /proc-Verzeichnis nachgesehen werden (siehe Kapitel 28.2).
29.3
Plug and Play und PCI Einstellungen
Im Kapitel über die ISA-Karten (32.1) wird gezeigt, wie eine derartige Karte unter Linux
installiert wird. Dabei wird ersichtlich, dass der Karte unter Linux feste Werte für die
IO-Adresse und den IRQ zugewiesen werden (genau wie bei nicht PnP -fähigen Erweiterungskarten).
Das BIOS kennt aber diese Einstellungen nicht und verteilt möglicherweise diese Werte
an unterstütze PnP Karten, womit ein Konflikt entsteht. Aus diesem Grund bietet das
Setup-Programm die Möglichkeit, bestimmte IRQ-Werte für ISA-Karten zu reservieren,
und so zu verhindern, dass diese von Plug and Play Karten geschnappt werden.
29.4
Weitere Einstellungen
Im Setup-Programm existieren noch viele weitere Möglichkeiten, die Hardware einzustellen.
Dazu zählen folgende Einstellungen:
ˆ Ansteuerung der Festplatten mit modernen Methoden (PIO, (U)DMA, usw.)
ˆ Management des Arbeitsspeichers (Zugriffsmodus, Burst, usw.)
ˆ Boot-Reihenfolge der Geräte
ˆ Systempasswort
ˆ Energiespar-Optionen
191
Kapitel 30
Konfiguration von Modems und
Soundkarten
30.1
Kompatibilitätskriterien
Bemerkenswert sind die Kompatibilitätskriterien für diese beiden Gerätearten. Bei der
Anschaffung eines Gerätes, das unter Linux betrieben werden soll, ist es natürlich einfach,
entsprechend darauf zu achten, dass es sich um Geräte handelt, die auch unter Linux
betrieben werden können. Es gibt sowohl Kompatibilitätslisten einzelner Distributoren,
als auch unabhängige Aufzählungen, welche Hardware von Linux mit welchem Treiber
angesprochen werden kann. Ein guter Startpunkt für die Suche ist hierbei das HardwareHOWTO [12] des Linux-Documentation-Project [11].
Schlimmer sieht es aus, wenn mit bestehender Hardware auf Linux umgerüstet werden soll.
In diesem Fall kann es hin und wieder vorkommen, dass die entsprechenden Geräte nicht,
oder nur eingeschränkt benutzbar sind. Ein typisches Beispiel für solche Geräte sind die
sogenannten Winmodems, die im Kapitel 30.2.2 einer genaueren Betrachtung unterworfen
werden sollen.
30.2
Modems
30.2.1
Konfigurieren der serielle Schnittstelle
Das Programm zur Konfiguration serieller Schnittstellen heisst setserial. setserial
wurde dazu entworfen, Konfigurationsinformation einer seriellen Schnittstelle zu setzen
oder zu lesen. Diese Information beinhaltet welche IO-Adressen und IRQs die seriellen
Schnittstellen benutzen und mit welchem Multiplikator Hochgeschwindigkeitsverbindungen
bearbeitet werden.
192
Normalerweise wird setserial über ein Skript beim Systemstart für alle angeschlossenen
seriellen Schnittstellen gestartet um sie zu konfigurieren. Ohne besondere Parameter gibt
setserial die Informationen über eine bestimmte serielle Schnittstelle aus.
Die vier standardmässigen seriellen Schnittstellen des PC werden als /dev/ttyS0 bis
/dev/ttyS3 bezeichnet. Mit diesen Bezeichnungen kann setserial arbeiten.
Der Aufruf von setserial /dev/ttyS0 ergibt beispielsweise folgende Ausgabe:
/dev/ttyS0, UART: 16550A, Port: 0x02f8, IRQ: 3
Um jetzt Einstellungen vorzunehmen, müssen dem Programm setserial mehr Parameter
mitgegeben werden. Die Aufrufform ist dabei:
setserial DEVICE [SETTINGS] [FLAGS]
Beispiele von Einstellungsparameter (SETTINGS) sind:
port PORTNO Setzt die IO-Adresse auf PORTNO.
irq IRQNO
Setzt den IRQ auf IRQNO.
uart UARTNO Setzt den verwendeten UART (Universal Asynchronous Receiver
Transmitter ) Baustein auf UARTNO. Gültige Werte sind: none, 8250,
16450, 16550, 16550A, 16650, 16650V2, 16654, 16750, 16850,
16950 und 16954. Der Wert none schaltet die Schnittstelle aus.
Viele Anwendungen, die mit seriellen Schnittstellen und Modems arbeiten kennen nur
Geschwindigkeitseinstellungen bis zu 38.4kb pro Sekunde. Moderne Modems erfordern
aber wesentlich schnellere Verbindungen zwischen Rechner und Modem, da diese Modems
selbst noch Datenkompression anbieten, also mehr Daten zwischen Rechner und Modem
transportiert werden müssen, als zwischen Modem und Modem. Damit auch ältere Anwendungen mit diesen Geschwindigkeiten arbeiten können, bietet setserial die Möglichkeit
an, verschiedene Flags zu setzen, die eine höhere Geschwindigkeit einschalten, wenn die
Anwendung 38.4kb pro Sekunde anfordert.
Flag
spd normal
spd hi
spd vhi
spd shi
spd warp
Geschwindigkeit bei Anforderungen von 38.4kb pro Sekunde
38.4kb pro Sekunde
57.6kb pro Sekunde
115kb pro Sekunde
230kb pro Sekunde
460kb pro Sekunde
Um die serielle Schnittstelle /dev/ttyS0 auf eine Geschwindigkeit von 115kb pro Sekunde
zu setzen resultiert folgender Befehl:
# setserial /dev/ttyS0 spd_vhi
193
Durch einen erneuter Aufruf von setserial kann die Einstellung überprüft werden:
# setserial /dev/ttyS0
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3, Flags: spd_vhi
30.2.2
Konfiguration eines Modems
Modems werden über einen Befehlssatz gesteuert, der nicht hundertprozentig standardisiert ist. Grundsätzlich beginnen Modembefehle mit dem Wort AT, dem weitere Zeichen
folgen. Die genauen Befehle müssen dem jeweiligen Modemhandbuch entnommen werden.
Hier ein kleiner Überblick über die Befehle, die in der Regel alle Modems kennen. Jeder
der folgenden Befehle muss mit einem Enter abgeschlossen werden, damit ihn das Modem
überhaupt erst ausführt.
Das Modem antwortet mit OK. Tut es das nicht, so stimmt etwas
mit der Kommunikation zwischen Modem und Rechner nicht.
ATD[Nummer] Das Modem wählt die angegebene Nummer und baut eine Verbindung auf.
ATH0
Modem legt auf.
ATH1
Modem nimmt ab.
ATX0
Modem wählt und meldet CONNECT bei erfolgreichem Verbindungsaufbau.
ATX1
Modem wählt und meldet CONNECT <SPEED> bei erfolgreichem Verbindungsaufbau (SPEED bezeichnet dabei die Verbindungsgeschwindigkeit) .
ATX2
Modem wartet auf Freizeichen, wählt und meldet CONNECT <SPEED>
bei erfolgreichem Verbindungsaufbau.
ATX3
Modem wählt und meldet CONNECT <SPEED> oder BUSY (belegt) bei
erfolgreichem Verbindungsaufbau. ATX3 sollte bei Nebenstellenanlagen verwendet werden, um das Warten auf ein Freizeichen der
Amtsleitung zu vermeiden.
ATX4
Modem wartet auf Freizeichen, wählt und meldet CONNECT <SPEED>
bei erfolgreichem Verbindungsaufbau.
ATX5
Modem wählt und meldet CONNECT <SPEED>, BUSY oder VOICE (Telefon anstatt eines Modems an der Gegenstelle) bei erfolgreichem
Verbindungsaufbau.
ATX6
Modem wartet auf Freizeichen, wählt und meldet CONNECT
<SPEED>, BUSY oder VOICE bei erfolgreichem Verbindungsaufbau.
ATS0=X
Bei X=0 nimmt das Modem nicht selbstständig Anrufe entgegen.
X=1 bedeutet das Modem nimmt nach einmal Klingeln ab, X=2 nach
zweimal Klingeln, usw.
AT&W
Das Modem speichert seine gegenwärtige Einstellungen.
ATZ
Das Modem liesst die gespeicherte Einstellung und aktiviert sie.
AT
194
Jedes Datenfernübertragungsprogramm wie zum Beispiel minicom oder die Programme,
die PPP und SLIP Verbindungen aufbauen, müssen diese Befehle nutzen. Normalerweise
wird entweder ein Modeminitialisierungsbefehl angegeben, der alle notwendigen Einstellungen enthält wie etwa ATS0=0 X3 oder es ist vorher dafür gesorgt worden, dass das Modem
seine Einstellungen gespeichert hat, dann genügt ein ATZ.
Winmodems
Früher waren alle Modems eigenständige Geräte, die eine eigene Logik und Steuerung enthielten. Das einzige Problem am Anschluss eines Modems ist die Einstellung der verwendeten seriellen Schnittstelle und ihrer Kommunikationsparameter. Wenn der Computer das
Modem ansprechen konnte, dann konnte er es auch benutzen. Modems benötigen eigentlich keinerlei Treiber, sondern ein Programm, das ihren Befehlssatz kennt. Die normalen
Modems arbeiten alle mit einem Befehlssatz, der kompatibel zum früheren Marktführer auf
diesem Gebiet, der Firma Hayes, ist. Dieser Befehlssatz beginnt alle Befehle mit einem AT
(Attention Prefix ) und antwortet mit entsprechenden Meldungen wie OK. Ein Programm
zur Ansteuerung eines Modems musste also nur diese Befehle kennen und konnte mit dem
Modem umgehen. In der Regel konnte der Benutzer des Programms die entsprechenden
Befehle (wählen, auflegen, usw.) in eine Konfigurationsmaske eintragen und das Programm
konnte dann damit arbeiten.
Moderne, sogenannte Winmodems, arbeiten leider nicht mehr mit diesem Prinzip. Aus
Kostengründen ist den Modems die Eigenintelligenz gestrichen worden, das heisst, der
Rechner muss den grössten Teil der Arbeit leisten. Solche Modems halten sich an keinen Standard, sondern benötigen entsprechende Gerätetreiber. Diese Treiber werden in
der Regel nur für Windows ausgeliefert, was es in einigen Fällen unmöglich macht, unter
Linux mit diesen Modems zu arbeiten. Das Linux Documentation Project [11] hat ein
spezielles Winmodem-Howto [13] zu diesem Thema zusammengestellt. Ausserdem gibt es
eine Webseite unter http://www.linmodem.org, auf der Anleitungen bereit stehen, um
auch Winmodems unter Linux zum Laufen zu bringen.
30.3
Konfiguration von Linux als PPP-Client
Normalerweise werden IP-Verbindungen über Netzwerkkarten hergestellt. Die Protokolle
von TCP/IP sind für den Umgang mit Netzwerken geschrieben, sie arbeiten zum Beispiel
mit den MAC -Adressen (ARP ) und mit der Aufteilung eines Datenstroms in Pakete, wie
es bei Netzen üblich ist.
Um zwei Computer anstatt über Netzwerkkarten über serielle Schnittstellen zu vernetzen,
existieren mehrere Protokolle wie SLIP (Serial Line IP ) und PPP (Point to Point Protocol ). SLIP ist veraltet und wird nur noch sehr selten eingesetzt. Heute wird meist PPP
195
benutzt.
Die wirkliche Aufgabenstellung von PPP ist es nicht, zwei alleinstehende Computer über
eine serielle Leitung zu vernetzen. Heute sind Netzwerkkabel und -karten so billig, dass
es sich nicht lohnen würde eine solche Art der Vernetzung zu realisieren. Zumal damit
nur zwei Rechner vernetzt werden können, das System also nicht ohne weiteres erweiterbar
ist. Die wirkliche Aufgabe von PPP ist es, Rechner über serielle Leitungen mit anderen
Rechnern zu verbinden, die an ein tatsächliches Netz angeschlossen sind, so dass auch der
einzelne Rechner Zugriff auf das echte Netz hat. In der Regel ist das echte Netz das Internet
und die serielle Leitung ist eine Modem, ISDN oder ADSL Verbindung zum Provider. Das
PPP -Protokoll ist ein spezielles Protokoll zur Realisierung einer IP-Verbindung über ein
Medium, das nur zwei Kommunikationspartner verbindet. Also etwa serielle oder parallele
Verbindungen. Spezielle Versionen von PPP sind für ISDN (syncPPP) oder für (A)DSL
(PPPoE) verfügbar, das klassische PPP ist typischerweise für Modemverbindungen gedacht.
Linux kann natürlich beide Rollen übernehmen, die der Workstation, die über PPP an
einen Gateway angeschlossen wird (PPP -Client) oder die des Gateways, der eine PPP Verbindung an ein echtes Netz knüpft (PPP -Server).
30.3.1
Physikalischer Vorgang
Grundsätzlich ist der Vorgang des Aufbaus einer PPP -Verbindung in drei Teile aufzuteilen:
ˆ Aufbau der Modemverbindung
ˆ Loginvorgang
ˆ Aufbau der PPP -Verbindung
Das heisst, zunächst einmal muss das Modem soweit gebracht werden, dass es eine Verbindung zu der bestimmten Nummer aufbaut. Das heisst das Modem muss initialisiert werden
(ATZ) und die Initialisierung mit einem OK beantworten, anschliessend muss die Nummer
gewählt werden (ATD [Nummer]) und auf die Antwort CONNECT gewartet werden. Wenn
diese Antwort empfangen wurde ist der erste Teil der Aufgabe erledigt. Damit haben wir
eine bestehende serielle Verbindung zu dem anderen Rechner (unserem Gateway). Auf dem
Gateway hat das Modem abgenommen und ein normaler Login-Vorgang über getty wird
jetzt gestartet. Das heisst, der Gateway schickt uns jetzt eine Meldung, die wahrscheinlich
den Rechnernamen und das Wort login: beinhaltet. Diese Meldung wird von uns mit
unserem Benutzernamen beantwortet. Daraufhin schickt der Gateway die Frage nach dem
Passwort, die wir mit unserem Passwort beantworten. Wenn alles geklappt hat, ist der
Login-Vorgang damit abgeschlossen.
Jetzt muss der eigentliche PPP -Daemon gestartet werden. Das muss auf beiden Seiten
der Verbindung geschehen. Der Gateway hat den PPP -Daemon (pppd) als Startshell für
196
den Usernamen eingetragen, er startet den Daemon also automatisch. Wir müssen den
Daemon jetzt von Hand starten mit
pppd DEVICE SPEED defaultroute
Die Schnittstelle ist dabei unsere serielle Schnittstelle, auf der das Modem hängt,
die Geschwindigkeit ist meist 38400 (für moderne schnelle Modems) und die Option
defaultroute sorgt dafür, dass die Verbindung zum Gateway als Default Route eingetragen wird. Der PPP -Daemon initialisiert jetzt die neu entstandene symbolische Netzschnittstelle ppp0 mit dem Programm ifconfig (mit einer dynamischen IP-Adresse, die er
von der Gegenstelle bekommt) und legt die default route auf dieses Interface.
Jetzt besteht eine IP-Verbindung zu dem Garteway und unser Rechner hat Zugriff auf das
hinter dem Gateway liegende Netz. PPP ist also jetzt aktiv.
Dieser Vorgang kann natürlich automatisiert werden und muss niemals von Hand ausgeführt werden. Diese Darstellung dient nur dazu, den Vorgang zu verstehen, der im
nächsten Abschnitt beschrieben wird.
30.3.2
Automatischer Aufbau einer PPP-Verbindung mit chat
Damit der oben beschriebene Vorgang automatisiert werden kann, gibt es das Programm
chat. Es dient dazu, eine Kommunikation mit dem Modem (oder jeden anderen seriellen
Verbindung) zu automatisieren. chat erwartet seine Befehle aus einer Skriptdatei, die eine
sehr einfache Struktur hat. Jede Zeile eines chat-Skripts besteht aus einem Paar:
"Warte auf"
"Sende"
Das heisst, chat wartet immer auf ein angegebenes Wort, das vom Modem kommt, und
sendet nach dem Empfang dann das entsprechende Wort Sende. Nehmen wir ein Beispiel.
Wir wollen eine Verbindung zu einem Gateway aufbauen, der die Telefonnummer 12345
hat. Unser Username auf diesem Gateway ist hans, unser Passwort ist 12sd45gf. Das
entsprechende chat-Skript würde also folgendermassen aussehen:
’’
ATZ
OK
ATD12345
CONNECT ’’
ogin: hans
ssword: 12sd45gf
Das bedeutet, wir warten auf nichts und senden ein ATZ. Dadurch wird das Modem initialisiert. Das Modem antwortet mit einem OK. Sobald wir das OK empfangen haben, senden wir
den Modembefehl ATD12345, der das Modem veranlasst, die Nummer 12345 anzuwählen.
197
Sobald das gegenüberliegende Modem des Gateways abgenommen hat und die beiden Modems ihren Handshake beendet haben, antwortet unser Modem mit dem Wort CONNECT.
Wenn wir das empfangen haben, schicken wir ein Return (’’).
Jetzt wird der Gateway eine Loginaufforderung schicken. Wir wissen nicht, was genau er
schickt, aber wir wissen, dass die Aufforderung mit den Buchstaben ogin: aufhört. Der
Gateway könnte beispielsweise folgendes schicken:
Welcome to XYZ-Gateway
Login:
Es ist egal, was der Gateway sendet, sobald wir die Buchstaben ogin: empfangen, schicken
wir wiederum den Usernamen hans. Der Gateway antwortet mit einer Aufforderung, ein
Passwort einzugeben. Wir wissen nicht, ob er das gross oder klein schreibt, aber die letzten
Buchstaben, die er schickt werden sicherlich ssword: sein. Sobald wir die empfangen
haben, schicken wir das Passwort.
Mit diesem Befehl ist der Anmeldedialog abgeschlossen und die PPP -Verbindung wird
aufgebaut.
Um den PPP -Daemon mit diesem Skript zu starten, wird der Befehl
pppd "chat -f Skriptdatei" /dev/tty2 38400
eingegeben. Skriptdatei bezeichnet die Datei, die das oben besprochene chat-Skript
enthält. Dadurch wird eine PPP -Verbindung automatisch aufgebaut. Der PPP -Daemon
pppd wird aufgerufen und er erhält als ersten Parameter den Aufruf von Chat, mit der
Skriptdatei. Die Angabe /dev/tty2 38400 bezieht sich auf die serielle Schnittstelle, an
der das Modem hängt und die dort verwendete Geschwindigkeit.
Die zu verwendenden Optionen werden wir - statt sie auf der Kommandozeile einzugeben
- in einer anderen Datei (/etc/ppp/options) angeben, dazu genaueres später.
Wenn der PPP -Daemon erfolgreich einen Verbindungsaufbau erledigt hat, so ruft er ein
Shellskript mit Namen /etc/ppp/ip-up auf. Diesem Shellskript gibt er die folgenden Parameter mit:
ip-up INTERFACE DEVICE SPEED LOCAL_IP REMOTE_IP
Dieses Skript kann jetzt dazu verwendet werden, weitere Befehle auszuführen, die nach dem
Verbindungsaufbau gewünscht werden, etwa Firewallregeln oder andere Kommandos. Beim
Abbau einer Verbindung wird entsprechend das Skript /etc/ppp/ip-down abgearbeitet, das
wieder entsprechende Befehle beinhalten kann.
198
30.3.3
Automatischer Aufbau einer PPP-Verbindung mit wvdial
Die modernere Methode, mit der heute PPP -Verbindungen aufgebaut werden läuft über
das Programm wvdial. Dieses Programm erledigt alle Aufgaben, von der Anwahl über
das Modem, bis hin zum Start des PPP -Daemons. Es ersetzt das chat-Programm und
ermöglicht einen Login, ohne ein Skript zu schreiben.
Wen wvdial startet, lädt es zunächst seine Konfiguration aus der Datei /etc/wvdial.conf.
Diese Datei enthält sowohl die Grundeinstellungen für die Schnittstelle, das Modem und
die Geschwindigkeit, als auch Informationen über die anzuwählenden Provider (Telefonnummer, Username, Passwort).
Nachdem diese Datei gelesen wurde, initialisiert wvdial das Modem, wählt die entsprechende Nummer, authentifiziert den Login und startet den PPP -Daemon.
Die Konfigurationsdatei kann für verschiedene Provider Einträge besitzen. Sie ist aufgebaut wie eine Windows-INI Datei, also mit Sektionen, die durch Überschriften in eckigen
Klammern begrenzt werden. Neben der Sektion [Dialer Defaults], die die Grundeinstellungen und einen voreingestellten Providereintrag enthält, kann es beliebig viele andere
Einträge in der Form [Dialer Providername].
Wird wvdial ohne Parameter aufgerufen, so wählt es die Verbindung aus der Sektion
[Dialer Defaults], wird es aber mit einem Parameter aufgerufen, der einen Provider
beschreibt, so wird der entsprechende Einträge aus der Datei /etc/wvdial.conf benutzt.
Der Aufruf
wvdial foo
benutzt also den Eintrag [Dialer foo] aus der Konfigurationsdatei.
Ein Beispiel für eine solche Datei könnte folgendermassen aussehen:
[Dialer Defaults]
Modem = /dev/modem
Baud = 57600
Init1 = ATZ
Dial Command = ATDT
Idle Seconds = 180
Phone = 012345678
Username = foo
Password = bar
[Dialer provider1]
Phone = 0987654321
Username = hans
Password = asdf1234
199
[Dialer provider2]
Phone = 0918273645
Login Prompt = Weristda:
Username = hmueller
Password = 1082.oir
Im Abschnitt [Dialer Defaults] werden die entsprechenden Grundeinstellungen gemacht, die für alle anderen Abschnitte auch benutzt werden, wenn dort nichts anderes
vereinbart ist. Jeder andere Abschnitt enthält dann noch die notwendigen Informationen
über den anzurufenden Provider.
Wie beim Aufbau der Verbindung mit Chat, so wird auch hier beim Aufbau der PPP Verbindung das Skript /etc/ppp/ip-up abgearbeitet und beim Verbindungsabbau entsprechend /etc/ppp/ip-down.
Im Verzeichnis /etc/ppp/peers muss - bei Verwendung modernerer PPP -Daemonen - die
Datei wvdial liegen, die ein paar Optionen für den PPP -Daemon enthält, die er benötigt,
wenn er über wvdial gestartet wurde. In der Regel enthält diese Datei nur die Zeilen
noauth
name wvdial
replacedefaultroute
Falls andere Startprogramme verwendet werden, können sie auch in diesem Verzeichnis
jeweils eine Datei besitzen, die die nötigen Optionen für sie setzen.
30.3.4
Die Datei /etc/ppp/options
Damit der PPP -Daemon nicht jedesmal mit viele Kommandozeilenoptionen aufgerufen
werden muss, können die gewünschten Optionen in die Datei /etc/ppp/options eingetragen
werden. Es ist sogar möglich, für jede Schnittstelle (/dev/ttyS1, /dev/modem, usw.) eine
eigene solche Datei anzulegen, die dann entsprechend /etc/ppp/options.ttyS1 usw. heissen
muss.
Diese Datei kennt viele verschiedenen Einträge, die wichtigsten sind hier kurz erklärt:
noipdefault Der PPP -Client übernimmt nicht seine IP-Adresse aus /etc/hosts sondern
bezieht seine Adresse vom Server. Diese Option sollte für normale Provider immer
angegeben sein.
noauth Keine automatische Authentifizierung. Das bedeutet, dass die normale Authentifizierung über das Chat-Skript benutzt wird.
crtscts Hardware-Flusskontrolle des Modems wird aktiviert.
200
lock Lockdateien werden angelegt, um zu verhindern, dass ein anderer Prozess das Modemgerät benützt, während wir online sind.
modem Die Verbindung läuft über ein Modem. Das Gegenteil wäre local und wird nur
angewandt, wenn zwei Rechner über ein Nullmodemkabel miteinander verbunden
sind. Für eine Modemverbindung sollte immer modem gesetzt sein.
defaultroute Die aufgebaute PPP -Verbindung wird als Default Route gesetzt.
persist Nach einem Verbindungsabbruch wird nicht aufgelegt, sondern versucht, die Verbindung erneut aufzubauen.
maxfail N Die Verbindung wird abgebrochen, wenn N mal die Verbindung durch einen
Fehler abgebrochen wurde. Ein Wert von 0 bedeutet, dass nie automatisch abgebrochen werden soll.
idle N Die Verbindung wird automatisch beendet, wenn mehr als N Sekunden keine Daten
über sie gelaufen sind.
30.3.5
Zwingender Abbau einer PPP-Verbindung
Um eine PPP -Verbindung abzubrechen, muss einfach der PPP -Daemon per Signal INT
gekillt werden. Da der Daemon seine ProzessID immer in einer bestimmten Datei ablegt,
kann diese Aufgabe automatisch durch ein Skript erledigt werden. Die Datei, in die der
Daemon seine PID ablegt ist normalerweise /var/run/interface.pid, wobei interface für die
symbolische Schnittstelle (ppp0, ppp1, ...) der Verbindung steht. Um also die Verbindung
von ppp0 abzubrechen, kann der Befehl
kill -INT ‘cat /var/run/ppp0.pid‘
ausgeführt werden. Natürlich kann dieser Befehl auch in einem Skript verwendet werden.
30.4
Soundkarten
Es gibt unter Linux verschiedene Arten, wie eine Soundkarte zum Laufen gebracht werden
kann. Die wichtigste Art, das sogenannnte OSS, soll hier kurz besprochen werden.
Beim OSS (Open Sound System) handelt es sich um eine Treiberschnittstelle zum Kernel, die neben der eigentlichen Schnittstelle noch sogenannte Low-Level Treiber für jede
Soundkarte benötigt. Es gibt eine grosse Menge solcher Treiber für fast alle Soundkarten,
die manchmal aber nur rudimentäre Unterstützung gewährleisten. Alle Treiber können als
Module oder als fester Bestandteil des Kernels implementiert werden, heute werden aber
meist Kernel-Modulen verwendet.
201
Die meisten Soundkarten sind heute PCI -Karten, es existieren aber immer noch alte ISA
und ISA-PnP Karten, für die natürlich alles gilt, was im Kapitel 32.1 gezeigt wird. Zur
einfacheren Installation von Soundkarten hat der Distributor RedHat ein kleines Programm
mit dem Namen sndconfig geschrieben, das inzwischen auch für andere Distributionen
erhältlich ist. Dieses Programm durchsucht die Bussysteme nach Soundkarten. Falls es
sich um ISA-PnP Karten handelt, erledigt sndconfig gleich die Aufgabe, mit isapnp die
entsprechenden Einstellungen menügeführt vorzunehmen.
Voraussetzung für die Verwendung von sndconfig ist die Verfügbarkeit von OSS -Treibern
und der OSS -Schnittstelle im Kernel. sndconfig ist ein menügeführtes Programm, das im
Normalfall keine Kommandozeilenparameter benötigt.
202
Kapitel 31
Einrichten von SCSI -Geräten
Das Small Computer System Interface (SCSI ) ist jahrelang die Profi-Schnittstelle für
Geräte wie Festplatten, CD-ROMs aber auch Scanner und anderer externer Geräte gewesen. Auch heute noch finden sich in den meisten Server-Installationen SCSI Geräte,
anstelle der sonst üblichen IDE -Platten. SCSI -Geräte sind in der Regel um einiges teurer
als ihre IDE -Pendants, bieten aber oft eine bessere Performance, eignen sich besser für den
Dauerbetrieb und bieten zusätzlkiche Möglichkeiten, die unter IDE nicht oder nur schwer
zu realisieren sind (zum Beispiel Hot-Pluging).
31.1
Grundsätzliche Architektur von SCSI
SCSI ist ein Bussystem, das bis zu 8 Geräte (16 Geräte bei Wide-SCSI ) verwalten kann.
Eines der 8 (oder 16) Geräte ist der SCSI -Hostadapter selbst. Der Hostadapter (oft fälschlicherweise als SCSI -Controller bezeichnet) ist das SCSI -Gerät, das den Bus mit dem
Computer verbindet.
Grundsätzlich besteht ein SCSI System aus einem Bus, der in der Regel im Inneren des
Computers durch ein 50poliges Flachbandkabel realisiert wird. Nach aussen hin (für externe Geräte wie Scanner) wird ein abgeschirmtes Spezialkabel verwendet. An diesem Bus
hängen die SCSI -Geräte, auch der Hostadapter.
Beim Aufbau des SCSI -Busses müssen folgende Punkte beachtet werden:
ˆ Der Bus darf nur zwei Enden haben, T-Stücke (Abzweigungen) sind verboten.
ˆ Jedes Ende des Busses muss mit einem Terminator (Abschlusswiderstand) abgeschlossen sein (die Widerstandswerte betragen 330 Ohm gegen Masse und 220 Ohm
gegen +5V). Heute werden diese Widerstände entweder softwaremässig oder gar automatisch gesetzt. Bei älteren SCSI -Geräten war hier noch Steckarbeit erforderlich.
ˆ Der Leitungsabstand zwischen zwei SCSI Geräten muss mindestens 10 cm betragen.
203
ˆ Der SCSI -Bus darf eine Gesamtlänge von 3 Metern nicht überschreiten (Bei mehr
als vier Geräten darf er beim normalen SCSI sogar nur 1,5 Meter lang sein).
ˆ Bastlerverbindungen (zum Beispiel Pfostenstecker) sind nicht zulässig, das Flachbandkabel muss durchgängig sein.
ˆ Der Bus darf nicht durch ein offenes Kabelende abgeschlossen sein. Selbst wenn nur
ein Gerät (ausser dem Adapter) angeschlossen ist muss immer der letzte Anschluss
des Kabels verwendet werden.
Diese Regeln sind unbedingt einzuhalten, sonst kommt es mit Sicherheit zu Fehlern, deren
Ursache oft sehr schwer ermittelbar ist.
31.2
SCSI -Typen
SCSI ist ein gewachsenes System, das in verschiedenen Generationen auftritt. Die ursprünglichen Bezeichnungen SCSI, SCSI2 und SCSI3 haben mehr zur Verwirrung beigetragen, als zur Klärung, daher werden heute die folgenden Begriffe verwendet:
SCSI (oder SCSI1 ) Das klassische SCSI mit bis zu 8 Geräte (7+Hostadapter) an einem 50poligen Kabel. Es wurde 1986 standardisiert, seitdem können alle SCSI Hostadapter Geräte ansteuern, die diesem Standard folgen.
SCSI2 Eine Erweiterung des SCSI -Befehlssatzes, die hauptsächlich auch die Ansteuerung
anderer Geräte als Festplatten ermöglichte. Diese Form von SCSI wurde weiter
aufgespalten in eine schnellere Variante (Fast-SCSI-2 ) und eine Variante mit der
Möglichkeit mehr Geräte (16 statt 8) anzuschliessen (Wide-SCSI-2 ).
SCSI3 (oder Ultra SCSI ) SCSI3 ist noch nicht vollständig fertig entwickelt, trotzdem bieten es einige Hersteller schon an. Es zeichnet sich durch eine noch höhere
Geschwindigkeit aus. Für SCSI3 existieren auch völlig neue Kabelformen (Glasfaser,
serielle Übertragung).
Die Wide-SCSI Varianten benutzen statt einem 50poligen Kabel (8-Bit-Bus) ein 68poliges
Kabel (16 Bit Bus), damit die einzelnen Geräte adressiert werden können. Die folgende
Tabelle zeigt die verschiedenen Kombinationsmöglichkeiten, die auf dem Markt sind, inklusive ihren maximalen Transferraten:
Busbreite
8-Bit
16-Bit
Kabelbreite
50-polig
68-polig
Standard
Fast
5 MB/sec 10 MB/sec
10 MB/sec 20 MB/sec
Ultra
20 MB/sec
40 MB/sec
Durch entsprechende Kombinationen entstehen dadurch etwas verständlichere Namen wie
Ultra-Wide-SCSI oder Fast-Wide-SCSI.
204
Abbildung 31.1: Externe SCSI-Stecker
31.3
Adressierung im SCSI -Bus
Jedes SCSI Gerät muss über eine SCSI -ID verfügen, also einer numerischen Adresse, über
die es eindeutig ansprechbar ist. Diese Eindeutigkeit bedeutet, dass kein SCSI Gerät in
einem Bus die gleiche ID wie ein anderes haben darf. Die IDs beginnen mit der Null und
enden mit der Sieben (Normales SCSI ) oder der 15 (Wide-SCSI ) Es gibt inzwischen auch
schon Versuche mit 32 Geräten, die erfordern jedoch ganz andere Kabel und zum Teil
auch andere Protokolle, da es schlicht unmöglich ist, auf einem 1,5 Meter langen Kabel 32
Geräte mit einem Mindestabstand von 10 cm anzuschliessen.
Der Hostadapter hat üblicherweise die ID 7. Die Vergabe der ID sollte nicht wahllos
geschehen, den die höchste ID hat immer auch die höchste Priorität im System. Hingegen
hat die ID nichts mit der physikalischen Position am Bus zu tun.
Die IDs müssen entweder softwaremässig (über den Adapter) oder über Schalter (externe
Geräte) und Jumper (interne Geräte) eingestellt werden. Falls eine reine SCSI -Installation
ohne IDE Platten eingerichtet werden soll, muss die Bootfestplatte die ID 0 haben.
Neben der SCSI -ID gibt es für jedes Gerät noch eine sogenannte LUN (Logical Unit
Number ), die eventuell existierende Untergeräte addressiert. So kann etwa ein SCSI Festplattenschrank mit 5 Festplatten aus der Sicht des SCSI -Busses nur ein Gerät mit
einer SCSI -ID sein. Um die einzelnen Festplatten trotzdem ansprechen zu können werden
die eigentlichen SCSI -IDs der Festplatten jetzt zu den LUNs des Schrankes.
Um auch mehrere SCSI -Hostadapter in einem Rechner betreiben zu können, bekommt
auch der SCSI -Bus selbst eine Nummerierung. Auch diese Bus wird von 0 her aufwärts
nummeriert.
Aus der Kombination der drei Angaben (durch Komma getrennt) lässt sich so eine eindeutige Adressierung innerhalb eines Systems erreichen. Jedes SCSI -Gerät kann mit der
Adresse der Art:
205
Busnummer,SCSI-ID,LUN
angesprochen werden. In den meisten Fällen werden Busnummer und LUN jeweils auf 0
gesetzt sein (wenn nicht mehrere SCSI-Adapter oder Geräte mit Untergeräten im Einsatz
sind).
31.4
Das SCSI-BIOS
SCSI ist ein intelligentes Subsystem, von dem das Standard-BIOS des PC nichts weiss. Die
Ansteuerung von SCSI -Geräten erfolgt durch entsprechende Gerätetreiber des Betriebssystems. Das ist weiter kein Problem, wenn das Betriebssystem von einem Medium gestartet
werden kann, das vom BIOS erkannt wird. Auf einem System, das nur SCSI -Platten
aufweist, ist das aber nicht möglich.
Auf einem solchen System muss ein Hostadapter mit eigenem BIOS installiert werden,
damit auch von SCSI -Geräten gebootet werden kann. In diesem Punkt unterscheiden
sich die Hostadapter sehr stark voneinander. Billige Adapter, wie sie etwa beim Kauf
eines SCSI -Scanners mitgeliefert werden, besitzen kein eigenes BIOS sondern dienen ausschliesslich der Ansteuerung von SCSI -Geräten im laufenden Betrieb. Teurere Adapter
weisen ein eigenes BIOS auf, welches, analog zum BIOS des Computers selbst, auch ein
Setup-Programm beinhaltet.
Durch eine Tastenkombination beim Hochfahren des Rechners (zum Beispiel <CTRL>-A
bei den Adaptec-Adaptern) wird das Setup-Programm des SCSI-BIOS gestartet. Hier
können verschiedene Einstellungen vorgenommen werden, die den Adapter selbst und die
angeschlossenen Geräte betreffen (etwa seine SCSI -ID) und Informationen über alle angeschlossenen Geräte ermittelt werden. Dazu zählen insbesondere:
ˆ Ermittlung aller vergebenen SCSI -IDs
ˆ Einstellung der Transferrate
ˆ Einstellung, von welchem Gerät gebootet werden soll
Manche modernen SCSI -Geräte sind auch in der Lage, ihre SCSI -ID softwaremässig einzustellen, was dann auch innerhalb dieses Programms vorgenommen werden kann.
31.5
Booten von SCSI -Geräten
Wenn von einem SCSI -Gerät gebootet werden soll, müssen die oben genannten Einstellungen im SCSI-BIOS vorgenommen werden. SCSI -Hostadapter ohne eigenes BIOS eignen
sich nicht, um von einem angeschlossenen Gerät zu booten.
206
Im System-BIOS muss dann noch eingestellt werden, dass von einem SCSI -Gerät gebootet
werden soll. Um welches Gerät es sich handelt, kann das System-BIOS nicht bestimmen,
dazu hat der Hostadapter ja sein eigenes BIOS. Bei der Einstellung der Boot-Reihenfolge im
System-BIOS (Bootsequence) wird einfach nur SCSI angegeben. In diesem Fall übergibt
das System-BIOS die Aufgabe des Bootens an das SCSI-BIOS, das wiederum über die
entsprechenden Informationen verfügt, von welchem Gerät gebootet werden soll.
31.6
SCSI im Linux-System
Im /proc-Verzeichnis findet sich ein Unterverzeichnis scsi, dass alle gefundenen SCSI -Hostadapter wiederum als Unterverzeichnis enthält. Jedes dieser Unterverzeichnisse
enthält wiederum eine Datei, die eine Nummer als Namen trägt. Das ist die Nummer, mit
welcher der SCSI -Bus an diesem Adapter bezeichnet wird. Die Datei selbst enthält Informationen über den entsprechenden Adapter. Ein Beispiel: Auf einem Linux-System ist ein
Dual-SCSI Adapter LSI SYM53C896 installiert. Im Verzeichnis /proc/scsi befindet sich
folgender Inhalt:
# ls -lR /proc/scsi
/proc/scsi:
total 0
-r--r--r-1 root
dr-xr-xr-x
2 root
/proc/scsi/sym53c8xx:
total 0
-rw-r--r-1 root
-rw-r--r-1 root
#
root
root
0 Nov 16 11:39 scsi
0 Nov 16 11:39 sym53c8xx
root
root
0 Nov 16 11:39 0
0 Nov 16 11:39 1
Das Verzeichnis sym53c8xx enthält zwei Dateien mit den Namen 0 und 1, welche Informationen über den SCSI -Bus 0 beziehungsweise SCSI -Bus 1 enthalten. Die Datei scsi
enthält Informationen über alle angeschlossene Geräte, egal auf welchem Bus sie hängen
und könnte so aussehen:
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: HP
Model: 9.10GB C 68-D94N
Type:
Direct-Access
Host: scsi0 Channel: 00 Id: 01 Lun: 00
Vendor: HP
Model: 9.10GB C 68-D94N
Type:
Direct-Access
Host: scsi0 Channel: 00 Id: 03 Lun: 00
207
Rev: D94N
ANSI SCSI revision: 02
Rev: D94N
ANSI SCSI revision: 02
Vendor: HP
Model: C1537A
Type:
Sequential-Access
31.7
Rev: L005
ANSI SCSI revision: 02
Die Namensgebung von SCSI -Geräten unter Linux
Die Namen der SCSI -Geräte unter Linux sind abhängig von der Reihenfolge, in der die
Hostadapter beim Booten erkannt werden. Die einzelnen Festplatten werden anhand der
Reihenfolge ihrer Erkennung durchnummeriert. So ist die erste erkannte Festplatte auf
dem ersten erkannten SCSI -Adapter die Festplatte mit dem Namen /dev/sda. Die nächste
Festplatte des selben Adapters bekäme den Namen /dev/sdb. Sind keine weiteren Platten
mehr angeschlossen, beginnt das gleiche Spiel beim nächsten Adapter. Die dortige Platte,
die zuerst erkannt wurde wäre also in unserem Beispiel /dev/sdc und so weiter.
CDROM-Laufwerke bekommen entsprechend die Namen /dev/sr0, /dev/sr1, usw. oder
auch (gleichzeitig) /dev/scd0, /dev/scd1, usw. Das sr steht für SCSI -Removable also
SCSI -Wechselplatte.
Eine andere Form der Adressierung wäre eindeutiger, die schon bekannte Form
Busnummer,SCSI-ID,LUN
Um die beiden Adressierungsformen zueinander in Verbindung zu bringen, existiert das
kleine Programm scsi info, dem als Parameter der Name der Gerätedatei eines beliebigen
SCSI -Gerätes mitgegeben wird. Als Ausgabe gibt das Programm dann die Adresse in
der Form: Busnummer,SCSI-ID,LUN und weitere Informationen aus /proc/scsi/scsi. Der
Aufruf von scsi info ergibt beispielsweise folgende Ausgaben:
# scsi_info /dev/sda
SCSI_ID="0,0,0"
MODEL="HP 9.10GB C 68-D94N"
FW_REV="D94N"
# scsi_info /dev/sdb
SCSI_ID="0,1,0"
MODEL="HP 9.10GB C 68-D94N"
FW_REV="D94N"
#
Mit diesem Hilfsmittel ist es also möglich, die tatsächlichen physikalischen Adressen zu
ermitteln.
208
Kapitel 32
Einrichtung verschiedener
PC-Erweiterungskarten
32.1
ISA-Karten
Wie in der Beschreibung über die Hardwareparameter (Kapitel 28.1) schon gezeigt, benötigen ISA-Karten die korrekte Einstellung ihrer Parameter wie IRQ, IO-Adresse und DMAKanal. Das Betriebssystem muss sich im Klaren über diese Parameter sein, damit es die
entsprechende Hardware ansprechen kann. Bei der Installation einer ISA-Karte müssen also normalerweise die entsprechenden Einstellungen sowohl auf der Hardwareseite, als auch
der Softwareseite vorgenommen werden, damit die Karte funktioniert.
Die moderneren ISA-Karten haben zur Vereinfachung dieser Einstellungen einen Standard
entwickelt, der die Karte und das Betriebssystem in die Lage versetzen soll, miteinander zu
kommunizieren. Mit Hilfe dieser Verständigung sollte es möglich werden, dass sich die Karte beim Betriebssystem erkundigt, welche Ressourcen (IO-Adressen, IRQs, usw.) noch frei
sind und dann selbstständig eine entsprechende Einstellung vornimmt. Das Betriebssystem
selbst kann diese Einstellung dann aus der Karte lesen und den Gerätetreiber entsprechend
konfigurieren. Diese Technik stellt natürlich einige Anforderungen an die Erweiterungskarte. Sie muss einen ROM-Speicher besitzen, der die denkbaren Parameter enthält und die
entsprechende Verdrahtung oder Logik, die diese Einstellungen dann nutzt.
Dieser Standard wird Plug and Play (PnP ) genannt. Voraussetzung für die korrekte Funktionsweise ist es aber, dass das Betriebssystem diese Technik beherrscht. Die schlechte
Nachricht vorab: Linux ist nicht Plug and Play fähig.
Um mit Linux sogenannte ISA-PnP Karten anzusprechen, muss eine passende Einstellung
an die Karte geschickt werden, die ihre Ressourcen fest zuweist. Wenn das geschehen
ist, kann Linux die Karte genauso behandeln, als ob es eine Karte mit manueller oder
softwaremässiger Einstellung wäre. Das heisst, beim Laden der Gerätetreiber können die
entsprechenden Parameter angegeben werden.
209
Um die entsprechenden Einstellungen vorzunehmen gibt es zwei Programme, die diese
Aufgabe in zwei Schritten übernehmen. Allerdings ist dazu etwas Handarbeit nötig. Die
beiden Programme sind:
ˆ pnpdump
ˆ isapnp
Das erste Programm, pnpdump, durchsucht den ISA-Bus nach PnP -Karten und liesst von
den gefundenen Karten die möglichen Einstellungen (Ressourcen) aus dem ROM. Diese Einstellungen werden dann in einem bestimmten (für Menschen lesbaren) Format auf
die Standard-Ausgabe geschrieben. Die denkbaren Einstellungen sind angegeben, eine
tatsächliche Konfiguration ist aber auskommentiert. Die Ausgabe von pnpdump wird üblicherweise in eine Datei umgeleitet und dann mit einem Editor bearbeitet um eine bestimmte Einstellung zu aktivieren. Die bearbeitete Datei wird dann zur Konfigurationsdatei des
zweiten Programms, isapnp mit dem die Einstellungen dann an die Karten zurückgeben
werden.
Die Konfiguration von ISA PnP -Karten kann somit in folgende drei Schritte gegliedert
werden:
1. Aufruf von pnpdump
pnpdump wird aufgerufen und die Ausgabe gleich in die Datei /etc/isapnp.conf umgeleitet, was der voreingestellte Konfigurationsdatei von isapnp entspricht.
2. Editieren der Datei /etc/isapnp.conf
Die gerade erstellte Datei wird mit einem Editor bearbeitet, um die gewünschten Einstellungen zu aktivieren. Es ist jetzt möglich, die Hardwareparameter auszusuchen,
die auf dem System noch frei sind.
3. Aufruf von isapnp
Das Programm isapnp schreibt die Einstellungen aus seiner Konfigurationsdatei wieder zurück an die Karten. Dieser Vorgang muss bei jedem Start des Systems wiederholt werden. Das Programm isapnp sollte also über ein Startskript bei jedem
Systemstart aufgerufen werden.
Nachdem diese drei Schritte vollzogen wurden, sind die ISA-Karten soweit, als wären es
normale Karten, die über Jumper oder Software konfiguriert worden sind. Erst jetzt können
die Kernelmodule für diese Karten geladen werden.
32.1.1
Beispielkonfiguration einer ISA-Netzwerkkarte
Nachfolgenden werden die einzelnen Schritte zur Konfiguration einer ISA-PnP Netzwerkkarte gezeigt.
210
Als erstes wird pnpdump aufgerufen:
$ pnpdump > /etc/isapnp.conf
Damit wird die Datei /etc/isapnp.conf erzeugt. Der Inhalt sieht wie folgt aus (gekürzt
und mit Zeilennummern versehen):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
$Id: 101.tex 326 2004-06-18 10:42:47Z mischneider $
Release isapnptools-1.21 (library isapnptools-1.21)
This is free software, see the sources for details.
This software has NO WARRANTY, use at your OWN RISK
For details of the output file format, see isapnp.conf(5)
For latest information and FAQ on isapnp and pnpdump see:
http://www.roestock.demon.co.uk/isapnptools/
Compiler flags: -DREALTIME -DNEEDSETSCHEDULER -DABORT_ONRESERR
(for
library: -DREALTIME -DNEEDSETSCHEDULER -DABORT_ONRESERR)
Card 1: (serial identifier 13 0e 1e 37 b4 19 01 89 14)
EDI0119 Serial No 236861364 [checksum 13]
Version 1.0, Vendor version 1.0
ANSI string -->PLUG & PLAY ETHERNET CARD<-Logical device id EDI0119
Device support I/O range check register
(CONFIGURE EDI0119/236861364 (LD 0
Compatible device id PNP80d6
Logical device decodes 10 bit IO address lines
Minimum IO base address 0x0240
Maximum IO base address 0x03e0
IO base alignment 32 bytes
Number of IO addresses required: 32
(IO 0 (BASE 0x0340))
IRQ 3, 4, 5, 9, 10, 11, 12 or 15.
High true, edge sensitive interrupt
(INT 0 (IRQ 10 (MODE +E)))
Memory is non-writeable (ROM)
Memory is non-cacheable
Memory decode supports high address
memory is 8-bit only
memory is shadowable
memory is an expansion ROM
211
37
38
39
40
41
42
43
44
45
46
#
Minimum memory base address 0x0c0000
#
Maximum memory base address 0x0dc000
#
Range base alignment mask 0xff4000 bytes
#
Range length 16384 bytes
# Choose UPPER = Range, or UPPER = Upper limit to suit hardware
# (MEM 0 (BASE 0x0c0000) (MODE bu) (UPPER 0x0c4000))
# (MEM 0 (BASE 0x0c0000) (MODE br) (UPPER 0x004000))
#
(ACT Y))
#)
# End tag... Checksum 0x00 (OK)
Aus dem Inhalt ist folgendes ersichtlich:
ˆ Es wurde eine Plug and Play fähige Karte mit der Seriennummer 13 0e 1e 37 b4
19 01 89 14 gefunden (Zeile 14).
ˆ Es handelt sich um eine Ethernet-Karte (Zeile 17).
ˆ Die eigentliche Konfiguration findet zwischen den Zeilen 20 und 45 statt
ˆ Alle Konfigurationseinstellungen sind noch auskommentiert (#)
ˆ Die Karte benötigt eine IO-Adresse und einen IRQ (Zeilen 23/24 und 28).
ˆ Die möglichen Einstellungen für die IO-Adresse und den IRQ sind auf den Zeilen
sind auf den Zeilen 23-25 beziehungsweise auf der Zeile 28 aufgelistet.
Zuerst stellen wir nun eine gültige IO-Adresse ein. Aus den Zeile 23-25:
23 #
24 #
25 #
Minimum IO base address 0x0240
Maximum IO base address 0x03e0
IO base alignment 32 bytes
können wir entnehmen, dass die kleinste mögliche Adresse 0x240, und die grösste Adresse
0x3e0 ist. Die Adressen dazwischen können in Schrittweiten von 32 Byte angegeben werden. Gültige IO-Adressen wären also:
0x0240
0x02c0
0x0340
0x03c0
0x0260
0x02e0
0x0360
0x03e0
0x0280
0x0300
0x0380
0x02a0
0x0320
0x03a0
Jede dieser Adressen repräsentiert einen Adressbereich von dieser Adresse bis zur jeweils
nächsten. Die Adresse 0x0240 beschreibt also den Bereich 0x0240-0x025f.
212
Aus diesen Adressen muss nun eine Adresse ausgewählt werden, die noch nicht vom System
oder einem anderen Gerät benutzt wird. Dazu wird die Datei /proc/ioports überprüft, die
zum Beispiel für den genannten Adressbereich folgende Angaben beinhalten könnte:
...
0170-0177
01f0-01f7
02f8-02ff
0376-0376
0378-037a
03c0-03df
03f6-03f6
03f8-03ff
...
:
:
:
:
:
:
:
:
ide1
ide0
serial(set)
ide1
parport0
vga+
ide0
serial(set)
Die Adressen 0x02e0-0x02ff sind für unser Beispiel also nicht zu gebrauchen, weil diese
Adressen teilweise durch ein anderes Gerät (serial) belegt sind. Auch die Adressen 0x0360
bis 0x03e0 sind bereits durch andere Geräte (ide1, parport0, vga, ide0 und serial) belegt.
Alle anderen Adressen stehen uns zur freien Verfügung. Wir wählen beispielsweise die
Adresse 0x0300. Um diese Einstellung vorzunehmen ändern wir die Zeile 27 und entfernen
das Kommentarzeichen, damit diese wie folgt aussieht:
(IO 0 (BASE 0x0300))
Nun setzen wir einen freien IRQ. Hier zeigt uns die Zeile 28 die möglichen Werte:
28 #
IRQ 3, 4, 5, 9, 10, 11, 12 or 15.
Ein Blick auf /proc/interrupts zeigt uns, welche IRQs auf unserem System schon belegt
sind:
0:
1:
2:
10:
11:
12:
14:
15:
882379
31607
0
126
54397
250763
41476
63616
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
timer
keyboard
cascade
ES1938
aic7xxx
PS/2 Mouse
ide0
ide1
IRQ 5 wäre beispielsweise noch frei. Um diesen IRQ zu aktivieren, ändern wir die Zeile
30 und entfernen das Kommentarzeichen, so dass diese wie folgt aussieht:
213
(INT 0 (IRQ 5 (MODE +E)))
Damit sind alle notwendigen Einstellungen erledigt, wir müssen die Karte jetzt nur noch
aktivieren. Dazu wird das Kommentarzeichen auf Zeile 44 entfernt, damit diese so aussieht:
(ACT Y))
Nun sind die manuellen Einstellungen erledigt und die Datei kann abgespeichert werden.
Um die vorgenommenen Einstellungen jetzt tatsächlich der Karte bekannt zu machen,
muss das Programm isapnp aufgerufen werden. Das Programm bekommt den Namen der
Konfigurationsdatei als Parameter, der Aufruf lautet also:
$ /sbin/isapnp /etc/isapnp.conf
Diese Zeile muss bei jedem Systemstart erneut ausgeführt werden. Sie sollte also in einem
der init-Skripts eingetragen sein. Meist wird bei der Installation von isapnp bereits ein
entsprechendes init-Skript angelegt.
Mit der nun besprochenen Einstellungsarbeit ist die ISA-Karte aber noch nicht ins System
eingebunden. Das Einzige, was mit dieser Arbeit erreicht wurde ist, dass die Karte jetzt
die entsprechenden Hardwareparameter benutzt. Die Arbeit entspricht also der manuellen
Einstellung durch Jumper auf alten Karten. Das Laden der entsprechenden Module und
die Übergabe der Hardwareparameter wird im Rahmen der LPIC Prüfung 102 besprochen.
32.2
PCI -Karten
32.2.1
Unterschied zwischen ISA und PCI
Der wichtigste Unterschied zwischen diesen beiden Systemen ist, dass PCI die bei ISA eher
wackelige Funktionalität des Plug and Play wirklich standardisiert übernommen hat. Das
heisst, es existieren weltweite Standards, wie sich eine PCI -Karte gegenüber dem System
ausweist. Jeder Hersteller von PCI -Karten ist zentral registriert (ähnlich wie bei der Vergabe der MAC -Adressen bei Netzwerkkarten) und hat eine eindeutige Identifikation. Jedes
Gerät, das der Hersteller produziert, bekommt wiederum eine eindeutige Identifikation, die
bei der Bestimmung der Funktionalität hilft. Zudem hat jede PCI -Karte die entsprechenden Informationen (Identifikation und ausgeschriebene Beschreibung) auf einem kleinen
ROM-Speicherstein gespeichert und kann sich so gegenüber einem System ausweisen. Linux
speichert die Informationen über diese Identifikation in der Datei /usr/share/misc/pci.ids.
Im Gegensatz zu ISA-Karten ist also bei PCI -Karten niemals die manuelle Vergabe von
Hardware-Parametern (IO-Adresse, IRQs, DMA-Kanäle) notwendig. Linux unterstützt die
PCI -Technologie vollständig.
214
Die ISA-Karten benötigen unter Linux grundsätzlich immer diese Parameter, egal, ob sie
alte Karten mit manueller Einstellung sind, oder Plug and Play Karten. Bei den letzteren
wird das Programm isapnp benutzt, um die Einstellungen festzulegen, beim Laden der
Module müssen die Einstellungen aber trotzdem vorgenommen werden.
Zur Vollständigkeit folgt hier noch eine kurze Beschreibung des AGP -Busses für Grafikkarten. Der AGP -Bus ist (technisch gesehen) ein eigenständiger PCI -Bus mit einer anderen
Bauform der Steckverbindung. Dieser Bus hat nur einen Steckplatz und dieser ist nur für
die Grafikkarte gedacht. Der Grund für diese Vorgehen liegt in dem besonders grossen
Datentransfer-Volumen von Grafikkarten. Um einen ungebremsten Verbindung zwischen
Computer und Monitor sicherzustellen, wurde für diese Aufgabe ein eigenständiger Bus angelegt, bei dem sich die Grafikkarte die Leistung des Bussystems nicht mit anderen Karten
teilen muss.
PCI -Bussysteme werden intern ähnlich adressiert wie SCSI -Systeme. Auch hier gibt es
eine dreigeteilte Adressierung in der Form:
Busnummer:Steckplatznummer.Funktionsnummer
Die Busnummer für den normalen PCI -Bus ist 00, die für den AGP -Bus ist 01. Die
beiden Bussysteme werden also tatsächlich als unterschiedliche Systeme behandelt. Die
Funktionsnummer steht für das jeweilige Gerät, das die entsprechende Funktionalität zur
Verfügung stellt.
32.2.2
Das Programm lspci
Um in einem Linux-System den PCI -Bus abzusuchen, existiert das Programm lspci.
lspci ist ein Hilfsmittel, um Informationen über alle PCI-Bussysteme des Systems und
alle dort angeschlossenen Geräte darzustellen.
Das Programm lspci ermöglicht es, genau zu bestimmen, welche Geräte (Erweiterungskarten) am PCI -Bus angeschlossen sind und als was sie sich ausgeben. Das ist insbesondere
wichtig, um herauszufinden, welche Chipsätze oder Kompatibilitätskriterien bestimmte
Karten aufweisen, um mit dieser Information dann das entsprechende Modul zu laden.
Moderne Linux-Distributionen, die bei der Installation selbstständig herausfinden, welche
Karten angeschlossen sind (Hardwareerkennung) bedienen sich dieses Programms. Die
Ausgabe des Programmes könnte etwa so aussehen:
# lspci
00:00.0
00:01.0
00:07.0
00:07.1
00:07.2
00:07.3
00:09.0
00:0a.0
Host bridge: Intel Corp. 440LX/EX - 82443LX/EX Host bridge (rev 03)
PCI bridge: Intel Corp. 440LX/EX - 82443LX/EX AGP bridge (rev 03)
ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 01)
IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)
USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01)
Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 01)
Ethernet controller: Linksys Network Everywhere Fast Ethernet 10/100 model NC100 (rev 11)
Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
215
01:00.0 VGA compatible controller: Intel Corp. i740 (rev 21)
#
Die eigentlichen Informationen, welche Hersteller und welche Geräte die gefundenen Ergebnisse repräsentieren, wird die systemweite Datenbank /usr/share/misc/pci.ids benutzt.
Durch den Parameter -n wird lspci dazu gezwungen, diese Datei nicht zu konsultieren,
sondern die Ergebnisse numerisch auszugeben.
Linux Kernel, die neuer als die Version 2.1.82 sind, stellen zudem im Verzeichnis
/proc/bus/pci weitere Informationen (binär) zur Verfügung. Das Verzeichnis enthält für
jeden PCI-Bus ein entsprechendes Unterverzeichnis, das wiederum für jede angeschlossene
Karte eine Datei beinhaltet.
216
Kapitel 33
Konfiguration von
Kommunikationsgeräten
Alle für diese Kapitel relevanten Informationen wurden bereits im Kapitel 30 über die
Konfiguration von Modems und Soundkarten besprochen. Es sollte an dieser Stelle aber
nochmals speziell auf die Konfiguration der seriellen Schnittstelle hingeweisen werden, da
dies die eigentliche Konfiguration von Modems ausmacht.
Die serielle Schnittstelle wird mit dem Programmm setserial konfiguriert. Die dabei
einzustellenden Parameter sind insbesondere die IO-Adresse, den IRQ und den Typ des
UART -Bausteins. Zudem kann ein Multiplikator für die höchste Übertragungsgeschwindigkeit angegeben werden, welcher angewendet wird, wenn die serielle Schnittstelle mit
38.4kb pro Sekunde betrieben wird. Für eine Übertragungsgeschwindigkeit von 115.2kb
pro Sekunde heisst dieser Multiplikator spd vhi.
217
Kapitel 34
Konfiguration von USB-Geräten
34.1
Grundsätzliche Unterstützung von USB
USB wird von Kerneln ab Version 2.2.7 unterstützt. Besser sind aber die Kernel ab 2.4.0.
Die generelle Unterstützung von USB ist heute meist fest in einen Kernel hineingebaut,
kann aber auch als Modul realisiert werden. Dieses Modul muss, falls mit USB gearbeitet
werden soll, entsprechend geladen werden. Das Modul heisst usbcore.o und kann mit dem
Befehl:
# modprobe usbcore
im laufenden Betrieb eingehängt werden. Üblich ist aber, dass diese grundsätzliche USB Unterstützung fest integriert ist. Falls das der Fall ist sollte beim Systemstart eine Meldung
ähnlich der folgenden angezeigt werden:
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
Initializing USB Mass Storage driver...
usb.c: registered new driver usb-storage
USB Mass Storage support registered.
Damit ist klar, dass die USB -Unterstützung grundsätzlich aktiviert ist.
34.2
UHCI oder OHCI
Die meisten modernen Mainboards stellen einen USB -Controller zur Verfügung. Ältere
Maschinen können mit einem USB -Controller auf einer PCI-Karte nachgerüstet werden.
USB -Controller sind entweder kompatibel zum Open Host Controller Interface (OHCI )
218
von Compaq oder zum Universal Host Controller Interface (UHCI ) von Intel. Beide Typen
haben die selben Fähigkeiten und USB -Geräte arbeiten mit beiden Typen zusammen. Die
wesentliche Aufgabe bei der Konfiguration von USB unter Linux ist es, herauszufinden,
welchen der beiden Controller auf dem Rechner verwendet wird, auf dem USB konfiguriert
werden soll.
Mainboards der folgenden Firmen benutzen UHCI :
ˆ Intel
ˆ VIA
Mainboards der folgenden Firmen benutzen OHCI :
ˆ Compaq
ˆ Ali
ˆ SiS
ˆ NEC
ˆ Opti Chipsatz
Eine gute Methode, um den entsprechenden Chipsatz herauszufinden ist ein Aufruf von
lspci -v. Eine typische Ausgabe wäre:
...
00:1f.1 IDE interface: Intel Corp. 82801DBM Ultra ATA Storage Controller (rev 01) (prog-if 8a [Mast
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at <unassigned>
00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00 [UHCI])
Subsystem: IBM: Unknown device 052d
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at 1800 [size=32]
...
was eindeutig auf den Hersteller Intel hinweist und somit UHCI bedeutet.
Falls das nicht weiterführt, gibt es die Möglichkeit, die Datei /proc/pci anzusehen. Dort
findet sich ein Eintrag in der Art:
Bus 0, device
7, function 3:
USB Controller: VIA Technologies, Inc. UHCI USB (#2) (rev 22).
IRQ 10.
Master Capable. Latency=32.
I/O at 0xa800 [0xa81f].
219
Wenn auch hier keine Angaben stehen, dann sollte die IO-Adresse angesehen werden. Ist
sie in der Form 0xHHHH (wobei HHHH für vier hexadezimale Ziffern steht), dann haben wir
es mit UHCI zu tun, ansonsten, wenn die Form der Adresse 0xHH000000 ist, dann ist es
OHCI. Ein Beispiel aus /proc/pci hierfür könnte so aussehen:
Bus 0, device 15, function 2:
USB Controller: PCI device 1166:0220 (ServerWorks) (rev 4).
IRQ 10.
Master Capable. Latency=32. Max Lat=80.
Non-prefetchable 32 bit memory at 0xfd103000 [0xfd103fff].
Sobald herausgefunden wurde, welcher Controller benutzt wird, kann das Grundmodul für
USB geladen werden. Das ist eines der beiden folgenden Module:
ˆ usb-ohci.o
ˆ usb-uhci.o
Geladen werden diese Module entweder von Hand über den Befehl:
# modprobe usb-uhci
oder:
# modprobe usb-ohci
oder automatisiert über einen entsprechenden Eintrag in /etc/modules.conf der Art:
alias usb uhci
Jetzt kann in einer Systemstartdatei ein modprobe usb eingetragen werden und das entsprechende Modul wird automatisch beim Start geladen. Es ist sogar möglich dadurch alle
gewünschten anderen USB -Module gleich mitzuladen, etwa indem dort eingetragen wird:
alias usb uhci
post-install uhci modprobe printer
post-install printer modprobe joydev
post-install joydev modprobe hid
220
34.3
Das USBDevFS -Dateisystem
Das USB Geräte-Dateisystem ist ein dynamisch generiertes Dateisystem, ähnlich dem
/proc-Dateisystem. Es kann theoretisch an jede beliebige Stelle des Systems gemountet
werden, es hat sich aber durchgesetzt, es nach /proc/bus/usb einzuhängen.
Wenn im Kernel die Unterstützung für dieses Dateisystem aktiviert ist (Preliminary USB
Device Filesystem) dann sollte es (zumindest bei Kerneln ab 2.4) automatisch beim Start
gemountet werden. Ältere Kernel erfordern entweder Handarbeit wie
#
mount -t usbdevfs none /proc/bus/usb
oder einen Eintrag nach /etc/fstab in der Art;
none
/proc/bus/usb
usbdevfs
defaults
0
0
Nachdem das Dateisystem gemountet ist, sollte der Inhalt von /proc/bus/usb etwa folgendermassen aussehen:
-r--r--r--r--r--r--
1 root
1 root
root
root
0 2002-08-20 00:02 devices
0 2002-08-20 00:02 drivers
Sobald das entsprechende Modul usb-ohci.o oder usb-uhci.o geladen ist, der USB Controller also ansprechbar ist, sollte mindestens noch ein (meist aber zwei) Unterverzeichnis zu finden sein, für jede USB -Schnittstelle eines:
dr-xr-xr-x
dr-xr-xr-x
-r--r--r--r--r--r--
1
1
1
1
root
root
root
root
root
root
root
root
0
0
0
0
2002-08-20
2002-08-20
2002-08-20
2002-08-20
00:11
00:11
00:11
00:11
001
002
devices
drivers
Die Einträge in diesen Verzeichnissen und Dateien sind binär und somit nicht für menschliche Augen gedacht. Es geht darum, im Fehlerfall Zugriff auf jedes einzelne Gerät zu haben
und Diagnosen stellen zu können.
34.4
Das USB-Schichtenmodell von Linux
Um zu verstehen, welche Module wie voneinander abhängen, folgt hier eine Darstellung des
USB -Schichtenmodells, wie es der Linux-Kernel benutzt. Daraus wird klar, dass der USB Kern (usbcore) nicht die unterste Schicht des USB -Stapels ist, sondern in beide Richtungen
erweiterbar ist.
221
Nach unten hin, also Richtung Controller-Hardware sind ihm die bereits besprochenen
USB -Hostcontroller-Module (usb-ohci und usb-uhci ) angeschlossen, mit denen er in die
Lage versetzt wird, den entsprechenden USB -Controller anzusprechen. Nach oben hin
folgen die Module, die für die einzelnen Geräte selbst notwendig sind.
Der Kern (usbcore) selbst stellt die Funktionalität von USB zur Verfügung, also alles, was
für alle Geräte gleich ist.
Abbildung 34.1: USB Schichtenmodell in Linux
Die einzelnen Geräte, die über USB angeschlossen werden, können in sogenannte Klassen
aufgeteilt werden. Als Klassen werden Geräte zusammengefasst, die eine bestimmte Menge
gleichartiger Mechanismen benutzen. Unter Linux ist die Aufteilung nicht besonders intensiv, die einzige grosse Klasse, die sich ergibt ist die Klasse HID (Human Interface Device).
Diese Klasse fasst alles zusammen, was als Eingabegerät des Benutzers klassifiziert werden
kann. Also zum Beispiel Tastatur, Maus und Joystick. Das entsprechende Modul unter
Linux heisst hid.o. Diese Klasse wiederum benutzt ein weiteres Modul, das die Eingabe
von solchen Geräten regelt. Unter Linux wird diese Aufgabe vom Modul input.o gelöst.
222
Erst darauf bauen dann die einzelnen Module für die jeweiligen Eingabegeräte wie etwa
usbkbd.o oder usbmouse.o auf.
Durch diese Architektur ist es mit relativ wenig Aufwand möglich, neue Treiber für Eingabegeräte zu schreiben. Die wesentliche Funktionalität ist ja schon durch die Module hid.o
und input.o gegeben. Nur noch die spezifischen Besonderheiten des jeweiligen Gerätes
müssen in den entsprechenden Treiber integriert werden.
Andere Geräte, die nicht zur HID-Klasse gehören, verwenden nur jeweils ein Modul, um die
entsprechende Funktionalität zur Verfügung zu stellen. So wird zum Beispiel für den Einsatz eines USB -Druckers nur das Modul printer.o benötigt. Dieses Modul erstellt dann
eine (oder mehrere) Gerätedatei(en) im Verzeichnis /dev/usb, die wie parallele Schnittstellen zu benutzen sind (/dev/usb/lp0 ), um einen dort angeschlossenen Drucker entsprechend
anzusprechen.
Genauere Informationen, über die gefundenen (angeschlossenen) USB -Geräte sind mit dem
Programm lsusb zu ermitteln.
34.5
Module für die USB-Geräte automatisch einbinden
USB ist von seinem ganzen Ansatz her ein sogenannter Hotplugging Service, also ein Dienst,
der im laufenden Betrieb ein- und ausgehängt werden kann. Diese Fähigkeit wird von Linux
unterstützt, es müssen dazu aber ein paar Voraussetzungen erfüllt sein. Grundsätzlich
existieren zwei unterschiedliche Ansätze, um diese Fähigkeit anzubieten:
hotplug Ein Programm, das die Hotplugging-Fähigkeit für viele verschiedene Systeme
anbietet, etwa USB oder PCMCIA.
usbmgr Ein Programm, das die Hotplugging-Fähigkeit nur für USB anbietet.
Im folgenden werden beide Ansätze kurz beschrieben.
34.5.1
Funktionsweise von hotplug
hotplug ist ein Programm, das vom Kernel benutzt werden kann, um Programme von
bestimmten Ereignissen (zumeist hardwarespezifisch) zu unterrichten. Ein solches Ereignis kann beispielsweise das Anstecken eines USB - oder PCMCIA-Gerätes sein. Das kann
brauchbar sein, um die entsprechenden Module für dieses Gerät automatisch zu laden.
hotplug benutzt für jedes zu überwachende System einen sogenannten Agenten, ein Shellskript, normalerweise unter /etc/hotplug/systemname.agent. Für USB wäre das also das
Skript /etc/hotplug/usb.agent.
223
Informationen über solche Ereignisse werden den Agenten vom Kernel über Umgebungsvariablen übermittelt. Das Programm usbmodules wird beispielsweise vom
usb-Agenten benutzt, um die erkannten Geräte mit den notwendigen Modulen
auszustatten.
usbmodules --device /proc/bus/usb/MMM/NNN inspiziert die Datei
/lib/modules/<kernel-version>/modules.usbmap die vom Kernel zur Verfügung gestellt wird und schlägt Module vor, die für dieses Gerät in Frage kommen. Wird ein USB
Gerät aktiviert, so setzt der Kernel die Umgebungsvariable DEVICE auf das korrekte gerät,
so dass hotplug usbmodules --device $DEVICE aufrufen kann.
hotplug ist ein Daemon, der über ein init-Skript (normalerweise /etc/init.d/hotplug) gestartet wird.
34.5.2
Funktionsweise von usbmgr
usbmgr ist ein Daemon, der benötigte USB -Module entsprechend seiner Konfigurationsdateien lädt und entlädt. Zusätzlich können noch Skripts ausgeführt werden, sofern das
notwendig sein sollte. usbmgr benutzt die offiziellen USB -Vendor-IDs und die USB -DeviceIDs, die vom USB -Consortium offiziell vergeben werden, um herauszufinden, welche Geräte
er gefunden hat. Die drei Konfigurationsdateien des Programms sind:
/etc/usbmgr/usbmgr.conf Eine Datei, die die offiziellen IDs enthält. Diese Datei kann
aktuell über http://www.dotaster.com/~shuu/linux/usbmgr/index.html bezogen werden und muss nicht verändert werden. Sie dient nur der Information, welche
Module für welche IDs geladen werden müssen.
/etc/usbmgr/preload.conf Diese Datei enthält eine Liste der Module, die usbmgr laden soll, wenn er startet. Diese Datei kann vom Systemverwalter entsprechend
verändert werden.
/etc/usbmgr/host Enthält den Modulnamen (ohne .o) des verwendeten USB Hostcontrollers also entweder usb-ohci oder usb-uhci.
Für eine korrekte Funktion von usbmgr müssen folgende Voraussetzungen erfüllt sein:
ˆ Der Kernel muss USB -fähig sein (usbcore)
ˆ Das USBDevFS muss unterstützt werden
ˆ Die benötigten Kernelmodule müssen existieren
Auch usbmgr ist ein Daemon, der über ein init-Skript gestartet wird.
224
Teil VI
110 - Das X Window System
225
Kapitel 35
Die Theorie hinter X11
[17]X11 (oder kurz X oder lang X Window System und nicht Windows) ist das auf UNIXSystemen übliche Grafiksubsystem. Ausserhalb des UNIX-Bereichs gibt es X11 auch für
einige andere Systeme, z.B. Windows und OS/2.
35.1
X11-Server
Der X11-Server ist das, was man bei Windows Grafikkartentreiber nennen würde. Sein
Serverdienst ist das zur Verfügung stellen von Grafikfunktionen, wie Linien zeichnen oder
Textzeichen im Grafikmodus ausgeben. Ausserdem kümmert sich der X-Server um die
Eingabe (über Maus, Tastatur und sonstige Geräte).
35.2
X11-Clients
Das sind die X11-Anwendungen (wie z.B. ein Browser oder ein WindowManager), denn sie
benutzen die Dienstleistungen (Serverdienste) eines X11-Servers zur graphischen Ausgabe.
Um X11 zu benutzen, verwenden diese Anwendungen in der Regel bestimmte Bibliotheken:
ˆ GTK
ˆ Qt
ˆ Xaw
226
35.3
Netzwerktransparenz
Das Zusammenspiel zwischen X-Server und X-Client geht nicht nur lokal, sondern auch
über ein TCP/IP-Netzwerk, d.h. die Anwendung läuft zum Beispiel auf dem dicken Hauptrechner im Keller und der Anwender betrachtet das ganze von einem Büro-PC.
Am Anfang ist es oft etwas verwirrend, besonders, wenn man statt Hauptrechner vom
Server spricht und statt vom Büro-PC von einem Client. Dann läuft nämlich der X-Client
auf dem Server und der X-Server auf dem Client. Alles klar?
Abbildung 35.1: X-Server und X-Client
Das X11-Protokoll ist standardisiert, das heisst auch ein X-Server unter Windows versteht
sich mit einer X-Anwendung unter Linux.
227
Kapitel 36
Installation und Konfiguration von
XFree86
Die meisten Distributionen installieren und konfigurieren heute automatisch XFree86, welches eine freie Implementation von X11 darstellt. LPI verlangt aber tieferes Wissen über
die Hintergründe.
36.1
Auswählen und Konfigurieren eines X Servers
XFree86 unterstützt heute eine grosse Pallette von Grafik- und anderer Hardware. Zum
Einen arbeiten open source Programmierer mit der Dokumentation der Hersteller an den
Treibern, zum Anderen stellen immer mehr Hardwarehersteller selber Treiber für Linux
her.
36.2
Unterstützte Videohardware
Um den besten Server zu finden braucht man folgende Angaben:
Version des installierten XFree86: XFree86 macht selber auch Fortschritte, langsam
zwar, dafür aber beständig. Um herauszufinden welche Version momentan installiert
ist, kann man folgendes Kommando verwenden:
mischneider@nephthys:~$ /usr/X11R6/bin/X -version
[...]
XFree86 Version 4.2.1.1 / X Window System
[...]
228
Das Grafikkarten Chipset: Normalerweise sind XFree86 Videodrivers für eine bestimmte Gruppe von Grafikchips gemacht, nicht für eine bestimmte Grafikkarte.
Verschiedene Grafikkartenhersteller benutzen dieselben Chips um das Computersignal auf den Monitor zu bringen, was die Karten aus der Systemperspektive fast
identisch macht. Um Details über das Chipset herauszufinden, ist entweder ein
Schraubenzieher oder lspci. Das folgende Beispiel zeigt ein ATI-Radeon Chipset:
mischneider@nephthys:~$ lspci -v
[...]
01:00.0 VGA compatible controller: ATI Technologies Inc Radeon R250 Lf
[Radeon Mobility 9000 M9] (rev 02) (prog-if 00 [VGA])
Subsystem: IBM: Unknown device 054d
Flags: bus master, stepping, fast Back2Back, 66Mhz,
medium devsel, latency 66, IRQ 11
Memory at e0000000 (32-bit, prefetchable) [size=128M]
I/O ports at 3000 [size=256]
Memory at c0100000 (32-bit, non-prefetchable) [size=64K]
Expansion ROM at <unassigned> [disabled] [size=128K]
Capabilities: [58] AGP version 2.0
Capabilities: [50] Power Management version 2
[...]
Darstellungshardware: Zur Darstellung kann fast jeder noch so exotische Monitortyp
verwendet werden, insofern man seine genauen Daten kennt. Zu früheren Zeiten
mussten verschiedene Frequenzen des Darstellungsgerätes genau bekannt sein und es
kam vor, dass ein Monitor bei falschen Eingaben abgeraucht ist. Um solche Dinge
zu vermeiden gibt es einige Vorgaben die auf den heutigen Multysinc-Monitoren sehr
gut funktionieren.
36.3
XFree86-Pakete installieren
XFree86 gibt es in verschiedenen Versionen in RPMs oder Debian Paketen. Bei der alten
Version 3 musste der ganze X-Server auf das Chipset abgestimmt sein. Bei den neueren
Version 4 wurde ein modulares Design verwirklicht, welches die Chipsetspezifischen Teile
dynamisch zulädt. Um unter Debian die Version 4 zu installieren benötigt man das Paket
xserver-xfree86, welches schon viele Treiber mitbringt und weitere, benötigte Pakete
nachlädt.
229
36.4
Vorkompilierte XFree86-Binaries installieren
Die neusten Versionen mit den neusten Treibern für XFree86 brauchen immer etwas Zeit bis
sie Eingang in die offiziellen Distributionen finden. Insbesondere Debian benötigt immer
reichlich Zeit. Die gesamten Quellen zu kompilieren empfielt sich für Leute mit viel Geduld,
Zeit und keinen anderen Hobbies und ist somit eigentlich keine Alternative. Ein guter
Zwischenweg sind die vorkompilierten Pakete des XFree86 Projektes. Erhältlich sind sie
von der Webseite des XFree86 Projektes.
Zuerst braucht man das Programm Xinstall.sh. Es kann mit der Option -check herausfinden, welche Binaries man braucht:
mischneider@nephthys:~/tmp$ ./Xinstall.sh -check
Checking which OS you’re running...
uname reports ’Linux’ version ’2.4.22’, architecture ’i686’.
Object format is ’ELF’. libc version is ’6.3.2’ (6.3).
No dist available for glibc 2.3.
Try Linux-ix86-glibc22
Nun müssen wir alle Dateien für dieses Linux herunterladen. Einige Dinge wie Schriften sind in eigenen Paketen. Eine detailiertere Beschreibung befindet sich im Install
Dokument das ebenfalls mit Xinstall.sh heruntergeladen werden kann.
Folgende Dateien braucht es zum Beispiel für XFree86 v4.0.1:
Dateiname
Xinstall.sh
extract
Xbin.tgz
Xlib.tgz
Xman.tgz
Xdoc.tgz
Xfnts.tgz
Xfenc.tgz
Xetc.tgz
Xvar.tgz
Xxserv.tgz
Xmod.tgz
Beschreibung
Installationsscript
Das Werkzeug um die Tarballs zu entpacken
X clients und Werkzeugbibliotheken
Einige Daten die zur Laufzeit gebraucht werden
Manual pages
XFree86 Dokumentation
Basis Schriften
Basis für die Schriftendekodierung
Laufzeit-Konfigurationsdateien
Daten zur Laufzeit
XFree86 X server
XFree86 X server Module
Nach dem Download muss nur noch als root die Datei Xinstall.sh aufgerufen werden.
230
36.5
Konfiguration des X-Servers
Die Konfiguration des X-Servers variiert von Distribution zu Distribution. Grundsätzlich
müssen mit irgendeinem Werkzeug sinnvolle Daten in die Datei XF86Config geschrieben
werden. Diese Datei beinhaltet alle systemspezifische Daten. Der normale Anwender wird
mit der direkten Erstellung überfordert sein, darum wurden einige Werkzeuge entwickelt:
xf86config: Ist ein textbasiertes Werkzeug das vom XFree86 Projekt zur Verfügung gestellt wird. Es fragt die benötigten Informationen direkt vom Benutzer ab und kreiert
eine entsprechende Konfigurationsdatei (XF86Config).
XF86Setup: Wird ebenfalls vom XFree86 Projekt zur Verfügung gestellt und bietet eine
grafische Benutzeroberfläche.
xf86cfg: Dieses Werkzeug wird wie XF86Setup vom XFree86 Projekt zur Verfügung gestellt und bietet wie dieses eine grafische Oberfläche. Im Unterschied zu diesem werden aber die Komponenten als Blockdiagramm dargestellt und der Benutzer kann
die Einstellungen über diese Icons tätigen.
Distributionsspezifische Tools: Verschiedene Distributionshersteller haben eigene
Werkzeuge um die benötigte Konfigurationsdatei herzustellen. RedHat zum Beispiel ist verantwortlich für den Xconfigurator , bei Debian funktioniert es mittels
dpkg-reconfigure xserver-xfree86 .
Abbildung 36.1: Der Bergrüssungsbildschirm von XF86Setup
231
36.6
Beispiel einer XF86Config Datei
Hier ein Beispiel einer XF86Config Datei der Version 4 von XFree86:
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
XF86Config-4 (XFree86 X server configuration file) generated by dexconf, the
Debian X Configuration tool, using values from the debconf database.
Edit this file with caution, and see the XF86Config-4 manual page.
(Type "man XF86Config-4" at the shell prompt.)
This file is automatically updated on xserver-xfree86 package upgrades *only*
if it has not been modified since the last upgrade of the xserver-xfree86
package.
If you have edited this file but would like it to be automatically updated
again, run the following commands as root:
cp /etc/X11/XF86Config-4 /etc/X11/XF86Config-4.custom
md5sum /etc/X11/XF86Config-4 > /var/lib/xfree86/XF86Config-4.md5sum
dpkg-reconfigure xserver-xfree86
Section "Files"
FontPath
"unix/:7100"
# local font server
# if the local font server has problems, we can fall back on these
FontPath
"/usr/lib/X11/fonts/Type1"
FontPath
"/usr/lib/X11/fonts/CID"
FontPath
"/usr/lib/X11/fonts/Speedo"
FontPath
"/usr/lib/X11/fonts/misc"
FontPath
"/usr/lib/X11/fonts/cyrillic"
FontPath
"/usr/lib/X11/fonts/100dpi"
FontPath
"/usr/lib/X11/fonts/75dpi"
EndSection
Section "Module"
Load
"GLcore"
Load
"bitmap"
Load
"dbe"
Load
"ddc"
Load
"dri"
Load
"extmod"
Load
"freetype"
Load
"glx"
Load
"int10"
232
Load
Load
Load
Load
EndSection
"record"
"speedo"
"type1"
"vbe"
Section "InputDevice"
Identifier
"Generic Keyboard"
Driver
"keyboard"
Option
"CoreKeyboard"
Option
"XkbRules"
"xfree86"
Option
"XkbModel"
"pc101"
Option
"XkbLayout"
"de_CH"
Option
"XkbVariant"
"nodeadkeys"
EndSection
Section "InputDevice"
Identifier
"Configured Mouse"
Driver
"mouse"
Option
"CorePointer"
Option
"Device"
"/dev/psaux"
Option
"Protocol"
"PS/2"
Option
"Emulate3Buttons"
"true"
Option
"ZAxisMapping"
"4 5"
EndSection
Section "InputDevice"
Identifier
"Generic Mouse"
Driver
"mouse"
Option
"SendCoreEvents"
"true"
Option
"Device"
"/dev/input/mice"
Option
"Protocol"
"ImPS/2"
Option
"Emulate3Buttons"
"true"
Option
"ZAxisMapping"
"4 5"
EndSection
Section "Device"
Identifier
Driver
ChipID
EndSection
"ATI Radeon Mobility"
"ati"
0x4242
Section "Monitor"
233
Identifier
HorizSync
VertRefresh
Option
EndSection
"LCD Screen"
30-57
43-72
"DPMS"
Section "Screen"
Identifier
"Default Screen"
Device
"ATI Radeon Mobility"
Monitor
"LCD Screen"
DefaultDepth
24
SubSection "Display"
Depth
1
Modes
"1400x1050" "1024x768"
EndSubSection
SubSection "Display"
Depth
4
Modes
"1400x1050" "1024x768"
EndSubSection
SubSection "Display"
Depth
8
Modes
"1400x1050" "1024x768"
EndSubSection
SubSection "Display"
Depth
15
Modes
"1400x1050" "1024x768"
EndSubSection
SubSection "Display"
Depth
16
Modes
"1400x1050" "1024x768"
EndSubSection
SubSection "Display"
Depth
24
Modes
"1400x1050" "1024x768"
EndSubSection
EndSection
Section "ServerLayout"
Identifier
"Default Layout"
Screen
"Default Screen"
InputDevice
"Generic Keyboard"
InputDevice
"Configured Mouse"
InputDevice
"Generic Mouse"
234
"800x600" "640x480"
"800x600" "640x480"
"800x600" "640x480"
"800x600" "640x480"
"800x600" "640x480"
"800x600" "640x480"
EndSection
Section "DRI"
Mode
0666
EndSection
235
Grobe Beschreibung:
ServerLayout: Diese Abteilung verbindet das Anzeigegerät mit einem oder mehr InputDevices. Es können mehrere ServerLayout Abteilungen geschrieben werden, um
mehrbildschirm-Systeme zu konfigurieren.
Files: Diese Abteilung beinhaltet Pfade zu Schriften und Farbinformationen.
InputDevice: Mehrere dieser Abteilungen sollten geschrieben werden, mindestens für
Tastatur und Maus.
Monitor: Hier können verschiedene Modi eines Monitors angegeben werden. Grundsätzlich kennt der X Server aber die standard VESA Modi.
Device: Dies ist der Platz für die Grafiktreiber. Mehrere dieser Abteilungen können
verwendet werden, wenn mehrere Grafikkarten in einem System stecken.
Screen: In dieser Abteilung werden Monitore mit Devices verbunden.
[18] gibt eine gute Übersicht über die einzelnen Tools und eine Vergleichstabelle.
36.7
Tuning mit xvidtune
[19]Natürlich möchte man auch informiert sein, mit welchen Frequenzen XFree86 seinen Job
verrichtet. Herauszubekommen ist dies unter anderem mit dem Programm xvidtune, mit
dem auch allerhand justiert werden kann. Während Konfigurationstools wie xf86config eher
fürs Grobe zuständig sind, übernimmt xvidtune das Feintuning. Dort kann der Bildschirm
verschoben, gestaucht oder gestreckt werden, bis die Position für die Bildröhre erträglich
ist.
Starten sollten Sie dieses Programm unbedingt aus einem X-Terminal (wie dem xterm)
heraus, denn nur dort erfolgt eine Ausgabe: Ein Tastendruck auf den Button Show gibt
im Terminal die aktuell einjustierte Modeline aus. Dies ist eine Steuerzeile, die dem XServer sagt, wie der Monitor betrieben werden soll. Auch in der Konfigurationsdatei bei
XFree86 3.3.x finden sich Modelines. Haben Sie nun eine bessere über xvidtune gefunden,
so tragen Sie die Ausgabe in /etc/X11/XF86Config anstatt der bisherigen Modeline ein.
Dies geschieht in der Section Monitor. Ein Beispiel:
Modeline "1280x1024" 135.00 1280 1312 1456 1712 1024 1027 1030 1064
Bei XFree86 4.x existieren eventuell gar keine Modelines – in diesem Fall fügen Sie die
ermittelte Modeline einfach in der gleichen Sektion ein.
236
Abbildung 36.2: Der spröde Charme von xvidtune
36.8
Schriften in X
X bringt verschiedene Schriften mit, die für die meisten Anwendungen genügen. Es können
aber zusätzliche Schriften installiert werden. Diese Schriften sind oftmals frei erhältlich,
einige können aber auch kommerziell erworben werden. XFree86 stellt alle Schriften die im
FontPath vorhanden sind den Applikationen zur Verfügung. Mit dieser Direktive können
in der Abteilung Files weitere Verzeichnisse hinzugefügt werden.
In folgendem Beispiel werden 7 Verzeichnisse hinzugefügt, in welchen X Schriften suchen
soll:
Section "Files"
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
EndSection
"/usr/lib/X11/fonts/Type1"
"/usr/lib/X11/fonts/CID"
"/usr/lib/X11/fonts/Speedo"
"/usr/lib/X11/fonts/misc"
"/usr/lib/X11/fonts/cyrillic"
"/usr/lib/X11/fonts/100dpi"
"/usr/lib/X11/fonts/75dpi"
237
36.8.1
Schriften installieren
Am einfachsten sind Type1 Schriften zu installieren. Man sollte zuerst ein eigenes Verzeichnis anlegen (zum Beispiel /usr/local/fonts) um bei Upgrades nicht im Wege zu stehen.
Nachdem man alle Schriften in dieses Verzeichnis kopiert hat und es zu XF86Config hinzugefügt hat, muss man das Tool mkfontdir angewendet werden, damit X11 die Schriften
einordnen kann. Danach kann man den X-Server neu starten oder mit xset dynamisch
über die neuen Schriften orientieren:
# xset fp+ /usr/local/fonts
36.8.2
Der X-Fontserver
In einem Netzwerk mit mehreren Computern, kann es ziemlich mühsam sein alle Schriften
auf jeder einzelnen Maschine aktuell zu halten. Darum gibt es den xfs, den X-Fontserver.
Dieser Server kann auf einer Maschine installiert werden und diese stellt allen anderen seine
Schriften zur Verfügung. An sich braucht es mit einem installierten xfs keine FontPath
Anweisungen mehr.
Um die Schriften über xfs zu verwalten muss es folgende Anweisungen im XF86Config
geben:
Section "Files"
RgbPath
"/usr/X11R6/lib/X11/rgb"
FontPath
EndSection
"unix/:-1"
Entweder wird xfs automatisch beim Booten gestartet oder durch Tippen des Kommandos
xfs. Konfiguriert wird er über die Datei /etc/X11/fs/config:
# font server configuration file
# $Xorg: config.cpp,v 1.3 2000/08/17 19:54:19 cpqbld Exp $
# allow a maximum of 10 clients to connect to this font server
client-limit = 10
# when a font server reaches its limit, start up a new one
clone-self = on
# log messages to /var/log/xfs.log (if syslog is not used)
error-file = /var/log/xfs.log
# log errors using syslog
use-syslog = on
# turn off TCP port listening (Unix domain connections are still permitted)
238
no-listen = tcp
# paths to search for fonts
catalogue = /usr/lib/X11/fonts/Type1/,
/usr/lib/X11/fonts/CID/,
/usr/lib/X11/fonts/Speedo/,
/usr/lib/X11/fonts/misc/,
/usr/lib/X11/fonts/cyrillic/,
/usr/lib/X11/fonts/100dpi/,
/usr/lib/X11/fonts/75dpi/
# in decipoints
default-point-size = 120
# x1,y1,x2,y2,...
default-resolutions = 100,100,75,75
# font cache control, specified in kB
cache-hi-mark = 2048
cache-low-mark = 1433
cache-balance = 70
Die einzelnen Zeilen bedeuten folgendes:
catalogue: Hier wird eine Liste von Verzeichnissen angehängt, durch Kommas getrennt,
die xfs nach Schriften durchsuchen soll.
alternate-servers: Eine Liste von weiteren Servern, die Schriften zur Verfügung stellen.
client-limit: Die maximale Anzahl von Clients die bedient wird.
clone-self: Wenn auf on, kopiert sich der Schriftenserver wenn die Anzahl der Xlients
überschritten wird.
36.9
X Applikationen kontrollieren mit .Xresources
oder .Xdefaults
Das X Window System bietet viele Möglichkeiten, das Verhalten und Aussehen anzupassen. Es bietet zum Beispiel ein Interface für Applikationen dass eine einfache Parameterübergabe erlaubt. So können benutzerspezifische Einstellungen im Home-Verzeichnis
jedes Benutzers in der Datei .Xresources oder .Xdefaults (abhängig von der Distribution)
gespeichert werden. Das Format dieser Datei ist:
Programm*Variablenname: Wert
239
Diese Zeile bedeutet folgendes:
Programm: Der Name einer Applikation, wie zum Beispiel xterm.
Variablenname: Wird manchmal auch Resource genannt. Diese Variable kann von der
Applikation ausgelesen werden.
Wert: Ist der Inhalt der Variable der der Applikation übergeben wird.
Ein Kommentar beginnt mit dem Ausrufezeichen. Hier ist ein Beispiel dass die Farben für
xterm festlegt:
! Set the Colors
xterm*background: Black
xterm*foreground: Wheat
xterm*cursorColor: Orchid
xterm*reverseVideo: false
240
Kapitel 37
Einrichten eines Display Managers
Der X-Display Manager oder xdm kann X-Sitzungen lokal oder über das Netzwerk managen. Er ersetzt zum Beispiel den textbasierten Login mit einem schönen, aufgepeppten
grafischen Login. Neben xdm gibt es auch noch gdm von Gnome und kdm des KDEProjekts.
37.1
Display Manager von Hand ausführen
Der folgende Abschnitt behandelt exemplarisch xdm. Dasselbe gilt aber ebenso für kdm
und gdm. Der xdm kann mit dem Kommando xdm gestartet werden. xdm Startet den XServer und zeigt den grafischen Login. Nach dem Ausloggen startet sich xdm von Neuem
und steht wieder zur Verfügung. So richtig Sinn macht das nicht, und so sind die meisten
Distributionen so eingerichtet, dass xdm schon beim Booten gestartet wird.
Gestoppt werden kann xdm mit dem Kommando killall xdm. Man sollte alledings sicher
sein, dass niemand mehr eingeloggt ist, denn unter Umständen können so Daten verloren
gehen.
Wichtig ist, dass die Terminals normalerweise weiter zur Verfügung stehen und mit
<ctrl>+<Alt>+<F1> bis <ctrl>+<Alt>+<F6> aufgerufen werden können. Zurück zu X
kommt man normalerweise mit <Alt>+<F7> oder bei Knoppix mit <Alt>+<F5>.
37.2
Display Manager automatisch starten
Es hat sich eingebürgert, auf Wunsch den grafischen Login im Runlevel 5 zu starten. Dafür
muss die Datei /etc/inittab um folgende Zeile ergänzt werden (xdm ist auf Wunsch durch
kdm oder gdm zu ersetzen):
# Run xdm in runlevel 5
241
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon
37.3
X-Terminals
37.3.1
Was sind X-Terminals
X-Terminals oder X-Stations sind spezielle Computer, welche normalerweise nur einen XServer eingebaut haben und eine Tastatur und einen Monitor ansteuern können. Da sie nur
die Darstellung übernehmen und die Rechenleistung einer Applikation auf einem X-Client
stattfindet, können sie günstiger produziert werden als eine voll ausgebaute Workstation. Obwohl es solche Terminals schon sehr lange gibt, werden sie neuerdings mit dem
Schlagwort Thin-Clients bezeichnet.
37.3.2
Display Manager für X-Terminals
Um einen Display Manager (xdm, gdm oder kdm) auf einem Host für ein X-Terminal zu
benutzen, muss dieser auf dem Host installiert sein und laufen. Er wartet dabei auf eine
Verbindung von einem X-Terminal aus mittels XDMCP (XDM Control Protocol) auf Port
177. Der Host reagiert darauf mit einem grafischen Loginscreen auf dem Terminal, das
gleich aussieht wie auf dem Host lokal.
Der Zugriff auf den Host kann begrenzt werden mit Hilfe der Datei /etc/X11/xdm/Xaccess.
Hier ein Beispiel das alle terminals der Domäne local.com und alle Terminals die auf nice
enden in der Domäne hacker.com verbinden lässt. Alle anderen sind gesperrt:
*.local.com
*nice.hacker.com
!*
37.4
Konfiguration von xdm
xdm ist teil des XFree86 Projektes und befindet sich im Verzeichnis /etc/X11/xdm.
37.4.1
Dateien für xdm
Wichtige Dateien sind:
Xaccess: Diese Datei kontrolliert Verbindungsanfragen anderer Hosts.
242
Xresources: Diese Datei ist identisch zur Datei .Xresources (Siehe Kapitel 36.9) und
beinhaltet Konfigurationsdaten für xdm, inklusive dem grafischen Login, der durch
das Editieren dieser Datei verändert werden kann.
Xservers: Diese Datei verbindet die virtuellen Display-Namen (:0, :1, ...) entweder mit
dem lokalen oder mit einem fremden X-Server.
Xsession: Diese Datei beinhaltet alle Scripts die bei einem erfolgreichen Login von xdm
ausgeführt werden. Normalerweise wird nach einer Datei .xsession im Homeverzeichnis des Benutzers gesucht und die Kommandos darin ausgeführt. Wenn es keine
solche Datei gibt, werden Vorgaben benutzt.
Xsetup 0: Diese Datei wird als root ausgeführt, bevor der grafische Login angezeigt wird.
Es beinhaltet oftmals Kommandos um die Farben zu setzen, Grafiken anzuzeigen oder
andere Programme zu starten.
xdm-config: Diese Datei verbindet Konfigurationen mit den obengenannten Dateien.
Normalerweise muss es nicht editiert werden.
37.4.2
Detailierte Konfiguration von xdm
Texte und Farben von xdm können in der Datei /etc/X11/xdm/Xresources im bekannten
Format (siehe 36.9) editiert werden:
! Xresources file
xlogin*borderWidth: 10
xlogin*greeting: Welcome to Linux on CLIENTHOST
xlogin*namePrompt: Login:\040
xlogin*fail: Login incorrect - try again!
xlogin*failColor: red
xlogin*Foreground: Yellow
xlogin*Background: MidnightBlue
Um dem X-Server Kommandozeilen-Optionen mitzugeben, muss die Datei
/etc/X11/xdm/Xservers editiert werden. Um zum Beispiel auf 24 Bit Farbtiefe zu
schalten kann folgender Eintrag verwendet werden:
# Xservers file
:0 local /usr/X11R6/bin/X -bpp 24
Um die Sache noch mehr aufzupeppen können in der Datei /etc/X11/xdm/Xsetup 0 weitere Programme gestartet werden. Hier wird zum Beispiel der Hintergrund (das Rootfenster)
auf eine feste Farbe gesetzt und unten rechts eine Uhr eingebelendet. Da die Uhr nicht
automatisch terminiert und zum aufrufenden Programm zurückkehrt, wird sie mittels & in
den Hintergrund geschickt:
243
#!/bin/sh
# Xsetup
/usr/X11R6/bin/xsetroot -solid "#A4D299"
/usr/X11R6/bin/xclock -digital -update 1 -geometry -5-5 &
37.5
Konfiguration von kdm
KDM kann nach dem Einrichten komfortabel über das KDE Control Center (kcontrol)
konfiguriert werden. Unter System Administration ⇒ Login Manager können viele Einzelheiten eingestellt werden:
ˆ Texte für die Willkommensmeldung
ˆ Hintergrundbild/Hintergrundfarbe
ˆ Anzuzeigende Benutzer
ˆ Automatisches Einloggen eines Benutzers
ˆ Berechtigungen für Shutdown und Reboot
ˆ ...
Ansonsten findet man im Verzeichnis /etc/X11/kdm dieselben Dateien wie die oben für
xdm genannten plus einer mit Namen kdmrc. Im Notfall können diese auch direkt editiert
werden
37.6
Konfiguration von gdm
Gdm ist der Gnome Display Manager und er kann mit verschiedenen, sog. Themes
verändert werden. Themes steuern dabei das Hintergrundbild, die Farben, die Schriften,
die Anordnung auf dem Bildschirm, etc.
Konfiguriert werden kann gdm ebenfalls mit der Grafischen Oberfläche oder durch die
Dateien im /etc/X11/gdm Verzeichnis. Die wichtigste dabei ist gdm.conf welche alle Konfigurationsparameter beinhaltet. Unterverzeichnisse beinhalten Scripts die bei bestimmten
Ereignissen aufgerufen werden. Für ein tieferes Verständnis lohnt es sich, das GDM Reference Manual zu lesen (http://www.jirka.org/gdm.html).
244
Abbildung 37.1: Konfiguration von kdm
Abbildung 37.2: GDM ist themeable
245
Kapitel 38
Installation und Anpassung eines
Windowmanagers
X11 an sich bringt noch nicht viel. Es ist die Grundlage für eine grafische Oberfläche und
nicht die grafische Oberfläche an sich. Die ganze Infrastruktur zum Erzeugen und Verwalten von Fenstern und weiteren Elementen wird von einem Windowmanager übernommen.
Windowmanager gibt es wie Sand am Meer. Es gibt kleine und einfache wie twm oder fvwm
und ganze Desktop Environements wie kde und Gnome welche neben der grafischen Kontrolle weitere Dienste anbieten wie Interprozesskommunikation, eine Entwicklerbibliothek,
Systemschnittstellen, etc. Wichtig ist: Applikationen die mit den Gnome Bibliotheken
geschrieben wurden laufen auch unter KDE oder jedem anderen Window Manager und
umgekehrt, sie sind dann aber nicht in die Umgebung integriert.
38.1
Starten von X
XFree86 kann gestartet werden durch die Eingabe von X auf der Kommandozeile. Ohne Windowmanager macht es aber keinen Spass und so muss dieser neben X auch noch
gestartet werden.
38.2
Der XFree86 Start Ablauf
Wenn wir keinen Desktop Manager verwenden, läuft der Startvorgang folgendermassen ab
(bei Verwendung von startx):
1. Der Benutzer gibt startx auf der Kommandozeile ein. startx wird vom XFree86
Projekt mitgeliefert und wird oft von Distributionsherstellern und Administratoren
angepasst. startx ist ein Frontend für xinit
246
2. startx ruft xinit auf mit zwei Argumenten:
(a) Ein Script mit allen X-Programmen, die gestartet werden sollen. Normalerweise ist dies die Datei .xinitrc im Homeverzeichnis des Benutzers oder die
systemweite Datei /etc/X11/xinit/xinitrc.
(b) Serveroptionen wie Zugrifskontrolle (X authority), etc.
3. xinit startet XFree86 und das Xinitrc-Script
4. XFree86 startet
5. Eventuell wird ein Display Manager gestartet
6. Die lokale Datei .xsession wird ausgeführt.
7. Clientprogramme und ein Windowmanager aus Xinitrc werden gestartet.
38.3
Beispiel eines Xinitrc-Skripts
Ein Beispiel der Datei /etc/X11/xinit/xinitrc welches Resourcen aus verschiedenen
Dateien liest und die Tastatur einstellt und danach den Windowmanager twm startet:
#!/bin/sh
# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 rws Exp $
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap
# merge in defaults and keymaps
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi
if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
if [ -f $userresources ]; then
xrdb -merge $userresources
fi
247
if [ -f $usermodmap ]; then
xmodmap $usermodmap
fi
# start some nice programs
(sleep 1; xclock -geometry 50x50-1+1) &
(sleep 1; xterm -geometry 80x50+494+51) &
(sleep 1; xterm -geometry 80x20+494-0) &
exec twm
38.4
Anpassen der Windowmanager
Die möglichkeiten, Windowmanager anzupassen und zu konfigurieren sind vielfältig und
unterscheiden sich von Manager zu Manager. Normalerweise können sie, wenn sie einmal
laufen, mit einem GUI konfiguriert werden (Bsp: kcontrol für kde).
Textbasiert macht kde ein Verzeichnis mit Namen .kde im Homeverzeichnis des entsprechenden Users. twm benutzt die Datei .twmrc im Homeverzeichnis oder die Systemweite
Konfiguration /etc/X11/twm/system.twmrc.
38.5
xterm
Eine der wichtigsten Applikationen für den Systemadministrator ist die sogenannte Terminalemulation.
Diese stellt eine Kommandozeile unter X dar.
Sie bieten dabei eine Vielzahl von Hilfen und Konfigurationsmöglichkeiten. xterm als Urvater aller Terminalemulationen speichert die Konfigurationen systemweit in der Datei /usr/lib/X11/app-defaults/XTerm, welche von der Datei .Xdefaults im HomeVerzeichnis überschrieben werden kann. Hier ein Ausschnitt:
! $Xorg: XTerm.ad,v 1.3 2000/08/17 19:55:08 cpqbld Exp $
!
!
!
!
! $XFree86: xc/programs/xterm/XTerm.ad,v 3.22 2002/01/05 22:05:02 dickey Exp $
XTerm.JoinSession:False
*SimpleMenu*BackingStore: NotUseful
248
*SimpleMenu*menuLabel.font: -adobe-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-*
*SimpleMenu*menuLabel.vertSpace:
100
*SimpleMenu*HorizontalMargins: 16
*SimpleMenu*Sme.height: 16
*SimpleMenu*Cursor: left_ptr
*fontMenu.Label: VT Fonts
*fontMenu*fontdefault*Label:
Default
*fontMenu*font1*Label: Unreadable
*VT100*font1:
nil2
*IconFont:
nil2
Für die LPI-Prüfung sollte man mit der Konfiguration mindestens einer Terminalemulation
vertraut sein (xterm, rvxt, aterm, ...)
38.6
X-Libraries
XFree86 wird mit allen Bibliotheken (Libraries) ausgeliefert, die traditionelle XApplikationen benötigen. Grössere Window Manager KDE, Gnome bringen eigene Libraries mit, die Applikationen die speziell für diese Manager geschrieben wurden benötigen.
Um zum Beispiel GIMP (ein berühmtes open source Zeichnungsprogramm) zu starten,
werden die Gnome-Bibliotheken benötigt, auch wenn man GIMP unter KDE startet.
Um manuell Bibliotheksabhhängigkeiten zu finden, kann man das Kommando ldd benutzen, wie in Kapitel 24.1.1 auf Seite 162 beschrieben.
38.7
xhost
Um dem X-Server mitzuteilen, welche Client-Rechner er akzeptieren soll, existiert das
Kommando xhost - das ebenfalls ein Client ist und selbst der Zugangskontrolle unterliegt.
Für den einfachen Gebrauch von xhost existieren mehrere Aufrufe:
xhost: fragt den Server, von welchen Rechnern Clients Verbindung aufnehmen dürfen,
und gibt diese Liste aus.
xhost +Rechnername: ab jetzt sind auch Clients auf Rechnername befugt, den Server
zu kontaktieren.
xhost -Rechnername: ab jetzt sind Clients auf Rechnername nicht (mehr) befugt, den
Server zu kontaktieren. Bestehende Verbindungen bleiben erhalten.
249
xhost +: Alle Computer, die den Server grundsätzlich erreichen können, dürfen das auch.
Jegliche Zugangsüberwachung ist abgeschaltet. Nicht empfehlenswert aber einfach.
xhost -: Die Zugangskontrolle ist (wieder) aktiv; nur die Rechner, die der Server kennt,
dürfen eine Verbindung beginnen.
Statt eines Hostnamens ist auch die IP-Nummer verwendbar.
Wenn dieser Mechanismus vorrangig vom Server verwendet wird, befindet sich nach Start
der Sitzung nur der Rechner in der Liste, auf dem die Sitzung abläuft. Wäre die Liste leer,
so könnte kein einziger Client etwas tun.
38.8
Die DISPLAY Variable
Die Ausgabe jedes Programmes kann – sofern alles richtig konfiguriert wurde – auf einen
über das Netwerk verbundenen X-Server oder auf ein lokales, virtuelles Terminal umgeleitet
werden. Wo die Ausgabe erscheint, bestimmt die Umgebungsvariable DISPLAY. Sie hat
die Form:
[Host]:Anzeige[.Bildschirm]
Wobei gilt:
Host: Ist die Adresse des gewünschten Hosts. Wenn sie weggelassen wird, wird der lokale
Host als Ziel angenommen.
Anzeige: Ist die gewünschte Anzeige. Ein System kann mehrere, unabhängige Anzeigen
besitzen.
Bildschirm: Ist der gewünschte Bildschirm bei Systemen mit mehreren Monitoren. Diese
Angabe kann weggelassen werden.
Beispiele:
ˆ Standardeinstellung für den Lokalen Rechner: :0
ˆ xterm auf dem Rechner Cassandra starten und auf dem rechner Nephtys anzeigen
lassen:
michael@cassandra:~> export DISPLAY=nephtys:0
michael@cassandra:~> xterm
ˆ xterm auf dem Rechner Cassandra starten und auf dem rechner 192.168.1.129 anzeigen lassen:
250
michael@cassandra:~> export DISPLAY=192.168.1.129:0
michael@cassandra:~> xterm
Ein weiteres Besipiel soll zeigen, wie eine zweite X-Ausgabe (:1) auf dem lokalen Rechner
gestartet werden kann, so dass ein Benutzer problemlos eingeloggt bleiben kann während
ein anderer arbeitet:
1. Mit <Ctrl>+<Alt>+<F1> auf ein Textterminal wechseln.
2. Auf dem Textterminal einloggen.
3. startx -- :1
4. Nun kann mittels <Ctrl>+<Alt>+<F7> und <Ctrl>+<Alt>+<F8> gewechselt werden.
251
Teil VII
Anhang
252
Anhang A
Glossar
GUI: Graphical User Interface, die grafische Oberfläche.
253
Anhang B
Lösungen
B.1
Aufgaben Kapitel 5.6.3
Seite 33:
export PS1="Hallo"
B.2
Aufgaben Kapitel 5.6.3
Seite 34:
1. ls : /bin/ls
2. export : Shell builtin
3. echo : /bin/ls
4. groups : /usr/bin
B.3
Aufgaben Kapitel 5.7.1
Seite 35:
^etc^var
254
Literaturverzeichnis
[1] Jeffrey Dean: LPI Linux Certification in a nutshell, O’Reilly, First Edition, June 2001
61
[2] Linux Professional Institute, LPI Homepage
http://www.lpi.org
[3] knopper.net: Knoppix
http://www.knopper.net/knoppix/ 3
[4] Ole Vanhoefer: FIBEL.ORG, 19.01.2003
http://www.fibel.org/linux/node338.html 71, 72
[5] LunetIX: Das Linuxhandbuch, 1997
http://www.linux-ag.de/linux/LHB/node90.html 69
[6] Christian Koller: Reguläre Ausdrücke / Regular Expressions, 2000-2003
http://www.aspheute.com/artikel/20000829.htm 73
[7] Frank Gehde, Arbeitsgemeinschaft Intranet: Regular Expressions - Reguläre Ausdrücke, 19.08.2001
http://www.ag-intra.net/linux-al-regex.html 73
[8] Thomas Ermer, Michael Meyer: Die Linuxfibel
http://www.linuxfibel.de 10
[9] F. Kalhammer: LPIC 101 Study-Guide, 2002
http://www.linux-praxis.de/lpic1/lpi101/index.html 178
[10] Charles M. Kozierok: The PC-Guide, 2001
http://www.pcguide.com/ref/hdd/bios/modesLBA-c.html 151
[11] The Linux Documentation Project
http://www.tldp.org 192, 195
[12] Steven Pritchard: Linux Hardware Compatibility HOWTO, 2002
http://www.tldp.org/HOWTO/Hardware-HOWTO/ 192
255
[13] Alexandre J.: The Winmodems-and-Linux HOWTO, 2001
http://www.tldp.org/HOWTO/Winmodems-and-Linux-HOWTO.html 195
[14] Carsten Dinkelmann und Marko Meyer, Zwickau Linux User Group e.V., Überblick über das Betriebssystem Linux, http://wwwstud.fh-zwickau.de/~linux/
projekte/Linux-Kurs/Linux-Kurs_html/script.html 15
[15] Wikipedia, die freie Enzyklopädie, Linux-Kernel, http://de.wikipedia.org/wiki/
Linux-Kernel 16
[16] Mario Eberlein, freenet.de AG, Jedem sein eigener Kernel, http://freenet.meome.
de/app/fn/artcont_portal_news_article.jsp/76676.html 17
[17] Linux Wiki, x11, Oktober 2003, http://www.linuxwiki.de/X11 226
[18] Andreas Huchler, Linux User Magazin, Helfer für´s Grobe, 21.02.2001, http://www.
linux-user.de/ausgabe/2000/11/026-xconf/xconf.html 236
[19] Jo Moskalewski, Linux User Magazin, Das Kreuz mit dem X, 04.11.2002, http://
www.linux-user.de/ausgabe/2001/12/028-x/X-4.html 236
256
Index
., 53
.., 53
&, 69
˜, 53
/bin, 87, 133
BIOS, 179, 187
Setup, 188
BIOS-Setup, siehe BIOS
/boot, 87, 133
access-mode, siehe Berechtigungen
Boot-Prozess, 148
Adressbus, siehe Bus
Bootmanagers, 147
ADSL, 196
bunzip2, 158
AGP, 215
Bus
alien, 166
Adressbus, 179
apropos, 141
AGP, 215
apt, 167
Datenbus, 179
apt-cache, 169
ISA-Bus, 178
apt-get, 166, 169
PCI-Bus, 178
apt.conf.d, 168
SCSI, 203, 205
Ausführungsberechtigung, siehe Berechti- bzip2, 158
gungen
cat, 39
autoconf, 158
chat, 197
Backticks, 36
chgrp, 124
Backup, 145
chmod, 118
Bash, 28
chown, 123
Basic Input Output System, siehe BIOS
configure, 158
Berechtigungen
cp, 53
Ausführung, 115
cut, 40
Lesen, 115
oktal, 116
Daemon-Processes, 64
Schreiben, 115
Dateidatenbank, siehe Zentrale DateidatenSGID, 116, 117
bank
spezielle, 116
Dateisysteme, 84
Sticky Bit, 116, 117
ext2, 92, 103
SUID, 116
ext3, 92, 103
symbolische, 119
iso9660, 103
bg, 69
msdos, 104
257
nfs, 104
ntfs, 104
reiserfs, 92
swap, 104
USBDevFS, 221
vfat, 104
xfs, 92
Datenbus, siehe Bus
debugfs, 101
/dev, 87, 133
df, 95
Direct Memory Access, siehe DMA
Diskquotas, siehe Quotas
DISPLAY, 250
DMA, 181
Channels, 181
dmesg, 154
dpkg, 166, 170
dpkg-reconfigure, 171, 231
dpkg.cfg, 171
dselect, 166, 172
du, 96
dumpe2fs, 101
Dynamic Loader, 162
e2fsck, 98
edquota, 110
Eigentümer, 114
Elternprozess, 64
env, 33
Erweiterte Partitionen, siehe Partitionen
/etc, 87, 133
expand, 41
ext2, siehe Dateisysteme
ext3, siehe Dateisysteme
fdisk, 88
Festplattenaufteilung, 144
fg, 69
FHS, siehe Filesystem Hierarchy Standard
Filesystem Hierarchy Standard, 132
find, 37, 54, 139
first-stage loader, 148
fmt, 41
FontPath, 237
fsck, 99
fsck.ext2, 98
fsck.ext3, 98
fsck.minix, 98
fsck.msdos, 98
fsck.vfat, 98
fsck.xfs, 98
reiserfsck, 98
fstab, 102
fvwm, 246
gdm, 241
GID, 64
globbing, 57
Globs, 57
Gnome, 246
GRUB, 153
gunzip, 157
gzip, 157
Hardlinks, 126
head, 41
History, 34
/home, 87, 133
hotplug, 223
IDE, 84
Inode, 54, 95
inodes, 91
insmod, 23
Interrupt Request Channel, siehe Interrupts
Interrupt-Handler, siehe Interrupts
Interrupt-Request, siehe Interrupts
Interrupt-Tabelle, siehe Interrupts
Interrupts, 180
Handler, 180
IRQ, 180
Request, 180
sharing, 181
Tabelle, 180
IO-Adresse, 179
IRQ, siehe Interrupts
258
IRQ-sharing, siehe Interrupts
ISA-Bus, siehe Bus
ISA-Karten, 182, 209
isapnp, 210
iso9660, siehe Dateisysteme
Job Management, 69
jobs, 69
join, 42
kcontrol, 244
kde, 246
kdm, 241
Kernel, 15
kill, 67
killall, 68
Kinderprozesse, 64
Knoppix, 2
Kommandozeile, 26
Large Block Architecture, siehe LBA
LBA, 190
LD LIBRARY PATH, 164
ldconfig, 163
ldd, 162
Leseberechtigung, siehe Berechtigungen
/lib, 87, 134
LILO, 149
lilo, 150
Links, 126
auffinden, 130
echte, siehe Hardlinks
erstellen, 129
kopieren, 131
symbolische, siehe Symlinks
Typen, 126
LiveDistribution, 2
ln, 129
locate, 142
Logische Partitionen, siehe Partitionen
lsmod, 23
lspci, 215
lsusb, 223
make, 159
Makefile, 158
Master Boot Record, 148
Memory-Base, 183
minicom, 195
mkdir, 55
mke2fs, 101
mkfontdir, 238
mkfs, 92
mkdosfs, 92
mke2fs, 92
mkswap, 94
/mnt, 134
Modem, 192
Befehle, 194
Winmodem, 195
modprobe, 23
Module, 22
modules.conf, 23
mount, 105
mount points, 86
mtab, 105
mv, 55
nfs, siehe Dateisysteme
nice, 71
nice-Number, 71
nl, 43
nohup, 69
ntfs, siehe Dateisysteme
od, 44
OHCI, siehe USB
OLDPWD, 34
Open Sound System, siehe OSS
/opt, 134
Orphans, 68
OSS, 201
Partitionen, 84
erweiterte, 85
logische, 86
primäre, 85
paste, 45
259
PATH, 33, 138
Pattern, 73
PCI-Bus, siehe Bus
PCI-Karten, 182, 214
Pfad, 52
PID, 63
Pipes, 60
Plug and Play, 182, 209
pnpdump, 210
PPID, 64
PPP, 195
PPP-Deamon, 196
pppd, 196
pr, 46
Primäre Partitionen, siehe Partitionen
/proc, 134, 183
Harwareparameter, 183, 184
Kernelinformation, 185
Softwareinformation, 185
Systeminformation, 186
.profile, 32
Prompt, 28
Prozess, 63
ps, 64
PS1, 33
PS2, 33
pstree, 65
PWD, 34
pwd, 34
quota, 108
quotacheck, 109
Quotalimiten, siehe Quotas
quotaoff, 109
quotaon, 108
Quotas, 107, 111
Limiten, 107
Redirection, 60
Regular Expressions, 73
reiserfs, siehe Dateisysteme
renice, 72
repquota, 110
rm, 56
rmdir, 56
rmmod, 23
/root, 134
root-Dateisystem, 86, 132
Root-Verzeichnis, 52
Rootfenster, 243
rpm, 173
Abfrage, 175
Deinstallation, 174
Installation/Upgrade, 174
Verifikationsmodus, 175
/sbin, 87, 135
Schreibberechtigung, siehe Berechtigungen
SCSI, 84, 85, 203
BIOS, 206
Booten von, 206
Fast-SCSI, 204
Gerätenamen, 208
Hostadapter, 203
ID, 205
SCSI2, 204
SCSI3, 204
Ultra-SCSI, 204
Wides-SCSI, 204
SCSI-Bus, siehe Bus
SCSI-ID, siehe SCSI
SCSI2, 204
SCSI3, 204
scsi info, 208
sed, 50
setserial, 192, 217
SGID, siehe Berechtigungen
Shared Libraries, 161
Shell, 28
Shell-Variablen, 32
Signale, 67
SLIP, 195
slocate, 142
Small Computer System Interface, siehe SCSI
sndconfig, 202
260
Softlinks, siehe Symlinks
sort, 46
Soundkarten, 201
sources.list, 168
Speicherplatz, 95
split, 47
startx, 246
STDERR, 28
STDIN, 28
STDOUT, 28
Sticky Bit, siehe Berechtigungen
Subprozess, 64
SUID, siehe Berechtigungen
Superblock, 90
swap, siehe Dateisysteme
/swap, 87, 144
Symlinks, 127
tac, 47
tail, 48
tar, 156
Tastaturhilfen, 35
tee, 61
/tmp, 87, 135
top, 66
touch, 57
tr, 48
tune2fs, 101
twm, 246
Schichtenmodell, 221
UHCI, 218
USBDevFS, 221
usbmgr, 224
USBDevFS, siehe Dateisysteme
usbmgr, 224
usbmodules, 224
/usr, 87, 135, 136
/var, 87, 135, 137
vfat, siehe Dateisysteme
VI, 80
wc, 49
whatis, 140
whereis, 139
which, 139
Wildcards, 29, 57
Windowmanager, 246
Winmodem, siehe Modem
wvdial, 199
X, 226
X-Stations, 242
X-Terminals, 242
X11, 226
Xaccess, 242
xargs, 61
Xconfigurator, 231
.Xdefaults, 239
xdm, 241
UART, 193
XDMCP, 242
UHCI, siehe USB
xf86cfg, 231
UID, 64
XF86Config, 231
umask, 120
xf86config, 231
Umgebungsvariablen, 31
XF86Setup, 231
umount, 106
XFree86, 228
unexpand, 49
xfs, siehe Dateisysteme, 238
uniq, 49
Universal Asynchronous Receiver Transmit- xhost, 249
xinit, 246
ter, siehe UART
.xinitrc, 247
unset, 32
Xinstall.sh, 230
USB, 218
.Xresources, 239
OHCI, 218
.xsession, 243, 247
261
xset, 238
xterm, 248
xvidtune, 236
Zentrale Dateidatenbank, 141
Zombie, 68
Zugriffskontrolle, siehe Berechtigungen
Zugriffsrechte, siehe Berechtigungen
262
Herunterladen