Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Операционные системы > UNIX > BSD > FreeBSD

Обновление 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 в зоне ( 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) Всегда используйте процедуры резервного копирования перед любыми работами по обновленю системы.

Ссылки по теме: Chapter 24: Updating and Upgrading FreeBSD


Материалы по обновлению FreeBSD

Бинарное обновление FreeBSD 6.2 до 8.0
Двоичное (бинарное) обновление FreeBSD с помощью freebsd-update (9.0 -> 9.1 -> 9.2)
Freebsd-update
Upgrade FreeBSD 9.1 to FreeBSD 10.0-RELEASE
Глава 21. Обновление системы и смена версии
9.5. Сборка и установка собственного ядра
FreeBSD: сборка собственного ядра
Сборка ядра ОС FreeBSD




Главная > Операционные системы > UNIX > BSD > FreeBSD