FreeBSD – Port packages maken met Poudriere

Je kunt natuurlijk gebruik maken van de port packages welke door FreeBSD beschikbaar worden gesteld maar dan mis je de mogelijkheid om aanpassingen te maken in de configuratie van deze packages. Bijvoorbeeld heb ik geen X11 windows server draaien en dan hoeft dat ook niet in de packages meegenomen te worden.

De oplossing is dus om zelf de port packages te bouwen. Dit kan direct in de ports boom op het systeem maar hier kleven een aantal nadelen aan, met name wat betreft het afhandelen van afhankelijkheden tussen de verschillende ports. Om dit op te vangen maak ik gebruik van ports-mgmt/poudriere om in een afgeschermde omgeving de port packages te bouwen welke dan lokaal geïnstalleerd kunnen worden.

Poudriere configuratie

Voordat we kunnen beginnen moeten we de configuratie voor de standaard port packages aanpassen. Normaal wordt gebruik gemaakt van kwartaalupdates maar we willen dit aanpassen naar de laatste versies. Dit kan door het bestand /usr/local/etc/pkg/repos/FreeBSD.conf te maken met de volgende inhoud:

FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}

Nu dit is aangepast kunnen we poudriere installeren. Hierbij wordt gevraagd om ook de laatste versie van pkg te installeren. Daarnaast installeren we ook een port voor het afhandelen van de cache.

# pkg install ports-mgmt/poudriere devel/ccache

Na installatie kun je een voorbeeld configuratie vinden in /usr/local/etc/poudriere.conf.sample met uitleg over de verschillende parameters welke ingesteld kunnen worden. Voor onze configuratie maken we het bestand /usr/local/etc/poudriere.conf met de volgende inhoud:

# Poudriere configuration file

ZPOOL=zbase
ZROOTFS=/p
FREEBSD_HOST=ftp://ftp.nl.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_PORTLINT=no
USE_TMPFS=all
DISTFILES_CACHE=/poudriere/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
PKG_REPO_SIGNING_KEY=/usr/local/etc/pki/poudriere/poudriere.key
CCACHE_DIR=/var/cache/ccache
WRKDIR_ARCHIVE_FORMAT=tbz
NOLINUX=yes
URL_BASE=http://poudriere.home.lan/poudriere/
ATOMIC_PACKAGE_REPOSITORY=yes
COMMIT_PACKAGES_ON_FAILURE=yes
KEEP_OLD_PACKAGES=yes
KEEP_OLD_PACKAGES_COUNT=3

Belangrijk in deze configuratie is dat de juiste ZFS pool naam gebruikt wordt, in mijn geval dus zbase. Verder configureren we alvast de URL voor de web client zodat we het bouwproces in de gaten kunnen houden.

Jails, ports en settings

Om gebruik te kunnen maken van poudriere moeten we eerst een jail maken waarin de port packages gebouwd gaan worden. Dit en de vervolg stappen staan uitgebreid beschreven in het FreeBSD Handbook.

# poudriere jail -c -j 12amd64 -v 12.0-RELEASE

Vervolgens moeten we de ports tree ophalen. Deze bevat de makefiles en patches voor alle beschikbare port packages.

# poudriere ports -c

Het bestand /usr/local/etc/poudriere.d/make.conf bevat de algemene opties voor het bouwen van de ports.

# Use the OpenSSL port version where possible
DEFAULT_VERSIONS+=      ssl=openssl

# Default versions for some programs
DEFAULT_VERSIONS+=      bdb=5
DEFAULT_VERSIONS+=      mysql=10.2m
DEFAULT_VERSIONS+=      perl5=5.26
DEFAULT_VERSIONS+=      python=2.7
DEFAULT_VERSIONS+=      python2=2.7
DEFAULT_VERSIONS+=      python3=3.6
DEFAULT_VERSIONS+=      ruby=2.4
DEFAULT_VERSIONS+=      apache=2.4
DEFAULT_VERSIONS+=      php=7.2

# Enable some features by default
OPTIONS_SET+=   PKGNG
OPTIONS_SET+=   MANPAGES
OPTIONS_SET+=   VP8
OPTIONS_SET+=   ICONV
OPTIONS_SET+=   GSSAPI_MIT
OPTIONS_SET+=   READLINE_PORT
OPTIONS_SET+=   SSP_PORTS

# Disable some features by default
OPTIONS_UNSET+= X11
OPTIONS_UNSET+= WAYLAND
OPTIONS_UNSET+= CUPS
OPTIONS_UNSET+= LDAP
OPTIONS_UNSET+= TCL
OPTIONS_UNSET+= WXGTK
OPTIONS_UNSET+= OPENGL
OPTIONS_UNSET+= EGL
OPTIONS_UNSET+= NLS
OPTIONS_UNSET+= EXAMPLES
OPTIONS_UNSET+= LUA
OPTIONS_UNSET+= DEBUG
OPTIONS_UNSET+= SOUND
OPTIONS_UNSET+= ALSA
OPTIONS_UNSET+= PULSEAUDIO
OPTIONS_UNSET+= DOCBOOK
OPTIONS_UNSET+= GSSAPI_BASE

Als laatste maken we het bestand /usr/local/etc/poudriere.d/12amd64.pkglist met hierin alle port packages welke we gebouwd willen hebben.

ports-mgmt/pkg
ports-mgmt/poudriere
devel/ccache
ports-mgmt/dialog4ports

Hoewel we de algemene instellingen voor de port packages hebben aangemaakt, moeten we ook de individuele port packages nog configureren.

# poudriere options -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Dit zal alle gedefinieerde port packages aflopen, inclusief alle afhankelijke packages, en ons de mogelijkheid geven om de configuratie aan te passen. Deze configuratie wordt opgeslagen zodat dit niet elke keer gedaan hoeft te worden.

Port packages bouwen en gebruiken

Nu alle configuratie is gedaan, is het tijd om de port packages te bouwen. Hierbij zal poudriere zelf aangeven of er nog ontbrekende directories gemaakt moeten worden.

# poudriere bulk -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Als dit klaar is, dan kunnen we de gebouwde port packages gaan gebruiken op ons systeem. We moeten pkg dan wel vertellen waar de port packages staan. Dit doen we door het bestand /usr/local/etc/pkg/repos/Poudriere.conf te maken:

Poudriere: {
  url: "file:///poudriere/data/packages/12amd64-default",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/pki/poudriere/poudriere.crt",
  priority: 100,
  enabled: yes
}

Met de huidige configuratie worden ook nog port packages gebruikt van de officiële FreeBSD repository en dat willen we niet. Om dit uit te zetten veranderen we in /usr/local/etc/pkg/repos/FreeBSD.conf de parameter enabled naar no.

We kunnen nu de officiële port packages vervangen door de zojuist gebouwde port packages.

# pkg update
# pkg upgrade -f