Обновление FreeBSD


Операционная система FreeBSD находится в постоянным развитии. Некоторые люди предпочитают использовать официальные релизы, в то время как другие предпочитают синхронизировать систему в том числе и между этими событиями. И для первых, и для вторых также, достаточно важно, чтобы их система всегда содержала последние исправления безопасности. В этом разделе описаны те инструменты, которыми можно поддерживать Вашу систему все время обновленной и в случае доступности, перейти на более поздний релиз FreeBSD. Существует 2 метода обновленией - через получение бинарных кодов с серверов update.freebsd.org (freebsd-update) и обновление через сборки из исходных кодов ( CTM, CVS, SVN )
Через freebsd-update(8)

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

Вы можете редактировать конфигурационный файл /etc/freebsd-update.conf для большего контроля над процессом и более гибной работы утилиты.
Components src world kernel

- Список компонент системы, которые подлежат обновлению. По-умолчанию, система обновляет исходный код (src), основную базу (world) и ядро системы (kernel). Вы можете обновить конкретный компонент выборочно, указав через "/" категорию, которую следует обновить, например
src/bin - обновит лишь /usr/src/bin, world/games - обновит лишь /usr/games

Рекомендуется эти опции оставлять по-умолчанию, поскольку обновление лишь части системы может приводить к неожиданному поведению системы.
IgnorePaths

- Пути, которые указаны в этой опции, будут проигнорированы на этапе инсталляции обновлений. Эту опцию имеет смысл использовать, чтобы не дать freebsd-update переписать Ваши локальные модификации
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

- По путям, перечисленным в UpdateIfUnmonified, будут применены обновления только в том случае, если содержимое этих файлов не было модифицированно пользователем.

Опция KeepModifiedMetadata заставит freebsd-update сохранить все изменения во время модификаций.
MergeChanges /etc/ /var/named/etc/

- При обновлении на более новый релиз FreeBSD, пользовательские модификации файлов, перечисленные в MergeChanges пройдут процедуру слияния с более новыми версиями файлов из нового релиза. Процедура работы аналогична работе с шаго mergemaster при обновлении через исходные коды.
# WorkDir /var/db/freebsd-update

- Временный каталог, куда будут загружены обновления. Партишен, где находится этот катаолг должен содержать не меньше 1 Гигабайта доступного дискового пространства
# StrictComponents no

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

Патчи безопасности могут быть загружены с удаленной машины следующими командами:
freebsd-update fetch
freebsd-update install

В том случае, если патчи безопасности относились к ядру (ядро или модули), по завершению работы freebsd-update систему необходимо будет перезагрузить. Для регулярной отработки этой операции, можно воспользоваться cron(8), поместив в него следующую строчку:
@daily root freebsd-update cron

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

В том случае, если после freebsd-update работа системы нарушена, есть способ вернутся на прежнее состояние через команду
freebsd-update rollback

Утилита freebsd-update в состоянии обновлять только GENERIC-ядро. В том случае, если Вы используете ядро собственной сборки, Вам потребуется его перекомпилировать после каждой отработки freebsd-update, в которой затронуты изменения относящиеся к ядру. freebsd-update также может обнаруживать и обновлять GENERIC ядро, по пути /boot/GENERIC (если оно существует), поэтому, хранить еще одно ядро в /boot/GENERIC - это хорошая идея.

Уровень патчей на системе идентифицирует число, следующее за буквой 'p' в имени релиза (команда uname -r)
Обновления
Подготовка

Внимание! Вы можете обновлять систему, будучи загруженным на собственном ядре, однако всегда рекомендуется иметь в системе копию стандартного ядра, расположенного в /boot/GENERIC каталоге. Его можно получить, например, с установочного диска FreeBSD:
mount /cdrom
cd /cdrom/X.Y-RELEASE/kernels
./install.sh GENERIC

Где X.Y - это релиз системы, который Вы используете.

Помимо этого, GENERIC ядро можно собрать из исходных кодов:
cd /usr/src
env DESTDIR=/boot/GENERIC make kernel
mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
rm -rf /boot/GENERIC/boot
Шаг1: получение обновлений

Для того, чтобы обновить систему на определенный релиз, freebsd-update необходимо запускать с ключем -r, где после 'r' указывается конечная версия системы.

Например:
freebsd-update -r 7.2-RELEASE upgrade

заставит freebsd-update получить те дополнения, которые необходимы для FreeBSD 7.2-RELEASE. В процессе отработки, будут выведены те категории системы, которые будут подлежать обновлению. Нажатием 'y' (или Enter) на вопрос "Does this look reasonable (y/n)? y" Вы подтверждаете, что freebsd-update будет скачивать перечисленные категории на локальный диск.

В том случае, если система запущена не на GENERIC ядре, вы получите об этом соответствующее уведомление:

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

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

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

Обратите внимание, что на данном этапе, все изменения и слияния конфиг-файлов происходят в другом каталоге, поэтому, в случае проблем (пропажа питания), система загрузиться в привычное состояние, а шаги по обновлению придется делать заново.
Шаг2: применение обновлений для ядра
freebsd-update install

На этом этапе будут обновлено ядро и модули ядра. После этого шага, система нуждается в перезагрузке. Если система работает не на GENERIC ядре, используйте nextboot(8) для установки ядра следующей загрузки:
nextboot -k GENERIC

Перезагрузка:

shutdown -r now
Шаг3: применение обновлений userland

После перезагрузки, freebsd-update должна быть запущена вновь, для обновления базовых утилит и библиотек.
freebsd-update install

Внимание! Поскольку на этом этапе возможна инсталляция библиотек более старших версий, сторонее ПО (например устанавливаемое из портов) требуется переустанавливать. Для этого можно воспользоваться утилитами (ports-mgmt/portupgrade, ports-mgmt/portinstall). Если в данный момент времени эта процедура невозможна, прочтите пункт 'c' в замечениях.

Если Вами используется не GENERIC ядро, самое время, чтобы его перестроить и установить ( cd /usr/src && make kernel KERNCONF="MYKERNEL" )
shutdown -r now

Процесс обновления завершен.
Из исходных кодов

Долгое время, до появления freebsd-update, этот метод был единственным. В данный момент метод полезен в тех вариантах, когда утилита freebsd-update не поддерживает требуемую вам ветку ( например FreeBSD-HEAD ), используете свои собственные модификации исходных кодов, используете одну сборку системы для поддержания большого количества систем и ряда других случаев.
Шаг1: Получение исходных кодов.

Исходные коды FreeBSD обычно располагаются в каталоге /usr/src. Если содержимое этого каталога пусто, его можно получить например следующими способами:
Из первого CD диска дистрибутива (для любой архитектуры), например 7.1-RELEASE-[arch]-disc1.iso, либо DVD диска:

a) подмонтируйте диск в любую доступную точку монтирования, например /cdrom:
mount /cdrom

b) Зайти в каталог, содержащий комперссированное содержимое исходных кодов, каталог /cdrom/{RELEASE-NAME}/src. Для 7.1-RELEASE:
cd /cdrom/7.1-RELEASE/src

c) Запустить распаковку:
sh install.sh all
Через утилиту csup(1):

a) Скопируем пример конфигурационного файла для cvsup в удобную директорию, например /root/share/csup
mkdir -p /root/share/csup/
cp /usr/share/examples/cvsup/stable-supfile /root/share/csup/

b) Откроем /root/share/csup/stable-supfile на редактирование, где как минимум, необходимо задать на какую ревизию обновлять и откуда.
default release=cvs tag=RELENG_7

где tag= указывает, какую ветку следует синхронизировать.

Если Вы хотите иметь N-stable, ставьте RELENG_N

Если Вы хотите N.M-RELEASE, ставьте RELENG_N_M

Если Вы хотите обновится на HEAD (CURRENT), девелоп-версию FreeBSD, ставьте tag=.
default host=CHANGE_THIS.FreeBSD.org

CHANGE_THIS.FreeBSD.org - изменить на зеркало CVSup. Их список можно просмотреть, например здесь http://www.freebsd.org/doc/handbook/mirrors.html

Hint: можно использовать утилиту sysutils/fastest_cvsup для поиска наиболее быстрого/ближайшего для Вас зеркала

Строчки
default host=cvsup4.ru.FreeBSD.org
default release=cvs tag=RELENG_7_1

Заставят дерево исходных кодов обновиться до 7.1-RELEASE с зеркала cvsup4.ru.freebsd.org

c) Создадим скрипт для запуска csup, например /root/bin/csup-bsd.sh

Содержимое файла:
#!/bin/sh
CSUP=`which csup`
CONFFILE="/root/share/csup/stable-supfile"

if [ ! -z ${CSUP} ]; then
${CSUP} -g -z ${CONFFILE}
else
echo "csup not found"
fi

PS: содержимое файла /root/bin/csup-bsd.sh, если Вы используете sysutils/fastest_cvsup (и ищите cvsup в зоне "ru" ( fastest_cvsup -q -c ru )):
#!/bin/sh
CSUP=`which csup`
CONFFILE="/root/share/csup/stable-supfile"
FASTEST_CVSUP=`which fastest_cvsup`

if [ ! -z ${FASTEST_CVSUP} ]; then
if SERVER=`fastest_cvsup -q -c ru`; then
${CSUP} -h $SERVER ${CONFFILE}
fi
else
echo fastest_cvsup not found, using directly
${CSUP} -g -z ${CONFFILE}
fi

d) Сделать скрипт выполняемым и запустить:
chmod +x /root/bin/csup-bsd.sh
sh /root/bin/csup-bsd.sh
Через утилиту svn(1)

После миграции "движка" SCM для проекта FreeBSD с Cvsup на Subversion, стал доступен метод обновления через утилиту svn(1). Старый (cvsup) метод по-прежнему доступен, но через какое-то время cvsup выйдет из эксплуатации. Тем не менее, в силу некоторых причин (например, отсутствие svn клиента в базовой системе FreeBSD 7/8) csup является предпочтительным вариантом.

a) Установка svn, если это еще не сделано:

Из портов:
cd /usr/ports/devel/subversion && make install

Из пекеджей с сервера ftp.freebsd.org:
pkg_add -r subversion

b) Создадим скрипт для запуска сессии обновления, например /root/bin/svn-bsd.sh:
#!/bin/sh
SVN=`which svn`

if [ ! -z ${SVN} ]; then
${SVN} checkout svn://svn.freebsd.org/base/stable/7 /usr/src
else
echo "svn not found"
fi

где svn:svn.freebsd.org/base/stable/7 - задает ветку синхронизации указывая svn-у обновить /usr/src до 7-STABLE другие примеры: svn:svn.freebsd.org/base/release/7.1.0 - обновить до 7.1-RELEASE
svn://svn.freebsd.org/base/head - обновить /usr/src до HEAD (CURRENT), develop-версии FreeBSD

Посмотреть, куда можно обновиться, можно используя WEB интерфейс svn.freebsd.org

c) Сделать скрипт выполняемым и запустить:
chmod +x /root/bin/svn-bsd.sh
sh /root/bin/svn-bsd.sh
Шаг2: компиляция мира

Запуск процесса сборки userland
cd /usr/src
make buildworld

(PS: Процесс длительный, зависящий от быстродействия Вашей системы и файлов /etc/src.conf, /etc/make.conf Если Вы планируете и дальше поддерживать состояние системы в актуальном состоянии, можно добавить ключ NO_CLEAN для make, чтобы система не собирала объектные файлы для тех исходных кодов, кто не претерпел изменения, что заметно экономит время при вторичной и будущих перекомпиляций:
make buildworld -DNO_CLEAN

Также, можно попробовать собирать через параллельную сборку (ключ -j для make(1)), указав сборку в несколько потоков. Рекомендуется для мультипроцессорных(-ядерных) систем:
make buildworld -j4 -DNO_CLEAN
Шаг3: компиляция ядра и инсталляция

Запуск процесса сборки ядра и инсталляция в /boot/kernel/*
cd /usr/src
make kernel KERNCONF="KERNEL_NAME"

где KERNEL_NAME - имя ядра. Если кастомизации конфиг ядра не было, как правило - GENERIC Ваше старое ядро при этом, будет скопировано в /boot/kernel.old/kernel

Указать, что следующая загрузка системы пройдет в Single-mode (если Вы обновляете локальную машину, либо имеете доступ к удаленной машине посредством KVM/iLO и тп:
nextboot -k kernel -o "-s"

Если обновляемая система удаленная, только с доступом по сети в ОС, этого не требуется, однако риск столкнуться с проблемой возрастает.

Перезагрузка системы:
shutdown -r now
Шаг4: инсталляция мира

После загрузки в Single-mode. Примонтируем все в RW-режим:
/sbin/mount -a

Убедимся, что загруженное ядро является работоспособным и обновленным:
/usr/bin/uname -a

Запускаем инсталляцию свежескомпилированных базовых программ:
cd /usr/src
make installworld

Перезагружаемся:
/sbin/shutdown -r now
Шаг5: синхронизация конфиг файлов

В данный момент, система загружена на обновленую версию, однако содержащую старые библиотеки от предыдущего релиза и старый синтаксис конфигурационных файлов (а возможно и уже устаревших и лишних)

Исправляется последнее через интерактивную работу с mergemaster
mergemaster -p

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

по окончанию выполните
exit

для загрузки в многопользовательский режим, если Вы загружены в однопользовательский.
Шаг6: пересборка стороннего ПО

Внимание! Поскольку на этом этапе обновления возможна инсталляция библиотек более старших версий, сторонее ПО (например устанавливаемое из портов) требуется переустанавливать. Для этого можно воспользоваться утилитами (ports-mgmt/portupgrade, ports-mgmt/portinstall). Если в данный момент времени эта процедура невозможна, прочтите пункт © в замечениях до перехода к пункту 7.
Шаг7: удаление старый файлов и библиотек

Удалить устаревшие для Вашего релиза файлы и библиотеки следующими действиями:
cd /usr/src
make delete-old
make delete-old-libs

Данные команды интерактивно будут Вас спрашивать удаление конкретного устаревшего файла. Если вы уверены в себе и своей системе, удалить без вопросов можно через
yes | make delete-old
yes | make delete-old-libs

Процесс обновления завершен.
Замечания

a) Просмотреть, какие версии для обновления доступны через freebsd-update, можно здесь: http://update.freebsd.org - каталоги с префиксом "to-".

b) Посмотреть список систем, с которых можно обновляться через freebsd-update, можно здесь: http://update.freebsd.org/ -каталоги вида X.Y-RELEASE. (Например, с любого RELENG_X, ввиду того, что исходные коды этой ветки никогда не бывают "заморожены", воспользоваться freebsd-update не получиться.)

c) Для того, чтобы сторонее ПО могло продолжать успешно работать без перекомпиляции, через порты доступны пакеты, содержащие более ранние версии библиотек (misc/compatNx), где N - номер версии FreeBSD, требующейся для совместимости.
misc/compat3x
misc/compat4x
misc/compat5x
misc/compat6x

Если Вы используете собственные сборки ядра, опции COMPAT_ также могут быть полезны для поддержки системных вызовов более ранних ядер релизов:
options COMPAT_FREEBSD4 # Compatible with FreeBSD4
options COMPAT_FREEBSD5 # Compatible with FreeBSD5
options COMPAT_FREEBSD6 # Compatible with FreeBSD6
options COMPAT_FREEBSD7 # Compatible with FreeBSD7

Для проверки, имеются ли в Вашей системе файлы, слинкованные с удаленными библиотеками, можно воспользоваться утилитой sysutils/libchk, доступной из портов.

d) Всегда используйте процедуры резервного копирования перед любыми работами по обновленю системы.

http://wiki.bsdportal.ru/doc:freebsd_update

Обновлено: 12.03.2015