Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Créer une image d'installation d'OpenBSD personnalisée (iso)

Ce n'est pas très compliqué de créer sa propre iso d'installation d'OpenBSD. La méthode qui suit peut certainement être améliorée, surtout en utilisant directement des outils d'OpenBSD.

J'ai ici gardé une méthode artisanale qui devrait aussi bien fonctionner sous une système BSD que linux.

Récupérer les fichiers de travail

Le plus simple consiste à partir d'une image d'installation d'openBSD déjà existante et de la décompresser :

$ curl -C - -o install59.iso "http://ftp.fr.openbsd.org/pub/OpenBSD/5.9/amd64/install59.iso"
$ mkdir -p loopdir
# mount -o loop install59.iso loopdir
$ cp -rv loopdir/ ./install-59
$ chown -R 1000:1000 ./install-59
$ chmod -R +w ./install-59
# umount loopdir/
$ rm -r loopdir/

Vous avez dans le dossier install-59 tous les fichiers que contenait l'iso.

Modifier le contenu de l'iso

Dans le dossier précédent, vous trouverez un dossier 5.9/amd64/ qui contient tous les “sets”. Ce sont en fait toutes les archive .tgz disponibles à l'installation.

Vous pouvez librement supprimer celles qui ne vous intéressent pas. Mais j'imagine que ce que vous voulez, c'est en rajouter. Il faut pour cela créer une archive siteXX.tgz (en remplaçant les XX par le numéro de version).

Créer un set d'installation siteXX.tgz

Cette archive site59.tgz doit contenir la hiérarchie des fichiers prêts à être décompressée dans /. Pour vous faire une idée, regardez comment sont faits les autres archives.

Vous avez donc la possibilité de mettre les programmes et autres fichiers que vous souhaitez avoir dans le système installé, comme par exemple le contenu de /etc/skel. Puisque cette archive est installée en dernier, les fichiers peuvent remplacer des déjà existants.

Lancer un script juste après l'installation

Heureusement, on peut inclure un script qui sera lancé juste après l'installation. Ce script doit s'appeler install.site, qui doit être présent dans l'archive siteXX.tgz.

Vous pouvez donc mettre dedans une commande qui installera tous les paquets souhaités. Par exemple :

#!/bin/sh
echo "* RUNNING POST-INSTALL SCRIPT"
# pkg
echo "installpath = http://ftp.fr.openbsd.org/pub/OpenBSD/%v/packages/%a/" >> /etc/pkg.conf
pkg_add fluxbox p7zip dmenu st netsurf

# kshrc
mkdir -p /etc/skel
echo ". /etc/ksh.kshrc" >> /etc/skel/.profile
echo "HISTFILE=~/.mksh_hist" >> /etc/skel/.profile
echo "HISTSIZE=3000" >> /etc/skel.profile

exit 0

N'oubliez pas de rendre ce script exécutable :

chmod 755 install.site

Vous créez l'archive contenant ce script ainsi :

tar cvzf site59.tgz install.site

Notez que on peut installer des paquets par cette méthode. Cependant, je préfère installer les paquets lors du premier démarrage après l'installation pour m'assurer que tous les paquets sont bien enregistrés et les caches correctement générés.

Lancer un script au premier démarrage

Vous pouvez lancer une série de commandes lors du premier démarrage de la machine qui vient d'être installée. Il faut pour cela créer le script /etc/rc.firsttime. Ce script peut très bien être intégré dans l'archive siteXX.tgz. Veillez toutefois à lui donner les droits d'exécutions :

chmod 755 rc.firsttime

Reconstruire l'iso

Une commande suffit :

genisoimage -r -no-emul-boot -b 5.9/amd64/cdbr -c boot.catalog -o CustomOBSD.iso install-59/

Récupérer les archives des programmes (méthode déconseillée)

Vous pouvez récupérer les archives des programmes que vous voulez installer ainsi que leur dépendances, les décompresser dans un dossier, puis compresser le contenu de ce dossier dans une archive site59.tgz.

Voilà pour la théorie. Cependant, retrouver manuellement les dépendances de chaque paquet est très pénible (on les trouve dans le fichier +DESC contenu dans chaque archive).

Je vous propose donc le script suivant qui se chargera de récupérer les paquets listés dans la variables PACKAGES et d'en faire une archive siteXX.tgz (ne l'utilisez pas ☺) :

#!/bin/sh

PKG_PATH="http://ftp.fr.openbsd.org/pub/OpenBSD/5.9/packages/amd64/"

PACKAGES="
fluxbox-1.3.7p0.tgz
ImageMagick-6.9.3.0.tgz
antiword-0.37p0.tgz
aspell-fr-0.50.3v1.tgz
bogofilter-1.2.4-sqlite3.tgz
bogofilter-1.2.4.tgz
catfish-1.2.2.tgz
cdrdao-1.2.0p2.tgz
cdrtools-3.00p1.tgz
detox-1.2.0.tgz
discount-2.1.8ap0.tgz
dmenu-4.6.tgz
docx2txt-1.4.tgz
dos2unix-7.3.2.tgz
gv-3.7.1p1.tgz
lftp-4.6.5.tgz
ntfs_3g-2015.3.14.tgz
oggconvert-0.3.3p3.tgz
odt2txt-0.5.tgz
p7zip-15.09p4.tgz
pdftk-2.02p2.tgz
rox-filer-2.11.tgz
st-0.6p0.tgz
vim-7.4.900-no_x11.tgz
vim-spell-fr-7.4.tgz
xdotool-3.20150503.1v0.tgz
youtube-dl-2016.01.01.tgz
"

dl_tgzs() {
mkdir -p temp
for p in $@; do
if [ ! -e $p ]; then
echo $p
curl -# -C - -O $PKG_PATH/$p
tar -C site -xzphf $p
DEPS=$(grep "@depend" site/+CONTENTS | cut -d':' -f3 | sed -e 's;$;.tgz;g')
rm -f site/+*
dl_tgzs $DEPS
fi
done
}

mkdir -p packages/site
cd packages

echo "* Downloading packages"
dl_tgzs $PACKAGES

echo "Create siteXX.tgz"
cd site
tar cvzf ../site59.tgz *

exit 0

Mettez cette archive dans le dossier 5.9/amd64 avec les autres sets pour qu'elle soit proposée à l'installation de votre iso.

Avouez que récupérer le nom des paquets au numéro de version près, c'est juste super fastidieux (et je reste poli!). Qui plus est, selon les archives que l'on décompresse ensuite, il peut y avoir des erreurs.

Plus grave, le gestionnaire de paquets n'a aucune trace des paquets installés pour une suppression ultérieure. Il faut donc trouver une autre solution, comme lancer un script juste après l'installation.

Références

Calomel FAQ