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.