Очень хорошую и лаконичную статью выдал мне гугл при запросе “обновление 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х действий.
На этом все. Спасибо автору оригинальной статьи.