Mise à jour binaire avec ''freebsd-update'' et merge de ''/etc''

Contexte : il s'agit d'opérer à cœur ouvert sur une upgrade binaire via freebsd-update qui ne se passe pas réellement comme prévu. Plus précisément, dans le cas qui nous intéresse, c'est une FreeBSD 7.2-RELEASE-p8 qui n'est plus supportée à la date de la tentative de passage en 7.3-RELEASE (et c'est un peu la raison de cette mise à jour, la fin du support).

Identification du problème

En pratique, la mise à jour s'est pour le moment bien déroulée, mis à part que freebsd-update vous propose de merger à la main une bonne partie des fichiers de /etc. Vous remarquez même que ce petit malin vous laisse faire tout son boulot à sa place, puisque l'écrasante majorité des modifications se limite à un diff de ce genre :

@@ -1,4 +1,4 @@
-# $FreeBSD: src/etc/amd.map,v 1.10.6.1 2008/11/25 02:59:29 kensmith Exp $
+# $FreeBSD: src/etc/amd.map,v 1.10.12.1 2010/02/10 00:26:20 kensmith Exp $
 #
 /defaults       type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key}
 *               opts:=rw,grpid,resvport,vers=3,proto=tcp,nosuid,nodev

Le message qui manifeste la présence de ce petit problème sera quelque chose du genre :

The following file could not be merged automatically: /etc/amd.map
Press Enter to edit this file in vi and resolve the conflicts
manually...

L'origine réelle du soucis semble être un petit trou dans les merges des versions précédentes. Explication : un merge précédent n'a pas été réalisé. Reprenons l'exemple de /etc/amd.map, et constatons que le fichier présent dans /var/db/freebsd-update/merge/7.2-RELEASE/etc/amd.map est légèrement différent : il s'agit d'un changement du commentaire avec l'identifiant du gestionnaire de version, $FreeBSD$. Dans la suite, une solution sale sera proposée, mais elle a été validée sans problème sur deux FreeBSD 7.2-RELEASE-p8 pour un passage en 7.3-RELEASE.

Préparation d'une solution

Dans un premier temps, on va réaliser une différence entre l'état de notre /etc et ce que l'on devrait avoir, à savoir ce qui est présent dans /var/db/freebsd-update/merge/7.2-RELEASE/. Il va sans dire que pour une version différente, il sera nécessaire d'adapter le chemin. Trivialement il vient :

# diff -ur /etc /var/db/freebsd-update/merge/7.2-RELEASE/etc/ |grep -v Only > 7.2-RELEASE.patch

Il va ensuite être nécessaire d'éditer le patch de sorte à ne pas altérer votre configuration locale. Pour réaliser cette opération, on peut utiliser l'outil diffstat qui permettra de voir les statistiques des changements dans le patch. Vu le problème soulevé, l'écrasante majorité des modifications doit se limiter à deux lignes, c'est-à-dire une sortie similaire à celle-ci :

 var/db/freebsd-update/merge/7.2-RELEASE/etc/amd.map                                |    2 
 var/db/freebsd-update/merge/7.2-RELEASE/etc/apmd.conf                              |    2 
 var/db/freebsd-update/merge/7.2-RELEASE/etc/auth.conf                              |    2 
 var/db/freebsd-update/merge/7.2-RELEASE/etc/bluetooth/hcsecd.conf                  |    2 
 var/db/freebsd-update/merge/7.2-RELEASE/etc/bluetooth/hosts                        |    2 
 var/db/freebsd-update/merge/7.2-RELEASE/etc/bluetooth/protocols                    |    2

Procédez donc à une analyse complète du patch, pour vous assurer que vous ne massacrerez pas votre configuration, comme cela pourrait être le cas de /etc/group ici :

 var/db/freebsd-update/merge/7.2-RELEASE/etc/group                                  |   10 

Prenons le cas de /etc/crontab :

diff -ur /etc/crontab /var/db/freebsd-update/merge/7.2-RELEASE/etc/crontab
--- /etc/crontab        2009-02-28 12:19:50.000000000 +0100
+++ /var/db/freebsd-update/merge/7.2-RELEASE/etc/crontab        2010-08-29 09:57:46.000000000 +0200
@@ -1,6 +1,6 @@
 # /etc/crontab - root's crontab for FreeBSD
 #
-# $FreeBSD: src/etc/crontab,v 1.32.32.1 2008/11/25 02:59:29 kensmith Exp $
+# $FreeBSD: src/etc/crontab,v 1.32.34.1 2009/04/15 03:14:26 kensmith Exp $
 #
 SHELL=/bin/sh
 PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
@@ -24,4 +24,3 @@
 # Adjust the time zone if the CMOS clock keeps local time, as opposed to
 # UTC time.  See adjkerntz(8) for details.
 1,31   0-5     *       *       *       root    adjkerntz -a
-0      4       */n     *       *       root    /usr/sbin/freebsd-update cron

Seule la première modification nous intéresse, on va donc retirer la seconde, qui commence dès le délimiteur @@ … @@ pour obtenir ce qui suit. Attention, si vous ajoutez/retirer des lignes entre deux délimiteurs, il devient nécessaire de modifier les références des numéros de lignes précisées dans ce délimiteur.

diff -ur /etc/crontab /var/db/freebsd-update/merge/7.2-RELEASE/etc/crontab
--- /etc/crontab        2009-02-28 12:19:50.000000000 +0100
+++ /var/db/freebsd-update/merge/7.2-RELEASE/etc/crontab        2010-08-29 09:57:46.000000000 +0200
@@ -1,6 +1,6 @@
 # /etc/crontab - root's crontab for FreeBSD
 #
-# $FreeBSD: src/etc/crontab,v 1.32.32.1 2008/11/25 02:59:29 kensmith Exp $
+# $FreeBSD: src/etc/crontab,v 1.32.34.1 2009/04/15 03:14:26 kensmith Exp $
 #
 SHELL=/bin/sh
 PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

En cas de doute (deux modifications dans le même délimiteur, etc.), il parait sage de supprimer tout le fichier du patch, c'est-à-dire depuis la ligne diff -ur …. Vous aurez le message vous demandant de réaliser le merge vous-même, mais moins de risque de faire des bêtises.

Application et validation

Une fois toutes ces opérations réalisées, on va appliquer le patch ainsi créé. Dans notre cas, il s'agit du fichier FreeBSD-7.2-RELEASE+prepare_7.3-RELEASE.patch. Pour commencer, nous proposons de vérifier que le patch s'applique sans soucis :

# patch -p0 --quiet --check < FreeBSD-7.2-RELEASE+prepare_7.3-RELEASE.patch

-p0 est utilisé car le diff réalisé est fait à partir de /etc ; –quiet limite l'affichage aux erreurs ; –check n'applique pas de modification aux fichiers, et permet de s'assurer que le patch s'applique correctement. Si vous avez bien travaillé, votre patch doit fonctionner, c'est-à-dire qu'à ce moment précis, aucune erreur n'est remontée par patch. Si ce n'est pas le cas, retournez modifier votre patch pour le corriger. Sinon, appliquez-le définitivement :

# patch -p0 --quiet < FreeBSD-7.2-RELEASE+prepare_7.3-RELEASE.patch

Ensuite, il vous suffit de relancer la mise à jour :

# freebsd-update -r 7.3-RELEASE upgrade

Les demandes de merge devraient être limitées aux fichiers que vous avez éliminé à la main, et à quelques-un de /var éventuellement, mais la situation est largement plus tenable que le cas précédent : sans cette intervention, ce n'est pas quatre ou cinq fichiers que vous devriez merger à la main, mais plus de 300.

freebsd/freebsd-update_et_merge_etc.txt · Last modified: 2010/09/06 06:22 by lissyx