Итак, сабж. Есть сервер на FreeBSD 8.2, по прошествии нескольких лет безупречной работы вдруг подумалось, что надо его обновить. И не только ПО, но и саму ось.

Немного поясню, что за сервер. Это домашний NAS, по большому счету, на нем SambaTransmissionMediatombApache+PHP+MySQL для опытов. Все это работает за PF, как за каменной стеной, причем управление очередями включено при компилировании в ядра. А обновить решил по новому, с помощью одних только утилит. Не секрет, что управление пакетами сейчас с pkg переехало на pkgng, есть вполне рабочая утилита portupgrade, а обновление самой оси выполняется теперь через freebsd-update. Итак, поехали. Немного курнув мурзилку, решил переустановить пакет pkg. Через порты. Поэтому сначала обновляем дерево портов. portsnap идет в базе, начиная с FreeBSD 6.

portsnap fetch update

Небольшой оффтоп. Вообще-то в мурзилке написано, что при первом запуске сначала надо сделать

portsnap fetch #получение дерева

portsnap extract #установка его на место.

Но

Во-первых, у меня уже было старое дерево портов (как нормальный параноик, я все сразу устанавливал через порты, а не пакетами), а во-вторых (это только мое предположение, данные не подтверждены), даже если у Вас каталог usr/ports пустой, команда portsnap update должна все равно развернуть все дерево.

Кроме этого, говорят, что есть старые версии portsnap, которые не могу в одной строке выполнять две команды. Тогда делаем двумя строками:

portsnap fetch #получение дерева

portsnap update #обновление его на месте.

Теперь можно начать апгрейд приложений.

Еще одно лирическое отступление. Если Вы давно не обновляли систему, может случиться так, что установленная версия приложения уже исключена из дерева портов, поэтому удалить её через portsupgrade не удастся. Это не должно Вас печалить, есть pkg remove. Если при обновлении мы видим надпись, что <какое-то там приложение версии x.y.z> исключено из дерева портов, а вместо него рекомендуется использовать <какое-то там приложение версии x.y+6.z> или вообще <какое-то другое приложение версии a.b.c>, тогда мы делаем:

pkg remove <какое-то там приложение версии x.y.z> # удаление старого приложения

Если говорит, что удалить не могу, есть зависимости, тогда удаляем принудительно, с ключом –f, а все зависимости мы потом все равно перестроим.

pkg remove –f <какое-то там приложение версии x.y.z> # удаление старого приложения принудительно

cd usr/ports/<каталог какого-то другого приложения версии a.b.c>

make install clean #установкановогоЯ надеюсь, что найти порт в дереве все знают как, и безошибочно набирают:

whereis <какое-то другое приложение версии a.b.c>

Вернемся к нашему апгрейду. Сначала проапгрейдим саму команду pkg:

portupgrade pkg

Если ругается, что нет такой команды, тогда надо установить её:

cd /usr/ports/sysutils/portupgrade

make install clean

После обновления pkg выполняем pkg2ng (не касается BSD 9.1 и выше, а также тех, кто раньше перевел управление бинарными пакетами на эту утилиту):

pkg2ng #перевод базы пакетов в pkgng.

В /etc/make.conf сразу добавим строку

WITH_PKGNG=yes

Это позволит при выполнении команды make записывать установленные пакеты в новую базу

Да и

WITHOUT_X11=yes



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

Есть еще параметр, который Вам может понадобиться. Когда пакет исключается из портов, при его компиляции Вы будете получать предупреждение, что такой-то порт поддерживается до такого-то числа, нажмите чтобы продолжить. При массовом обновлении старой белиберды мы устанем нажимат. Поэтому можно в этот файл добавить еще и строчку

NO_WARNING_PKG_INSTALL_EOL=yes

После обновления всего мы проверим степень успеха и совсем старые порты будем обновлять вручную по указанной выше схеме (pkg remove + make install clean), поэтому смысла в этом предупреждении немного.

Далее самый простой вариант:

portupgrade –af #обновление всех вообще портов принудительно.

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

По окончании делаем pkg check и смотрим вывод. Там будут перечислены корявые пакеты, требующие ручного вмешательства. Там могут быть три варианта сообщений. Первый я уже сказал в самом начале, когда пакет исключен из дерева портов, но есть его другая версия. Тогда pkg remove+make install. Второй – пакет вообще исключен – его функциональность включена в другой пакет, который уже установлен. В этом случае ничего делать не надо. И третий, когда с пакетом какая-то фигня творится, не хватает библиотеки, не компилируется, не удаляется старый и т.д., то есть нестандартная ошибка, с которой Вам придется разбираться без меня.

После этого можно обновлять саму ось.

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

Переходим к обновлению FreeBSD. Если Вы компилировали свое ядро и не прибрали конфигурационный файл, сделайте это. При обновлении каталог /usr/src будет вычищен.

Замечание: freebsd-update использует /var/db/freebsd-update каталог для своих нужд, а нужды эти велики. Если на этой файловой системе места немного (у меня это вообще был корень), тогда либо смонтируйте что-нибудь туда, либо сделайте симлинк в свободный раздел.

Запускаем обновление до freebsd 9.2-release:

freebsd-update -r 9.2-RELEASE upgrade

После определения установленных и неустановленных компонент и показа их списков программа обновления спросит: «Продолжать?», отвечаем и ждем обновления. После получения обновлений переходим к их установке.

freebsd-update install

Сначала будет установлено ядро и модули.

После этого делаем перезагрузку:

reboot

И продолжаем установку

freebsd-update install

После этого надо пересобрать все программное обеспечение. Мурзилка рекомендует делать это в следующем порядке:

# portupgrade -f ruby

# rm /var/db/pkg/pkgdb.db

# portupgrade -f ruby18-bdb

# rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db

# portupgrade -af

Что, в принципе, логично. Только версию (ruby18-bdb) проконтролируйте, она может быть другой.

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

После этого рекомендуется снова запустить freebsd-update install, но у меня был выдан только ответ, что устанавливать нечего. В итоге я получил обновленную ось с ядром, скомпилированным в GENERIC, а не в моей конфигурации, поэтому потребовалась пересборка ядра с моими параметрами. В результате на все это я потратил три дня. Есть у меня подозрение, что за это время можно было вручную все сделать, с нуля установить ось и все приложения. Тем более, что в то время, когда я решал конфликты версий, сервисы были неработоспособны. Главная проблема — libz.so.5. Какая-то проблема с приложениями, установленными в freebsd8, они не работают в «девятке», им не хватает этой библиотеки. Смотрите вывод при компиляции, если увидите ошибку с этой библиотекой, или при запуске сервиса, например:

service apace22 start

Shared object "libz.so.5" not found, requires by ...

Если эта ошибка есть, делаем

make install clean -C /usr/ports/misc/compat8x/

После этого приложения работают.

Вывод. Да, portupgrade и freebsd-update работают, но если есть физическая возможность, проще установить новый сервер, а потом со старого все перенести на новый и заменить. А если решили обновлять, запаситесь временем и терпением. Если же не менять версию freebsd, тогда все будет хорошо и ненапряжно. Можно даже это записать в cron, вероятность неполадок очень мала.

You have no rights to post comments