FreeBSD is een besturingssysteem, dat menig Linux gebruiker niet vreemd is. Een veelgehoord argument voor FreeBSD, is dat het een schoner systeem zou zijn. En in principe is dat ook zo. In tegenstelling tot Linux, wordt FreeBSD als één compleet besturingssysteem ontwikkeld. FreeBSD gaat ook strikter om met het gescheiden houden van userland- en systeembestanden.

Marinus ten Napel

FreeBSD heeft een flexibele software manager, namelijk Ports. Sommige Linux distro’s hebben zich hierdoor laten inspireren, zoals Gentoo. Ports heeft echter één nadeel. Het downloadt de broncode van elk pakket, om het vervolgens te gaan compileren en linken. Dat kost veel tijd. Dit compileren is ook een zware belasting op het systeem. Dat wil je niet op een server doen, die het al druk genoeg heeft. Tenslotte kan het compileren fout gaan, waardoor je dan met half geïnstalleerde software zit die niet werkt. Kortom, software compileren op een productie-server, dat wil je niet.

Gelukkig heeft FreeBSD nog een andere software manager, namelijk pkg. Eigenlijk is dit niets anders dan een manier om compleet voorgecompileerde pakketten van Ports te installeren en te managen. Deze txz-bestanden zijn te vergelijken met deb-bestanden.

Helaas worden deze pakketten met minimale opties gecompileerd. Zo kan het gebeuren dat de support voor PostgreSQL ontbreekt. Je hebt ook geen controle meer over de gebruikte dependencies. Dus kan een overstap van PostgreSQL-10 naar PostgreSQL-11 geforceerd worden. Je bent dan gedwongen om een database migratie uit te voeren.

Stel, je wilt bijvoorbeeld Postfix installeren, maar je mist PostgreSQL support. Wat doe je dan? Een mogelijkheid is om Postfix via Ports te installeren. De ervaring leert echter dat dit op een niet te onderhouden puinhoop uit zal draaien. Het wordt dan ook afgeraden om Ports en pkg door elkaar te gebruiken.

Een andere mogelijkheid is het compileren van een pakket in een aparte omgeving, zoals een jail. Dit kan een oplossing zijn, maar het geeft geen garantie op succes. Dit pakket kan problemen geven, omdat het systeem waar je het wilt gebruiken bepaalde dependencies mist, of verkeerde versies draait. En dat brengt ons tot de kern van dit artikel. Hoe ga je hiermee om?

Poudriere

FreeBSD levert een tool om eenvoudig je eigen software repositories te managen, namelijk Poudriere. Met Poudriere kun je al je pakketten offline compileren en te beheren. Je kunt dat met verschillende FreeBSD releases doen. Dat kunnen zelfs verouderde releases zijn, waardoor je upgrades kunt uitstellen tot een geschikter moment. Je kunt ook verschillende port-trees beheren, zodat je zelf bepaalt wanneer je welke Ports-trees wilt updaten en met welke branch. Elke keer als je pakketten gaat compileren, kun je aangeven voor welke FreeBSD omgeving je die wilt compileren en welke Ports-tree je wilt gebruiken.

Je kunt dus je eigen pakketten maken, waarbij je precies bepaalt hoe die pakketten gecompileerd worden. Je weet dan zeker dat alles op elkaar afgestemd is en dat het probleemloos zal werken in de gewenste FreeBSD omgeving. Problemen tijdens het compileren gooien ook geen roet meer in het eten. Je kunt ze rustig oplossen, zonder een productie-server in gevaar te brengen. En je hoeft alles maar één keer te compileren, om ze daarna over meerdere systemen uit te rollen.

Je kunt ook precies bepalen welke versies van software je wilt gebruiken. Zo bepaal je zelf wanneer je wilt upgraden naar een nieuwe release van PHP of een database. Je komt dus niet meer voor onaangename verrassingen te staan bij het uitvoeren van updates en upgrades, omdat je het hele traject zelf beheert.

Installatie

Nu zul je denken, dat klinkt allemaal leuk en aardig, maar hoe werkt dat dan? Dat zal ik nu laten zien. We beginnen met de installatie van Poudriere.

# cd /usr/ports/ports-mgmt/poudriere
# make install clean

Poudriere zal alle gecompileerde pakketten ondertekenen. Daarvoor is een SSL-certificaat nodig.

# mkdir /usr/local/etc/poudriere.d/ssl
# openssl genrsa -out /usr/local/etc/poudriere.d/ssl/poudriere.key 4096
# openssl rsa -in /usr/local/etc/poudriere.d/ssl/poudriere.key -pubout -out /usr/local/etc/poudriere.d/ssl/poudriere.cert
# chmod 0600 /usr/local/etc/poudriere.d/ssl/poudriere.key

Nu moet Poudriere geconfigureerd worden.

# vi /usr/local/etc/poudriere.conf

Stel de volgende opties naar wens in.

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=https://download.FreeBSD.org
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere.d/ssl/poudriere.key
URL_BASE=https://mijn.pkgserver.nl/

Vervolgens maken we een build omgeving aan.

# poudriere jail -c -j naamvandeomgeving 12.1-RELEASE

Nu kunnen we een Ports-tree aanmaken.

# poudriere ports -c -p PORTSNAAM

Je kunt de aangemaakte omgevingen en port-trees bekijken met:

# poudriere jail -l
# poudriere ports -l

Nu moet er een build-list gemaakt worden, die Poudriere vertelt welke pakketten er gebouwd moeten worden. De build-list is een tekstbestand, waarin je de gewenste pakketten opsomt.

# vi /usr/local/etc/poudriere.d/ports-list-naam

Zet in dit bestand een lijst van de gewenste pakketten.

mail/postfix
mail/dovecot
security/clamav
databases/redis

Je kunt per omgeving aangeven hoe bepaalde zaken globaal geregeld dienen te worden. Dit doe je door in /usr/local/etc/poudriere.d/ een bestand met de jail-naam te plaatsen, gevolgd door -make.conf

# vi /usr/local/etc/poudriere.d/freebsd_121_mail-make.conf

Zet daarin bijvoorbeeld de volgende opties.

OPTIONS_UNSET+= DOCS X11 EXAMPLES
DEFAULT_VERSIONS+=pgsql=11 php=7.4

Dit zorgt ervoor dat documentatie, X11 en voorbeelden standaard niet meegenomen worden. Daarnaast zorgt het ervoor dat standaard PostgreSQL-11 en PHP-7.4 gebruikt worden. Nu moeten we de pakketten configureren.

# poudriere options -j jailnaam -p PORTSNAAM -f /usr/local/etc/poudriere.d/ports-list-naam

Nu kunnen we gaan compileren.

# poudriere bulk -j jailnaam -p PORTSNAAM -f /usr/local/etc/poudriere.d/ports-list-naam

Aangezien dit lang kan duren, is het verstandig om hier screen voor te gebruiken. Maar het gebruik van screen gaat te ver voor dit artikel, dus laten we dat verder buiten beschouwing.

Poudriere biedt een webinterface aan om het proces te monitoren. Daarnaast is dit nodig om de pakketten te distribueren. Hiervoor is een webserver nodig.

cd /usr/ports/www/nginx
make install clean

Bewerk nu de configuratie van nginx.

# vi /usr/local/etc/nginx/nginx.conf

Zorg ervoor dat de default vhost er als volgt uit komt te zien.

server {
        listen 80 default;
        server_name mijn.pkgserver.nl;
        root /usr/local/share/poudriere/html;

        location /data {
            alias /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }
        location /packages {
            root /usr/local/poudriere/data;
            autoindex on;
        }
}

Je kunt ervoor kiezen dit over https te doen, wat natuurlijk de voorkeur heeft. Maar het gaat te ver voor dit artikel om daar op in te gaan. Bovendien worden alle pakketten door Poudriere ondertekend, waardoor de veiligheid al is gewaarborgd. Bewerk ook mime.types, zodat de logbestanden correct weergegeven worden.

# vi /usr/local/etc/nginx/mime.types

Pas de volgende optie aan:

text/plain                          txt log;

Bewerk /etc/rc.conf:

# vi /etc/rc.conf

En zet daar de volgende regel in.

nginx_enable="YES"

En start Nginx.

/usr/local/etc/rc.d/nginx start

Je kunt nu Poudriere monitoren door met je browser naar het IP-adres of hostnaam van je build-server te gaan. En dit wordt straks ook gebruikt om de gecompileerde pakketten naar andere servers te  distribueren.

De build-server is nu klaar voor gebruik. Het enige wat rest is het instellen van de servers waar je de pakketten wilt installeren.

Kopieer het eerder gemaakt Poudriere certificaat.

# scp inlognaam@mijn.pkgserver.nl:/usr/local/etc/poudriere.d/ssl/poudriere.cert /usr/local/etc/ssl/poudriere.cert

Voeg nu je eigen repository toe.

# mkdir /usr/local/etc/pkg
# mkdir /usr/local/etc/pkg/repos
# vi /usr/local/etc/pkg/repos/mijnpkgserver.conf

Zet daarin de volgende instellingen.

mijnpkgserver: {
    url: "http://mijn.pkgserver.nl/packages/jailnaam-PORTSNAAM/",
    mirror_type: "http",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/ssl/poudriere.cert",
    enabled: yes,
}

Schakel de standaard FreeBSD repository uit.

# vi /usr/local/etc/pkg/repos/freebsd.conf

En zet daarin het volgende:

FreeBSD: {
    enabled: no
}

Update tenslotte pkg:

# pkg update

Je bent nu klaar om pakketten uit je eigen repository uit te rollen.