В OpenSolaris и Solaris Nevada на смену традиционной для Unix пакетной системе System V пришла IPS - Image Packaging System. Более подробно о ней рассказано здесь: http://dlc.sun.com/osol/docs/content/dev/IMGPACKAGESYS/index.html Многие черты IPS взяла у Apt - пакетной системы Debian Linux, перекочевавшей оттуда в Ubuntu и ставшей де-факто одним из стандартов Linux.
Получила IPS от Apt и один из недостатков - сильная зависимость от Интернет-репозиториев, являющихся источниками пакетов, что вызывает трудности в случае если систем много или они находятся в DMZ. Для Apt разработано такое решение, как apt-proxy, мы же поговорим как обойти такое ограничение в OpenSolaris, создав собственный локальный репозиторий.
Для переноса нужно использовать утилиты pkgrecv, скачивающий пакет из Интернет-репозитория и pkgsend, помещающий его в репозиторий. В моем примере используются два хоста: cheetah - локальный IPS-сервер и tiger - где мы будем опробовать репозиторий.
Для начала создадим репозиторий, включим pkg-server:
myaut@cheetah:~$ pfexec pkgsend -s file:///var/pkg/repo create-repository
Примечание: в последних Development Release следует указывать еще и префикс репозитория:
myaut@cheetah:~$ pfexec pkgsend -s file:///var/pkg/repo \
create-repository \ --set-property \
publisher.prefix=cheetah
myaut@cheetah:~$ pfexec svcadm enable pkg/server
Подробную информацию по переменным SMF можно найти в man pkg.depotd. Ключевые из них:
-
pkg/content_root - Директория, содержащая веб-контент сервера
-
pkg/inst_root - Директория репозитория для хранения пакетов (по-умолчанию - /var/pkg/repo)
-
pkg/log_access и pkg/log_errors - Логи для доступа и ошибок соответственно. Возможные значения: stderr, stdout, none, или абсолютный путь.
-
pkg/port - Номер порта репозитория.
-
pkg/readonly - Запрет на создание новых пакетов в репозитории (используя команду pkgsend).
Метаданные репозитория хранятся в файле /var/pkg/repo/cfg_cache
Теперь перешлем пакет SUNWipc в репозиторий. Выясним URI текущего репозитория:
myaut@cheetah:~$ pkg publisher
PUBLISHER TYPE STATUS URI
opensolaris.org (preferred) origin online http://pkg.opensolaris.org/dev/
Для того, чтобы узнать содержимое репозитория нужно вызвать pkgrecv с опцией -n
myaut@cheetah:~$ pkgrecv -s http://pkg.opensolaris.org/dev/ -n | grep SUNWipc
pkg:/SUNWipc@0.5.11,5.11-0.133:20100216T075928Z
Скачиваем пакет:
myaut@cheetah:~$ pkgrecv -s http://pkg.opensolaris.org/dev/ -d . 'pkg:/SUNWipc@0.5.11,5.11-0.133:20100216T075928Z'
Retrieving manifests for package evaluation ...
Retrieving package content ...
myaut@cheetah:~$
Если посмотреть в манифест пакета, то видим, что SUNWipc - виртуальный пакет для system/ipc
myaut@cheetah:~$ grep depend SUNWipc/0.5.11%2C5.11-0.133%3A20100216T075928Z/manifest
depend fmri=consolidation/osnet/osnet-incorporation type=require
depend fmri=system/ipc@0.5.11-0.133 type=require
Аналогичным образом скачиваем и пакет system/ipc.
Добавим пакет в репозиторий. Так как pkgsend не имеет интерактивной среды все команды выполняются по очереди через bash.
Для того, чтобы команда pkgsend распознала, какой пакет сейчас обрабатывается, используется переменная PKG_TRANS_ID. Получить ее значение и открыть транзакцию можно командой pkgsend open.
myaut@cheetah:~$ pkgsend -s http://localhost:80/ open system/ipc@0.5.11-0.134
export PKG_TRANS_ID=1268740176_pkg%3A%2F%2Fcheetah%2Fsystem%2Fipc%400.5.11%2C5.11-0.134%3A20100316T114936Z
myaut@cheetah:~$ export PKG_TRANS_ID=1268740176_pkg%3A%2F%2Fcheetah%2Fsystem%2Fipc%400.5.11%2C5.11-0.134%3A20100316T114936Z
Затем отправляем манифест на сервер и закрываем сессию. Здесь опция -d используется для указания базовой директории пакета, содержащей скачанные pkgrecv файлы, а в качестве аргумента используется путь до манифеста.
myaut@cheetah:~$ pkgsend -s http://localhost:80/ include -d \
system%2Fipc/0.5.11%2C5.11-0.134%3A20100302T054428Z/ \
system%2Fipc/0.5.11%2C5.11-0.134%3A20100302T054428Z/manifest
myaut@cheetah:~$ pkgsend -s http://localhost:80/ close
PUBLISHED
pkg://cheetah/system/ipc@0.5.11,5.11-0.134:20100316T114936Z
В свежих development release (проверено на snv_127 и snv_134) непосредственно добавление в репозиторий можно делать утилитой pkgrecv, поэтому все вышесказанное упрощается до одной команды:
myaut@cheetah:~$ pkgrecv -s http://pkg.opensolaris.org/dev/ \
-d http://localhost:80/ pkg:/system/ipc@0.5.11,5.11-0.134:20100302T054428Z
Пакет опубликован. Теперь добавим в tiger новый репозиторий и сделаем его репозиторием по-умолчанию, удалим старый и обновим кеш.
myaut@tiger:~$ pfexec pkg set-publisher -P -g http://cheetah:80/ cheetah
myaut@tiger:~$ pfexec pkg unset-publisher opensolaris.org
myaut@tiger:~$ pkg publisher
PUBLISHER TYPE STATUS URI
cheetah (preferred) origin online http://cheetah:80/
myaut@tiger:~$ pfexec pkg refresh
Устанавливаем:
myaut@tiger:~$ pfexec pkg install SUNWipc
DOWNLOAD PKGS FILES XFER (MB)
Completed 1/1 3/3 0.0/0.0
PHASE ACTIONS
Install Phase 16/16
P.S. В следующей части мы автоматизуем этот процесс, создадим собственный пакет и поговорим о других возможностях локального репозитория.