Upgrade FreeBSD 8.0 et jails

J’ai upgradé ma FreeBSD (ce serveur) et ses 4 jails de FreeBSD 7.2-RELEASE vers FreeBSD 8.0-RELEASE, voilà donc le récit de ce qui est toujours une épopée.

Dans un premier temps il faut récupérer les sources du système. J’ai fait ça à coup de csup depuis cvsup1.fr.FreeBSD.org (qui n’est autre que cvsup.free.org).

# cat /usr/local/etc/stable-supfile
*default host=cvsup1.fr.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_0
*default delete use-rel-suffix
*default compress
src-all
# csup /usr/local/etc/stable-supfile

Pendant ce temps au lieu de te tourner les pouces fais toi un /etc/src.conf(5) pour customiser un peu ce qu’on va compiler dans le world. Moi je n’utilise plus sendmail, authpf, bind (j’ai déjà un bind sur mon routeur), bluetooth, les jeux, IPfilter (j’utilise pf) ni zfs.

# cat /etc/src.conf
WITHOUT_AUTHPF=YES
WITHOUT_BIND=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_GAMES=YES
WITHOUT_IPFILTER=YES
WITHOUT_SENDMAIL=YES
WITHOUT_ZFS=YES

Quand csup à finit son boulot on peut lancer la compilation qui tue :

# cd /usr/src
# make buildworld

Bois une grosse tasse de café et attend sagement en lisant config(8) et $EDITOR ta config kernel dans /usr/src/sys/<arch>/conf/LAPIN, sinon le kernel GENERIC marche bien hein :-).

Une fois le buildworld terminé lance la compilation de ton kernel :

# cd /usr/src/
# make buildkernel KERNCONF=LAPIN

Pendant ce temps mettons à jours les jails. Moi j’arrête complètement les jails, je préfère un service injoignable qu’un service qui pourrait planter. Pour que le mergemaster(1) soit moins long j’ai mis quelques options dans /root/.mergemasterrc.

# cat /root/.mergemasterrc
FREEBSD_ID=yes
# /etc/rc.d/jail stop
# cd /usr/src
# make installworld DESTDIR=/path/to/jail
# mergemaster -i -C -D /path/to/jail

Réponds aux questions de mergemaster, c’est long mais nécessaire, si ça te parait trop long rajoutes -U aux options de mergemaster.

Refait la manip pour toutes tes jails. Enfin installe le nouveau kernel et reboot en Single user mode.

# cd /usr/src
# make installkernel KERNCONF=LAPIN
# shutdown -r now
## MAINTENANT EN SINGLE USER MODE ##
# adjkerntz -i
# mount -a -t ufs
# mergemaster -p
# cd /usr/src/
# make installworld
# mergemaster -i -C
# reboot

Nous voilà en FreeBSD 8.0-RELEASE-p1, maintenant il faut réinstaller tous les ports pour que les softs soient liés avec les libs de la 8.0. Alors là plusieurs méthodes possibles.

  • Par compilation => portupgrade -a (va faire un tour sur google.com pour plus d’info sur les options crousti de portupgrade).
  • En binaire, c’est ce que j’ai fait via un hack plus crade qu’un porno thaïlandais mais qui marche.

Attention lapin ! , ce script va t’installer des packages avec les options de compilation par défaut des ports. Ça va enlever ton support PGSQL de dovecot et te rajouter toute la libx11 :-), à manipuler avec précaution donc.

Mon petit script magique pkg_reinstall:

#!/bin/sh
# Force la réinstallation des
# packages pour la nouvelle release
# http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails
# Je ne suis pas responsable de la casse éventuelle :-)
# Mirroir pour choper les packages voyez pkg_add(1)
# section ENVIRONEMENT.
export PACKAGEROOT="ftp://ftp.fr.freebsd.org"
# Liste des packages sur la machine
PKG_LIST=`pkg_info | cut -d' ' -f1`
for pkg in $PKG_LIST
do
# On coupe la version du package
# et on force la réinstallation
pkg_add -rvF "${pkg%-*}"
done

Je lance donc mon script dans un shell de la jail (dont le JID m’est donné par jls(1)) :

# jexec 1 sh
# sh /root/pkg_reinstall

Ensuite tu peux normalement supprimer les anciennes libs et anciens fichiers de ta vielle FreeBSD :

# cd /usr/src
# yes | make delete-old DESTDIR=/path/to/jail
# yes | make delete-old-libs DESTDIR=/path/to/jail

Tu peux faire pareil pour l’hote maintenant, un coup de pkg_reinstall et yes | make delete-old(|-libs) et te voilà en 8.0 avec un système super clean.

Bonus spécial pour toi lapin !

Personnellement j’aime bien rester avec mes packages de RELEASE, donc je met pratiquement jamais à jours. Par contre l’idée d’avoir des packages avec des failles de sécurité ça m’insupporte. Donc j’utilise le grand portaudit et si il trouve un package foireux je l’upgrade vers les build de STABLE (qui sont plus récents).

# export PACKAGEROOT="ftp://ftp.fr.freebsd.org"
# pkg_add -r portaudit
# /usr/local/sbin/portautit -Fda
Problem found with phplol see http://machintruc.com/64867/php/6764

Et pour tous les packages faillibles :

# export PACKAGESITE="ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/"
# pkg_add -rF phplol

Te voilà avec un système très nice nice qui te laissera dormir jusqu’au prochain local root voir même jusqu’à la prochaine release.