ezjail : mettre à jour ses jails FreeBSD avec freebsd-update
ezjail (sur la documentation duquel votre serviteur a pas mal travaillé ces derniers temps) est un outil d'administration des jails pour FreeBSD. Dirk Engling a ajouté il y a peu la possibilité de mettre à jour le système de base des jails en utilisant FreeBSD Update (c'est dans le CVS, pas encore dans la dernière version d'ezjail). Il est donc possible de passer son serveur FreeBSD avec ses jails d'une version à l'autre sans avoir à compiler quoi que ce soit.
1. Les jails de FreeBSD
Quelques petits rappels pour les malheureux Linuxiens qui ne
connaîtraient pas les jails de FreeBSD. Les jails de FreeBSD sont
parfois comparées à des chroot
sur stéroïdes ; maintenant que Linux
a des choses telles qu'OpenVZ ou LXC, il faudrait plutôt utiliser cela
comme comparaison.
Les jails pour FreeBSD ont été introduites dans FreeBSD 4.0
(mars 2000) par Poul-Henning Kamp (le développeur derrière UFS2 et pas
mal de code tournant autour du stockage disque, l'auteur du
malloc(3)
de FreeBSD, du cache Varnish, et l'inventeur de
l'expression bikeshedding). Une jail est définie par :
- un dossier racine ;
- un nom d'hôte ;
- optionnellement une ou plusieurs adresses IP ;
- une commande, qui est typiquement
/etc/rc
pour lancer un FreeBSD complet.
Depuis l'intérieur de la jail, il est impossible de sortir du
dossier racine, contrairement à un chroot(2)
. Les processus tournant
à l'intérieur de la jail ne peuvent utiliser que les adresses IP
attribuées par l'administrateur pour se connecter ou accepter des
connexions externes.
Le dossier attribué à une jail peut être tout petit (une dizaine de fichiers, comme le décrit Bapt dans ses NANO Jails), ou contenir un système FreeBSD complet (voire un système CentOS, en utilisant la couche d'émulation de Linux).
Pour des jails contenant un système FreeBSD complet, on voit qu'il peut rapidement y avoir quelques difficultés d'administration :
- une approche naïve conduirait à avoir autant d'installations de FreeBSD que de jails, ce qui est gourmand en espace disque (et en consommation mémoire, les bibliothèques dynamiques ne pouvant pas être partagées) ;
- lorsqu'une mise à jour est publiée, il faut réaliser autant de mises à jour que de jails ;
- même si créer une jail est facile et se fait en environ 6 lignes, cela pourrait être encore plus simple.
ezjail propose une solution à tout cela, et notamment aux deux
premiers points en utilisant mount_nullfs(4)
(l'équivalent du mount
-o bind
de Linux) pour fournir à toutes les jails une unique
installation de FreeBSD en lecture seule ; cette installation est
appelée la basejail. ezjail a un certain nombre d'autres
fonctionnalités, que je ne déveloperai pas ici.
2. Mise à jour du système de base
2.1. Pour l'hôte
Depuis l'introduction de FreeBSD Update, il est possible de mettre à jour son OS diabolique, y compris d'une version à l'autre. La procédure est décrite à chaque fois dans l'annonce de sortie, mais se résume à :
- télécharger les nouveaux fichiers et merger les fichiers de
configuration (c'est l'étape demandant un peu d'intervention
manuelle) avec
freebsd-update -r 8.2-RELEASE
; - installer le nouveau noyau avec
freebsd-update install
, et rebooter sur le nouveau noyau ; - installer les nouveaux fichiers du « monde », avec un deuxième
passage de
freebsd-update install
; - s'il s'agit d'un changement de branche (par exemple 7.4 -> 8.2), recompiler les ports contre les nouvelles bibliothèques.
2.2. Pour les jails
Comme nous l'avons dit au début, ezjail dans sa version CVS permet de mettre à jour la basejail à partir de FreeBSD Update. Le port ezjail n'a pas encore été mis à jour. J'ai un port local d'ezjail, qui installe directement à partir du CVS.
Une fois la version CVS d'ezjail installée, la mise à jour se fait tout simplement :
# ezjail-admin update -s 8.1-RELEASE -U
On notera qu'il est nécessaire de donner la version actuelle de la
basejail : FreeBSD Update utilise en temps normal uname -r
pour
connaître la version actuelle de la machine, ce qui n'est bien sûr pas
possible dans une jail, puisque uname
va renvoyer la version du
noyau de l'hôte, et non de l'espace utilisateur de la basejail.
Un problème : freebsd-update(8)
détecte les composants installés à
partir de deux choses : la ligne Components
dans
/etc/freebsd-update.conf
, et ce qui est réellement sur le disque.
Cependant, le noyau est géré un petit peu à part, et est ajouté aux
composants à mettre à jour si Components
liste kernel
et si la
nouvelle version vient avec un nouveau noyau, même si le noyau n'est
pas installé sur la cible. Bien sûr, vouloir mettre à jour le noyau
dans une jail ne va pas donner grand'chose… Ma solution a été de
supprimer kernel
des composants potentiellement installés. À terme,
il faudra probablement qu'ezjail lance freebsd-update
avec un
fichier de configuration à lui.
2.3. Et pour les ports ?
ezjail a depuis longtemps la possibilité, avec update -p
, de mettre
à jour l'arbre des ports ; mais pour mettre à jour les ports
eux-mêmes, rien de spécial n'est prévu. La technique habituelle,
lorsqu'on a beaucoup de machines, est de consacrer une jail à la
compilation de ports, et d'utiliser pkg_create -b
pour créer des
packages
qu'on distribue ensuite aux autres jails.