FreeBSD/Ports/readonly

Aus UUGRN
< FreeBSD‎ | Ports
Version vom 26. März 2007, 22:28 Uhr von Rabe (Diskussion | Beiträge) (→‎Intelligenterer Ansatz: Variablen im Environment und make.conf)

Default

Die Standardkonfiguration der Ports Infrastruktur ist, dass alle "beweglichen Daten" unterhalb von /usr/ports geschrieben und gespeichert werden. Ansich muss man sich hierbei keine großen Gedanken machen, für den Standardfall ist das gut.

Problem

Hat man allerdings sehr viele Systeme zu betreuen, so wird man schnell merken, dass es sehr aufwendig ist, für jedes einzelne System eigene Ports zu verwalten, schon allein der Speicherhunger durch die tausenden kleinen Dateien und Verzeichnisse und die daraus resultierenden Wartezeiten bei Update, Backup und eigentlich allen Dateisystemoperationen auf den Ports können den Wunsch nach einer zentralen Pflege sinnvoll erscheinen lassen.

Naive Idee

Naiv könnte man jetzt /usr/ports per NFS einfach freigeben und auf allen Systemen verwenden. Wehe dem, wenn auf 2 Maschinen parallel Ports konpiliert werden, womöglich noch mit überlappenden Abhängigkeiten, da kann ein "make clean" auf einem System den laufdenden Buildprozess auf dem anderen System zu einem hässlichen Ende führen. Möglicherweise hat man sogar noch verschiedene Rechnerarchitekturen und zum Schluss versucht ein Port bereits fertig kompilierten Code einer amd64 Architektur auf einem i386-System einzuspielen. Will man alles nicht.

Intelligenterer Ansatz

Man setzt die Ports auf read-only für alle Systeme und zwingt jedes System dazu, erforderliche Schreibzugriffe ausserhalb von /usr/ports durchzuführen. Es gibt allerdings einige Stellen, wo im Standardfall davon ausgegangen wird, dass /usr/ports schreibbar ist. Glücklicherweise gibt es für alles Knobs und Flags.

WRKDIRPREFIX
Arbeitsverzeichnisse ("work/") unterhalb von /var/tmp Erstellen. Weiterer Vorteil: bei abgebrochenen Kompilierläufen muss man nicht überall in den Ports die diversen /work/-Verzeichnisse wegputzen, einfach rm -Rf /var/tmp/usr/ports/abc/xyz/ reicht.
DISTDIR und PACKAGES
Heruntergeladene Sourcen ("distfiles") sowie lokal kompilierte Packages z.B. in /data/ports abgelegen und speichern.
INDEX
Die folgenden Zeilen erzwingen den Port-Index in /data/ports. Leider scheinen die verschiedenen Tools auf verschiedene Variablen zu achten, weswegen es hier leichte Redundanzen gibt.

/etc/profile

Wird von Tools verwendet, die NICHT innerhalb eines make-Kontexts ausgeführt werden.

# ---- Ports r/o ----
export WRKDIRPREFIX=/var/tmp
export DISTDIR=/data/ports/distfiles/
export PACKAGES=/data/ports/packages/
export PORTS_INDEX=/data/ports/INDEX
export PORTS_DBDIR=/data/ports/

/etc/make.conf

Wird im make-Kontext benötigt und zugegriffen.

# /usr/ports ist read-only in den Jails.
WRKDIRPREFIX=/var/tmp
DISTDIR=/data/ports/distfiles/
PACKAGES=/data/ports/packages/
INDEXDIR=/data/ports
PORTS_INDEX=/data/ports/INDEX
PORTS_DBDIR=/data/ports/