freebsd-update с 8.3-RELEASE до 9.0-RELEASE: как работать с десятками различий?

Я обновляю систему FreeBSD 8.3-RELEASE до FreeBSD 9.0-RELEASE, используя freebsd-update. Я впервые выполняю обновление основной версии во FreeBSD.

В какой-то момент процесса freebsd-update выполняет сравнение файлов, которые отличаются от ожидаемых для 9.0-RELEASE. Он сравнивает текущую версию в системе с новыми изменениями, добавленными из 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)?

И даже жалуется, потому что я удалил номер версии FreeBSD из моей локальной (пользовательской) /etc/passwd файл:

<<<<<<< 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 или mergemaster, но я не могу точно сказать, что она делает.

Обработка этих файлов утомительна. Есть ли способ, которым я могу просто сказать "Принять новую версию" или "сохранить старую версию" или "Ваше слияние правильно"? Должен быть более простой способ иметь дело с этими файлами. Я должен что-то упустить.

Это не большая проблема для одной машины, но в конечном итоге я буду делать это десятки раз и хочу найти более простой способ.

И я не одинок. По крайней мере, еще один администратор указал на эту проблему. Автор Zytrax.com: Руководство по выживанию при обновлении FreeBSD: обновление freebsd-обновления младших или основных версий также рассказывает об этой ситуации:

Заметки:

  1. При обновлении до нового выпуска многое меняется (в гораздо меньшей степени это касается незначительного выпуска). Когда файлы сценариев и конфигураций модифицируются, freebsd-update выводит их, загружает в vi и представляет для сверки. Поскольку большинство изменений являются простыми изменениями в поле комментария номера версии, это может быть серьезной болью (в нашем случае было изменено более 50 файлов, более 40 были только комментариями). Однако, будьте осторожны - необходимо усердие (нет:wq для каждого файла, не глядя). Кроме того, если файл не является явно коротким, все знаки различия (:/>>>/) должны быть просмотрены и согласованы. Невыполнение этого условия приведет к тому, что в результирующем файле будут содержаться индикаторы различий, и многие важные системные файлы будут просто грохнуться при загрузке (включая файл паролей в нашем случае), что приведет к бесконечным часам забавного поиска файлов, которые были изменены (угадайте, как мы выяснил это). Хотя в действительности нет альтернативы подлинным изменениям файлов, необходимость согласования изменений для комментариев приводит только к серьезным недостаткам в процессе. Возможно, лучше переместить замененные файлы в специальное место и позволить пользователю вручную согласовать интересующие вас файлы. Как часто вы меняете /etc/periodic/weekly/310.locate?

Обновить:

Похоже, эти различия управляются слиянием (1), а не слиянием. Из справочной страницы слияния (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

4 ответа

Решение

Я не получил большого ответа здесь, поэтому я спросил на форумах.freebsd.org.

Краткий ответ: Нет. Нет простого способа объединить эти изменения с помощью freebsd-update. freebsd-update использует merge(1) для выполнения различий и слияния, и merge не очень дружелюбный или гибкий.

Существуют и другие параметры, такие как sysutils/etcupdate, как предлагает kworr. Однако я не понимаю, как это можно интегрировать с freebsd-update.

Из того, что я прочитал, freebsd-update - это удобный способ обновить FreeBSD, но он не работает другими способами. Многие администраторы FreeBSD вообще не используют freebsd-update и предпочитают ручное использование с использованием source и mergemaster (8).

Я согласен с тем, что во многих случаях старый способ доставит меньше хлопот; то есть, если вы обновляете не-RELEASE "ветку", обновления основной версии и т. д.

Но freebsd-update - это "да schiz" для поддержания актуальности системы RELEASE-веток с исправлениями безопасности (или, другими словами, на рабочей машине / сервере).

Каждый раз, когда вы обновляете что-то более чем несколько месяцев назад, вероятно, есть некоторые изменения в файлах в /etc - более старый способ использует "mergemaster", который немного удобнее, чем слияние, но обновление объединяет в /etc/ files, которые имеют Модификация всегда будет PITA, которая требует хорошего ручного вмешательства. Просто Mergemaster немного (только немного) более "дружественный".

Из моего прочтения руководства вы можете установить некоторые из этих действий в файле конфигурации для 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

Хотя я всегда делал обновления / обновления вручную, я мог бы попробовать это на моей тестовой машине, чтобы увидеть, как это происходит.

В портах есть хорошая вещь под названием sysutils / etcupdate. Это может сделать полуавтоматическое трехстороннее слияние ваших конфигов, требующее минимального участия.

Другие вопросы по тегам