Differences

This shows you the differences between two versions of the page.

Link to this comparison view

freebsd:freebsd-update_et_merge_etc [2010/09/06 06:22] (current)
lissyx created
Line 1: Line 1:
 +====== 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 :
 +<​code>​
 +@@ -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
 +</​code>​
 +
 +Le message qui manifeste la présence de ce petit problème sera quelque chose du genre :
 +<​code>​
 +The following file could not be merged automatically:​ /​etc/​amd.map
 +Press Enter to edit this file in vi and resolve the conflicts
 +manually...
 +</​code>​
 +
 +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 :
 +<​code>​
 +# diff -ur /etc /​var/​db/​freebsd-update/​merge/​7.2-RELEASE/​etc/​ |grep -v Only > 7.2-RELEASE.patch
 +</​code>​
 +
 +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 :
 +<​code>​
 + ​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
 +</​code>​
 +
 +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 :
 +<​code>​
 + ​var/​db/​freebsd-update/​merge/​7.2-RELEASE/​etc/​group ​                                 |   ​10 ​
 +</​code>​
 +
 +Prenons le cas de ''/​etc/​crontab''​ :
 +<​code>​
 +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
 +</​code>​
 +
 +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.
 +<​code>​
 +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
 +</​code>​
 +
 +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 :
 +<​code>​
 +# patch -p0 --quiet --check < FreeBSD-7.2-RELEASE+prepare_7.3-RELEASE.patch
 +</​code>​
 +
 +Où ''​-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 :
 +<​code>​
 +# patch -p0 --quiet < FreeBSD-7.2-RELEASE+prepare_7.3-RELEASE.patch
 +</​code>​
 +
 +Ensuite, il vous suffit de relancer la mise à jour :
 +<​code>​
 +# freebsd-update -r 7.3-RELEASE upgrade
 +</​code>​
 +
 +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