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.