2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !
Не бойтесь mergemaster
Среди начинающих и не только системных администраторов FreeBSD, часто наблюдается боязнь и непонимание относительно действий, когда в процессе freebsd-update (или при обновление через компиляцию исходных кодов) наступает черед отработки mergemaster (для FreeBSD 10.x: etcupdate), утилиты, призванной провести слияние тех кусков в ascii-конфигурационных файлов, которые появились в новой версии программ с уже имеющимися.
При больших изменениях сделанных администратором, это действительно может быть утомительно.
Между тем избежать головной боли, вызванной ручным разруливанием конфликтов (если автоматика бессильна или осторожничает) и/или возвратом своих конфиг-файлов обратно довольно просто — достаточно воспользовавшись функционалом rc.subr подсистемы, позволяющей через name_flags выносить в rc.conf все, что заблагорассудится при запуске той или иной программы.
Например, вас не устраивает настройка стандартного /etc/ssh/sshd_config – вам не требуется проверка rDNS, не хотите на 22 порту и вообще, политика авторизации вам не подходит.
Просто не трогайте стандартный файл /etc/ssh/sshd_config, а опишите нужные параметры в rc.conf. Например так:
sshd_flags="-oPort=1234 -oPermitRootLogin=without-password -oPasswordAuthentication=yes -oUseDNS=no"
и отработка mergemaster перестанет вам сбивать соответствующие настройки при каждом обновлении.
Таким же образом, выносите все ваши конфиги за пределы отработки mergemaster в те файлы (любые пути-файлы кроме стандартных имен),
в которые mergemaster заглядывать не будет.
Например, создадим свой каталог для хранения модифицированных конфигураций:
% mkdir /root/etc
Если используется ipfw и /etc/rc.firewalll вы модифицируйте, скопируйте файл /etc/rc.firewall в /root/etc/rc.firewall, а через флаги в /etc/rc.conf скормите альтернативный путь к боевой конфиге:
firewall_script="/root/etc/rc.firewall"
Другие примеры выноса конфигураций за пределы mergemaster:
syslogd_flags="-ss -c -f /root/etc/syslog.conf" inetd_flags="-wW -C 60 /root/etc/inetd.conf" named_conf="/etc/namedb/myconf.conf" newsyslog_flags="-CN -f /root/etc/newsyslog.conf" ..
и т.д. — все базовые утилиты, имеющие конфиг файлы, можно переопределить на альтернативный путь.
Необходимость редактирования системного файла /etc/crontab заменяем на пользовательский cron ( crontab -e), который хранит все записи в /var/cron.
Соответственно, вы правите лишь те файлы, которые скопировали в /root/etc (в случае с named выше, копируете /etc/namedb/named.conf в /etc/namedb/myconf.conf).
После таких незначительных изменений, как правило, mergemaster отрабатывает совершенно без капризов — ему остается провести слияние с ручными модификациями в /etc/group и /etc/master.passwd файлах, что не вызывает затруднений, и обновления систем проходят быстро, надежно и без поломок настроек сервисов.
Примечание: Разумеется, необходимость изучения Release Notes и отслеживание модификации в новых конфигурациях этот подход не отменяет.