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