Portage, das Paketsysteme von Gentoo Linux, erscheint auf den ersten Blick recht komplex. Bei genauerem Hinsehen erweist es sich aber als extrem vielseitig und einfach zu handhaben.
Das Gentoo-Paketsystem Portage [1] ähnelt den Ports der freien Unix-Variante FreeBSD. Als quellenbasierte Distribution lädt Gentoo vor dem Installieren die Quellcode-Pakete aus dem Internet. Das setzt natürlich einen permanenten Zugang zum weltweiten Netz voraus. Die Quellen eines zu installierenden Pakets stammen direkt von den Seiten der Programmentwickler. Dort liegen sie in aller Regel als Tarball vor.
Das System entpackt das Paket in einen temporären Pfad (voreingestellt ist /var/tmp) um es dort zu kompilieren und danach ins System zu installieren. Vereinfacht dargestellt läuft eine automatisierte Variante eines ./configure && make && make install ab.
Um aber eine gemeinsame Installationsbasis vieler verschiedener Pakete zu gewährleisten, sieht die Wirklichkeit natürlich etwas komplexer aus. So nimmt etwa das Configure-Skript verschiedene Parameter für das Übersetzen des jeweiligen Paketes entgegen. Ferner beeinflussen Compiler-spezifische Umgebungsvariablen das Übersetzen eines Pakets und passen es so an einen Prozessor an, etwa an eine 64-Bit-CPU.
Zentrale Konfiguration
Bei Binary-orientierten Distributionen, wie Novell/Suse, Red Hat/Fedora und den meisten anderen, stecken in den RPM-Paketen generisch vorkompilierte Pakete. Meist optimieren die Entwickler dabei auf i586-Architekturen: Das bedeutet, dass das Programm auf jedem Rechner ab einer Pentium-CPU oder einem AMD K6-2 läuft. Der Grund dafür liegt auf der Hand: Die Programme sollen möglichst auf jedem PC lauffähig sein. Im Fall von 32- und 64-Bit-Anwendungen treten aber erhebliche Unterschiede auf. Daher bieten die Distributoren für diese verschiedene Pakete an.
Gentoo überlässt hingegen das Anpassen der Pakete dem Anwender. Über die zentrale Konfigurationsdatei /etc/make.conf ist es möglich, das Installationsverhalten des Systems zu kontrollieren und die Software auf die Hardware zu optimieren (siehe Kasten Konfigurationsdatei). In der make.conf setzen Sie die Flags [2] für den C- und den C++-Compiler, die für beide meist identisch sind.
Das Verwenden von Compiler-Flags erlaubt es, ein Paket für eine bestimmte Rechnerarchitektur anzupassen und zu optimieren – seien es die 32- und 64-Bit-Varianten von Intel oder AMD, PowerPCs, Sparcs oder Alphas. Dieser Tatsache hat Gentoo den nicht unbegründeten und schon häufig unter Beweis gestellten Ruf eingetragen, auf jeder Architektur zu laufen.
Aber auch andere für das Übersetzen notwendige Umgebungsvariablen finden Platz in der Datei make.conf. Ein Beispiel ist die Umgebungsvariable LINGUAS="de" für das Paket kde-base/kde-i18n, welches die deutsche Sprache für KDE installiert.
Installieren mit Emerge
Der Befehl emerge leitet unter Gentoo eine Installation ein. Vorher sollte man sich die Man-Page genauer ansehen, da Emerge etliche Optionen bietet und die Ausgabe mitunter einige Fragen aufwirft. Ein einfaches emerge Programmname reicht zum Installieren eines Paketes. Wer mit der Kommandozeile auf dem Kriegsfuß steht, dem ermöglichen alternativ grafische Frontends, wie das KDE-Programm Kuroo (Abbildung 1), das installieren und konfigurieren von Software.

Abbildung 1: Ein grafisches Frontend wie Kuroo vereinfacht das Arbeiten mit dem Gentoo-Paketsystem Portage.
Vorher gilt es aber sicherheitshalber noch zu prüfen, welche Abhängigkeiten das Paket hat und vor allem welche USE-Flags noch gesetzt sein sollten (siehe Kasten “Konfigurationsdatei”). Das erledigt der Befehl emerge -pv Programmname. Dabei steht p für “pretend”: Emerge simuliert die Installation lediglich und löst dabei die Abhängigkeiten auf. Für ausführliche Verlaufsmeldungen sorgt v wie “verbose”.
Listing 1 zeigt die entsprechende Ausgabe bei der Einrichtung von Xfig auf einem Rechner mit bereits installiertem X.org. Das N hinter ebuild bedeutet hier, dass das Paket neu und noch nicht installiert ist. Stünde eine Position weiter ein R, wäre das Paket bereits eingerichtet.
Listing 1
# emerge -pv xfig These are the packages that I would merge, in order: Calculating dependencies …done! [ebuild N ] media-libs/urt-3.1b-r1 +X +gif -gs +tiff 992 kB [ebuild N ] media-libs/jbigkit-1.6-r1 396 kB [ebuild N ] media-libs/jasper-1.701.0 +jpeg +opengl 1,329 kB [ebuild N ] media-libs/netpbm-10.30-r1 +jpeg +png +svga +tiff +zlib 2,542 kB [ebuild N ] x11-libs/Xaw3d-1.5-r1 277 kB [ebuild N ] media-gfx/transfig-3.2.4-r1 318 kB [ebuild N ] media-gfx/xfig-3.2.4-r1 5,043 kB Total size of downloads: 10,901 kB
Bei vielen Abhängigkeiten des Paketes handelt es sich um Zusatzpakete oder gar Bibliotheken, die nicht zum Arbeitsalltag gehören. Um dahinter zu kommen, was sich beispielsweise hinter urt-3.1b-r1 verbirgt, genügt eine Suche mit emerge -s urt: Sie spuckt unter anderem das Paket media-libs/urt aus und beschreibt es als Bibliothek zum Behandeln von Rastergrafiken (Bitmaps).
Genauere Informationen liefert aber die Online-Suche in der Paketdatenbank im Internet [3]. Neben einem kurzem Text, der das Paket beschreibt, gibt die Seite auch Auskunft über die verwendbaren USE-Flags. Im Beispiel in Listing 1 nicht gesetzt ist das USE-Flag gs, angezeigt durch ein Minus davor. Bei gesetztem Flag übersetzt Emerge das Paket mit Ghostscript-Unterstützung.
Für den Einsatz des USE-Flags gibt es zwei Möglichkeiten: Auf der Kommandozeile übergeben Sie die Variable mit USE="gs"; emerge -pv xfig direkt an Emerge. Sicherer ist es, das Flag in der make.conf einzutragen. Das stellt sicher, dass auch ein späteres System-Update das Paket wieder mit Ghostscript-Unterstützung installiert.
Bei entsprechend gesetztem USE-Flag erscheint das Paket media-libs/urt mit +gs in der Pretend-Anfrage. Ist das Paket app-text/ghostscript noch nicht installiert, zeigt Emerge dieses als weitere Abhängigkeit an.
Ebuilds
Die Gentoo-Paketdatenbank trägt den Namen Portage und umfasst derzeit weit über 100?000 nach Paketgruppen sortierten Dateien samt Beschreibungen. Die Paketbeschreibungen Portages heißen unter Gentoo Linux Ebuilds. Sie legen fest, was mit dem Paket nach dem Download aus dem Internet passiert.
Über den ganzen Globus verstreute Rsync-Server verteilen und aktualisieren Portage ständig. Die Datenbank auf dem lokalen Rechner bringt der Befehl emerge --sync auf den aktuellen Stand. Das sollte allerdings nicht dazu einladen, jeden Tag eine Portage-Aktualisierung und danach ein System-Update seiner Gentoo-Installation zu machen.
Sicherheits-Updates müssen dagegen laufend erfolgen. Im Web unter [4] meldet das Gentoo-Projekt gefundene Sicherheitslücken. Im Paket app-portage/portage-utils gibt es das Tool glsa-check, das nach Berichten über Sichwachstellen sucht. Allerdings steckt es derzeit noch in der Testphase und eignet sich nicht für den Einsatz auf Produktivsystemen.
Ein Update der Installation führt der Befehl emerge -u world aus, wobei auch hier wieder der Optionskombi -pv nützlich ist, um die zu aktualisierenden Pakete anzuzeigen. Diese kennzeichnet anstelle eines N oder R ein U.
Ein Beispiel für ein Ebuild findet sich in Listing 2. Die Abbildung 2 zeigt den schematischen Ablauf beim Einspielen des Paketes. Es handelt sich dabei wieder um Xfig, dessen Ebuild in der Datenbank unter /usr/portage/media-gfx/xfig/xfig-3.2.4-r2.ebuild liegt. Ebuilds bedienen sich einer eigenen auf Python basierten Syntax und unterteilen sich in einen deklarierenden Teil sowie drei Kernabschnitte.
Listing 2
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/media-gfx/xfig/xfig-3.2.4-r1.ebuild,v 1.10 2004/11/01 20:17:28 corsair Exp $
inherit eutils
MY_P=${PN}.${PV}
S=${WORKDIR}/${MY_P}
DESCRIPTION="A menu-driven tool to draw and manipulate objects interactively in an X window."
HOMEPAGE="http://www.xfig.org"
SRC_URI="http://www.xfig.org/xfigdist/${MY_P}.full.tar.gz
mirror://gentoo/${P}-gentoo.diff.bz2"
LICENSE="BSD"
SLOT="0"
KEYWORDS="x86 ppc ~sparc alpha ~hppa amd64 ~ppc64"
IUSE=""
DEPEND="virtual/x11
x11-libs/Xaw3d
media-libs/jpeg
media-libs/libpng"
RDEPEND="${DEPEND}
media-gfx/transfig
media-libs/netpbm"
src_unpack() {
unpack ${A}
cd ${S}
epatch ${WORKDIR}/${P}-gentoo.diff
epatch ${FILESDIR}/${P}-xaw3d.diff
}
src_compile() {
xmkmf || die
make || die
}
src_install() {
make DESTDIR=${D} install || die
make \
DESTDIR=${D} \
MANDIR=/usr/share/man/man1 \
MANSUFFIX=1 \
install.all || die
dodoc README FIGAPPS CHANGES LATEX.AND.XFIG
}

Abbildung 2: Vom Aufruf des Emerge-Befehls bis zum fertig installierten Paket durchläuft ein Paket im Gentoo-System einige Stationen.
Die Deklaration beschreibt vorab die Paketbezeichnung in der Variablen MY_P, die sich aus Paketnamen und Version zusammensetzt. In Zeile 9 legt DESCRIPTION die Beschreibung fest, die eine Suche nach dem Paket ausspuckt. Zeile 11 gibt an, wo Emerge das Paket im Internet findet.
Die KEYWORDS in Zeile 16 legen fest, für welche Architektur das Paket als stabil (ohne Tilde) respektive instabil (mit Tilde) gilt. Die darauf folgenden Tags DEPEND und RDEPEND teilen Emerge mit, welche Abhängigkeiten das Paket hat. In Zeile 27 beginnt mit src_unpack() die Installation. Dann leitet der Ebuild das Entpacken des Pakets in das Temporärverzeichnis von Portage ein, wechselt dorthin und patcht nötigenfalls die Quellen. Das Einpflegen von Patches übernehmen die Package-Maintainer von Gentoo, um etwaige Probleme bei der Installation auszuräumen.
Im zweiten Teil beginnt der arbeitsintensivste Schritt, das Kompilieren. Der Befehl in Zeile 35 erstellt ein Makefile, der folgende übersetzt das Paket. Je nach Größe des Quellcodes und Leistung des Rechners dauert dieser Vorgang entsprechend lange. Auf einem Pentium-4 mit 1 GByte Speicher dauert das Übersetzen von Xfig etwas mehr als zwei Minuten.
Ist das Paket kompiliert, folgt das Kopieren der fertigen Produkte ins Dateisystem. Das erledigt der Abschnitt src_install().
Hoch flexibel
Die hohe Anpassungsfähigkeit von Gentoo Linux verleiht der Distribution eine besondere Note. Hier bestimmt der User, wie sein System letztendlich aussieht. Daher eignet sich Gentoo perfekt für Desktop-, aber gerade auch für Server-Systeme. Ein Server braucht keine grafische Oberfläche, da die meiste Arbeit via SSH über die Konsole erfolgt.
Ferner verschmilzt das Kompilat mit seinem Rechner geradezu. Deshalb ist Gentoo ein perfektes Betriebssystem für den professionellen IT-Einsatz, aber gerade auch für User mit Experimentierdrang und Spieltrieb. Letzteren befriedigen beispielweise auch die Paketgruppen games-fps und games-rpg. Außerdem gibt es wohl keine Distribution mit einer aktiveren Community. Hilfe und erste Schritte bei der Arbeit und Installation von und mit Gentoo liefert die umfangreiche Dokumentation [5] sowie der zweiteilige Gentoo-Workshop in LinuxUser [6, 7].
Konfigurationsdatei
Die Konfigurationsdatei /etc/make.conf fasst alle wichtigen, zum Übersetzen und zur Installation notwendigen Optionen zusammen. Etliche davon muss man kaum je ändern: etwa jene, die beschreiben, woher Gentoo seine Pakete bezieht, und mit welchen Kommandos das geschieht. Die Beispiel-Konfigurationsdatei /etc/make.conf.example enthält sehr gute Kommentare. In /etc/make.globals finden sich grundlegende Optionen, die man ebenfalls nicht zu editieren braucht.
Compiler-Optionen
Die Variable CHOST sollte man nicht verändern, da das System sonst irreparabel beschädigt und die weitere Arbeit damit unmöglich würde. Sichere Compiler-Optionen für die CFLAGS und CXXFLAGS finden sich im Netz unter [2]. Die GNU-Compiler für C und C++ bieten weitaus mehr Flags als dort beschrieben, aber auch hier gilt Vorsicht beim Experimentieren. Im Allgemeinen sind folgende Optionen für die meisten Architekturen die sichersten:
CFLAGS="-march=<I>Architektur<I> -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
Das Flag -march bestimmt die Compiler-Optionen für die Rechnerarchitektur. Zum Übersetzen der Pakete für alle Intel-basierten CPUs ab einem Pentium Pro dient hier beispielsweise ein i686. Für einen AMD64 hieße das korrekte Flag -march=k8, für einen Pentium 4 mit EM64T -march=nocona.
Die Option -O legt den Grad des Optimierens fest. -Os optimiert die Kompilate auf Größe, was speziell für Embedded-Systemen Sinn macht. -O3 verursacht bei vielen Paketen. Damit während des Übersetzens keine temporären Dateien anfallen, sorgt die Option -pipe dafür, dass die Übersetzungsprozesse direkt miteinander kommunizieren. Die Option -fomit-frame-pointer verwirft Debug-Informationen, die einem Entwickler zwar nützliche Informationen liefern, dem Anwender aber eher egal sind.
Eine weitere Compiler-Option findet sich mit MAKEOPTS="-j2" weiter unten in der Konfigurationsdatei. Dies legt die Anzahl von parallel ausführbaren Übersetzungsprozessen fest – in der Regel also die Anzahl der Prozessoren (auch Hyperthreading) plus Eins.
USE-Flags
Die USE-Flags legen fest, welche Features ein übersetztes Programm unterstützt. In vielerlei Fällen bestimmen die USE-Flags die Parameter, die das System dem Configure-Skript vor dem Kompilieren übergibt. Die Stärke der USE-Flags liegt darin, dass sie es erlauben, das System ganz konkret an die jeweiligen Anforderungen anzupassen.
Ein Server beispielsweise braucht keine grafische Oberfläche, was man in der Konfigurationsdatei einfach mit USE="-X -kde -gnome -arts einstellt. Binary-Distributionen dagegen benötigen spezifische Server- und Client-Pakete, unter Gentoo genügt das Anpassen der USE-Flags.
Portage
Einige Optionen bestimmen das Verhalten der Paketdatenbank Portage. Hier legt der Benutzer über /var/tmp fest, wo die temporären Daten während des Übersetzens liegen sollen. Außerdem finden sich Angaben zur Lokation der Paketdatenbank und der Quellpakete. Ein wichtiger Aspekt ist hier das PORTDIR_OVERLAY.
Die lokale Paketdatenbank Gentoos logiert unter /usr/portage. Durch die Pfadangabe in PORTDIR_OVERLAY legt das System eine zusätzliche Paketdatenbank im Pfad an. Die Variable darf mehrere Pfade enthalten. Auf diese Weise trennen Sie die Standardpakete sauber von solchen, die Sie von Dritten einspielen [8].
Features
Der Features-Abschnitt erlaubt, spezielle Funktionen für das Kompilieren festzulegen. Beispielsweise forciert FEATURES="ccache" den Einsatz des Programms Ccache. Oft verarbeitet der Compiler beim Übersetzen Teile von Programmen und deren Abhängigkeiten doppelt. In diesem Fall greift Ccache ein und puffert die Ergebnisse. Das ermöglicht ein fünf- bis zehnfach schnelleres Übersetzen. Die Umgebungsvariablen CCACHE_SIZE und CCACHE_DIR in /etc/make.conf sorgen dabei für das Feintuning.
Eine wichtige Option stellt ACCEPT_KEYWORDS dar. Sie legt fest, ob das Paketsystem ausschließlich stabile – also als definitiv kompilierbar eingestufte – Pakete nutzt, oder auch solche, die noch nicht ausreichend getestet wurden. Die Option ACCEPT_KEYWORDS="~x86" vor einem Emerge legt fest, dass das System ein als noch nicht stabil eingestuftes Paket mit höherer Versionsnummer installiert. Für einen AMD-Prozessor lautet die entsprechende Angabe ~amd. Wer Probleme beim Installieren mit ACCEPT_KEYWORDS="~x86" hat, findet im Gentoo-Forum [9] garantiert Gleichgesinnte und mit hoher Wahrscheinlichkeit auch eine Lösung.
Infos
[1] Gentoo Linux: http://www.gentoo.org
[2] Sichere Compiler-Flags: http://gentoo-wiki.com/Safe_Cflags
[3] Portage-Online-Suche: http://www.gentoo-portage.com
[4] Gentoo Linux Security Advisories (GLSA): http://www.gentoo.org/security/en/glsa/
[5] Gentoo-Linux-Dokumentationen: http://www.gentoo.org/doc/de/index.xml
[6] Gentoo-Workshop (Teil 1): Alexander Reiterer, “Installation in 12 Schritten”, LinuxUser 05/2005, S. 68
[7] Gentoo-Workshop (Teil 2): Alexander Reiterer, “Systemwartung mit Portage”, LinuxUser 06/2005, S. 69
[8] Zusätzliche Paketdaten einbinden: http://gentoo-wiki.com/HOWTO_Installing_3rd_Party_Ebuilds
[9] Gentoo-Forum: http://forums.gentoo.org




