"NetBSDfr - Bien sûr, ça tourne sous NetBSD !"

Construire ses packages dans un chroot avec pkg_comp

pkg_comp est un outil pour compiler ses packages dans un chroot. Il propose un certain nombre de cibles, autrement dit des actions pour faciliter les tâches suivantes :

  • Gestion du chroot : création, activation, destruction
  • Compilation de packages et packaging du résultat

L'avantage de cette technique est de compiler des applications de pkgsrc sans affecter le système principal, s'assurer qu'une mise à jour va réussir. Pour faire simple, on peut compiler sur une machine de production sans avoir les mains moites.

Prérequis

Les sets correspondants à la version de NetBSD pour laquelle les packages seront construits. Si le système est constuit à partir des sources, il faut déclarer RELEASEDIR dans /etc/mk.conf pointant sur le répertoire ou les sets seront copiés ou utiliser l'option -R de build.sh. On obtient ensuite les sets en utilisant la cible sets de build.sh.

Pour fabrique le set du kernel :

  • utiliser la cible releasekernel=CONF de build.sh
  • aller dans RELEASEDIR/<arch>/kernel:
# cp netbsd-CONF.gz netbsd.gz
# gunzip netbsd.gz
# tar czf ../sets/kern-CONF.tgz ./netbsd

Préparation

La première chose à faire est de mettre à jour son arbre pkgsrc, ensuite il faut installer pkg_comp :

# cd /usr/pkgsrc
# cd pkgtools/pkg_comp && make install clean clean-depends

Configuration

Ensuite, on va demander à pkg_comp de nous créer un fichier de configuration avec les valeurs par défaut :

# pkg_comp maketemplate
pkg_comp: /root/pkg_comp/default.conf created.  Edit the file by hand now.

pkg_comp s'attend à touver les fichiers de configuration dans $HOME/pkg_comp, le fichier default.conf étant celui par défaut. On peut en créer d'autres au même endroit, ils doivent avoir un suffixe .conf pour les utiliser directement par avec l'option -c. On copie donc le fichier default.conf en test.conf pour l'éditer :

# cd /root/pkg_comp
# cp default.conf test.conf

Les paramètres à changer :

  • DESTDIR : la racine du chroot
  • DISTRIBDIR : le chemin vers les sets du système cible (jusqu'au nom de l'architecture)
  • SETS : la liste des sets à utiliser, on change pour notre kernel custom
DESTDIR="/usr/chroot/pkg_comp/test"
DISTRIBDIR="/var/pub/NetBSD/amd64"
SETS="base.tgz comp.tgz etc.tgz kern-SECATEUR.tgz text.tgz"

Création du chroot

# pkg_comp -c test makeroot

Il faut ensuite configurer le /etc/mk.conf du chroot, en y ajoutant la configuration des packages, par exemple :

## pkgsrc
X11_TYPE=native

# install rc scripts
PKG_RCD_SCRIPTS=YES

# default options for all packages
PKG_DEFAULT_OPTIONS+= inet6 ssl

Construction de paquets

Pour construire des paquets, on utilise la cible build de pkg_comp suivi de la liste des paquets à construire. Les noms de paquets sont les chemins à partir de la racine de l'arbre pkgsrc.

Par exemple, pour construire wget :

# pkg_comp -c test build net/wget

pkg_comp va donc compiler et créer le paquet ainsi que ses dépendances. Le résultat sera disponible dans /usr/pkgsrc/packages

Installation des paquets

Pour installer les paquets fraichement compilés par pkg_comp, on utilise tout simplement pkg_add, en spécifiant le PKG_PATH qui va bien, pour notre exemple de wget :

# PKG_PATH=/usr/pkgsrc/packages/All pkg_add -v wget

Gérer son chroot

La cible chroot permet d'exécuter une commande, ou par défaut un shell, dans le chroot de pkg_comp. Par exemple, plutôt que de chercher où se trouve le fichier etc/mk.conf d'un chroot, on lance un cat directement :

# pkg_comp -c test chroot cat /etc/mk.conf
PKG_COMP ==> Installing new `pkg-vulnerabilities' file
/usr/pkgsrc/distfiles/pkg-vulnerabilities not found.
PKG_COMP ==> Mounting sandboxed filesystems
PKG_COMP ==> Entering sandbox `/usr/chroot/pkg_comp/test'
#
# /etc/mk.conf
# File automatically generated by pkg_comp on Sun May 17 19:59:27 CEST 2009
#
# ....
PKG_COMP ==> Unmounting sandboxed filesystems

Ce qui est important ici, c'est le fait que pkg_comp gère le montage de certains systèmes de fichiers (avec nullfs) à notre place et les démonte proprement lorsqu'on a fini.

Un autre point important : le chroot se comporte comme le système, on peut donc avoir une construction de package qui échoue sur l'installation parce qu'une version antérieure existe déjà dans le chroot. Le fait d'aller dans le chroot avec un shell permet de débloquer la situation en supprimant le vieux package et en recommençant ou en faisant un make replace.

Supprimer un chroot

Lorsqu'on a tout cassé ou qu'on en a plus besoin, on peut supprimer le chroot en utilisant la cible removeroot. Attention à bien vérifier que le chroot n'est pas en cours d'utilisation en vérifiant la sortie de la commande mount avant d'agir.

howto/pkg_comp.txt · Dernière modification: 2011/12/15 00:18 (modification externe)