Обновление FreeBSD 7.3 до FreeBSD 8.1 + JAILs

Очень хорошую и лаконичную статью выдал мне гугл при запросе “обновление FreeBSD”. Решил взять на заметку, так как вчера впервые обновлял фрю на боевом сервере с jail’ами.

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

Итак, начинаем:

# freebsd-update upgrade -r 8.1-RELEASE

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

# freebsd-update install

Установит новые исходники всего, в том числе и ядра, если это указано в /etc/freebsd-update.conf.

Перед тем, как перезагрузиться, нужно все таки проверить, поставлено ли новое ядро. У меня оно было, но все равно опишу способ “ручной” установки:).

Качаем ядро:

# mkdir -p /root/8kern
# cd /root/8kern
# wget -r -nd ftp://ftp4.ru.freebsd.org/pub/FreeBSD/releases/amd64/8.1-RELEASE/kernels/
# sh
# export DESTDIR=/
# sh install.sh generic
# exit
# mv /boot/kernel /boot/kernel.7.3
# mv /boot/GENERIC /boot/kernel

Отключаем на всякий случай файерволл ipfw в /etc/rc.conf (firewall_enable=”YES” в firewall_enable=”NO” например), или закомментировать загрузку pf, смотря что у вас стоит.

# shutdown -r now

Первая перезагрузка с новым ядро и старым софтом.

# freebsd-update install

В результате выполнения этой команды, будут установлены новые бинарники и библиотеки.

И вот тут я допустил одну очень печальную ошибку (но… как говориться в оправдание… было 2 часа ночи и голова уже соображала туго). Так вот, я не стал ничего собирать, как было написано у автора статьи:

Вот тут уже можно пересобирать софт, ядро со своим конфигом при необходимости.

И потом об этом пожалел. Что случилось? Да в принципе ничего сверхстрашного, просто вместо того, чтобы сократить себе время обновления – я его продлил. Причина тому было то, что после этой команды в системе еще есть старые библиотеки и можно с относительно малыми патерями все пересобрать. Но… как говориться, мы не ищем легких путей:(

В итоге, я не пересобрав софт и не воспользовавшись своим конфигом ядра, выполнил команду еще раз:

# freebsd-update install

После чего все старые системные библиотеки, которые могли требоваться софту, были беспощадно удалены. И мне пришлось в дальнейшем действовать в ручную, правя конфиги.

Но обо всем по порядку.

# shutdown -r now

Финальная перезагрузка в новую систему, с новым ядром и обвеской, но не рабочим (увы) софтом и GENERIC ядром.

Тут я допустил вторую ошибку, которая оговаривалась выше – во время исправлений конфигов недоглядел за конфигурацией ssh и просто согласился с внесением изменений. И будь машина далеко, я бы потерял еще минут 30 времени, реанимируя удаленку.

Ну делать нечего, начал удалять/обновлять пакеты, необходимые для запуска утилиты portupgrade. Жаловалась при установке она в основном на 2 пакета – autoconf и automake. Удалив обоих и запустив установку, софтина установилась без проблем:

# pkg_delete autoconf-2.62 automake-1.10.1
# whereis portupgrade
portupgrade: /usr/ports/ports-mgmt/portupgrade
# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

Теперь можно проверить соответствие установленных пакетов (вне зависимости от того, ставились ли они из бинарников или собирались из портов) текущему состоянию. Этой цели служит следующая утилита комплекта – portversion, вызываемая в такой форме:

# portversion -l "<"

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

Ну а дальше, запустив portupgrade, через некоторое время, все установленные пакеты были обновлены (благо в материнской системе их было не много):

# portupgrade -a

Но так может быть далеко не всегда. Иногда может потребоваться ручное вмешательство в процесс обновления!

Пока собирался софт, я подправил под себя конфиг ядра. А по окончании, запустил его на сборку. И тут же опять выплыла “детская неожиданность”. Оказывается сам “мир” не был собран, и по сему команда сборки нового ядра сказала мне, что конфиг ядра у меня не той ревизии. Ну что ж… ничего не поделаешь, пришлось сначала собрать “мир”:

# make buildworld

Пошел утомительный процесс 45 минутной сборки “мира”…

По его окончании уже смело и без проблем собралось и установилось ядро:

# make buildkernel KERNCONF=FiESTA-27.08.2010
# make installkernel KERNCONF=FiESTA-27.08.2010

И о чудо, после перезагрузки система была полностью в рабочем состоянии. Однако оставалась еще одна маленькая деталь – JAIL’ы. Они отказались запускаться, так как их “миры” обновлены не были.

За ответом на вопрос КАК отправился в гугл. И очень быстро нашел ответ. И написал даже небольшой скрипт для обновления миров в JAIL’ах:

#!/bin/sh

JAIL="/jails/jweb"
JPATHS="${JAIL} /jails/jdns"

cd /usr/src
make buildworld DESTDIR=${JAIL}
for j in ${JPATHS}
do
make installworld DESTDIR=${j}
mergemaster -i -C -D ${j}
done

Как только “мир” для клеток соберется, он будет установлен, а затем нужно будет пройти “тысты” на выносливость и по кол-ву клеток (аналогично материнской системе) пропатчить конфиги. Благо все достаточно тривиально и отвечать нужно выбрав одно из 4х действий.

На этом все. Спасибо автору оригинальной статьи.

Add Comment

Required fields are marked *. Your email address will not be published.