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.

Auteur : Frédéric Perrin

Date : mardi 5 avril 2011

Sauf mention contraire, les textes de ce site sont sous licence Creative Common BY-SA.

Ce site est produit avec des logiciels libres 100% élevés au grain et en plein air.