FreeBSD : installation auto

Bonjour à tous,

Un billet rapide sur comment automatiser l'installation de FreeBSD via un iso custom.

Tout d'abord, il faut télécharger l'iso et le monter en local (ici un boot only):

mkdir /root/build/iso
mount -t cd9660 /dev/`mdconfig -f FreeBSD-12.2-RELEASE-amd64-bootonly.iso` /root/build/iso

Pour pouvoir travailler le contenu, il faut le copier depuis l'iso dans un dossier :

mkdir /root/build/new-iso
rsync -az /root/build/iso /root/build/new-iso
cd /root/build/new-iso/etc/

L'automatisation peut se faire de deux façon dans l'iso :

  • mettre certaines commandes dans etc/rc.local et ensuite appeler installerconfig
  • mettre tout dans etc/installerconfig

J'ai choisis la deuxième méthode afin de n'avoir qu'un seul fichier à modifier.

Il faut donc créer le fichier installerconfig dans /root/build/new-iso/etc/ avec le contenu suivant :

if [ -e /dev/ada0 ]; then
  DISKSLICE=ada0
elif [ -e /dev/da0 ]; then
  DISKSLICE=da0
elif [ -e /dev/vtbd0 ]; then
  DISKSLICE=vtbd0
else
  echo "Unknown disk!"
  exit -1
fi

# Define partitions
PARTITIONS="${DISKSLICE} MBR { auto freebsd-ufs / }"
# Set archives to get
export DISTRIBUTIONS="base.txz kernel.txz"
# Url to get archives
export BSDINSTALL_DISTSITE="ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/`uname -r`/"
# Folder to store archives
mkdir /tmp/freebsd-dist
mount -t tmpfs -o size=512m tmpfs /tmp/freebsd-dist
export BSDINSTALL_DISTDIR=/tmp/freebsd-dist

# Define network if
local_if=$(ifconfig | grep '^[a-z]' | cut -d: -f1 | head -n 1)

# Get ip address
dhclient ${local_if}

# Get archives
bsdinstall distfetch

#!/bin/sh -x

local_if=$(ifconfig | grep '^[a-z]' | cut -d: -f1 | head -n 1)
echo "=> Conf rc.conf"
cat >> /etc/rc.conf << EOT
hostname="freebsd-auto"
keymap="fr"
ifconfig_${local_if}="dhcp"
sshd_enable="YES"
EOT

echo "=> Set up user accounts"
echo -n 'test1234' | pw usermod root -h 0
echo -n 'test1234' | pw useradd -n myuser -m -s csh -G wheel -h 0

echo "=> Reboot"
reboot

Petite explication du contenu :

  • la déclaration de la variable PARTITIONS permet leurs créations et leurs montages de façon automatique. Pour le début, je n'ai renseigné qu'une partition mais il est possible d'en créer plusieurs (attention au format du boot! MBR 4 partitions maxi sinon il faut passer en GPT qui passe à 128 partitions maxi)
  • définition des archives à utiliser pour faire l'installation et qui seront fetch par l'installeur. Attention! Il faut bien faire un export sinon le fetch ne trouvera pas la variable
  • définition de l'url à utiliser pour fetch les archives déclarées dans la variable précédente
  • création d'un tmpfs pour stocker les archives qui serviront à l'installation
  • récupération du nom de l'interface réseau et déclenchement du dhclient pour avoir une configuration réseau fonctionnelle
  • récupération et extraction des archives d'installation. Cette commande vérifie également le checksum des archives.

Information! Si vous utilisez un CD complet et pas un boot only, la partie tmpfs et fetch n'est pas obligatoire car les fichiers sont présent directement dans l'iso.

La partie suivante concerne la customisation qu'il est possible d'apporter à l'installation. Dans mon cas, elle est très succinte car j'effectue les dernières étapes via ansible.

Concernant la partie password, il est possible de mettre des hash SHA512, pour cela, il faut modifier l'option -h en -H.

Pour générer un hash en SHA512 :

mkpasswd --method=sha-512 'test1234'

J'ai également customisé l'autoboot de l'iso. En temps normal, un délais de 9 secondes est appliqué pour choisir ce que l'on veut faire au boot de l'iso sauf que dans ce cas la, une installation automatique la plus rapide est voulue.
Pour cela, il faut éditer le fichier /root/build/newiso/boot/defaults/loader.conf et modifier la ligne :

autoboot_delay="9"

Il est possible de :

  • réduire la valeur à 1 par exemple
  • mettre NO, il faudra donc faire l'action de sélection à la main
  • mettre -1 et ne pas avoir du tout de choix d'action, cela bootera directement vers l'installer.

Une fois les modifications faites, il reste à recréer un iso :

CUSTOM_ISO_TITLE=$(isoinfo -d -i /root/FreeBSD-12.2-RELEASE-amd64-bootonly.iso | awk '/Volume id/ { print $3 }')
mkisofs -J -R -no-emul-boot \
-V "$CUSTOM_ISO_TITLE" \
-b boot/cdboot \
-o /root/build/fbsd-122-custom.iso /root/build/newiso

Si mkisofs n'est pas trouvé, il faut installer le paquet suivant :

pkg install cdrtools

L'iso est alors prêt à être utilisé! Avec cette installation automatique sur proxmox en kvm, j'arrive à avoir une installation faite en 2mins30 environ.

Have fun.