Во FreeBSD cуществует 2 метода обновленией — через получение бинарных кодов с серверов update.freebsd.org (freebsd-update) и обновление через сборки из исходных кодов ( CTM, CVS, SVN )
Через freebsd-update
Использование 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 — это хорошая идея.
Обновления
Шаг1: получение обновлений
Для того, чтобы обновить систему на определенный релиз, freebsd-update необходимо запускать с ключем -r, где после ‘r’ указывается конечная версия системы.
freebsd-update -r 8.1-RELEASE upgrade
После того, как необходимые категории будут сохранены начнется процесс их применения. Скорость операции зависит от скосрости и загрузки Вашей машины. Возможно, в процессе слияния конфигурационных файлов, система может столкнуться с трудностями и запустив редактор, потребует от Вас ручного вмешательства.
Обратите внимание, что на данном этапе, все изменения и слияния конфиг-файлов происходят в другом каталоге, поэтому, в случае проблем (пропажа питания), система загрузиться в привычное состояние, а шаги по обновлению придется делать заново.
Если вы используете не GENERIC ядро то бинарное обновление не получится. Я когда то пытался так обновится с MYGENERIC.
freebsd-update upgrade -r 8.1-RELEASE No mirrors remaining, giving up.
Шаг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).
Если Вами используется не GENERIC ядро, самое время, чтобы его перестроить и установить ( cd /usr/src && make kernel KERNCONF=«MYKERNEL» )
shutdown -r now
Процесс обновления завершен.
Из исходных кодов
Во FreeBSD имеется две ветки разработки: FreeBSD-CURRENT и FreeBSD-STABLE. FreeBSD-CURRENT является последними рабочими версиями исходных кодов FreeBSD и предназначена в первую очередь для разработчиков, тестеров и просто интересующихся людей. В отличие от FreeBSD-CURRENT ветка FreeBSD-STABLE является разработкой, из которой делаются основные релизы. Соответственно для использования на ответственных серверах рекомендуется FreeBSD-STABLE.
Для того чтобы иметь самые последние версии исходных текстов системы необходимо провести синхронизацию с любым из серверов проекта FreeBSD. Для этих целей воспользуемся утилитой cvsup с sup-файлом stable-supfile из каталога /usr/share/examples/cvsup. Это наиболее рекомендуемый метод, так как он позволяет вам загрузить набор исходных текстов один раз полностью, а затем загружать только произошедшие изменения.
cp /usr/share/examples/cvsup/stable-supfile /etc/cvsupfile cat /etc/cvsupfile #c какого сервера качать исходники *default host=cvsup.ru.FreeBSD.org *default base=/var/db *default prefix=/usr #версия исходников #если не указывать версию в ветке (RELENG_8_1), то будут скачиваться исходники #последней доступной версии, которая не обязательно может быть STABLE *default release=cvs tag=RELENG_8_1 *default delete use-rel-suffix #включаем сжатие *default compress #качать все исходники src-all
Запускаем cvsup и ждем пока закончится обновление.
# cvsup -g -L2 /etc/cvsupfile
Шаг1: компиляция мира
Запуск процесса сборки 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
Шаг2: компиляция ядра и инсталляция
Запуск процесса сборки ядра и инсталляция в /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"
Если обновляемая система удаленная, только с доступом по сети в ОС, этого не требуется, однако риск столкнуться с проблемой возрастает.Что бы снизить риск можно отключить некоторые службы.Отключить в /etc/rc.conf все службы, в которых нет необходимости для запуска системы это СУБД, FTP, Apache и т.д. (sshd не выключать!)
Перезагрузка системы:
shutdown -r now
Шаг3: инсталляция мира
После загрузки в Single-mode. Примонтируем все в RW-режим:
/sbin/mount -a
Убедимся, что загруженное ядро является работоспособным и обновленным:
/usr/bin/uname -a
Запускаем инсталляцию свежескомпилированных базовых программ:
cd /usr/src make installworld
Перезагружаемся:
/sbin/shutdown -r now
Шаг4: синхронизация конфиг файлов
В данный момент, система загружена на обновленую версию, однако содержащую старые библиотеки от предыдущего релиза и старый синтаксис конфигурационных файлов (а возможно и уже устаревших и лишних)
Исправляется последнее через интерактивную работу с mergemaster
Несколько слов о работе этой утилиты. Она сравнивает уже установленные файлы конфигурации с теми которые предлагаются новой версией FreeBSD. Если есть отличия, то на экране появляется сообщение об этом. Первой строкой в нем идет имя файла, который не соответствует новым требованиям, а ниже сами отличия. Знаком «-» помечаются строки, которые утилита собирается удалить, а «+» — которые будут добавлены.
В конце предлагаются следующие варианты:
d — удалить предлагаемый вариант и оставить старый;
i — установить предлагаемый вариант, удалив старый;
m — сравнить построчно старый и предлагаемый вариант;
v — посмотреть отличия в файлах снова.
Чаще всего можно жать i, но иногда это может привести к замене ваших настроек на дефолтные. Так что будте внимательны. Например, у меня установлен exim, а mergemaster предложил вернуть файл /etc/mail/mailer.conf в первоначальное состояние. Это мне не нужно, поэтому выбираю m.
Начинается построчное сравнение файлов. Экран делится на две части, слева строки из старого файла, а справа из предлагаемого. При нажатии на «Enter» выводятся возможные варианты последующих действий:
l — использовать вариант слевой стороны;
r — использовать вариант справой стороны;
и т.д.
В моем случае, чтобы оставить старые настройки жмем «l». После того как сравнение кончилось, предлагаются следующие варианты:
i — установить получившийся файл;
r — повторить сравнение снова;
v — просмотреть получивщийся файл.
Возможен также вариант, когда с новой версией системы появляются новые файлы, которых до этого не было. В таком случае предлагается только 2 варианта:
d — удалить предлагаемый вариант и оставить старый;
i — установить предлагаемый вариант, удалив старый.
И в таком же духе сравниваются все файлы.
mergemaster -p
по окончанию выполните
exit
для загрузки в многопользовательский режим, если Вы загружены в однопользовательский.
Шаг5: удаление старый файлов и библиотек
Удалить устаревшие для Вашего релиза файлы и библиотеки следующими действиями:
cd /usr/src
make delete-old make delete-old-libs
Данные команды интерактивно будут Вас спрашивать удаление конкретного устаревшего файла. Если вы уверены в себе и своей системе, удалить без вопросов можно через
yes | make delete-old yes | make delete-old-libs
Процесс обновления завершен.
Ссылки
http://wiki.bsdportal.ru/doc:freebsd_update
http://www.lissyara.su/articles/freebsd/tuning/make_buildworld/