Archiv der Kategorie: LPIC-1[101]

1.103.2 Texte mittels Filterprogrammen bearbeiten

lupus

Quelle für 1.103 Bild

Aus dem Kapitel 1.103 GNU und Unix Kommandos
Prüfungskandidaten sollten in der Lage sein, Filter auf Textströme anzuwenden. Dieses Lernziel beinhaltet das Senden von Textdateien und -ausgaben durch Textfilterprogramme, um die Ausgabe zu modifizieren, und die Verwendung von Standard-Unix-Kommandos, die im GNU textutils Paket enthalten sind.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* cat, cut, expand, ,fmt, head, join, nl, od, paste, pr, sed, sort, split, tac, tail, tr, unexpand, uniq, wc

Textfilter

Unter Unix werden sehr viele kleine Programme angeboten, die als Filter für Textdateien zur Anwendung kommen und die in der Regel nur eine kleine Aufgabe beherrschen. Durch die Kombination mehrerer solcher Programme mit Pipes und Umleitungen (siehe Abschnitt 1.103.4 – Benutzen von Unix Streams, Pipes und Umleitungen) können dadurch vielfältige Aufgaben gelöst werden. Die in dieser Zielsetzung genannten Textfilter sollten Sie beherrschen. Hier nochmal zu diesen Filtern ein paar Kurzbeschreibungen. Grundsätzlich ist das Studium der jeweiligen Handbuchseiten hier sehr empfehlenswert…

sed

sed ist ein Stream-Editor, ein Editor, der Datenströme oder Dateien nach bestimmten Regeln bearbeitet. sed ist ein sehr komplexes Programm, von dem in der LPI-101-Prüfung nur sehr geringe Kenntnisse verlangt werden. Wichtig ist zu wissen, daß dieses Werkzeug in der Lage ist, immer wiederkehrende Aufgaben mit Hilfe einer Scriptdatei zu lösen.
Ein Beispiel mag das verdeutlichen:
Sie haben 500 Textdateien, in denen immer wieder der Begriff „Synopsis“ vorkommt. Sie wollen diesen Begriff nach „Syntax“ ändern. Außerdem soll jeweils die 3. Zeile jeder dieser Dateien gelöscht werden. Das wäre unglaublich viel Arbeit, hätten wir nicht das Programm sed. Der Streameditor erlaubt uns verschiedene Aktionen auf einen Datenstrom auszuführen. Dazu erstellen wir eine Datei, die die notwendigen Befehle enthält. Nennen wir sie „befehle“:

1,$s/Synopsis/Syntax/g
3d

Jede Zeile enthält einen Befehl. Jeder Befehl besteht aus einer Adress-Angabe und dem Befehl selbst. Die erste Zeile hat die Adressangabe 1,$, was soviel heißt wie von der ersten Zeile bis zum Dateiende. Der Befehl ist s – das steht für substitute – also ersetzen. Der Befehl s hat die Form:
s/Suchbegriff/Ersetzungsbegriff/Optionen
Als Option haben wir g benutzt, was heißt, daß eine Zeile global durchsucht werden soll, nicht nur das erste Auftreten, sondern jedes soll ersetzt werden.
Die zweite Zeile unserer Datei ist noch einfacher, ihr Adress-Teil ist einfach die 3 und meint also Zeile 3. Der Befehl ist d und steht für delete also löschen. Es ist also die Anweisung, die Zeile 3 zu löschen.
Um diese Befehlsdatei jetzt anzuwenden, schreiben wir nur noch:
sed -f befehle Datei > Datei_neu
und schon wurde die Datei Datei bearbeitet. Das Ergebnis steht jetzt in Datei_neu. Eine kleine Schleife konstruiert, und schon könnten wir alle 500 Dateien mit einem Aufwasch bearbeiten…

Wie gesagt, die LPI 101-Prüfung besteht nicht darauf, daß Sie den sed vollständig beherrschen, aber ein paar Übungen dazu sind nicht verkehrt. Genauere Beschreibungen, was dieses Programm für Befehle versteht finden Sie auf der sed-Handbuchseite, oder hier: sed

sort

Dieses kleine Programm sortiert einen Eingabedatenstrom oder eine Datei zeilenweise und gibt das Ergebnis wieder auf die Standard-Ausgabe aus.

Normalerweise werden die ganzen Zeilen verglichen, um sie zu sortieren. Es ist aber auch möglich, Zeilen nach einem bestimmten Positionsfeld zu sortieren. Ein Beispiel:

Der Befehl ls -l gibt uns eine Liste aller Dateien im aktuellen Verzeichnis aus. Ab Spalte 31 steht die Dateigröße. Würden wir den Befehl

ls -l | sort

eingeben, dann würden die gesamten Zeilen sortiert. Das macht wenig Sinn, denn die Zeilen beginnen ja immer mit der Angabe der Zugriffsrechte und die zu sortieren ist sicher nicht das, was wir wollen. Um die Ausgabe nach Dateigröße zu sortieren können wir eingeben:

ls -l | sort +0.32

Dabei bedeutet 0.32 das erste Feld (0) und davon alles, ab dem 31. Buchstaben. (Die Angabe von Feldern bezieht sich auf Dateien, die tatsächlich feldorientiert aufgebaut sind, wie etwa /etc/passwd)

Alle Optionen und Möglichkeiten entnehmen Sie wieder der sort-Handbuchseite, oder hier: sort
1.103.2 Texte mittels Filterprogrammen bearbeiten weiterlesen

(281)

1.103.1 Arbeiten auf der Kommandozeile

lupus

Quelle für 1.103 Bild

Aus dem Kapitel 1.103 GNU und Unix Kommandos
Prüfungskandidaten sollten in der Lage sein, mit Shell und Kommandos auf der Kommandozeile umzugehen. Das beinhaltet das Schreiben gültiger Kommandos und Kommandoabfolgen, das Definieren, Referenzieren und Exportieren von Umgebungsvariablen, die Benutzung der Kommando-History und Eingabemöglichkeiten, das Aufrufen von Kommandos im und außerhalb des Suchpfades, das Benutzen von Kommandosubstitution, das rekursive Anwenden von Kommandos über einen Verzeichnisbaum und das Verwenden von man, um Informationen über Kommandos zu erhalten.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* ., bash, echo, env, exec, export, man, pwd, set, unset, ~/.bash_history, ~/.profile
An dieser Stelle werden noch nicht viele Kommandos vorausgesetzt. Trotzdem sollten grundlegende Befehle wie less, more, cat, echo, … klar sein und problemlos verwendet werden können.

Grundsätzlich ist ein Unix-Kommando immer gleich aufgebaut. Zuerst wird das Programm angegeben, dann optionale Parameter und dann die Dateien, auf die das Programm angewandt werden soll.

Parameter liegen meist in zwei verschiedenen Formen vor, einmal als kurze Form, eingeleitet durch einen Bindestrich gefolgt von einem Buchstaben (wie etwa -r) und andererseits als lange Form, eingeleitet durch zwei Bindestriche gefolgt von einem Wort (–recursive). Kurze Parameter können dabei meist zusammengefasst werden, so daß statt -z -v -f einfach -zvf geschrieben werden kann. Das erklärt auch, warum lange Parameter mit zwei Bindestrichen beginnen. Sonst könnte ja ein –recursive als -r -e -c -u -r -s -i -v -e missinterpretiert werden.
Kommandoeingabe
Grundsätzlich ist die Eingabe von Kommandos eine Eingabe an die Shell (bash). Die Shell interpretiert das eingegebene Kommando, ersetzt bestimmte Muster durch Dateinamen oder Variableninhalte und führt erst dann das Kommando aus.

Linux-Kommandos werden entweder einfach eingegeben, oder zusammen mit dem Pfad, der die genaue Position des aufzurufenden Programmes im Dateisystem festlegt. Normalerweise reicht der Aufruf eines Kommandos ohne Pfad, wenn das Kommando im Suchpfad liegt.
1.103.1 Arbeiten auf der Kommandozeile weiterlesen

(505)

1.101 Hardware und Systemarchitektur

Eat228

Wikimedia Commons Frank Dickert

Übersicht: Linux Zertifizierung LPIC-1 [101]
In diesem Abschnitt geht es darum, verschiedene Einstellungen vorzunehmen, die als Grundvoraussetzung gelten, damit Linux überhaupt auf einem Computer arbeiten kann, bzw. damit eine bestimmte Hardware angesprochen werden kann. In der ersten Ausgabe der LPIC-Level 1 Prüfungen war dieses Thema zum zweiten Prüfungsteil zugeordnet, jetzt ist es beim ersten gelandet.
Artikel zu diesen Bereichen:
1.101 Hardwareparameter
1.101 Das /proc-Dateisystem
1.101 Plug and Play für Linux
1.101.1 Konfiguration grundlegender BIOS-Einstellungen
1.101.3 Konfiguration von Modem 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

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. Dazu folgen hier ein paar Seiten, die diese notwendigen Grundlagen vermitteln sollen. In den einzelnen späteren Kapiteln sind meist Verweise auf diese Grundlagen gegeben.
Alle Artikel zur LPIC unterliegen der GNU Free Documentation License.
Quellen, Weblinks:
Debian GNU/LInux Anwenderhandbuch
LPIe.V. German
Linux Professional Institute
Linux

(410)

1.101 – Hardwareparameter

800px-Siberian_Tiger_sf

Wikimedia Commons Mila Zinkova

Aus dem Bereich 1.101 Hardware und Systemarchitektur der Unterlangen für die Linux Zertifizierung LPIC-1 [101]

Hardwareparameter

Jedes Stück Hardware, das wir installieren 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 {de:PCI-Bus} nutzen, kümmern sich selbst um die Einstellungen dieser Parameter, ältere Erweiterungskarten für den {de:ISA-Bus} müssen von Hand konfiguriert werden. Damit unter Linux Hardwareerweiterungen korrekt installiert werden können, ist es notwendig etwas Basiswissen über die grundlegende Funktion solcher Karten zu besitzen. Diese Grundlageninformation soll hier auf die Schnelle vermittelt werden. Im Rahmen dieser Darstellung ist es natürlich nicht möglich, einen umfassenden Kurs über die verschiedenen Mechanismen der Erweiterungskarten abzuhalten, es soll versucht werden, sich auf die wesentlichen Grundlagen zu beschränken. Diese Darstellung 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.
Funktionsweise von {de:Mainboard}s
Das Herz jedes Computers ist der {de:Prozessor_(Hardware)|Prozessor} . Er verarbeitet die Befehle, die er aus Programmen erhält. Programme sind in diesem Zusammenhang natürlich nicht nur Anwenderprogramme, sondern auch das Betriebssystem und die von ihm verwendeten Gerätetreiber sowie das {de:BIOS} â�� 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 Bus-Systeme zurück. Dabei handelt es sich zunächst einmal einfach um elektrische Verbindungen zwischen dem Prozessor und anderen Teilen des Computers.
Der wichtigste Teil des Computers â�� neben dem Prozessor â�� ist der {de:Arbeitsspeicher} . Er besteht aus einer großen 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 muß er zunächst einmal die Adresse dieser Speicherzelle auf den Adressbus schreiben. Dadurch öffnet sich ein Kanal auf dem Datenbus, vom Prozessor zu der angegebenen Speicherzelle. Erst jetzt können Daten auf diesem Weg übertragen werden.
Hardwareadressen
Aus der Sicht des Prozessors sind auch Zugriffe auf alle mögliche Hardware nur Speicherzugriffe. Das bedeutet, dass auch die andere Hardware des Computers entsprechende Adressen besitzen muss. 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. Also benötigt er die genaue Adresse der seriellen Schnittstelle. 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. Jedes Stück Hardware, auf das der Prozessor zugreifen soll, muss also eine Adresse haben. Man spricht in diesem Zusammenhang von der IO-Adresse. Ein anderer Begriff für diese Adresse ist ioport. Diese Hardware-Adresse 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 zu installierender Hardware (Erweiterungskarten) ist die Adresse meist einstellbar, so dass es zu keinerlei Doppelbelegung einzelner Adressen kommen kann. Denn das würde zwangsläufig zu Fehlfunktionen führen. 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.
Das Interrupt-System
In einem Computersystem arbeitet der Prozessor jetzt also einzelne Programmanweisungen ab, die aus dem Speicher gelesen werden und die dann Ein- und Ausgaben auf Adressen vornehmen können. Es ist jetzt aber notwendig, dass die Abarbeitung dieser Programmanweisungen zu bestimmten Gelegenheiten unterbrochen werden müssen. In diesem Zusammenhang sprechen wir von {de:Interrupt}s . Ein Interrupt ist eine Unterbrechung des normalen Programmablaufs, um eine andere Aufgabe auszuführen. 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 Computer 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 an der IO-Adresse der Tastatur an. Nur leider weiß der Prozessor das noch nicht, hat also 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 den zu dieser Anforderung passenden Interrupt aus. Das heißt, er führt ein kleines Programm aus, und kehrt dann zum normalen Programmablauf zurück.
Eine zwingende Voraussetzung ist es dabei aber, dass der Prozessor wiederum genau weiß, welche Interrupt-Anforderung von welchem Gerät kommt. Nur so kann er das passende Interrupt-Programm starten, das auch zu der entsprechenden Hardware gehört.
Wenn also Hardware installiert werden soll, die nicht nur Ausgaben, sondern auch Eingaben an den Computer ermöglicht, dann muss dieser Hardware ein sogenannter Interrupt Request Channel oder kurz {de:Interrupt_Request|IRQ} zugewiesen werden. Wie schon bei der IO-Adresse muss der Prozessor jetzt wieder genau wissen, welcher IRQ von welcher Hardware kommt.
Einige IRQs sind bereits standardmäßig von Systemhardware belegt, andere stehen für Erweiterungen zur Verfügung. Die folgende Tabelle zeigt die gängigste Belegung eines
Standard-AT Systems:
Wenn zwei Geräte auf ein- und demselben IRQ liegen, so ist die Gefahr eines Konfliktes sehr groß. COM2 und COM4 liegen z.B. standardmäßig auf dem IRQ 3. Sollten Sie also versuchen, mit einem Modem an COM4 und einer Maus an COM2 gleichzeitig zu arbeiten, kann das nicht richtig funktionieren. Moderne Rechner sind â�� zumindestens in einigen Fällen etwa bei {de:Peripheral_Component_Interconnect|PCI-Erweiterungskarten} â�� in der Lage sich IRQs zwischen mehreren Erweiterungen zu teilen (IRQ-sharing).
Das DMA-System
Unter dem Begriff {de:Direct_Memory_Access|DMA} versteht man den direkten Speicherzugriff 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 dieses Feature zu ermöglichen sind sogenannte DMA-Kanäle vorgesehen, von denen der Rechner wiederum nicht besonders viele anbietet. Ein Standard-PC bietet acht DMA-Kanäle an, von denen einer stets belegt ist (DMA4).
Auch hier haben wir aber wiederum die Notwendigkeit, dass die Hardware wissen muss, welchen DMA-Kanal sie benutzen darf, und der Prozessor auch weiß, welche Hardware welchen Kanal benutzt. Genauso wie bei IRQs ist es essentiell, dass jeder DMA-Kanal nur von einer Hardwareinstanz benutzt wird, damit es nicht zu schweren Konflikten kommt.
Einstellmöglichkeiten der Hardwareparameter
Die drei genannten Hardwareparameter IO-Adresse, IRQ und eventuell DMA-Kanal müssen für jede neu zu installierende Hardware eingestellt werden. Wichtig ist dabei, dass grundsätzlich jede Hardware eine IO-Adresse benötigt, Hardware, die Eingaben zulässt, dazu einen IRQ braucht und Hardware, die über direkten Speicherzugriff verfügt, zusätzlich noch einen DMA-Kanal benötigt.
Die Frage der Einstellung ist hier eine bilaterale Frage, denn die genannten 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 verwendeter Erweiterungskartengeneration. Im Folgenden sollen kurz die üblichen Verfahren erläutert werden:
Feste Hardware auf dem Mainboard
Fest auf dem Mainboard integrierte Hardware wie z.B. serielle Schnittstellen bekommen ihre Einstellungen über das BIOS-Setup Programm. Dort kann eingestellt werden, welche Adressen und welche IRQs diese Schnittstellen benutzen. In der Regel sind hier zwei oder drei feste Einstellungsmöglichkeiten vorgegeben.
Sehr alte {de:Industry_Standard_Architecture|ISA-Erweiterungskarten}
Auf sehr alten Karten müssen sämtliche Einstellungen hardwaremäßig vorgenommen werden. Das heißt 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 Siebdruck-Aufdruck, der die jeweiligen Einstellungen erklärt.
Etwas modernere ISA-Erweiterungskarten
Etwas modernere Karten besitzen kleine Festspeicher ({de:EEPROM}S , Flash-EPROMS) die softwaremäßig 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äßig einstellbar. Die genannten drei Methoden bedingen grundsätzlich, dass auch das Betriebssystem bzw. damit der Prozessor erfährt, welche Einstellungen getroffen wurden. Wie oben schon gesagt, nur wenn beide Seiten (Hard- und Software) die gleiche Information haben, kann die Ansteuerung der Hardware funktionieren.
Modernere Systeme versuchen den Einbau von Erweiterungskarten dahingehend zu vereinfachen, dass die Karte und das Betriebssystem sich gegenseitig einigen, welche Parameter sie benutzen. Damit sollen auch Nicht-Spezialisten in die Lage versetzt werden, neue Hardware einzubauen. In diesem Zusammenhang ist häufig das Schlagwort „Plug And Play“ zu hören, als etwa „einstecken und loslegen“.
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 Abschnitt 1.101.5 werden wir uns damit auseinandersetzen, wie diese Art von Karten unter Linux zum Laufen gebracht 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 aushandeln, so dass hier keine manuellen Einstellungen mehr notwendig sind.
Speicherbereiche
Manche Erweiterungskarten besitzen einen eigenen Speicher auf der Karte, entweder einen wirklichen Arbeitsspeicher, wie etwa der Bildschirmspeicher auf der Graphikkarte oder einen EPROM mit eigenem BIOS, wie z.B. Graphikkarten und 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 (die Basisadresse des Kartenspeichers).

Alle Artikel zur LPIC unterliegen der GNU Free Documentation License.

(542)

1.102.4 Shared Libraries

800px-Siberian_Tiger_sf

Wikimedia Commons – Mila Zinkova

Aus dem Bereich 1.102 Installation und Paketmanagement der Unterlangen für die Linux Zertifizierung LPIC-1 [101]
Verwaltung von Shared Libraries
Prüfungskandidaten sollten in der Lage sein, Shared Libraries, die von ausführbaren Programmen benötigt werden, zu bestimmen und nötigenfalls zu installieren. Sie sollten ebenfalls fähig sein, anzugeben wo sich die Systembibliotheken befinden.
Die wichtigsten Dateien, Bezeichnungen und Anwendungen:
* ldd
* ldconfig
* /etc/ld.so.conf
* LD_LIBRARY_PATH
Die Technik der Shared Libraries
Shared Libraries sind Funktionsbibliotheken, die von mehreren Programmen benutzt werden können und die so nur einmal in den Speicher geladen werden müssen, anstatt für jedes Programm extra Platz zu verschwenden. Normalerweise würde ein Programm beim Linkvorgang (dem Vorgang, bei dem alle Objektdateien und die Systemlibraries zur ausführbaren Datei zusammengefügt werden) mit allen Libraries, aus denen das Programm Funktionen benötigt, statisch gelinkt. Das würde aber bedeuten, daß Programme, die gleichzeitig laufen, diese Funktionsbibliotheken – jedes Programm für sich – in den Speicher laden müsste. Die shared library Technik verhindert das. Ein Programm, das geladen wird, überprüft, ob die notwendigen Libraries schon im Arbeitsspeicher liegen. Tun sie das, so läd sich das Programm in den Arbeitsspeicher und benutzt einfach die schon geladenen Libraries. Liegen die benötigten Libraries noch nicht im Arbeitsspeicher, so werden sie zunächst geladen und erst dann läd sich das Programm.
So wird jede benötigte Library nur einmal in den Speicher geladen, was gerade in einem System, das viele Programme gleichzeitig geladen hält eine enorme Speichereinsparung bewirkt.
Wenn ein Programm geladen wird, dann muß es eine Instanz geben, die den geschilderten Vorgang startet. Denn das Programm selbst kann das nicht tun, es wird ja erst geladen, wenn die nötigen Libraries auch schon geladen sind. Diese Instanz ist sozusagen der Programmlader oder der sogenannte dynamische Linker und Lader. Der Name dieses Programms ist ld.so.

ld.so läd die shared libraries, die ein Programm benötigt, bereitet dann das Programm entsprechend vor und läd es selbst. Die shared libraries, die das zu ladende Programm benötigt, werden in der folgenden Reihenfolge gesucht:
* Alle Pfade, die in der Umgebungsvariable LD_LIBRARY_PATH eingetragen sind, werden nach den Libraries durchsucht. LD_LIBRARY_PATH ist eine Shellvariable, die eine durch Doppelpunkte getrennte Liste von Verzeichnissen enthält.
* Die Datei /etc/ld.so.cache enthält eine binäre Liste aller Librarie-Kandidaten, die schon vorher in den genannten Verzeichnissen gefunden wurden. (siehe weiter unten bei ldconfig.)
* Die Verzeichnisse /usr/lib und /lib werden durchsucht.
Ein Linux-Programm wird also von einem speziellen Programmlader (ld.so) geladen, der die notwendigen Libraries gleich mitläd. Aus diesem Grund ist es nötig, daß jedes Programm, das installiert wird, auch die entsprechenden Libraries mitinstalliert bzw. überprüft, ob sie schon installiert sind. Die Verwaltung dieser Libraries obliegt der Systemverwaltung.
Welches Programm braucht welche Library?
Um herauszufinden, welche Shared Libraries ein bestimmtes Programm benutzt, gibt es das kleine Programm ldd. Dieses Programm gibt eine Liste aller Libraries zurück, die das Programm benötigt, daß als Parameter ldd mitgegeben wurde. Um z.B. herauszubekommen, welche Libraries das Programm ls benötigt, schreiben wir
ldd /bin/ls
Das zu untersuchende Programm muß mit vollem Pfad angegeben werden. Die Ausgabe wäre für unser Beispiel dann etwas in der Art:
librt.so.1 => /lib/librt.so.1 (0x40022000)
libc.so.6 => /lib/libc.so.6 (0x40033000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4014e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Daraus geht hervor, daß das Programm ls vom Linker/Loader /lib/ld-linux.so.2 gestartet werden will und die Libraries librt.so.1, libc.so.6 und libpthread.so.0 benötigt. In der rechten Spalte sind die Fundorte der Libraries im Dateisystem zu lesen.
Wenn ein Programm neu installiert wird, so kann mit Hilfe dieses Befehls herausgefunden werden, ob alle Libraries für das Programm existieren oder ob einige nachinstalliert werden müssen.
Libraries installieren und aktualisieren
Wenn neue Libraries installiert werden sollen, dann stellt sich die Frage, wohin. Zunächst einmal bieten sich die Verzeichnisse /lib, /usr/lib und /usr/local/lib an. Sollen aber neue Verzeichnisse angelegt werden, die Libraries enthalten, dann muß das der internen Verwaltung der Libraries mitgeteilt werden.
Die interne Verwaltung der Libraries wird durch den Aufruf des Programms ldconfig vollzogen. Dieses Programm wartet den Library Cache und erstellt automatisch die notwendigen symbolischen Links auf Libraries. Der Librarie-Cache liegt in der Datei /etc/ld.so.cache und enthält eine binär codierte Liste aller dem System bekannten Libraries.
Damit ldconfig diese Datei erstellen kann und auch neu hinzugekommene Libraries dort aufgenommen werden, muß ldconfig wissen, welche Verzeichnisse nach Libraries durchsucht werden sollen. ldconfig durchsucht zunächst die beiden Verzeichnisse /usr/lib und /lib, danach alle Verzeichnisse, die in der Datei /etc/ld.so.conf aufgelistet sind.
Wenn also ein neues Programm foo installiert wird, das seine Shared Libraries im Verzeichnis /usr/local/foo/lib ablegt, so müssen wir nur dieses Verzeichnis in die Datei /etc/ld.so.conf aufnehmen. Nach der Installation neuer Libraries und/oder der Neuaufnahme von Pfaden in der Datei /etc/ld.so.conf muß das Programm ldconfig ausgeführt werden, bevor die neuen Libraries verwendet werden können. Erst nach dem Aufruf von ldconfig stehen sie ja in der Datei /etc/ld.so.cache und sind somit dem Linker/Loader bekannt.
Alle Artikel zur LPIC unterliegen der GNU Free Documentation License.

Quellen, Weblinks:

(307)