21.2. Обновление FreeBSD

Оригинальный текст написал Tom Rhodes.
На основе заметок, которые предоставил Colin Percival.

Своевременное применение обновлений безопасности и переход на более новую версию операционной системы - важные аспекты системного администрирования. FreeBSD включает в себя программу freebsd-update, которую можно использовать для решения обеих задач.

Эта программа используется для установки распространяемых в двоичном виде обновлений безопасности и исправлений для FreeBSD без необходимости ручной компиляции и установки патчей или нового ядра. Двоичные обновления доступны для всех архитектур и версий, поддерживаемых группой безопасности. Перечень поддерживаемых версий и их ожидаемые даты окончания поддержки указаны на странице http://www.FreeBSD.org/security/.

Эта программа также используется для незначительных обновлений версии операционной системы, а также для перехода на другую ветвь выпуска релизов. Перед обновлением следует ознакомиться с объявлением о выпуске новой версии, так как там может содержаться важная информация, применимая к версии, на которую намечен переход. С соответствующими объявлениями можно ознакомиться по ссылке http://www.FreeBSD.org/releases/.

Примечание:

Если имеется задание crontab, запускающее freebsd-update(8), то перед сменой версии операционной системы его обязательно нужно выключить.

В этом разделе описывается конфигурационный файл freebsd-update, демонстрируется применение исправлений безопасности и обновление операционной системы со сменой младшей или старшей версии, а также обсуждаются некоторые соображения касаемо смены версии операционной системы.

21.2.1. Конфигурационный файл

Конфигурационный файл freebsd-update самодостаточен и работает по умолчанию. Некоторые пользователи могут пожелать отредактировать конфигурационный файл /etc/freebsd-update.conf для лучшего контроля над процессом обновления. В комментариях описываются доступные в этом файле параметры, но для следующих из них может потребоваться дополнительное разъяснение:

# Components of the base system which should be kept updated.
Components world kernel

Данный параметр определяет, какие части FreeBSD будут обновлены. По умолчанию обновляется вся базовая система (world) и ядро (kernel). Вместо этого можно указать отдельные компоненты, такие как src/base или src/sys. Тем не менее, лучшим вариантом будет оставить всё как есть, поскольку изменение этого перечня с целью добавления особых пунктов потребует от пользователя указания подряд всех пунктов. Со временем это может привести к негативным последствиям из-за возможной рассинхронизации между исходными текстами и двоичными файлами.

# Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths /boot/kernel/linker.hints

Добавьте сюда пути к каталогам (например, /bin или /sbin), которые вы бы хотели оставить нетронутыми в процессе обновления. Этот параметр можно использовать для предотвращения перезаписывания локальных изменений программой 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

Этот параметр позволяет обновлять конфигурационные файлы в указанных каталогах, только если они не содержат изменений. При наличии каких-либо изменений со стороны пользователя автоматическое обновление таких файлов отменяется. Есть другой параметр KeepModifiedMetadata, который предписывает команде freebsd-update сохранять изменения в процессе слияния.

# When upgrading to a new FreeBSD release, files which match MergeChanges
# will have any local changes merged into the version from the new release.
MergeChanges /etc/ /var/named/etc/ /boot/device.hints

Список каталогов с конфигурационными файлами, для которых freebsd-update попытается выполнить слияние. Процесс слияния файла представляет собой последовательность изменений в формате diff(1), похожую на mergemaster(8), но с меньшим количеством параметров. Результат слияния принимается, открывается редактор или freebsd-update прекращает работу. В случае сомнений сделайте резервную копию /etc и просто согласитесь со всеми изменениями. Для получения подробной информации по команде mergemaster смотрите Раздел 21.6.4, <<Объединение файлов конфигурации>>.

# Directory in which to store downloaded updates and temporary
# files used by FreeBSD Update.
# WorkDir /var/db/freebsd-update

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

# When upgrading between releases, should the list of Components be
# read strictly (StrictComponents yes) or merely as a list of components
# which *might* be installed of which FreeBSD Update should figure out
# which actually are installed and upgrade those (StrictComponents no)?
# StrictComponents no

Если выставлено значение yes, то freebsd-update будет исходить из того, что список Components является полным, и не будет пытаться выполнить изменения за пределами этого списка. В действительности freebsd-update попытается обновить все файлы, которые принадлежат списку Components.

21.2.2. Обновления безопасности

Процесс применения обновлений безопасности FreeBSD был упрощён, что позволяет поддерживать систему в актуальном состоянии, используя freebsd-update. Для получения дополнительной информации по бюллетеням безопасности FreeBSD смотрите Раздел 14.14, <<Сообщения безопасности FreeBSD>>.

Обновления безопасности можно загрузить и установить с использованием следующих команд. Первая команда определяет наличие незагруженных обновлений и показывает файлы, которые будут изменены в процессе обновления. Вторая команда выполняет обновление.

# freebsd-update fetch
# freebsd-update install

Если были установлены обновления ядра, то после этого нужно перезагрузить систему. Если обновление установилось для какого-либо работающего в системе двоичного файла, то следует перезапустить затронутые приложения, чтобы использовалась исправленная версия двоичного файла.

Можно настроить ежедневную автоматическую проверку наличия обновлений, добавив следующую запись в /etc/crontab:

@daily                                  root    freebsd-update cron

При наличии обновлений они будут автоматически загружены. Пользователю root будет отправлено письмо, так что эти обновления можно будет просмотреть и установить самостоятельно командой freebsd-update install.

На случай, если что-то пошло не так, в freebsd-update предусмотрен механизм возврата последнего набора изменений с использованием следующей команды:

# freebsd-update rollback
Uninstalling updates... done.

Если после завершения всех действий было изменено ядро или какой-либо из его модулей, система должна быть перезагружена, а все затронутые исполняемые файлы нужно перезапустить.

Команда freebsd-update позволяет автоматически обновлять только ядро GENERIC. Если используется ядро с собственной конфигурацией, его понадобится пересобрать и переустановить после того, как freebsd-update завершит установку обновлений. Тем не менее, freebsd-update обнаружит и обновит ядро GENERIC при наличии /boot/GENERIC, даже если оно не является текущим используемым ядром в системе.

Примечание:

Всегда храните копию ядра GENERIC в /boot/GENERIC. Оно пригодится при решении различных проблем, а также при выполнении обновления со сменой версии. Смотрите Раздел 21.2.3.1, <<Собственная конфигурация ядра в FreeBSD 9.X и более поздних версиях>> для описания получения копии ядра GENERIC.

Если конфигурация в /etc/freebsd-update.conf не изменялась, freebsd-update вместе с остальными обновлениями установит обновлённые исходные тексты ядра. После этого можно обычным способом выполнить перестроение и переустановку нового ядра с собственной конфигурацией.

Обновления, получаемые с помощью freebsd-update, не всегда затрагивают ядро. Перестроение собственного ядра не является обязательным, если исходные тексты ядра не были изменены при выполнении freebsd-update install. Тем не менее, freebsd-update всегда обновляет /usr/src/sys/conf/newvers.sh. Текущий набор изменений, как указано в номере -p в выводе uname -r, получается из этого файла. Перестроение собственного ядра, даже если ничего больше не менялось, позволяет uname правильно сообщать текущий набор изменений в системе. Это в частности может помочь при сопровождении множества систем, поскольку позволяет быстро оценить наличие установленных обновлений в каждой из них.

21.2.3. Обновления со сменой старшей и младшей версий

Обновление с FreeBSD 9.0 на FreeBSD 9.1, называется обновлением со сменой младшего номера версии. Смена старшего номера версии происходит, когда FreeBSD переходит с одной значительной версии на другую, как, например, при обновлении с FreeBSD 9.X на FreeBSD 10.X. Оба типа обновлений можно произвести, указав freebsd-update версию, на которую нужно перейти.

Примечание:

Если в системе используется ядро с собственной конфигурацией, убедитесь перед началом обновления в наличии копии ядра GENERIC в /boot/GENERIC. Смотрите Раздел 21.2.3.1, <<Собственная конфигурация ядра в FreeBSD 9.X и более поздних версиях>> для описания получения копии ядра GENERIC.

Следующая команда, будучи запущенной на FreeBSD 9.0, выполнит обновление до версии FreeBSD 9.1:

# freebsd-update -r 9.1-RELEASE upgrade

После своего запуска freebsd-update анализирует содержимое конфигурационного файла и собирает необходимую для проведения обновления информацию о текущей установленной системе. На экран будет выдан перечень компонентов, которые удалось и не удалось обнаружить установленными. Например:

Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages

The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs

Does this look reasonable (y/n)? y

Следующим шагом freebsd-update попытается загрузить по сети файлы, необходимые для выполнения обновления. В некоторых случаях может потребоваться ответить на вопросы относительно того, что и как устанавливать.

Если используется ядро с собственной конфигурацией, то в этом случае появится предупреждение следующего вида:

WARNING: This system is running a "MYKERNEL" kernel, which is not a
kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"

На этом этапе предупреждение можно проигнорировать. На промежуточном этапе процесса обновления будет использовано обновлённое ядро GENERIC.

После того, как все изменения были загружены, они будут применены. Этот процесс может занять определённое время, в зависимости от производительности и текущей загруженности компьютера. Затем будет выполнено слияние конфигурационных файлов. Процесс слияния требует от пользователя определённого вмешательства, так как для файла можно выполнить слияние автоматически, а можно открыть текстовый редактор для слияния вручную. Результат успешного слияния будет показан на экране. Неудачное или пропущенное слияние вызовет преждевременное завершение программы. Можно подготовить резервную копию каталога /etc для таких важных файлов как master.passwd и group и выполнить их слияние вручную позднее.

Примечание:

На данном этапе система еще не модифицирована, и все изменения и слияния происходят в отдельном каталоге. Теперь, когда все изменения успешно применены, все конфигурационные файлы объединены и кажется, что процесс должен пройти плавно, изменения могут быть установлены на диск с помощью следующей команды:

# freebsd-update install

В первую очередь изменения будут применены к ядру и его модулям. При использовании ядра с собственной конфигурацией укажите для следующей загрузки обновлённое ядро /boot/GENERIC с помощью nextboot(8):

# nextboot -k GENERIC

Предупреждение:

Перед перезагрузкой с ядром GENERIC убедитесь, что оно содержит все необходимые драйвера для системы для корректной загрузки и подключения к сети, если машина обновляется удалённо. В частности, если в ядре содержится встроенная функциональность, которая обычно обеспечивается модулями ядра, загрузите эти драйвера с ядром GENERIC, временно указав их как модули в /boot/loader.conf. Рекомендуется отключить несущественные службы, а также любые локальные и сетевые диски до завершения процесса обновления.

Теперь компьютер должен быть перезагружен с новым ядром:

# shutdown -r now

После перезагрузки нужно повторно запустить команду freebsd-update. Команда прочитает, на каком этапе она находится, и перейдёт к удалению старых объектных файлов и совместно используемых библиотек.

# freebsd-update install

Примечание:

Количество этапов установки обновлений может быть два вместо трёх и зависит от того, были ли изменены номера версий каких-либо совместно используемых библиотек.

На этом процесс завершён. Если было выполнено обновление со сменой старшего номера версии, переустановите все порты и пакеты в соответствии с описанием, которое предоставляет Раздел 21.2.3.2, <<Обновление пакетов после смены старшей версии системы>>.

21.2.3.1. Собственная конфигурация ядра в FreeBSD 9.X и более поздних версиях

Перед использованием freebsd-update убедитесь в наличии копии ядра GENERIC в /boot/GENERIC. Если ядро с собственной конфигурацией было собрано единожды, то в /boot/kernel.old будет находиться ядро GENERIC. Просто переименуйте этот каталог в /boot/kernel.

Если ядро с собственной конфигурацией было собрано более одного раза, получите копию ядра GENERIC, соответствующую текущей версии операционной системы. При наличии физического доступа копию ядра GENERIC можно установить с установочного носителя:

# mount /cdrom
# cd /cdrom/usr/freebsd-dist
# tar -C/ -xvf kernel.txz boot/kernel/kernel

Иначе, ядро GENERIC можно собрать и установить из исходных текстов:

# cd /usr/src
# make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null

Чтобы такое ядро было определено как ядро GENERIC программой freebsd-update, в файле конфигурации GENERIC должны отсутствовать изменения. Также предлагается, что ядро было собрано без использования каких-либо специальных параметров.

Загрузка с GENERIC не требуется, поскольку для freebsd-update достаточно существования /boot/GENERIC.

21.2.3.2. Обновление пакетов после смены старшей версии системы

После обновления системы со сменой младшей версии установленные приложения, в целом, продолжают работать без каких-либо проблем. Различные старшие версии используют различающиеся двоичные интерфейсы приложений (Application Binary Interface, ABI), из-за чего перестаёт работать большинство сторонних приложений. После обновления системы со сменой старшей версии все установленные пакеты и порты также нуждаются в обновлении. Пакеты можно обновить с использованием pkg upgrade. Для обновления установленных портов используется ports-mgmt/portmaster.

Принудительное обновление все установленных пакетов приведёт к их замене на последние версии из репозитория, даже если номер версии при этом не увеличивался. Это требуется из-за смены версии ABI при обновлении на другую старшую версию FreeBSD. Принудительное обновление можно выполнить так:

# pkg-static upgrade -f

Перестроение всех установленных приложений можно выполнить этой командой:

# portmaster -af

Эта команда будет отображать экран выбора конфигурации для каждого приложения, в котором доступны параметры конфигурации, с ожиданием пользовательского ввода. Чтобы не использовать такое поведение и всегда выбирать параметры по умолчанию, добавьте ключ -G в вышеприведённую команду.

После завершения процесса обновления программного обеспечения закончите процесс обновления последним запуском freebsd-update, для того чтобы убедиться, что ничто не было пропущено в процессе обновления:

# freebsd-update install

Если в качестве временной меры использовалось ядро GENERIC, то это подходящее время для построения и установки нового ядра с собственной конфигурацией в соответствии с инструкциями в Глава 9, Настройка ядра FreeBSD.

Перезагрузите машину с новой версией FreeBSD. На этом процесс обновления завершён.

21.2.4. Сравнение состояния системы

С помощью команды freebsd-update IDS можно получить состояние установленной версии FreeBSD относительно известной доверенной копии. Эта команда проверяет текущую версию системных утилит, библиотек и конфигурационных файлов, и её можно использовать в качестве встроенной системы обнаружения вторжений (Intrusion Detection System, IDS).

Предупреждение:

Эта команда не является заменой IDS, такой как security/snort. Поскольку freebsd-update сохраняет свои данные на диске, возможность подмены становится очевидной. И хотя эта возможность может быть уменьшена при использовании настройки kern.securelevel, а также используя для записи данных freebsd-update файловую систему, которая в остальное время смонтирована только на чтение, лучшим решением будет сравнить систему относительно эталона на физически защищенном носителе, таком как DVD или внешний USB диск с включённой защитой от записи.

Для того, чтобы начать сравнение, укажите файл для сохранения результатов:

# freebsd-update IDS >> outfile.ids

Запустится проверка системы, результат которой будет записан в указанный файл в виде списка файлов вместе с их контрольными суммами в формате SHA256 - для известных файлов из релиза и текущих в системе.

Строки в списке чрезмерно длинные, но зато такой формат вывода удобен для разбора. Так, для получения списка всех отличающихся от релиза файлов достаточно выполнить такую команду:

# cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf

Вывод специально обрезан, на самом деле файлов намного больше. Некоторые из них изменены в ходе нормальной работы: так, файл /etc/passwd был изменён после заведения пользователей в системе. Модули ядра могли измениться вследствие обновления через freebsd-update. Для исключения из проверки конкретных файлов и каталогов укажите их в качестве значения параметра IDSIgnorePaths в /etc/freebsd-update.conf.

Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.

По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.