FreeBSD/Ports/readonly

Aus UUGRN
< FreeBSD‎ | Ports

Default[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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.

UUGRN:Jails[Bearbeiten]

Auf top.uugrn.org wird das Verzeichnis /usr/ports per mount_null r/o in alle Jail gemountet.

/etc/fstab
# Device        Mountpoint      FStype  Options         Dump    Pass#
[...]
/usr/ports /data/jails/verein.uugrn.org/usr/ports nullfs ro 2 0
/usr/ports /data/jails/intern.uugrn.org/usr/ports nullfs ro 2 0
/usr/ports /data/jails/shell.uugrn.org/usr/ports nullfs ro 2 0
[...]

Somit ist z.B. in shell.uugrn.org das Verzeichnis /usr/ports read-only verfügbar. Damit die Ports dort wie gewohnt funktionieren, sind, wie oben beschrieben, alle für Schreibzugriff erforderliche Verzeichnisse nach /data/ports oder /var/tmp ausgelagert.

/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/