我正在使用以下方法将 FreeBSD 8.3-RELEASE 系统升级到 FreeBSD 9.0-RELEASEfreebsd-更新这是我第一次在 FreeBSD 中进行重大版本升级。
在此过程中,freebsd-update 会对与 9.0-RELEASE 预期不同的文件执行 diff。它会将系统上的当前版本与从 9.0-RELEASE 添加的新更改进行比较。我修改了 /etc 下的几十个文件,每个文件都会显示一次此 diff。
因此,我看到了几十个差异,它们在 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 版本字符串:
--- 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
和 这样的字符串=======
,然后手动合并这些文件。正如我后来发现的那样,如果我不删除这些字符串,它们最终会留在文件中。8.3 和 9.0 之间有几十个文件不同,我自己也做了十几个本地修改。
似乎正在freebsd-update
使用 diff、sdiff 或合并主控函数某种程度上,但我说不出它到底在做什么。
处理这些文件非常繁琐。有没有办法让我直接说“接受新版本”或“保留旧版本”或“您的合并是正确的”?一定有更简单的方法来处理这些文件。我肯定遗漏了什么。
对于一台机器来说,这不是一个大问题,但最终我会这样做几十次,我想找到一种更简单的方法。
我不是唯一一个。至少有一位其他管理员指出了这个问题。Zytrax.com:FreeBSD 更新生存指南:freebsd-update 升级小版本或大版本也谈到了这种情况:
笔记:
- 当更新到新版本时,很多东西都会发生变化(小版本的变化就少得多)。当脚本和配置文件被修改时,freebsd-update 会比较它们,将它们加载到 vi 中并呈现以进行协调。由于大多数更改都是简单的版本号注释字段更改,这可能会非常麻烦(在我们的例子中,更改了 50 多个文件,其中 40 多个是仅注释的更改)。但是,请注意 - 勤奋是必要的(不要不看就对每个文件执行 :wq)。此外,除非文件明显很短,否则需要查看和协调所有差异标记 (:/>>>/)。如果不这样做,将导致生成的文件包含差异指示符,并且许多基本系统文件在加载时会崩溃(包括我们例子中的密码文件),从而导致无尽的寻找修改的文件的乐趣(猜猜我们是如何发现这一点的)。虽然除了真正的文件更改之外没有其他选择,但必须进行编辑协调才能进行仅注释的更改会导致流程中的严重缺陷。也许更好的办法是将替换的文件移动到一个特殊位置,让用户手动协调感兴趣的文件。你多久更改一次 /etc/periodic/weekly/310.locate?
更新:
看起来这些差异是由合并(1),而不是mergemaster。来自merge(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
答案1
答案2
我同意在很多情况下,旧的方法会带来较少的麻烦;也就是说,如果您从非发布“分支”升级、主要版本升级等。
但是 freebsd-update 是“da schiz”,用于保持 RELEASE 分支系统的安全补丁为最新(或者换句话说,生产机器/服务器)。
任何时候如果你从几个月前更新的版本中更新,/etc 中的文件可能会发生一些变化 --- 较旧的方式使用“mergemaster”,它是轻微地比merge更友好,但更新已修改的/etc/文件的合并总是很麻烦,需要大量的手动干预。只是mergemaster稍微(只有一点点)更“用户友好”。
答案3
有一件好事叫做sysutils/etcupdate 命令在端口中。它可以对您的配置进行半自动三向合并,只需最少的参与。
答案4
根据我对手册的阅读,您可以在 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
尽管我一直以手动方式进行更新/升级,但我可能会在我的测试机上尝试此操作以查看其进展如何。