Своевременное применение обновлений безопасности и переход
на более новую версию операционной системы - важные
аспекты системного администрирования. FreeBSD включает в себя
программу freebsd-update
, которую можно
использовать для решения обеих задач.
Эта программа используется для установки распространяемых в
двоичном виде обновлений безопасности и исправлений для FreeBSD
без необходимости ручной компиляции и установки патчей или
нового ядра. Двоичные обновления доступны для всех архитектур
и версий, поддерживаемых группой безопасности. Перечень
поддерживаемых версий и их ожидаемые даты окончания поддержки
указаны на странице http://www.FreeBSD.org/security/
.
Эта программа также используется для незначительных
обновлений версии операционной системы, а также для перехода на
другую ветвь выпуска релизов. Перед обновлением следует
ознакомиться с объявлением о выпуске новой версии, так как там
может содержаться важная информация, применимая к версии, на
которую намечен переход. С соответствующими объявлениями можно
ознакомиться по ссылке http://www.FreeBSD.org/releases/
.
Если имеется задание crontab
,
запускающее freebsd-update(8), то перед сменой версии
операционной системы его обязательно нужно выключить.
В этом разделе описывается конфигурационный файл
freebsd-update
, демонстрируется применение
исправлений безопасности и обновление операционной системы со
сменой младшей или старшей версии, а также обсуждаются некоторые
соображения касаемо смены версии операционной системы.
Конфигурационный файл 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
.
Процесс применения обновлений безопасности 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
правильно сообщать текущий набор изменений в системе. Это
в частности может помочь при сопровождении множества систем,
поскольку позволяет быстро оценить наличие установленных
обновлений в каждой из них.
Обновление с 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, <<Обновление пакетов после смены старшей версии системы>>.
Перед использованием 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
.
После обновления системы со сменой младшей версии
установленные приложения, в целом, продолжают работать без
каких-либо проблем. Различные старшие версии используют
различающиеся двоичные интерфейсы приложений (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. На этом процесс обновления завершён.
С помощью команды 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>.