Менеджер пакетов для FreeBSD или немного о проекте pkgng

FreeBSD
Исторически сложилось так, что во FreeBSD два пути установки ПО. Первый идеологически правильный, но уж очень медленный, это сборка ПО из коллекции портов. Плюсы этого метода — большая гибкость и уверенность в том что установлены самые свежие версии, минус большие затраты времени. Настройка сервера в среднем занимает несколько дней, а если уж десктоп настраивать, так и неделю провозиться можно.
Второй путь — устанавливать готовые пакеты, плюсы -скорость развертывания… И на этом плюсы заканчиваются.Остаются сплошные минусы, неактуальный софт, конфликты версий и прочие радости.
Отдельный вопрос, это обновление ПО.
В дистрибутивах Linux эти вопросы решаются с помощью менеджеров пакетов apt-get, yum и т.п. Проект pkgng призван решить эту задачу в FreeBSD.


Собственно проект находиться в стадии беты, но вполне работоспособной и стабильной беты.
Pkgng официально зарелизели.pkg (aka pkgng) 1.0 released
Для использования pkg потребуется репозитарий собранных пакетов. На данный момент есть всего один работающий внешний репозитарий
http://pkgbeta.freebsd.org/
к сожалению не полный, но вполне пригодный к использованию.
Либо можно создать собственный, о чем и пойдет речь в первой части.

Часть 1.
Строим собственный сервер сборки и публикации пакетов.
Основное требование — система должна стоять на zfs, и это обязательное требование.
1. Ставим poudriere

make -C /usr/ports/ports-mgmt/poudriere install clean

2. Ставим pkg

make -C /usr/ports/ports-mgmt/pkg install clean

Конфигурируем poudriere

#cat /usr/local/etc/poudriere.conf
BASEFS=/poudriere
ZPOOL=myzpool
FTPHOST=ftp.freebsd.org
POUDRIERE_DATA=/poudriere_data
RESOLV_CONF=/etc/resolv.conf
USE_PORTLINT=no
MFSSIZE=3072m      # Здесь задается размер рамдиска для сборки, если памяти мало лучше эту строчку совсем закоментировать
DISTFILES_CACHE=/usr/ports/distfiles

Важное замечание, параметр

MFSSIZE=3072m

Задает размер рамдиска для сборки портов, по умолчанию стоит 1024м, этого размера не хватает для многих портов,
после всех эксперементов значение 3072м -оптимально. Если вы не можете отдать столько памяти под рамдиск то лучше просто закоментировать эту строчку.
Создаем дефолтное дерево портов

$ poudriere ports -c


Создаем клетку где будут собираться пакеты

$ poudriere jails -c -j 90amd64 -v 9.0-RELEASE -a amd64


Добавляем для вновь собранных пакетов поддержку pkg

$ mkdir /usr/local/etc/poudriere.d
$ echo "WITH_PKGNG=yes" > /usr/local/etc/poudriere.d/90amd64-make.conf


Создаем список пакетов для сборки:

$ cat ~/mylist1
editors/vim
www/nginx

Тут надо еще учесть такой момент, если в списке есть интерактивные порты (типа jdk,Ooo и т.п.) то необходимо руками предварительно скачать требуемые архивы.
Если нужны опции отличные от дефолтных то добавляем их в
/usr/local/etc/poudriere.d/make.conf

примерно вот в таком виде (пример из сборки mysql)

# Указываем опции для сборки
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql51-client

 WITH_CHARSET=cp1251
 WITH_COLLATION=cp1251_bin
 BUILD_OPTIMIZED=yes

.endif

@TODO -здесь нужно разобраться со значением переменной ${PORTSDIR}

Начинаем сборку

$ poudriere bulk -f ~/mylist1 -j 90amd64

После того как команда отработает мы получим готовый репозитарий для pkg в
/usr/local/poudriere_data/packages/90amd64-default

Содержимое этого каталога надо опубликовать на веб сервере.
Что бы по ссылке
http://ваш-веб-сервер/90amd64-default

можно было увидет файлы.

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

$ poudriere ports -u # обновляем дефолтное дерево портов
$ poudriere bulk -f ~/mylist1 -j 90amd64 -k # пересобираем то что изменилось

Суть действий понятна из коментариев, одно уточнение не забываем про ключик "-k" без него будут
удалены и пересобраны все пакеты в репозитарии, с ним, только изменившиеся.
И так репозитарий создан и доступен по ссылке
http://ваш-веб-сервер/90amd64-default

переходим собственно к использованию pkg.

Часть 2.
Использование pkg на конечной машине.

Устанавливаем pkg

# cd /usr/ports/ports-mgmt/pkg
# make install clean

Следующий шаг, добавляем в make.conf поддержку pkg для всех вновь собираемых портов

# cat make.conf
WITH_PKGNG=yes

Создаем файлик конфига для pkg

# cat /usr/local/etc/pkg.conf
# System-wide configuration file for pkg(1)
# For more information on the file format and 
# options please refer to the pkg.conf(5) man page

# Configuration options
PACKAGESITE	    : http://repos.etoilebsd.net/9-amd64-20111222 # или http://ваш-веб-сервер/90amd64-default
PKG_DBDIR	    : /var/db/pkg
PKG_CACHEDIR	    : /var/cache/pkg
PORTSDIR	    : /usr/ports
PUBKEY		    : /etc/ssl/pkg.conf
HANDLE_RC_SCRIPTS   : NO
PKG_MULTIREPOS	    : NO
ASSUME_ALWAYS_YES   : NO
SYSLOG		    : YES
SHLIBS		    : NO
AUTODEPS	    : NO

# Repository definitions
repos:
  default : http://example.org/pkgng/
  repo1 : http://somewhere.org/pkgng/repo1/
  repo2 : http://somewhere.org/pkgng/repo2/


На этом настройка заканчивается, если все это делалось на машине где уже было что-либо установленное из портов
необходимо произвести конвертирование данных об установленных пакетах в формат pkg для этого надо выполнить
скрипт

# pkg2ng


Кратко о возможностях:

# pkg
usage: pkg [-v] [-d] [-j |-c ]  []

Global options supported:
	-d             Increment debug level
	-j             Execute pkg(1) inside a jail(8)
	-c             Execute pkg(1) inside a chroot(8)
	-v             Display pkg(1) version

Commands supported:
	add            Registers a package and installs it on the system
	audit          Reports vulnerable packages
	autoremove     Removes orphan packages
	backup         Backup and restore the local package database
	check          Check for missing dependencies and database consistency
	clean          Cleans old packages from the cache
	create         Creates software package distributions
	delete         Deletes packages from the database and the system
	help           Displays help information
	info           Displays information for installed packages
	install        Installs packages from remote package repositories
	query          Query information for installed packages
	search         Performs a search in remote package repositories
	set            Modify local database informations
	register       Registers a package into the local package database
	repo           Creates a package database repository
	update         Updates remote package repository databases
	updating       Displays UPDATING information for a package
	upgrade        Performs upgrades of package software distributions
	version        Summarize installed versions of packages
	which          Displays which package installed a specific file

For more information on the different commands see 'pkg help '.


Перед использованием обновляем базу данных репозитария

# pkg update
http://repos.etoilebsd.net/9-amd64-20111222/repo.txz       100% 9684KB   9.5MB/s   7.1MB/s   00:01

Ну а дальше небольшие примеры использования:
Поиск
# pkg search mysql-server
mysql-server-5.1.60: Multithreaded SQL database (server)
mysql-server-5.5.19: Multithreaded SQL database (server)
mysql-server-5.0.92: Multithreaded SQL database (server)
mysql-server-4.1.25: Multithreaded SQL database (server)

Установка пакета

# pkg install mysql-server-5.5.15
The following packages will be installed:
	Installing mysql-client: 5.5.15
	Installing mysql-server: 5.5.15

the installation will require 111 MB more space
9 MB to be downloaded

Proceed with installing packages [y/N]: y
http://repos.etoilebsd.net/9-amd64-20110821/All/mysql-client-5.5.15.txz       100% 1515KB   1.5MB/s   1.5MB/s   00:00
http://repos.etoilebsd.net/9-amd64-20110821/All/mysql-server-5.5.15.txz       100% 8114KB   2.6MB/s   2.9MB/s   00:03
Checking integrity... done
Installing mysql-client-5.5.15... done
Installing mysql-server-5.5.15...===> Creating users and/or groups.
Creating group 'mysql' with gid '88'.
Creating user 'mysql' with uid '88'.
 done
************************************************************************

Remember to run mysql_upgrade (with the optional --datadir= flag)
the first time you start the MySQL server after an upgrade from an
earlier version.

************************************************************************

Информация о установленных пакетах

# pkg info -a
mysql-client-5.5.15: Multithreaded SQL database (client)
mysql-server-5.5.15: Multithreaded SQL database (server)
nInvaders-0.1.1: The nIvaders game is a Space Invaders clone for ncurses

Информация о зависимостях

# pkg info -d mysql-server-5.5.19
mysql-server-5.5.19 depends on:
mysql-client-5.5.19

Информация об установленных пакетом файлах

# pkg info -l nInvaders-0.1.1
nInvaders-0.1.1 owns the following files:
/usr/local/bin/nInvaders
/usr/local/share/doc/nInvaders/README

Поиск какому пакету принадлежит файл

# pkg which /usr/local/lib/mysql/libmysqlclient.a
/usr/local/lib/mysql/libmysqlclient.a was installed by package mysql-client-5.5.15

Создание пакетов из уже установленных в системе бинарников

# pkg create -a
Creating package for mysql-client-5.5.15
Creating package for mysql-server-5.5.15
Creating package for nInvaders-0.1.1
# ls
mysql-client-5.5.15.txz
mysql-server-5.5.15.txz
nInvaders-0.1.1.txz

Просмотр версий пакетов и сравнение их с версиями в портах — специально отмечаю, что сравниваются версии установленного пакета и версии порта на локальной машине, перед применением этой команды следует обновить порты.

# pkg version -v
mysql-client                       <   needs updating (port has 5.5.20)
mysql-server                       <   needs updating (port has 5.5.20)
nInvaders                          =   up-to-date with port

Полезная мелочь, просмотр файла usr/ports/UPDATING

# pkg updating -h
pkg: illegal option -- h
usage: pkg updating [-d YYYYMMDD] [-f file] [portname ...]

Пример просмотра записей после определенной даты

# pkg updating -d 20110101
20110319:
  AFFECTS: users of databases/mysql55-client
  AUTHOR: ale@FreeBSD.org

  The shared library version of the client library was increased to reflect
  ABI changes, and avoid compatibility problems with the client library
  in MySQL 5.1, so client programs that use the 5.5 client library should
  be recompiled against the 5.5.10 client library.
  This can be achieved with:

  # portmaster -r mysql-client-5.5
  or
  # portupgrade -fr mysql-client-5.5

Использование pkg для апгрейда установленных пакетов

# pkg upgrade
The following packages will be upgraded:
	Upgrading mysql-client: 5.5.15 -> 5.5.19
	Upgrading mysql-server: 5.5.15 -> 5.5.19

the upgrade will require 4 MB more space
9 MB to be downloaded

Proceed with upgrading packages [y/N]: y
http://repos.etoilebsd.net/9-amd64-20111222/All/mysql-client-5.5.19.txz       100% 1518KB   1.5MB/s   1.5MB/s   00:00
http://repos.etoilebsd.net/9-amd64-20111222/All/mysql-server-5.5.19.txz       100% 8395KB   8.2MB/s   6.8MB/s   00:01
Checking integrity... done
Upgrading mysql-client from 5.5.15 to 5.5.19... done
Upgrading mysql-server from 5.5.15 to 5.5.19...==> You should manually remove the "mysql" user.
===> Creating users and/or groups.
Using existing group 'mysql'.
Using existing user 'mysql'.
 done


Удаление пакета

# pkg delete mysql-server
The following packages will be deinstalled:
	mysql-server-5.5.19

The deinstallation will save 79 MB

Proceed with deinstalling packages [y/N]: y
Deinstalling mysql-server-5.5.19...==> You should manually remove the "mysql" user.
 done


Аудит безопасности

# pkg audit -F
http://portaudit.FreeBSD.org/auditfile.tbz               100%   76KB  37.8KB/s  55.6KB/s   00:02
openssl-1.0.0_9 is vulnerable
OpenSSL -- CMS and S/MIME Bleichenbacher attack

WWW: http://portaudit.FreeBSD.org/60eb344e-6eb1-11e1-8ad7-00e0815b8da8.html

1 problem(s) in your installed packages found.


Вот в общем-то и все. Статья не претендует на оригинальность, но в рунете пока ничего по поводу этого проекта конструктивного нет. А проект вполне многообещающий, у себя я его использую для быстрого обновления серверов. Есть мелкие косяки, но легко поправимые и не критичные.
Ссылки на англоязычные источники:
Страница проекта на GitHub
Страница на FreeBSD WIKI
Блог автора
Более подробный обзор pkg на английском — Примеры от туда использованы в этой статье

2 комментария

avatar
Настройка сервера в среднем занимает несколько дней, а если уж десктоп настраивать, так и неделю провозиться можно.
В точности только наоборот.
avatar
Серьезно? :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.