FreeBSD/Ports/readonly
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/