RuWeb.net Forum

Технические подробности перехода на pkgng
timru - 27.10.2015 в 12:19

Внимание!
1) Переход на pkgng возможен только для версии FreeBSD не ниже чем 8.4.
2) Мы не гарантируем (а на данный момент вообще не оказываем) поддержку клиентам, которые самостоятельно совершали на своем VDS/сервере попытку перехода на pkgng.



Раньше бинарные пакеты для FreeBSD выпускались только с выходом нового релиза. Например, вышел релиз FreeBSD-7.3-RELEASE, и к нему готовые собранные всевозможные пакеты, как серверные, так и десктопные - apache, php, KDE, Gnome, и т.д. И если спустя месяц, допустим, в php обнаруживалась дыра, никого это уже не волновало. Хочешь актуальную версию - обновляй дерево портов и компилируй все что тебе нужно.
Разберем как было все устроено. Допустим, мы устанавливаем PHP. Он, как водится, кладет бинарники в /usr/local/bin/, библиотеки в /usr/local/lib/ и т.д. И еще создает папку /var/db/pkg/php52-5.2.17/, в которой лежат файлы:
# ls -1 /var/db/pkg/php52-5.2.17/
+COMMENT - краткое описание пакета
+CONTENTS - содержимое файлов пакета с контрольными суммами
+DESC - полное описание пакета
+DISPLAY - сообщение, отображаемое после установки пакета
+MTREE_DIRS - дерево каталогов, в которые раскладывается содержимое
+REQUIRED_BY - от каких других пакетов зависит данный пакет

Список установленного ПО выводился командой "pkg_info". По сути, эта команда печатает в 1-м столбике имена всех директорий в /var/db/pkg/, а во втором столбике - содержимое файла +COMMENT в каждой такой директории. И если мы удалим, допустим, директорию /var/db/pkg/php52-5.2.17, то pkg_info его уже не покажет. А если удалить все директории из /var/db/pkg/, то pkg_info не покажет ничего! Будто бы в системе нет ни одного пакета.

Какова ситуация сейчас. Начиная с версии 8.4 FreeBSD переходит на новую систему управления пакетами pkgng. Что изменилось:
1) появилась возможность скачивать актуальные пакеты (т.е. не те которые были скомпилированы к какому-то релизу, а свеженькие);
2) изменился способ хранения информации об установленных пакетах. Сейчас это не куча директорий в /var/db/pkg/, а один единственный файл /var/db/pkg/local.sqlite. Из названия должно быть понятно, что это sqlite-база.

Также, начиная с 01.09.2014 произошло очень важное изменение в дереве портов. По-прежнему, сохраняется возможность скомпилировать что-то вручную, например можно сделать cd /usr/ports/graphics/php5-exif && make install clean, но система хочет вести учет об установленных пакетах не иначе как в /var/db/pkg/local.sqlite, то есть директории типа /var/db/pkg/php5-exif создаваться уже не будут. Если дерево портов было обновлено после 01.09.2014 и мы пытаемся с него что-то установить, но файл /var/db/pkg/local.sqlite не найден, нам будет предложено сделать следующее:
1) установить пакет pkg;
2) выполнить команду pkg2ng - она сконвертирует старую систему в новую, т.е. создаст базу пакетов /var/db/pkg/local.sqlite на основе листинга директорий /var/db/pkg/ и содержимого файлов в них (при этом старые директории из /var/db/pkg/ автоматически не удаляются).
После этого можно выполнить:
# cd /usr/ports/graphics/php5-exif && make install clean
Пакет установится, сведения о нем запишутся в /var/db/pkg/local.sqlite, а не в папку /var/db/pkg/php5-exif.
В теории, вроде как, все просто и понятно. Однако на практике возникают проблемы.


ПРОБЛЕМА НОМЕР ОДИН.

После того как мы установили пакет pkg и выполнили команду pkg2ng, на сервере создается потенциально опасная ситуация: имеются сразу 2 системы управления пакетами, и обе они функицонируют. Команды для управления пакетами очень похожи. Но пользоваться старыми командами для работы с новой системой pkgng не только бессмысленно, но и очень опасно!
Команда для вывода списка установленных в системе пакетов раньше была "pkg_info", а теперь "pkg info" (то же самое, только без нижнего подчеркивания). Теперь обе они работают, но выводят они совершенно разные списки: "pkg info" - новый, актуальный, а "pkg_info" - старый, до конвертации.
Простой пример: нужно установить PHP-расширение, мы по-старинке сначала посмотрели версию PHP по команде "pkg_info", узнали оттуда что версия PHP допустим 5.3, и делаем cd /usr/ports/graphics/php53-exif && make install clean. Но при этом мы не учли, что "pkg_info" показывает старый список пакетов, а по факту PHP может быть уже проапгрейдили до версии 5.5, и смотреть актуальную версию надо было командой "pkg info". И хорошо если установка php53-exif не потянет за собой сам php53, который затрет имеющися php55.
Старые "pkg_add" и "pkg_delete" тоже ничего не знают ни о каком файле /var/db/pkg/local.sqlite, и ими можно легко затереть или криво удалить имеющийся пакет. Пользоваться нужно новыми командами "pkg install" и "pkg remove".
Еще больше можно запутаться, если после установки pkg администратор VDS/сервера забыл выполнить команду pkg2ng. Тогда файл /var/db/pkg/local.sqlite окажется пустым, т.е. в системе якобы ничего не установлено. Нового списка нет, а старый есть.

Теоретически, можно удалить из системы старые команды типа "pkg_info", "pkg_add" и "pkg_delete" (кстати, во FreeBSD 10 их уже не будет), а также удалить все директории из /var/db/pkg/. Но тут возникает следующая проблема.

ПРОБЛЕМА НОМЕР ДВА.

ISPmanager не умеет работать с pkgng. То ПО, которое мы видим в разделе "Настройки сервера" -> "Возможности", он составляет на основе названий директорий из /var/db/pkg/. Если после перехода на pkgng мы, во избежании путаницы, удалить все директории из /var/db/pkg/, ISPmanager будет считать, что никакое ПО на сервере не установлено вообще. Какие опасности это в себе несет - пока этот вопрос нами недостаточно изчуен. Может быть, на серверах с ISPmanager придется оставить директории в /var/db/pkg/ для совместимости, но тогда усиливается риск проблемы номер один.
Разумеется, после перехода на pkgng категорически не рекомендуется использовать панель ISPmanager для установки чего-либо, даже расширений для php или perl.
С DirectAdmin-ом такой проблемы нет, т.к. он вообще изначально предполагает самосбор. Поэтому там после перехода на pkgng директории из /var/db/pkg/ можно удалять.


Резюмирем вышесказанное: если у вас на VDS/сервере стоит FreeBSD и ISPmanager, переход на pkgng можете осуществлять только на свой страх и риск.
Для установки/обновления ПО рекомендуем пока использовать старое дерево портов:
http://forum.ruweb.net/viewthread.php?tid=2932



[Отредактировано 31.10.2015 кто timru]