从8.3-RELEASE到9.0-RELEASE的freebsd-update:如何处理数十个差异?

我正在使用freebsd-update将FreeBSD 8.3-RELEASE系统升级到FreeBSD 9.0-RELEASE。 这是我第一次在FreeBSD上进行一次主要的版本升级。

在这个过程中的一个点上,freebsd-update对不同于9.0-RELEASE预期的文件执行diff。 它将系统上的当前版本与从9.0-RELEASE添加的新更改进行比较。 我在/ etc下修改了几十个文件,每个文件都会显示一次。

因此,我提出了几十个在vi窗口中打开的差异,看起来像这样:

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 

它抱怨小版本号:

 --- 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 

事实上,它抱怨在几十个文件上的RCS版本string:

 --- 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)? 

甚至抱怨,因为我从我的本地(自定义) /etc/passwd文件中删除了FreeBSD的版本号:

 <<<<<<< 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 

等等。

这要求我手动编辑每个文件并删除像<<<<<<< current version >>>>>>> 9.0-RELEASE=======的string,并手动合并这些文件。 正如我后来发现的那样,如果我不删除这些string,他们最终会在文件中。 在8.3和9.0之间有几十个不同的文件,我自己也有十几个本地修改。

看起来freebsd-update使用了某种types的diff,sdiff或者mergemaster函数 ,但是我无法确切地知道它在做什么。

处理这些文件是乏味的。 有没有办法可以说“接受新版本”或“保留旧版本”或“您的合并是正确的”? 有一个更简单的方法来处理这些文件。 我肯定错过了什么。

这对于一台机器来说不是一个大问题,但是最终我会做这个几十次,我想找一个更简单的方法。

我并不孤单。 至less有一个其他pipe理员指出了这个问题。 Zytrax.com的作者:FreeBSD更新生存指南:freebsd-update升级小或主要版本也谈到了这种情况:

笔记:

  1. 当更新到新版本时,很多东西会发生变化(小版本的情况就less得多)。 当脚本和configuration文件被修改时,freebsd-update会对它们进行不同的处理,将它们加载到vi中,并提交它们以进行协调。 由于大部分更改都是简单的版本号注释字段更改,这可能是一个严重的痛苦(在我们的案例中,超过50个文件被更改,超过40个仅评论更改)。 但是,要警惕 – 勤勉是必要的(没有:每个文件没有看wq)。 此外,除非文件明显缩短,否则所有diff标记(:/ >>> /)都需要查看和调整。 不这样做会导致生成的文件包含比较指标,许多重要的系统文件将被加载(包括我们的情况下的密码文件),导致无尽的乐趣寻找被修改的文件(猜猜我们是如何发现了这一点)。 虽然没有真正的文件更改的替代scheme,但只有通过编辑和解进行评论才会导致过程中的严重缺陷。 或许更好的办法是将replace的文件移动到特定位置,并让用户手动调和感兴趣的文件。 你多久更换/etc/periodic/weekly/310.locate?

更新:

看起来像这些差异是由合并(1) ,而不是mergemasterpipe理。 从合并(1)手册页:

  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 

我在这里没有得到太多的回应,所以我在forums.freebsd.org上询问。

简短的回答是:没有。使用freebsd-update合并这些更改没有简单的方法。 freebsd-update使用merge(1)来执行差异和合并,并且merge不是非常友好或灵活。

还有其他选项,比如kworrbuild议的sysutils / etcupdate。 但是,我不明白如何可以与freebsd-update整合。

从我读到的,freebsd-update是升级FreeBSD的一个方便的方法,但是在其他方面失败了。 许多FreeBSDpipe理员根本不使用freebsd-update,而更喜欢使用source和mergemaster(8)的手动方式。

我同意,在很多情况下,较旧的方法会减less麻烦; 也就是说,如果你是从一个非RELEASE“分支”升级,主要版本升级等。

但是freebsd-update对于在安全补丁(或换句话说,生产机器/服务器)中保持RELEASE-branch系统当前是“da schiz”。

任何时候你从几个月前更新的东西都有可能对/ etc中的文件进行一些更改—以前的方式使用“mergemaster”,这合并稍微更友好,但是更新合并到/ etc /被修改总是会成为一个需要一点点人工干预的PITA。 这只是mergemaster是一个“只有一点点”更“用户友好”。

在端口中有一个名为sysutils / etcupdate的好东西。 它可以做一个半自动的三方合并您的configuration需要最小的参与。

从我读的手册中,你可以在freebsd-update的configuration文件中设置一些这样的行为:

  # 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 

虽然我一直以手动方式进行更新/升级,但是我可能会在我的testing机器上尝试这个方法,看看它是如何发生的。