FreeBSD: poudriere ou comment gérer ses paquets

Edit 23/03/16: maj de l'article pour le vhost et la déclaration du nouveau répo.
Edit 24/01/17: maj de l'article pour ajout désactivation repo FreeBSD

Bonjour à vous,

Aujourd'hui, un long billet qui va porter sur un logiciel FreeBSD: Poudriere.

Pour débuter, une petite explication : Poudriere est un logiciel permettant d'automatiser et de maintenir un serveur de packages privé. Il permet de compiler automatiquement une série de packages avec des options de compilation ainsi qu'un environnement prédéfini.
Privé au sens qu'il n'est pas dans la liste des dépôts publics de FreeBSD, mais si vous suivez ce billet, il le sera de tous ceux qui connaissent l'URL.

Par exemple, si vous avez besoin d'une version de php/perl fixe pour un environnement donné, il vous suffit de le fixer dans les fichiers de configuration dédié à cet arbre de ports. Ce qui permettra de ne pas changer d'environnement lors des prochains updates.

Prérequis

Afin de pouvoir utiliser Poudriere dans les meilleures conditions, ZFS est nécessaire.

Pour activer ZFS, il suffit de faire:

echo 'zfs_enable="YES"' >> /etc/rc.conf

Son utilisation permet d’accélérer la création de jails et le traitement des fichiers des différents ports.

Installation

L'installation de Poudriere est tout ce qu'il y a de plus classique :

pkg update
pkg install poudriere

Maintenant, il faut créer le dossier qui sera le point de montage du zpool ZFS:

mkdir /Poudriere
zpool create -m /poudriere poudriere /dev/vtbd1

Vous pouvez changer le dossier sans soucis. Cependant, il faudra adapter le reste du billet à ce changement.

Nous allons maintenant passer à la configuration de base de Poudriere.
Cela se passe dans le fichier /usr/local/etc/poudriere.conf :

ZPOOL=poudriere
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
USE_TMPFS=yes
ALLOW_MAKE_JOBS=yes

Petite explication des options ci-dessus:

  • ZPOOL : le nom de votre pool ZFS
  • ZROOTFS : la racine de votre pool (ou le point de montage)
  • FREEBSD_HOST : l’hôte à partir duquel télécharger les ports et la distribution. A adapter suivant votre pays afin d'avoir de meilleures performances.
  • RESOLV_CONF : le fichier de configuration du client DNS utilisé par poudrière.
  • BASEFS : le répertoire où poudrière va mettre ses jails et ports
  • USE_TMPFS : demander à Poudriere d’utiliser un TMPFS pour la compilation, il est possible de le désactiver en commentant la ligne si vous êtes limité en ram.
  • ALLOW_MAKE_JOBS=yes : permet de compiler un port avec plusieurs cpu/coeurs.

Ports et jail

Nous allons maintenant créer un arbre de ports par défault:

poudriere ports -c -p default

Options:

  • -c : indique la création de l'arbre de ports
  • -p : définie le nom de l'arbre de ports créé

Le nom peut être changé (ici default) au moment de la création.
/!\ Attention! Une fois créé il n'est plus possible de le changer.

Nous passons maintenant à la création de notre première jail:

poudriere jail -c -j "F102" -v "10.2-RELEASE" -a amd64

Options:

  • -c : indique la création de la jail
  • -j : définie le nom de la jail
  • -v : définie la version de FreeBSD voulue
  • -a : définie l'architecture voulue

Dans ce cas précis, je crée une jail pour la version 10.2 de FreeBSD avec comme architecture AMD64.

Fichiers make

Les fichiers de configuration pour la compilation (make.conf) sont stockés dans un dossier en particulier.
Il faut vérifier si ce dossier est bien présent, sinon il faut le créer:

mkdir /usr/local/etc/poudriere.d

Il est ensuite possible de passer des paramètres (ou knobs) à toutes les jails de Poudriere par le biais du fichier make.conf:

echo "WITH_PKGNG=yes" > /usr/local/etc/poudriere.d/make.conf
echo "WITHOUT_X11=yes" >> /usr/local/etc/poudriere.d/make.conf

Avec ces paramètres dans ce fichier en particulier, TOUTES les compilations seront faites avec le support de PKG pour l'installation des packets et sans le support X11.

Il est possible d'ajouter ces options uniquement pour une jail en particulier, il faudra pour cela ajouter ces options dans le fichier dédié à la jail. Par exemple dans le fichier F102-make.conf au lieu de make.conf.

Afin de gérer les logiciels à compiler, on peut soit préciser les logiciels à la main lors du lancement de la compilation ou les mettres dans un fichier. J'ai choisis la deuxième méthode, voici par exemple le contenu du fichier /usr/local/etc/Poudriere.d/F102-ports :

editors/nano
www/nginx

Une fois ce fichier renseigné, il faut choisir les options de compilation. La commande suivante est l'équivalent d'un make config-recursive:

poudriere options -f /usr/local/etc/poudriere.d/F102-ports -j F102 -p default

Compilation

Il ne reste plus qu'à lancer la compilation des logiciels que nous avons choisis:

poudriere bulk -f /usr/local/etc/poudriere.d/F102-ports -j F102 -p default

Options

  • -f : spécifie un fichier avec une liste de paquets à compiler
  • -p : spécifie le nom de l'arbre de ports à utiliser

Une fois la compilation terminée, il est possible de vérifier le contenu de l'arbre de ports:

ls -al /usr/local/poudriere/data/packages/F102-default

Le dossier peut être différent suivant le paramètre que vous avez fixé dans le fichier de configuration.

Update

Une fois ces premières étapes réalisées, la maintenance et l'update de notre arbre de ports, de notre jail et donc par association de la compilation qui va avec ce fait de la manière suivante.

En premier lieu, il faut mettre à jour notre arbre de ports:

poudriere ports -u -p default

Options:

  • -u : indique que nous voulons mettre à jour notre ports.
  • -p : spécifie le nom de l'arbre de ports à mettre à jour.
poudriere bulk -f /usr/local/etc/poudriere.d/F102-ports -j F102 -p default

Une fois la compilation terminée, vous aurez un rapport sur les paquets compilés. Deux formes de rapport: dans le shell directement avec le nombre de packages compilés, les échecs et les warning. Il y a également une page HTML regroupant ces informations.

Mise à disposition des paquets

Une fois les paquets compilés, il faut les mettre à disposition par le biais d'un serveur HTTP afin qu'ils soient accessibles par les serveurs.

Pour cela deux solutions:

  • Soit vous exposez directement le dossier /use/local/poudriere/data/packages/F102-default (chemin qui peut changer en fonction de ce que vous avez renseigné dans le fichier de configuration de Poudriere).
  • Soit vous faites une synchronisation de ce dossier sur un autre serveur qui lui mettre à disposition par HTTP les paquets.

De mon côté j'ai choisis la deuxième solution avec comme serveur HTTP Nginx.

Il faut mettre en place une réplication des packages entre l'arborescence de Poudriere et le serveur HTTP. Pour cela, rien de plus simple: rsync.

rsync -az /use/local/poudriere/data/packages/ serveur_ip_ou_nom:/chemin/vers/cible

Options:

  • -az : a pour le mode archivage qui permet de conserver les droits/permissions et de copier de façon récursive. z pour compresser les données avant l'envoie.

Cette commande utilise automatiquement SSH, il n'est plus nécessaire de le préciser.

Il est possible de rajouter un v (donc -avz) pour avoir un mode verbose, utile pour la première synchro.

Reste maintenant à configurer la partie HTTP. Pour cela, je créé un fichier de vhost dédié:

server {
    listen       80;
    listen       [::]:80;
    server_name  repo.securmail.fr;

    access_log  /var/log/repo/access.log;
    error_log   /var/log/repo/error.log;

    location / {
        root   /var/www/repo/;
        index  index.html index.htm;
        autoindex on;
    }
}

Attention! C'est du HTTP uniquement car je n'ai pas réussi à faire fonctionner pkg avec un repo en HTTPS et certificat autosigné.

Plusieurs choses sont importantes:

  • les logs: il faut faire attention que le dossier existe bien, sinon vous pouvez le changer sans soucis.
  • root: il s'agit du dossier où vont se trouver les packages, à adapter en fonction de la où vous les avez synchronisés.
  • autoindex: il est obligatoire d'avoir cet option d'activé, cela permet de lister automatiquement le contenu du dossier.

Il vous suffit d'effectuer un reload de Nginx et normalement votre repository privé sera opérationnel!

Afin de maintenir cette infrastructure en bon état de marche, il est possible de réaliser un script qui effectue les étapes d'update, de compilation et de synchronisation appelé depuis une tâche cron. Cela permettra d'avoir une arborescence toujours à jour.

Ce script sera aussi accessible pour un lancement à la main si vous souhaitez rajouter un logiciel qui n'est pas présent au sein du repository et que vous souhaitez l'ajouter sans délais.

Ajouter son repository

Maintenant que notre repository est accessible, il faut l'ajouter sur nos différents serveurs FreeBSD. Pour cela il faut créer le fichier suivant /usr/local/etc/pkg/repos/local.conf.
Il faut vérifier si le dossier /usr/local/etc/pkg/repos/ existe sinon, il faut le créer:

mkdir -p /usr/local/etc/pkg/repos/

Nous allons maintenant remplir le fichier local.conf

nano /usr/local/etc/pkg/repos/local.conf

Avec comme contenu:

myrepo: {
    url: "pkg+http://repo.yourdomain.fr/F102-default",
    mirror_type: "srv",
    signature_type: "none",
    fingerprints: "/usr/share/keys/pkg",
    enabled: yes
}

Suivant comment vous avez nommé votre repository, il faudra changer F102-default par ce que vous avez choisis.
Il est possible de changer le nom de notre repository en changeant myrepo par ce que vous souhaitez.

Une fois ce fichier complété, il suffit de faire:

pkg update
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
Updating myrepo repository catalogue...
Fetching meta.txz: 100%    264 B   0.3kB/s    00:01    
Fetching packagesite.txz: 100%    3 KiB   3.1kB/s    00:01    
Processing entries: 100%
myrepo repository update completed. 8 packages processed.
pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
Updating myrepo repository catalogue...
myrepo repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
New version of pkg detected; it needs to be installed first.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be UPGRADED:
	pkg: 1.6.3 -> 1.6.4 [myrepo]

Comme vous le constatez, notre repository est bien accessible et prit en compte.

A partir de ce point, il ne vous reste plus qu'à ajouter les logiciels dont vous avez besoin à votre repository.

Si vous souhaitez désactiver le repository FreeBSD de base il suffit de créer le fichier /usr/local/etc/pkg/repos/FreeBSD.conf et d'y inscrire le contenu suivant:

FreeBSD: { enabled: no }

Have a nice day.

PS: un grand merci à Solène Rapenne pour son aide et ses conseils :)