FreeBSD virtual environment management and repository

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