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-обновления младших или основных версий также рассказывает об этой ситуации:
Заметки:
- При обновлении до нового выпуска многое меняется (в гораздо меньшей степени это касается незначительного выпуска). Когда файлы сценариев и конфигураций модифицируются, 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. Это может сделать полуавтоматическое трехстороннее слияние ваших конфигов, требующее минимального участия.