Paketverwaltung und Ports

OpenBSD ist im Gegensatz zu Linux ein vollständiges Betriebssystem, das nicht nur aus einem Kernel besteht, sondern aus einem Basissystem mit allen grundlegenden Unixbefehlen, sowie einigen weiteren Diensten. Mit dem OpenBSD Basissystem wird außerdem auch X.org als Basis für grafische Oberflächen mitgeliefert.

Meistens wird man jedoch für den Betrieb eines OpenBSD-Systems auch einige nicht im Basissystem existierenden Programme installieren wollen. Für solche Drittanbieterprogramme gibt es in OpenBSD, ähnlich wie bei vielen Linuxdistributionen ein Paketsystem zum installieren und deinstallieren von für OpenBSD vorkompilierter Software. Neben diesem Paketsystem existiert auch noch das sogenannte Portssystem. Das Portssystem ist eine Verzeichnishierarchie, in dem sich vorgefertigte Makefiles befinden, mit denen man vollautomatisch Quellcode aus dem Internet herunter laden, patchen, kompilieren und als Paket installieren kann. Das Portssystem ist damit auch gleichzeitig die Quelle für die vorgefertigten Packages. Beim installieren aus Ports, wird immer auch ein Paket erstellt.

Das Basissystem von OpenBSD läßt sich nicht mit den Paketkommandos verwalten.

Paketsystem

OpenBSD benutzt für seine ganze Paketverwaltung 3 einfache Befehle: pkg_add, pkg_info und pkg_delete. Die Pakete selbst sind Gzip-komprimierte Tarbälle, die außer dem eigentlichen Programm noch ein paar Metainformationen (Installscripts, Abhängigkeitsinformationen, etc.) enthalten. Paketnamen enthalten immer als erstes den Namen des Programms, dann die Versionsnummer, dann eventuell (falls vorhanden) den sogenannten Flavor und dann als Endung immer .tgz. Flavors sind Varianten von Packages. Gibt es bei einem Programm z. B. die Möglichkeit, es mit X11 Unterstützung oder ohne solche Unterstützung zu kompilieren, dann kann es das Flavor no_x11 geben, was dann ein Paket ohne die optionale X11 Unterstützung ist.

Möchte man ein Paket installieren, macht man das mit dem Kommando pkg_add:

pkg_add paketname-1.0.0.tgz

So kann man Verfahren, wenn das Paket direkt auf der Festplatte vorliegt. Praktischer ist es jedoch, wenn man sich immer das neueste Paket per FTP oder HTTP aus einem Repository holen kann. Auch das geht mit pkg_add. Damit pkg_add weiß wo es sich Pakete hollen soll, gibt es die Umgebungsvariable PKG_PATH. Der Wert von PKG_PATH wird als Pfad zu den Paketquellen von pkg_add ausgewertet. Man kann dabei auch mehrere durch Doppelpunkt getrennte Paketquellen angeben:

export PKG_PATH="/mnt/cdrom/4.5/packages/i386/:
ftp://ftp.openbsd.org/pub/OpenBSD/4.5/packages/i386/:
http://meinlanserver/OpenBSD/4.5/packages/i386/"

In diesem Beispiel ist die Zeile wegen der Breite umgebrochen, jedoch sollte diese Zeile ohne Zeilenumbrüche eingegeben werden. Hier werden 3 Pfade angegeben: Ein lokaler Pfad nach /mnt/cdrom/4.5/packages/i386/ über den man z. B. vom offiziellen CD-Set Packages installieren kann, sofern die CD nach /mnt/cdrom gemountet wurde, ein FTP-Pfad auf den offiziellen Haupt-FTP-Server für OpenBSD und als letztes ein Pfad auf einen eigenen Lan-internen Webserver. Hat man diese Umgebungsvariable definiert, genügt zur Paketinstallation nur noch den Namen des gewünschten Paketes anzugeben:

pkg_add bash

pkg_add wird nun an jeder der in PKG_PATH angegebenen Pfade in der angegebenen Reihenfolge nach einem Paket suchen, welches mit dem Namen "bash" anfängt, dann eine Versionsnummer hat und dann die Endung .tgz. Abhängigkeiten werden nun automatisch mit installiert. Gibt es mehrere Möglichkeiten, wird man eine Fehlermeldung erhalten. Möchte man stattdessen eine Auswahl bei mehreren Möglichkeiten erhalten, gibt es den Parameter -i für pkg_add:

pkg_add -i bash

Dies wird bei mehreren Möglichkeiten eine Auswahl anzeigen, welches der in Frage kommenden Pakete installiert werden soll.

Am geschicktesten ist es die Variable PKG_PATH in einer Start- oder Profildatei der Shell zu definieren, damit diese immer automatisch zur Verfügung steht.

Üblicherweise liegen Packages in öffentlichen FTP-Servern in einer Verzeichnisstruktur mit folgenden Aufbau:

/pub/OpenBSD/<Version>/packages/<Hardwarearchitektur>/

pkg_add kennt auch einen Updatemodus für bereits installierte Pakete mit dem Parameter -u. Möchte man alle installierten Pakete updaten, gibt man folgendes Kommando an:

pkg_add -ui

Dies wird alle installierten Pakete mit den Versionen die im PKG_PATH zur Verfügung stehen vergleichen und eventuelle Updates installieren, bzw. bei unterschiedlichen Versionen fragen, welche installiert werden soll.

Informationen über bereits installierte Pakete erhält man mit dem Kommando pkg_info. Gibt man nur das Kommando ohne weitere Parameter an, erhält man eine Liste aller installierten Pakete.

Installiert man ein Paket, erhält man bei manchen Paketen eine kurze informative Nachricht, in der z. B. Informationen stehen, wie man dieses Programm speziell unter OpenBSD nutzt, oder welche speziellen Anpassungen dieses Programm unter OpenBSD hat. Diese Installationsnachricht kann man sich mit pkg_info auch nachträglich noch mal mit dem Parameter -M anzeigen lassen:

pkg_info -M postfix

Möchte man zu einem installierten Paket wissen, welche Dateien zu diesem Paket gehören, gibt es den Parameter -L:

pkg_info -L postfix

Dies gibt eine Liste aller Dateien aus, die durch die Installation des Pakets "postfix" ins System gelangt sind.

Möchte man nicht die installierten Pakete abfragen, sondern wissen welche Pakete, sich über die per PKG_PATH konfigurierten Repositories installieren lassen, gibt es den Parameter -Q:

pkg_info -Q gwenview

Dieser Befehl sucht in allen per PKG_PATH konfigurierten Repositories nach Paketen deren Name "gwenview" enthält und gibt die Suchtreffer aus.

pkg_info hat darüber hinaus noch viele weitere Optionen, die man am besten in der Manpage zu pkg_info nachliest.

Möchte man Pakete löschen, läßt sich dies mit dem Kommando pkg_delete machen:

pkg_delete postfix

Dies löscht das Paket postfix. Eventuell ebenfalls bei der Paketinstallation mitinstallierte Abhängigkeiten werden dabei nicht gelöscht, da das Paketsystem selbst nicht entscheiden kann, ob die als Abhängigkeit installierten Pakete weiter gebraucht werden oder nicht.

Damit sich jedoch mit der Zeit nicht immer mehr ungenutzte Abhängigkeiten auf dem System ansammeln, gibt es einen einfachen Trick: Mit dem Kommando:

pkg_info -t

lassen sich Pakete anzeigen, die von keinem anderen Paket als Abhängigkeit gebraucht werden. Befindet sich in dieser Liste ein Paket, das man nicht kennt oder von dem man nicht weiß wofür man es braucht, bzw. weiß das man es nicht braucht, so kann man dieses Paket ebenfalls löschen.

Eigene Repositories

Ein eigenes Paketrepository für OpenBSD ist sehr einfach zu erstellen. Betreibt man in seinem Lan z. B. einen eigenen FTP- oder Webserver muß man nur alle Pakete die man anbieten möchte in ein Verzeichnis des FTP- oder Webservers packen und dieses auf den Clients für PKG_PATH verwenden. Speziell auf einem Webserver muß auch noch in dem Paketverzeichnis eine index.txt Datei erstellt werden. Diese Datei enthält einfach eine Liste aller angebotenen Pakete und läßt sich auf einem OpenBSD System sehr einfach erstellen:

ls -1 > index.txt

Diese Datei dient dann zur Ermittlung welche Pakete das Repository vorhält. Auf einem FTP-Server ist die Datei nicht unbedingt erforderlich, da bei FTP der Client über die Nutzung von Wildcard Zeichen, die Versionsnummer eines gewünschten Pakets auch weglassen kann und trotzdem einen Treffer erhält, was bei HTTP im Gegensatz zu FTP nicht möglich ist.

OpenBSD selbst enthält im Basissystem den simplen BSD-FTPD, als auch eine modifizierte OpenBSD-Version des Apache 1.3 Webservers, womit das Basissystem alles bereit stellt um einen eigenen Paketserver im Lan zur Verfügung zu stellen.

Generell empfehle ich bei eigenen Paketrepositories sich an die oben bereits erwähnten üblichen Pfadangaben für OpenBSD Paketrepositories zu halten (also z. B. /pub/OpenBSD/4.5/packages/i386/).

Ports

Vorraussetzung um Ports auf seinem OpenBSD System zu kompilieren ist die vollständige Installation des Basissystems (also inklusive X). Die Verzeichnisse und Dateien des Portssystems sind nach der Installation des Basissystems noch nicht auf der Festplatte enthalten. Daher muß man sie sich entweder von einem FTP-Server holen oder von CD kopieren. Hat man das offizielle CD-Set von OpenBSD gekauft, befindet sich der Ports-Tree auf der dritten CD (auf der auch der Sourcecode für OpenBSD ist). Die benötigte Datei heißt ports.tar.gz. Diese Datei sollte man nach /usr kopieren und dort entpacken:

tar xzpf ports.tar.gz

Dadurch entsteht das Verzeichnis /usr/ports mit einer ganzen Reihe von Unterverzeichnissen. Alle Aktionen im Portstree werden durch entsprechende Make Anweisungen in den jeweiligen Verzeichnissen ausgelöst. Möchte ich eine Anwendung anhand ihres Namens suchen, gehe ich als erstes in das Verzeichnis /usr/ports und benützte das Make-Target um eine Suche auszuführen:

cd /usr/ports
make search key=samba

Dies wird mir alle Ports anzeigen, die "samba" im Namen enthalten. Habe ich den entsprechenden Port gefunden wechsle ich in das Unterverzeichnis für diesen Port:

cd net/samba

In diesem Verzeichnis befindet sich unter anderem ein Unterverzeichnis namens pkg, in welchem eine Datei namens DESCR liegt, welches eine einfache Textdatei mit der Beschreibung des Programms ist:

cat pkg/DESCR

In manchen Fällen gibt es auch mehrere DESCR-Dateien in der Art: DESCR-main, DESCR-docs, etc. In diesem Fall ist das Programm noch mal in mehrere Pakete unterteilt. In dieser Datei finden sich auch eventuell mögliche Flavors der Ports. Gibt es für einen Port mehrere mögliche Flavors, kann ich den gewünschten Flavor als Umgebungsvariable vor dem kompilieren festlegen. Das Beispiel Samba hat die möglichen Flavors: cups (mit Cups-Druckunterstützung kompilieren), ldap (mit LDAP Unterstützung kompilieren) und ads (mit ads Unterstützung kompilieren). Wenn ich den Port nun einfach kompilieren und installieren will benütze ich dafür das Kommando make install. Möchte ich noch einen bestimmten Flavor verwenden muß ich dies zuvor als Umgebungsvariable mit angeben:

env FLAVOR="cups" make install

Der Rechner fängt nun an die Software aus dem Internet herunter zu laden, zu kompilieren und zu installieren. Gibt es bislang ungelöste Abhängigkeiten werden diese ebenfalls herunter geladen und kompiliert. Bedenken sie, daß manche Flavors umfangreichere Abhängigkeiten haben, die dann ebenfalls erst herunter geladen und kompiliert werden müssen. Das Flavor "cups" von Samba benötigt z. B. Cups, wodurch Cups ebenfalls erst kompiliert werden muß, was bei einem Samba ohne Cups-Unterstützung nicht notwendig wäre.

Da dies sehr viel Zeit in Anspruch nehmen kann, sehen die OpenBSD Entwickler das Ports-System eher als System für den Bau von Paketen an und empfehlen normalen Endanwendern eher zu Packages zu greifen. Lediglich in seltenen Fällen in denen es aus Lizenzgründen nicht möglich ist, fertige Binärpakete anzubieten (das Java Runtime Environment ist ein Beispiel dafür), muß auch der Enduser das Portssystem in Ermangelung fertiger Packages nutzen.

Möchte man nur das jeweilige Paket bauen, ohne es auf seinem Rechner zu installieren, kann man statt make install auch einfach make package verwenden. Dies baut aus dem Quellcode ein OpenBSD-Paket ohne dieses zu installieren. Das Paket findet sich dann unter:

/usr/ports/packages/all/<Hardwarearchitektur>

wieder. Auch wenn mit make install installiert wird, wird die Software zusätzlich als Paket in dieses Verzeichnis gelegt. Diese Pakete, können dann wiederrum ein eigenes Paketrepository befüllen und so von anderen OpenBSD-Rechnern im Lan benutzt werden.

In der Manpage zu den Ports (man ports) finden sich noch nähere Informationen zum Portssystem.


René Maroufi, dozent (at) maruweb.de
Creative Commons By ND