freebsd-update de 8.3-RELEASE para 9.0-RELEASE: Como lidar com dezenas de diffs?

5

Eu estou atualizando um sistema FreeBSD 8.3-RELEASE para o FreeBSD 9.0-RELEASE usando freebsd-update . Esta é minha primeira vez realizando uma grande atualização de versão no FreeBSD.

Em um ponto do processo, o freebsd-update executa um diff nos arquivos que são diferentes do esperado para o 9.0-RELEASE. Ele compara a versão atual no sistema com as novas alterações adicionadas do 9.0-RELEASE. Eu modifiquei algumas dúzias de arquivos em / etc, e sou apresentado com este diff uma vez por arquivo.

Assim, sou apresentado a dezenas e dezenas de diffs que abrem em uma janela vi e se parecem com isso:

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

### vi window opens

<<<<<<< current version
driftfile /etc/ntp/drift
=======
#
# $FreeBSD: release/9.0.0/etc/ntp.conf 195652 2009-07-13 05:51:33Z dwmalone $
#
# Default NTP servers for the FreeBSD operating system.
#
# Don't forget to enable ntpd in /etc/rc.conf with:
# ntpd_enable="YES"
#
# The driftfile is by default /var/db/ntpd.drift, check
# /etc/defaults/rc.conf on how to change the location.
#
>>>>>>> 9.0-RELEASE

restrict default notrust nomodify ignore

E reclama de números menores de versão:

--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: src/gnu/usr.bin/man/manpath/manpath.config,v 1.25.28.1 2009/04/15 03:14:26 kensmith Exp $
+# $FreeBSD: src/gnu/usr.bin/man/manpath/manpath.config,v 1.25.32.1 2010/12/21 17:10:29 kensmith Exp $
 #
 # This file is read by manpath(1) to configure the mandatory manpath,
 # optional manpath and to map each path element to a manpath element.
 # The format is:
 #
Does this look reasonable (y/n)? y

E, na verdade, reclama da versão do RCS em dezenas de arquivos:

--- current version
+++ new version
@@ -1,4 +1,4 @@
-# $FreeBSD: src/etc/amd.map,v 1.10.8.1 2009/04/15 03:14:26 kensmith Exp $
+# $FreeBSD: release/9.0.0/etc/amd.map 164015 2006-11-06 01:42:11Z obrien $
 #
 /defaults       type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key}
 *               opts:=rw,grpid,resvport,vers=3,proto=tcp,nosuid,nodev
Does this look reasonable (y/n)?

E até reclama porque removi o número da versão do FreeBSD do meu arquivo /etc/passwd local (personalizado):

<<<<<<< current version
=======
# $FreeBSD: release/8.4.0/etc/master.passwd 243948 2012-12-06 11:54:25Z rwatson $
#
>>>>>>> 8.4-RELEASE
root:*:0:0:Charlie &:/root:/bin/csh
toor:*:0:0:Bourne-again Superuser:/root:
daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin

E assim por diante.

Isso requer que eu edite manualmente cada arquivo e remova as sequências como <<<<<<< current version >>>>>>> 9.0-RELEASE e ======= e mescle manualmente esses arquivos. Como descobri depois, se eu não remover essas cadeias, elas acabam no arquivo depois. Existem dezenas de arquivos que diferem entre 8.3 e 9.0, e eu tenho uma dúzia de modificações locais.

Parece que freebsd-update está usando uma função diff, sdiff ou mergemaster

O processamento desses arquivos é tedioso. Existe uma maneira que eu posso apenas dizer "Aceitar nova versão" ou "manter a versão antiga" ou "Sua mesclagem está correta"? Tem que haver uma maneira mais fácil de lidar com esses arquivos. Eu devo estar perdendo alguma coisa.

Este não é um grande problema para uma máquina, mas eventualmente eu farei isso dezenas de vezes e quero encontrar uma maneira mais fácil.

E eu não estou sozinho. Pelo menos um outro admin por aí apontou este problema. O autor de Zytrax.com: Guia de Sobrevivência para Atualização do FreeBSD: freebsd-update upgrading versões menores ou maiores também fala sobre esta situação:

Notes:

  1. When updating to a new release lots of stuff changes (much less so with a minor release). When scripts and configurations files are modified freebsd-update diffs them, loads them into vi and presents them for reconciliation. Since most of the changes are simple version number comment field changes this can be a serious pain (in our case well over 50 files were changed, over 40 were comment only changes). However, be warned - diligence is necessary (no :wq to every file without looking). Further, unless the file is visibly short all the diff marks (:/>>>/) need to be viewed and reconciled. Failure to do this will cause the resulting file to contain the diff indicators and many essential system files will simply croak when loaded (including the password file in our case) resulting in endless hours of fun looking for the files that were modified (guess how we found this out). While there is really no alternative to genuine file changes, having to undergo the edit reconciliation for comment only changes results in a serious shortcoming in the process. Better, perhaps, to move the replaced files into a special location and let the user manually reconcile those of interest. Just how often do you change /etc/periodic/weekly/310.locate?

Atualização:

Parece que esses diffs são gerenciados por merge (1) , não mergemaster. Da mesclagem (1) manpage:

   A conflict occurs if both file1 and file3 have changes in a common seg-
   ment of lines.  If a conflict is found, merge normally outputs a  warn-
   ing  and brackets the conflict with <<<<<<< and >>>>>>> lines.  A typi-
   cal conflict will look like this:

      <<<<<<< file A
      lines in file A
      =======
      lines in file B
      >>>>>>> file B
    
por Stefan Lasiewski 15.06.2012 / 20:50

4 respostas

3

Eu não estava obtendo muita resposta aqui, então perguntei em forums.freebsd.org .

A resposta curta é: Não. Não há uma maneira fácil de mesclar essas alterações usando o freebsd-update. O freebsd-update usa mescla (1) para realizar os diffs e merging, e merge não é muito amigável ou flexível.

Existem outras opções, como sysutils / etcupdate, como sugerido por kworr. No entanto, não vejo como isso pode ser integrado ao freebsd-update.

Pelo que eu li, o freebsd-update é uma maneira conveniente de atualizar o FreeBSD, mas ele falha de outras maneiras. Muitos administradores do FreeBSD não usam o freebsd-update, e preferem a maneira manual de usar a fonte e mergemaster (8) .

    
por 06.07.2012 / 22:16
1

Eu concordaria que, em muitos casos, o caminho mais antigo trará menos problemas; ou seja, se você estiver atualizando de uma "ramificação" não-RELEASE, atualizações de versão principais, etc.

Mas o freebsd-update é "da schiz" para manter um sistema RELEASE-branch atualizado com patches de segurança (ou, em outras palavras, uma máquina / servidor de produção).

Anytime você atualiza a partir de algo com mais de alguns meses, provavelmente há algumas mudanças nos arquivos em / etc --- a maneira mais antiga usa o "mergemaster", que é um pouco mais amigável que mescla, mas atualizar mesclagens para / etc / arquivos que foram modificados sempre será um PITA que requer um bom bocado de intervenção manual. É só que o mergemaster é um pouco (apenas um pouco) mais "user-friendly".

    
por 13.07.2012 / 17:51
0

Existe uma coisa boa chamada sysutils / etcupdate nos portos. Ele pode fazer uma mesclagem de três vias semi-automática de suas configurações, exigindo um envolvimento mínimo.

    
por 15.06.2012 / 22:15
0

Da minha leitura do manual, você pode definir alguns desses comportamentos no arquivo de configuração do freebsd-update:

    # Paths which start with anything matching an entry in an UpdateIfUnmodified
    # statement will only be updated if the contents of the file have not been
    # modified by the user (unless changes are merged; see below).
      UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

Embora eu sempre tenha feito atualizações / upgrades do modo manual, posso tentar isso em minha máquina de teste para ver como funciona.

    
por 17.07.2015 / 22:02

Tags