на серверы. Сборка из исходного кода и дальнейшей инсталляции собранного продукта вредно, так как затрудняет
дальнейшую актуализацию и манипуляцию программой (придется помнить список установленных файлов, месторасположение файлов
и так далее). В данной заметке, будет рассматриваться сборка SVR4 пакета утилиты bwping.
Для сборки пакета, необходимо пристутствие в сборочной директории двух файлов - pkginfo и prototype.
В файле pkginfo приводится информация для контроля процесса установки, а так же характеристики пакета. В файле pkginfo
должны быть определены 5 переменных, определяющих пакет - PKG, NAME, ARCH, VERSION, CATEGORY. Порядок следования этих
переменных значения не имеет.
PKG - Аббревиатура пакета. Поскольку префикс пакетов от SUN - "SUNW", то я вставил сюда свое имя

ARCH - Архитектура для которой собирался пакет. Может быть sparcv - для 32 разрядных SPARC'ов, sparcv9 - для 64 разрядных SPARC'ов,
VERSION - Версия ПО. Смена версии именно пакета, а не упакованного программного обеспечения, производится в другом месте.
CATEGORY - Категория ПО. Принадлежность пакета к определенной категории. Я посмотрел, к какой категории принадлежит утилита ping и подставил нужное значение.
BASEDIR - Путь, куда будет устанавливаться пакет. В официальной документации по сборке пакетов, для установки стороннего программного обеспечения определена директория /opt. Следует заметить, что пакеты из Sunfreeware устанавливаются в /usr/local. Поэтому, мы будем устанавливать нашу утилиту туда же.
DESC - Описание утилиты
PSTAMP - Имя упаковщика. В пакетах от SUN - тут стоит patch stamp. Некий "серийный номер", позволяющий точно сказать, когда был изменен данный пакет.
EMAIL - e-mail упаковавшего пакет.
В нашем случае, pkginfo выглядит так:
Код: Выделить всё
PKG="ANDYbwping"
ARCH="sparc"
VERSION="1.2"
NAME="bwping"
CATEGORY="system"
BASEDIR="/usr/local/"
DESC="bwping is a tool to measure bandwidth and response times between two hosts using ICMP echo request/echo reply mechanism"
PSTAMP="Andrew Clark"
EMAIL="andrewclarkii@gmail.com"
Код: Выделить всё
bash-3.00# cd /tmp/
bash-3.00# mkdir ANDYbwping
bash-3.00#
Код: Выделить всё
bash-3.00# ls -lahi
total 128
24686713 drwxrwxr-x 5 root root 492 Oct 18 17:07 .
1175946 drwxrwxrwt 7 root sys 1.0K Oct 19 15:30 ..
24686601 drwxr-xr-x 2 root root 180 Oct 18 17:07 bin
3860516 drwxr-xr-x 3 root root 180 Oct 18 17:07 doc
24687021 -rw-r--r-- 1 root root 280 Oct 18 17:07 pkginfo
30820857 -rw-r--r-- 1 root root 589 Oct 18 17:07 pkgmap
24686881 -rw-r--r-- 1 root root 705 Oct 18 17:07 prototype
30821277 drwxr-xr-x 3 root root 177 Oct 18 17:07 share
bash-3.00#
автоматической сборки пакетов на основе предварительно подготовленного файла, в Solaris не было
и нет, всю компиляцию, инсталляцию и дальнейшую упаковку пакета мейнтейнер проделывает руками.
Теперь следует скомпилировать программу и установить ее в специальную директорию:
Код: Выделить всё
bash-3.00# gunzip -c bwping-1.2.tar.gz | tar -xvf -
x bwping-1.2, 0 bytes, 0 tape blocks
x bwping-1.2/AUTHORS, 65 bytes, 1 tape blocks
x bwping-1.2/COPYING, 1361 bytes, 3 tape blocks
x bwping-1.2/ChangeLog, 0 bytes, 0 tape blocks
x bwping-1.2/INSTALL, 9498 bytes, 19 tape blocks
x bwping-1.2/Makefile.am, 112 bytes, 1 tape blocks
x bwping-1.2/Makefile.in, 18952 bytes, 38 tape blocks
x bwping-1.2/NEWS, 0 bytes, 0 tape blocks
x bwping-1.2/README, 2263 bytes, 5 tape blocks
x bwping-1.2/aclocal.m4, 31538 bytes, 62 tape blocks
x bwping-1.2/bwping.8, 2120 bytes, 5 tape blocks
x bwping-1.2/bwping.c, 11415 bytes, 23 tape blocks
x bwping-1.2/config.h.in, 1689 bytes, 4 tape blocks
x bwping-1.2/configure, 167784 bytes, 328 tape blocks
x bwping-1.2/configure.in, 673 bytes, 2 tape blocks
x bwping-1.2/depcomp, 15936 bytes, 32 tape blocks
x bwping-1.2/install-sh, 9233 bytes, 19 tape blocks
x bwping-1.2/missing, 11014 bytes, 22 tape blocks
bash-3.00#
Код: Выделить всё
bash-3.00# ls -l
total 60208
drwxrwxr-x 5 root root 492 Oct 18 17:07 ANDYbwping
drwxr-xr-x 2 root root 117 Oct 19 15:44 bwping
drwxr-xr-x 2 1000 1000 1230 Feb 8 2010 bwping-1.2
-rw-r--r-- 1 root root 73183 Oct 18 17:15 bwping-1.2.tar.gz
drwxr-xr-x 2 root other 179 Oct 8 13:33 hsperfdata_root
-rw-r--r-- 1 root root 30639700 Apr 21 2010 list_files_in_pkg.txt
-rw-r--r-- 1 root root 23437 Apr 21 2010 list_pkg_dir.txt
-rw-r--r-- 1 root root 705 Oct 19 15:36 prototype
drwxr-xr-x 3 root root 180 Apr 21 2010 screens
-rwxr-xr-x 1 root root 260 Apr 21 2010 ssp.sh
-rw-r--r-- 1 root root 139 Oct 8 12:30 streamtest01
-rw-r--r-- 1 root root 120 Oct 8 13:46 streamtest02
-rw-r--r-- 1 root root 120 Oct 8 14:54 streamtest03
bash-3.00#
поглядеть конфигурационный скрипт configure. Поскольку мы все устанавливаем в /usr/local,
то и переменные для configure будут соответствующими.
Код: Выделить всё
bash-3.00# cd bwping-1.2/
bash-3.00# ls
AUTHORS ChangeLog Makefile.am NEWS aclocal.m4 bwping.c configure depcomp missing
COPYING INSTALL Makefile.in README bwping.8 config.h.in configure.in install-sh
bash-3.00# ./configure --prefix=/usr/local/ --sysconfdir=/etc
checking for a BSD-compatible install... /opt/sfw/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... no
checking for nawk... nawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for a BSD-compatible install... /opt/sfw/bin/install -c
checking how to run the C preprocessor... gcc -E
checking for egrep... egrep
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for unistd.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for struct sockaddr_in.sin_len... no
checking for inet_aton... no
checking for inet_aton in -lresolv... yes
checking for gethostbyname... no
checking for gethostbyname in -lnsl... yes
checking for socket... no
checking for socket in -lsocket... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
bash-3.00#
Скомпилируем и установим утилиту:
Код: Выделить всё
bash-3.00# make
bash-3.00# make install DESTDIR=/tmp/bwping/
test -z "/usr/local//sbin" || /tmp/bwping-1.2/install-sh -d "/tmp/bwping//usr/local//sbin"
/opt/sfw/bin/install -c 'bwping' '/tmp/bwping//usr/local//sbin/bwping'
test -z "/usr/local//man/man8" || /tmp/bwping-1.2/install-sh -d "/tmp/bwping//usr/local//man/man8"
/opt/sfw/bin/install -c -m 644 './bwping.8' '/tmp/bwping//usr/local//man/man8/bwping.8'
bash-3.00#
Код: Выделить всё
bash-3.00# cd /tmp/bwping/usr/local/
bash-3.00# pwd
/tmp/bwping/usr/local
bash-3.00# ls
man sbin
bash-3.00#
nix-like системам, а в Solaris раздел man страниц с номером 8 просто отсутствует. Поэтому надо переименовать директорию соответствующим
образом (как у ping, в нашем случае). Для системных утилит, требующих для своей работы суперпользователя, местоположение sbin/, однако у простого пользователя данный путь может отсутствовать в переменной $PATH, поэтому можно нашу утилиту положить в bin/, что было и сделано. Для запускного файла
bwping следует назначить те же права, что и для ping.
Создадим файл prototype:
Код: Выделить всё
bash-3.00# pkgproto /tmp/ANDYbwping/ > /tmp/ANDYbwping/prototype
bash-3.00# cat /tmp/ANDYbwping/prototype
d none /tmp/ANDYbwping 0775 root root
f none /tmp/ANDYbwping/pkginfo 0644 root root
d none /tmp/ANDYbwping/bin 0755 root root
f none /tmp/ANDYbwping/bin/bwping 4555 root root
d none /tmp/ANDYbwping/doc 0755 root root
d none /tmp/ANDYbwping/doc/bwping 0755 root root
f none /tmp/ANDYbwping/doc/bwping/AUTHORS 0644 root root
f none /tmp/ANDYbwping/doc/bwping/ChangeLog 0644 root root
f none /tmp/ANDYbwping/doc/bwping/COPYING 0644 root root
f none /tmp/ANDYbwping/doc/bwping/INSTALL 0644 root root
f none /tmp/ANDYbwping/doc/bwping/NEWS 0644 root root
f none /tmp/ANDYbwping/doc/bwping/README 0644 root root
d none /tmp/ANDYbwping/share 0755 root root
d none /tmp/ANDYbwping/share/man 0755 root root
d none /tmp/ANDYbwping/share/man/man1m 0755 root root
f none /tmp/ANDYbwping/share/man/man1m/bwping.1m 0444 root root
f none /tmp/ANDYbwping/prototype 0644 root root
bash-3.00#
part ftype class path major minor mode owner group
part Необязательное числовое поле, позволяющее сгруппировать объекты пакета в части. Значение по умолчанию - 1.
ftype Поле, состоящее из одного символа, указывающего на тип объекта.
class Класс установки, к которому принадлежит объект.
path Абсолютное или относительное имя пути, указывающее, в каком месте целевой системы будет находиться объект пакета.
major Старший номер устройства для специальных блочных или символьных устройств.
minor Младший номер устройства для специальных блочных или символьных устройств.
mode Восьмеричный режим объекта (например, 0644).
owner Владелец объекта (например, bin или root).
У нас утилита простенькая, поэтому и данных меньше. Отдельно стоит упомянуть поле path. Расположение
файлов в пакете, должно соответствовать их расположению на диске. Слева находится путь, где будут располагаться
установленные файлы относительно переменной "BASEDIR=", определенной в файле pkginfo. Справа - путь, где располагаются
файлы которые мы будем упаковывать.
Приведем файл prototype к следующему виду:
Код: Выделить всё
i pkginfo
f none bin/bwping=/tmp/ANDYbwping/bin/bwping 4555 root bin
d none doc/bwping=/tmp/ANDYbwping/doc/bwping/ 0755 root root
f none doc/bwping/AUTHORS=/tmp/ANDYbwping/doc/bwping/AUTHORS 0644 bin bin
f none doc/bwping/ChangeLog=/tmp/ANDYbwping/doc/bwping/ChangeLog 0644 bin bin
f none doc/bwping/COPYING=/tmp/ANDYbwping/doc/bwping/COPYING 0644 bin bin
f none doc/bwping/INSTALL=/tmp/ANDYbwping/doc/bwping/INSTALL 0644 bin bin
f none doc/bwping/NEWS=/tmp/ANDYbwping/doc/bwping/NEWS 0644 bin bin
f none doc/bwping/README=/tmp/ANDYbwping/doc/bwping/README 0644 bin bin
f none share/man/man1m/bwping.1m=/tmp/ANDYbwping/share/man/man1m/bwping.1m 0444 root bin
Владелец и группа изменены на те, что и у остальных файлов в целевых директориях. Символ i означает,
что файл pkginfo информационный файл.
Перейдем в директорию со структурой пакета и соберем его:
Код: Выделить всё
bash-3.00# pwd
/tmp/ANDYbwping
bash-3.00# ls -lahi
total 112
24686713 drwxrwxr-x 5 root root 429 Oct 19 16:30 .
1175946 drwxrwxrwt 7 root sys 1.2K Oct 19 17:00 ..
24686601 drwxr-xr-x 2 root root 180 Oct 18 17:07 bin
3860516 drwxr-xr-x 3 root root 180 Oct 18 17:07 doc
24687021 -rw-r--r-- 1 root root 280 Oct 18 17:07 pkginfo
24686881 -rw-r--r-- 1 root root 660 Oct 19 17:00 prototype
30821277 drwxr-xr-x 3 root root 177 Oct 18 17:07 share
bash-3.00# pkgmk
## Building pkgmap from package prototype file.
## Processing pkginfo file.
WARNING: missing directory entry for <bin>
WARNING: missing directory entry for <doc>
WARNING: missing directory entry for <share>
WARNING: missing directory entry for <share/man>
WARNING: missing directory entry for <share/man/man1m>
WARNING: parameter <CLASSES> set to "none"
## Attempting to volumize 9 entries in pkgmap.
part 1 -- 166 blocks, 30 entries
## Packaging one part.
/var/spool/pkg/ANDYbwping/pkgmap
/var/spool/pkg/ANDYbwping/pkginfo
/var/spool/pkg/ANDYbwping/reloc/bin/bwping
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/AUTHORS
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/COPYING
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/ChangeLog
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/INSTALL
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/NEWS
/var/spool/pkg/ANDYbwping/reloc/doc/bwping/README
/var/spool/pkg/ANDYbwping/reloc/share/man/man1m/bwping.1m
## Validating control scripts.
## Packaging complete.
bash-3.00#
Код: Выделить всё
bash-3.00# ls -lahi /var/spool/pkg/ANDYbwping/
total 98
88988 drwxr-xr-x 3 root root 512 Oct 19 17:06 .
1233 drwxrwxrwt 2050 root bin 45K Oct 19 17:06 ..
89398 -rw-r--r-- 1 root root 274 Oct 19 17:06 pkginfo
89000 -rw-r--r-- 1 root root 561 Oct 19 17:06 pkgmap
89406 drwxr-xr-x 5 root root 512 Oct 19 17:06 reloc
bash-3.00#
без проблем.
Перенесем наш пакет в директорию /tmp/ и запишем его в файл:
Код: Выделить всё
bash-3.00# mv /var/spool/pkg/ANDYbwping /tmp/
bash-3.00# pkgtrans -s /tmp bwping-1.2-sol10-sparc.pkg