Publié le: 2014-02-10

Poudriere

Poudrière est un excellent outil disponible à la fois sur FreeBSD et DragonFlyBSD permettant de forger un repository pour FreeBSD/DragonFlyBSD afin de déployer rapidement un parc de serveurs ou de clients FreeBSD (en le couplant à Puppet vous serez à même de déployer très vite).

Prérequis

Poudrière requiert un pool ZFS, même si ce n’est pas obligatoire c’est fortement conseillé.

Installation

Rien de plus simple:

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

Configuration

On va tout d’abord créer un répertoire et y monter notre pool ZFS:

mkdir /poudriere
zpool create -m /poudriere poudriere /dev/ada1

On va maintenant configurer poudriere. Ouvrez le fichier /usr/local/etc/poudriere.conf

ZPOOL=zpool
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
USE_PORTLINT=no
USE_TMPFS=yes
DISTFILES_CACHE=/usr/ports/distfiles
PARALLEL_JOBS=1
export HTTP_PROXY=http://myproxy:3128
export HTTPS_PROXY=http://myproxy:3128
export FTP_PROXY=http://myproxy:3128

Détaillons ces options:

  • ZPOOL: le nom de votre pool ZFS
  • ZROOTFS: la racine de votre pool
  • FREEBSD_HOST: l’hôte à partir duquel télécharger les ports et la distribution
  • 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_PORTLINT: si vous souhaitez utiliser le nettoyage des ports passer la variable à yes
  • USE_TMPFS: demander à poudriere d’utiliser un TMPFS pour la compilation
  • DISTFILES_CACHE: permet de mettre en place un répertoire partagé entre les ports et les jails.
  • PARALLEL_JOBS: le nombre de tâches parallèles. Si le paramètres n’est pas indiqué, il s’agit du nombre de cœurs de processeur.

Nous aurons besoin d’un arbre de ports dédié. On demande à poudrière de le récupérer.

poudriere ports -c -p default

On va maintenant créer la jail correspondant à notre besoin:

poudriere jail -c -j "11_1" -v "11.1-RELEASE" -a amd64

Dans l’exemple ci-dessus, cela créée la jail 11_1, correspondant à FreeBSD 11.1 pour l’architecture amd64. (attention je ne recommande pas de mettre des . dans le nom de la jail, cela a des effets indésirables) Pour utiliser le format de packages pkg (devenu le seul, exécutez les lignes suivantes (11_1 correspond au nom de votre jail):

mkdir /usr/local/etc/poudriere.d
echo "WITH_PKGNG=yes" > /usr/local/etc/poudriere.d/11_1-make.conf

Il faut maintenant définir une liste de ports à forger. Ouvrez un fichier (par exemple dans /usr/local/etc/poudriere.d/11_1-ports) et insérez une liste de ports

shells/zsh
ports-mgmt/portmaster

Ensuite on va demander à poudriere de nous montrer les options de compilation afin de les sélectionner:

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

Enfin on lance la génération des ports:

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

Vous devriez avoir un résultat similaire:

fbsd91-tests# poudriere bulk -f /usr/local/etc/poudriere.d/11_1-ports -j 11_1 -p default   
====>> Creating the reference jail... done
====>> Mounting system devices for 11_1-default
====>> Mounting ports/packages/distfiles
====>> Mounting packages from: /usr/local/poudriere/data/packages/11_1-default
====>> Mounting /var/db/ports from: /usr/local/etc/poudriere.d/11_1-options
====>> Logs: /usr/local/poudriere/data/logs/bulk/11_1-default/2013-08-01_22h06m39s
/etc/resolv.conf -> /usr/local/poudriere/data/build/11_1-default/ref/etc/resolv.conf
====>> Starting jail 11_1-default
====>> Calculating ports order and dependencies
====>> Sanity checking the repository
====>> Deleting stale symlinks
====>> Deleting empty directories
====>> Cleaning the build queue
====>> Building 3 packages using 3 builders
====>> Starting/Cloning builders
====>> Hit CTRL+t at any time to see build progress and stats
====>> [01] Starting build of converters/libiconv
====>> [02] Starting build of ports-mgmt/portmaster
====>> [02] Finished build of ports-mgmt/portmaster: Success
====>> [01] Finished build of converters/libiconv: Success
====>> [01] Starting build of shells/zsh
====>> [01] Finished build of shells/zsh: Success
====>> Stopping 3 builders
====>> Preparing INDEX
====>> Generating INDEX... done
====>> Compressing INDEX-9... done
====>> Cleaning up
====>> Umounting file systems
====>> Built ports: ports-mgmt/portmaster converters/libiconv shells/zsh
====>> [11_1-default] 3 packages built, 0 failures, 0 ignored, 0 skipped
====>> Logs: /usr/local/poudriere/data/logs/bulk/11_1-default/2013-08-01_22h06m39s

Vous devriez voir apparaître l’arborescence de vos packages dans /usr/local/poudriere/data/packages/11_1-default (nom de la jail et de l’arbre de ports):

fbsd91-tests# ls -al /usr/local/poudriere/data/packages/11_1-default
total 13
drwxr-xr-x  8 root  wheel    9 Aug  1 22:09 .
drwxr-xr-x  3 root  wheel    3 Aug  1 22:06 ..
drwxr-xr-x  2 root  wheel    5 Aug  1 22:09 All
-rw-r--r--  1 root  wheel  348 Aug  1 22:09 INDEX-9.bz2
drwxr-xr-x  2 root  wheel    5 Aug  1 22:09 Latest
drwxr-xr-x  2 root  wheel    3 Aug  1 22:07 converters
drwxr-xr-x  2 root  wheel    3 Aug  1 22:07 devel
drwxr-xr-x  2 root  wheel    3 Aug  1 22:06 ports-mgmt
drwxr-xr-x  2 root  wheel    3 Aug  1 22:09 shells

Mettre à jour l’arbre et les packages

Il faudra régulièrement mettre à jour l’arbre de ports et forger de nouveau les paquets ayant été mis à jour. Pour se faire, il suffit de lancer simplement les commandes suivantes:

poudriere ports -u -p default
poudriere bulk -f /usr/local/etc/poudriere.d/11.1-ports -j 11_1 -p default

Vous avez désormais une forge de paquets et un repository FreeBSD.

Configuration côté client

Nous allons maintenant configurer notre client pour aller chercher ses packages sur le repository FreeBSD (il vous faudra un serveur http/ftp). Tout d’abord créez le répertoire /usr/local/etc/pkg/repos/ s’il n’existe pas Ouvrez le fichier /usr/local/etc/pkg/repos/local.conf

myrepo: {
    url: "pkg+http://freebsdrepo.lan/pub/FreeBSD/11.1",
    mirror_type: "http",
    signature_type: "none",
    fingerprints: "/usr/share/keys/pkg",
    enabled: yes,
}

puis tapez les commandes suivantes afin d’installer les paquets que nous avons forgé avec poudrière:

pkg update
pkg install zsh portmaster

C’est tout ! Source 1 Source 2 Source 3