Yet Another Useless Unix Book

! zum Inhaltsverzeichnis
< zum vorangehenden Abschnitt:


4 Das FreeBSD-Ports-Konzept

4.1 Software-Installation

Software auf einem Unix-System zu installieren gestaltet sich, will man es intelligent, homogen und auf benutzerfreundliche Weise machen, doch oft schwieriger als es auf den ersten Blick scheint. Schnell verliert man den Überblick über installierte Programme und deren Versionen, erst recht wenn man diese in einem ganzen Netz installieren muß. Spätestens wenn sich die Kapazität der Festplatte dem Ende zuneigt und man versucht Nichtbenötigtes zu löschen oder temporär ``auszulagern'', merkt man in welchen Ecken des Filesystems sich ein Programm überall hininstalliert hat: Konfigurationsdateien, Manualpages, weiterführende Dokumentation, evtl. benötigte Bibliotheken und nicht zuletzt das ausführbare Programm (oder mehrere) liegen über die Festplatte verteilt und lassen sich oft nur schwer als zusammengehörend erkennen.
Eine Möglichkeit zumindest den gröbsten Wildwuchs zu vermeiden, ist das gewissenhafte Editieren des zu den Programm-Sourcen mitgelieferten Makefile um dort auf die Gegebenheiten des verwendeten Systems einzugehen und so die einzelnen Programmbestandteile an möglichst zentralen Stellen zu installieren (make install). Dies verhindert zwar das sich jedes Programm an anderer Stelle im System installiert, eine Kontrolle was alles und wohin installiert wurde hat man damit aber noch nicht.

4.2 Package-Systeme

Viele moderne Unix-Systeme (u.a. Solaris, Linux und FreeBSD) gehen deshalb einen für den Anwender sehr einfachen und komfortablen Weg: Programme samt allem benötigten Zubehör werden für das System fertig compiliert in einem ``Packet'', dem sog. Package, geliefert. dieses muß der Anwender, die nötigen Rechte vorrausgesetzt, nur noch mit einem Befehl (z.B. pkg_add(1)) installieren. Bei diesem Vorgang wird das Package ausgepackt, alle benötigten Dateien an sinnvolle Stellen kopiert und das ganze in einer Datenbank vermerkt. Anhand dieser Datenbank ist es jederzeit möglich, nachzuvollziehen was alles für dieses Programm installiert wurde. Dadurch gestaltet sich auch das Entfernen (z.B. mit pkg_delete(1)) denkbar einfach, da das System nur noch in der Datenbank nach der Aufzeichung suchen muß, die dort vermerken Datein löschen und den Eintrag aus der Datenbank entfernen. Unter FreeBSD befindet sich diese Datenbank im Verzeichnis /var/db/pkg/. Darunter ist für jedes installierte Package ein Verzeichnis mit dem Programmnamen als Verzeichnisnamen zu finden, welches ein File mit den für das Programm installierten Dateien enthält (+CONTENTS). Zusätzlich finden soch dort noch zwei Dateien, welche Beschreibungen für diese Software (eine Einzeilen-Version, eine ausführlichere Variante) enthalten. Diese werden z.B. von Package-Verwaltungsprogramme wie pkg_info(1) angezeigt. Mit diesem Kommando läßt sich (mit der Option -aI) auch anzeigen welche Packages sich auf dem System befinden.
Das unter Linux sehr verbreitete RPM-Format und das Solaris-Packagesystem arbeiten ähnlich wie oben beschrieben. Allen gemeinsam ist der Nachteil das das Programm schon fertig compiliert, und somit evtl. nicht an die eigenen Bedürfnisse angepaßt, geliefert wird. Programm-Sourcen um eigene Einstellungen, die nur vor dem Compilieren möglich sind, vorzunehmen, sind nicht in solchen Packages enthalten. Zudem ist man vom Willen der System-Hersteller oder Programmautoren, auch solche Pakete für das entsprechende System anzufertigen und zu verteilen (FTP, CDROMs), abhängig. Auch Abhängigkeiten zwischen verschiedenen Packeten, wenn also der Betrieb eines bestimmten Programms das Vorhandensein eines anderen bedingt, sind meißt nur in Form einer kurzen Warnung zu finden.

4.3 Die Kombination: Ports

Die Vorteile des Package-Systems zu genießen und trotzdem möglichst unabhängig von vor-compilierten Programmen und dem Goodwill der Autoren oder freiwilliger Package-Maintainer zu sein, veranlaßte die FreeBSD-Entwickler das sog. Ports-System zu erstellen. Bei dieser Art der Software-Verwaltung wird sich ausschließlich auf die Original-Quellen des jeweiligen Programmautors gestützt und mit Hilfe der für jeden Port verfügbaren Patches*34* das Programm compiliert und, basierend auf dem Package-System, verwaltet. Dies setzt natürlich vorraus das sich jemand für das Erstellen und die Aktualität eines solchen ``Ports'' zuständig fühlt. Erledigt wird dies durch die Port-Maintainer, welche sich jeweils für ein oder mehrere Ports verantwortlich zeichnen. Die für den Port benötigten Quellen, sucht das System zuerst im Verzeichnis /usr/ports/distfiles/ und versucht sie per FTP oder HTTP von der Home-Site oder einem anderen Server zu bekommen, wenn sie sich nicht in diesem Verzeichnis befinden. Nachdem sie über das Netz geholt wurden, werden sie dann in /usr/ports/distfiles/ abgelegt. Im Verzeichnis /usr/ports/ befinden sich mehrere Unterverzeichnisse, welche eine grobe Gliederung in Kategorien (System-Utilities, X11-Programme, Netzwerk-Programme, News- und Mail-Systeme und -Clients, usw.) darstellen, darunter jeweils ein Verzeichnis pro Port, also jedes Programmpacket welches von FreeBSD bzw. einem Maintainer als Port unterstützt wird. Als Beispiel sei hier der Port für die ``pdksh'', der Public-Domain Korn-Shell, näher erklärt. Alle anderen Ports halten sich aber streng an die beschriebenen Mechanismen.

Das Verzeichnis /usr/ports/shells/pdksh/ sieht in etwa so aus:
drwxrwxr-x  2 root  wheel  512 Apr  6 18:18 CVS
-rw-rw-r--  1 root  wheel  374 Nov 18 12:39 Makefile
drwxrwxr-x  3 root  wheel  512 Apr  6 18:18 files
drwxrwxr-x  3 root  wheel  512 Apr  6 18:18 patches
drwxrwxr-x  3 root  wheel  512 Apr  6 18:18 pkg

Im Folgenden seien die wichtichsten Dateien erklärt:
opp@semmel2:/usr/ports/shells/pdksh% cat Makefile 
# New ports collection makefile for:    pdksh
# Version required:     5.2.12
# Date created:         23 May 1995
# Whom:                 thomas@ghpc8.ihf.rwth-aachen.de
#
# $Id: Makefile,v 1.16 1996/11/18 11:39:51 asami Exp $
#

DISTNAME=       pdksh-5.2.12
CATEGORIES=     shells
MASTER_SITES=   ftp://ftp.cs.mun.ca/pub/pdksh/

MAINTAINER=     tg@freebsd.org

GNU_CONFIGURE=  yes
MAN1=           ksh.1

.include <bsd.port.mk>

opp@semmel2:/usr/ports/shells/pdksh% cat files/md5 
MD5 (pdksh-5.2.12.tar.gz) = b622d7b961dbb6dc9cccd237a68ff151

opp@semmel2:/usr/ports/shells/pdksh% ls -l patches/
total 2
drwxrwxr-x  2 root  wheel  512 Apr  6 18:18 CVS
-rw-rw-r--  1 root  wheel  313 Nov  5  1996 patch-aa

opp@semmel2:/usr/ports/shells/pdksh% cat pkg/COMMENT 
The Public Domain Korn Shell.

opp@semmel2:/usr/ports/shells/pdksh% cat pkg/DESCR   
PDKSH is the Public Domain Korn Shell. Its command language is a
superset of the sh(1) shell language.

opp@semmel2:/usr/ports/shells/pdksh% cat pkg/PLIST 
bin/ksh
@exec echo "updating /etc/shells"; cp /etc/shells /etc/shells.bak;
(grep -v %D/%F /etc/shells.bak; echo %D/%F) >/etc/shells
@unexec echo "updating /etc/shells"; cp /etc/shells /etc/shells.bak;
(grep -v %D/%F /etc/shells.bak) >/etc/shells
man/man1/ksh.1.gz

Zum Compilieren des Ports genügt ein einfaches make in diesem Verzeichnis:
opp@semmel2:/usr/ports/shells/pdksh% make
>> Checksum OK for pdksh-5.2.12.tar.gz.
===>  Extracting for pdksh-5.2.12
===>  Patching for pdksh-5.2.12
===>  Applying FreeBSD patches for pdksh-5.2.12
===>  Configuring for pdksh-5.2.12
creating cache ./config.cache
checking for gcc... cc
[....]
creating ./config.status
creating Makefile
creating config.h
===>  Building for pdksh-5.2.12
CONFIG_FILES="" CONFIG_HEADERS=config.h ./config.status
creating config.h
config.h is unchanged
date > stamp-h
cc -c  -DHAVE_CONFIG_H -I. -I. -O alloc.c
[...]

Dieses ``make'' entpackt im Unterverzeichnis work/ die Sourcen, bereitet sie anhand der Patches optimal für FreeBSD vor und compiliert das Programm, so wie es der Autor vorgesehen hat. Es kann jederzeit in diesen Vorgang eingegriffen werden um z.B. Änderungen der Konfiguration vorzunehmen.
Ein ``make install'' installiert das Programmm im System und registriert es im Package-System:
opp@semmel2:/usr/ports/shells/pdksh% sudo make install
>> Checksum OK for pdksh-5.2.12.tar.gz.
===>  Installing for pdksh-5.2.12
./mkinstalldirs /usr/local/bin /usr/local/man/man1
install -c -s -o bin -g bin -m 555 ksh /usr/local/bin/`echo ksh|sed 's,x,x,'`
/usr/bin/install -c -o bin -g bin -m 644 ksh.1
/usr/local/man/man1/`echo ksh|sed 's,x,x,'`.1
NOTE: /etc/shells does not contain /usr/local/bin/ksh  you should add
it if you want to set your shell to ksh
===>   Compressing manual pages for pdksh-5.2.12
===>  Registering installation for pdksh-5.2.12

Mit einem ``make clean'' wird das Verzeichnis work/ gelöscht und somit alles nichtmehr benötigte entfernt.
*34* Änderungen im Quellcode von Programmen um sie möglichst optimal an das vorhandene System anzupassen, bekannte Bugs zu entfernen oder spezielle Features zu implementieren.

This document was converted from LaTeX using Karl Ewald's latex2html.