Tuesday Oct 09, 2012

Самостоятельная сборка и публикация пакетов IPS в Solaris 11

У меня на ноутбуке стоит Solaris 11 и на нём в свободное время я пишу для себя некую программу для управления доменами Oracle VM Server for SPARC (aka LDoms). Пишу на Python/GTK/NetBeans. Но не это главное. Главное в том, что мне понадобилось иметь в системе пакет pylibssh2 для того, чтобы подключаться из python по ssh к удаленным хостам.

Казалось бы можно выкачать pylibssh2 и libssh2, собрать и поставить. Но я захотел, чтобы эти пакеты были оформлены в виде пакетов Solaris IPS. Заодно я решил и научиться собирать пакеты.

Сразу оговорюсь, я не большой специалист по компиляторам и сборщикам. Я лишь знаю, что нужно запустить configure и make как описано в README ;)

Параллельной задачей будет показать как не использовать LD_LIBRARY_PATH. Тем более ни в коем случае не прописывать её в /etc/profile.

Я не буду очень подробно описывать каждый шаг. За деталями прошу обращаться в маны и по линкам в конце поста. Собственно, этим инструкциями я и следовал.

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

# zfs create rpool/export/repo
# zfs set atime=off rpool/export/repo
# chown roivanov:staff /export/repo
$ pkgrepo create /export/repo
$ pkgrepo set -s /export/repo publisher/prefix=tools
# pkg set-publisher -g /export/repo tools


Шаг 1, собираем пакет. Всю сборку пакетов я произвожу в $HOME/Projects/IPS/<имя пакета>, но это не принципиально. Кроме того, для сборки каждого пакета я запускаю отдельный терминал, чтобы не перепутались настройки окружения. Для сборки нам поребуется SunStudio cc или gcc.

$ export PKGREPO=/export/repo
$ mkdir -p $HOME/Projects/IPS/libssh2
$ cd $HOME/Projects/IPS/libssh2
$ export PKGROOT=`pwd`
$ unset LDFLAGS

$ PATH=$PATH:/opt/solarisstudio12.3/bin
$ export CC=cc
или
$ export CC=gcc

На этапе сборки пакета необходимо копировать (инсталлировать) пакет в ../root вместо /usr
$ export DESTDIR=$PKGROOT/root

В локальную директорию ../root я буду складывать собранный пакет. Окончательная инсталляция будет в /usr.
$ [ -d root ] && rm -rf root
$ cp ~/Скачивание/libssh2-1.4.2.tar.gz .
$ tar xzf libssh2-1.4.2.tar.gz 
$ cd libssh2-1.4.2

В случае, если пакет использует библиотеки из /usr/local/lib, устанавливаем LDFLAGS и _забываем_ про LD_LIBRARY_PATH
$ export LDFLAGS="-L/usr/local/lib -R/usr/local/lib"
$ ./configure
$ gmake && gmake install
$ cd ..

Сборка пакета Python (pylibssh2) производится несколько иначе
$ python setup.py install --root=../root


Шаг 2. Готовим файл с описанием пакета

$ cat > MANIFEST.files.mog << EOF
set name=pkg.fmri value=library/libssh2@1.4.2,0.5.11-11
set name=pkg.description \
    value="libssh2 is a client-side C library implementing the SSH2 protocol"
set name=pkg.summary value="libssh2 library"
set name=maintainer value="First Last <first.last@domain.com>"
set name=info.upstream-url value=http://www.libssh2.org/
set name=variant.arch value=$(ARCH)
license ../libssh2-1.4.2/COPYING license=BSD
<transform dir path=usr$ -> edit group bin sys>
EOF


Где:

  • library/libssh2 это название пакета, 1.4.2 версия пакета, 0.5.11 релиз, 11 номер сборки пакета.
  • description это описание, а summary это короткое описание пакета.
  • variant.arch для какой платформы собран пакет. Есть возможность в одном пакете иметь файлы для нескольких платформ, но это я делать пока не буду.
  • license файл и тип лицензии
  • transform необходим для того, чтобы в окончательном файле пакета была правильно выставлена группа владельца директории /usr


Собираем список файлов пакета

$ pkgsend generate root > MANIFEST.files.1


Добавляем информацию из файла описания и производим необходимые изменения

$ pkgmogrify -DARCH=`uname -p` MANIFEST.files.1 MANIFEST.files.mog > MANIFEST.files.2


Генерим список всех зависимостей

$ pkgdepend generate -md root MANIFEST.files.2 | pkgfmt > MANIFEST.files.3


Переводим список файловых зависимостей в список пакетов. Этот этап займет некоторое время.

$ pkgdepend resolve -m MANIFEST.files.3


На выходе получаем готовый файл MANIFEST.files.3.res с описанием пакета.

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

$ pkglint -c ../lint-cache -r http://pkg.oracle.com/solaris/release/ MANIFEST.files.3.res
$ pkglint -c ../lint-cache-local -r /export/repo MANIFEST.files.3.res


И собственно, публикуем пакет

$ pkgsend publish -s $PKGREPO -d `pwd`/root MANIFEST.files.3.res



Установка пакета и управление репозиторием
Чтобы посмотреть какие пакеты есть репозитории

$ pkgrepo list -s /export/repo/


Чтобы удалить устаревший пакет из репозитория

$ pkgrepo remove -s /export/repo/ libssh2@1.4.2,0.5.11-8:*


Чтобы посмотреть информацию о пакете в репозитории

$ pkg info -r libssh2


Чтобы посмотреть как пойдет установка, без реальной установки пакета

$ sudo pkg install -nv libssh2


Чтобы установить пакет

$ sudo pkg install libssh2


Чтобы обновить пакет

$ sudo pkg refresh
$ sudo pkg update



Список чтения:
[1] How to Create and Publish Packages to an IPS Repository on Oracle Solaris 11,
http://www.oracle.com/technetwork/articles/servers-storage-admin/o11-097-create-pkg-ips-524496.html

[2] Publishing your own packages with IPS - getting started.
https://blogs.oracle.com/barts/entry/publishing_your_own_packages_with

[3] How to create your own IPS packages (Ghost Busting)
http://blogs.oracle.com/cwb/entry/how_to_create_your_own

[4] Introduction to IPS for Developers
http://www.oracle.com/technetwork/systems/hands-on-labs/introduction-to-ips-1534596.html

About

Roman (pomah) Ivanov, ISV Engineering. Tips how to run Oracle best on Sun. Performance monitoring and tuning for system administrators. OpenSolaris user experience.

Search

Categories
Archives
« October 2012 »
SunMonTueWedThuFriSat
 
1
2
3
4
5
6
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   
       
Today