В данной главе рассказывается о процессе и задачах, связанных со сборкой пакета. Некоторые из этих задач являются обязательными. Некоторые из этих задач являются необязательными. Обязательные задачи детально рассмотрены в данной главе. Для получения сведений о необязательных задачах, которые позволяют придать пакету дополнительную функциональность, см. Глава 3Расширение функциональности пакета (задачи) и Глава 6Дополнительные методы создания пакетов.
Ниже следует перечень вопросов, рассматриваемых в данной главе.
В Таблица 2–1 описана процедура, которой необходимо придерживаться при сборке пакетов, особенно при отсутствии опыта их сборки. Хотя порядок выполнения первых четырех задач не является обязательным, он обеспечивает наибольшую простоту выполняемых действий. Накопив опыт в области создания пакетов, вы сможете переставлять эти задачи в любой наиболее удобной для вас последовательности.
Став опытным разработчиком пакетов, вы сможете автоматизировать процесс их сборки с помощью команды make и файлов Makefile. Для получения дополнительной информации см. справочную страницу о команде make(1S).
Таблица 2–1 Процесс сборки пакета (Карта задач)
Задача |
Описание |
Инструкции |
---|---|---|
1. Создать файл pkginfo |
Создать файл pkginfo для описания характеристик пакета. | |
2. Упорядочить содержимое пакета |
Упорядочить компоненты пакета в иерархическую структуру каталогов. | |
3. (не обязательно) Создать информационные файлы |
Определить зависимости пакета, включить сообщение об авторских правах и зарезервировать дополнительное место на целевой системе. | |
4. (не обязательно) Создать сценарии установки |
Настроить процессы установки и удаления пакета. | |
5. Создать файл prototype |
Описать объект пакета в файле prototype. | |
6.Собрать пакет |
Собрать пакет с помощью команды pkgmk. | |
7. Проверить и записать пакет |
Проверить целостность пакета перед копированием его на распространяемый носитель. |
Переменные среды можно использовать в обязательных информационных файлах, pkginfo и prototype. Кроме того, можно использовать параметр для команды pkgmk, используемой для сборки пакета. Поскольку в данной главе обсуждаются эти файлы и команды, здесь представлена дополнительная информации по переменным, зависящая от контекста. Однако перед началом сборки пакета следует ознакомиться с различными типами переменных и их возможным влиянием на успешное создание пакета.
Существуют два типа переменных:
Переменные, используемые при сборке пакета (переменные сборки)
Переменные сборки начинаются со строчной буквы, и их значение определяется в период сборки, когда производится сборка пакета с помощью команды pkgmk.
Переменные, используемые при установке пакета (переменные установки)
Переменные установки начинаются с заглавной буквы, и их значения определяются в период установки, когда пакет устанавливается с помощью команды pkgadd.
В файле pkginfo определение переменной имеет форму PARAM=value (Параметр=значение), и первая буква в PARAM является заглавной. Значения этих переменных определяются только во время установки. Если значение одной из этих переменных не может быть определено, выполнение команды pkgadd прерывается, и выдается сообщение об ошибке.
В файле prototype определение переменной может принять форму !PARAM=value или $variable. PARAM и variable могут начинаться как с заглавной, так и со строчной буквы. Вычисляются значения только для переменных, значения которых известны в период сборки. Если PARAM или variable является переменной сборки или установки, значение которой неизвестно во время сборки пакета, работа команды pkgmk прерывается, и появляется сообщение об ошибке.
Параметр PARAM=value можно включить и в качестве параметра команды pkgmk. Этот параметр работает так же, как в файле prototype, за исключением того, что область его действия является глобальной для всего пакета. Определение !PARAM=value в файле prototype является локальным для этого файла и той части пакета, который оно определяет.
Если PARAMявляется переменной установки, а variable - переменной установки или сборки с известным значением, то команда pkgmk вставляет определение в файл pkginfo, и это определение будет доступно в период установки. Однако команда pkgmk не определяет значения PARAM, содержащиеся в именах путей, указанных в файле prototype.
В таблице ниже представлен краткий обзор форматов, местоположения и области применения переменных.
Таблица 2–2 Краткий обзор переменных среды пакета
Место определения переменной |
Формат определения переменной |
Тип определяемой переменной |
Когда определяется значение переменной |
Где определяется значение переменной |
Элементы, которые переменная может заменить |
---|---|---|---|---|---|
Файл pkginfo |
PARAM=value |
Переменная сборки |
Игнорируется во время сборки |
нет |
Нет |
Установка |
Во время установки |
В файле pkgmap |
owner (владелец), group (группа), path (путь) или цель ссылки |
|
|
Файл prototype |
!PARAM=value |
Переменная сборки |
Во время сборки |
В файле prototype и любых включенных файлах |
mode (режим), owner (владелец), group (группа) или path (путь) |
Установка |
Во время сборки |
В файле prototype и любых включенных файлах |
Только в командах !search и !command |
|
|
Командная строка pkgmk |
PARAM=value |
Переменная сборки |
Во время сборки |
В файле prototype |
mode (режим), owner (владелец), group (группа) или path (путь) |
Установка |
Во время сборки |
В файле prototype |
Только команда !search |
|
|
Во время установки |
В файле pkgmap |
owner (владелец), group (группа), path (путь) или link target (целевая ссылка) |
|
|
|
Файл pkginfo представляет собой файл ASCII, в котором описаны характеристики пакета и даны сведения, которые помогают контролировать процесс установки.
Каждая запись в файле pkginfo представляет из себя строку, которая устанавливает значения параметра в формате PARAM=value. PARAM может быть любым стандартным параметром, описанным на справочной странице pkginfo(4) Не существует обязательного порядка, в котором следует указывать параметры.
Каждое значение value может быть заключено в одинарные или двойные кавычки, например: 'value' или “value”). Если значение value содержит символы, считающиеся специальными в интерпретаторе команд, необходимо использовать кавычки. В практических примерах, приведенных в данной книге, не используются кавычки. Пример использования двойных кавычек приведен на справочной странице pkginfo(4).
Можно также создавать свои собственные параметры пакета, присвоив им значение в файле pkginfo. Ваши собственные параметры должны начинаться с заглавной буквы. Дальнейшие буквы могут быть как заглавными, так и строчными. Заглавная буква означает, что параметр (переменная) будет определен во время установки, а не во время сборки. Для получения дополнительной информации о разнице между переменными установки и переменными сборки см. раздел Переменные среды пакета.
Конечные пробелы после любого значения параметра игнорируются.
Необходимо определить следующие пять параметров в файле pkginfo: PKG, NAME, ARCH, VERSION и CATEGORY. Параметры PATH, PKGINST и INSTDATE вставляются автоматически программным обеспечением во время сборки пакета. Не следует изменять эти восемь параметров. Для информации об остальных параметрах см. справочную страницу pkginfo(4).
Один и тот же пакет может иметь различные версии, быть совместимым с различными архитектурами или и то и другое одновременно. Каждая разновидность пакета называется экземпляр пакета. Экземпляр пакета определяется по сочетанию определений параметров PKG, ARCH и VERSION в файле pkginfo.
Команда pkgadd назначает идентификатор пакета каждому экземпляру пакета в процессе установки. Идентификатор пакета - это аббревиатура пакета с цифровым суффиксом, например SUNWadm.2. Данный идентификатор служит отличительным признаком экземпляра пакета, по которому его можно отличить от любых других пакетов, включая другие экземпляры этого же пакета.
Аббревиатура пакета - это краткое название пакета, которое определяется параметром PKG в файле pkginfo. Аббревиатура пакета должна иметь следующие характеристики:
Аббревиатура должна состоять из алфавитно-цифровых символов. Первый символ не может быть числом.
Аббревиатура не должна быть длиннее 32 символов.
Аббревиатура не должна совпадать с одной из зарезервированных аббревиатур: install, new или all.
Первые четыре символа должны быть уникальными для компании. Например у всех пакетов, созданных компанией Sun MicrosystemsTM, первые четыре символа аббревиатуры – “SUNW”.
В качестве примера сокращенной записи пакета в файле pkginfo можно привести PKG=SUNWcadap.
Параметр ARCH в файле pkginfo определяет, какие архитектуры связаны с данным пакетом. Имя архитектуры не должно превышать 16 алфавитно-цифровых символов. Если пакет связан с несколькими архитектурами, то все архитектуры необходимо перечислить в списке через запятую.
Пример спецификации архитектуры пакета в файле pkginfo :
ARCH=sparc |
Параметр SUNW_ISA в файле pkginfo указывает, какая архитектура системы команд связана с пакетом Sun Microsystems. Может принимать следующие значения:
sparcv9 для пакета, содержащего 64-разрядные объекты
sparcv для пакета, содержащего 32-разрядные объекты
Например, значение SUNW_ISA в файле pkginfo для пакета, содержащего 64-разрядные объекты, будет:
SUNW_ISA=sparcv9 |
Если параметр SUNW_ISA не установлен, то по умолчанию архитектура системы команд пакета устанавливается на значение параметра ARCH.
Параметр VERSION в файле pkginfo указывает версию пакета. Название версии не должно превышать 256 символов ASCII и не может начинаться с левой скобки.
Пример спецификации версии в файле pkginfo:
VERSION=release 1.0 |
Имя пакета - это полное название пакета, определяемое параметром NAME в файле pkginfo.
Поскольку системные администраторы часто используют имена пакетов для указания, следует ли устанавливать тот или иной пакет, написание четких и выразительных полных имен пакетов очень важно. Имена пакетов должны соответствовать следующим ниже критериям.
Укажите, для чего нужен этот пакет (например, для обеспечения определенных команд или функциональности или укажите, что пакет необходим для конкретного оборудования).
Укажите, для чего используется этот пакет (например, для разработки драйверов устройств).
Включите описание аббревиатуры пакета с помощью ключевых слов, кратко расшифровывающих аббревиатуру. Например, полное имя пакета для аббревиатуры SUNWbnuu – “Basic Networking UUCP Utilities, (Usr)” .
Укажите раздел диска, на который будет устанавливаться пакет.
Используйте термины в соответствии с их значением, принятым в отрасли.
Используйте возможность написания 256–символьного имени.
Пример имени пакета, определенного в файле pkginfo:
NAME=Chip designers need CAD application software to design abc chips. Runs only on xyz hardware and is installed in the usr partition. |
Параметр CATEGORY в файле pkginfo указывает, к какой категории принадлежит пакет. Пакет должен принадлежать как минимум к одной из следующих категорий: system (система) или application (приложение). Имена категорий обозначаются алфавитно-цифровыми символами. Имена категорий не зависят от регистра и не должны превышать 16 символов в длину.
Если пакет принадлежит к нескольким категориям, укажите эти категории в списке через запятую.
Пример спецификации CATEGORY в файле pkginfo :
CATEGORY=system |
С помощью своего любимого текстового редактора создайте файл с именем pkginfo.
Откройте файл для правки и определите пять обязательных параметров.
Этими пятью параметрами являются: PKG, NAME, ARCH, VERSION и CATEGORY. Для получения дополнительной информации об этих параметрах ознакомьтесь с разделом Создание файла pkginfo.
Добавьте к файлу любые необязательные параметры.
Создайте свои собственные параметры или прочтите справочную страницу pkginfo(4) для получения сведений о стандартных параметрах.
Сохраните изменения и выйдите из редактора.
В данном примере показано содержимое допустимого файла pkginfo с пятью обязательными параметрами, а также с параметром BASEDIR. Параметр BASEDIR более подробно обсуждается в разделе Поле path.
PKG=SUNWcadap NAME=Chip designers need CAD application software to design abc chips. Runs only on xyz hardware and is installed in the usr partition. ARCH=sparc VERSION=release 1.0 CATEGORY=system BASEDIR=/opt |
См. раздел Как упорядочить содержимое пакета.
Упорядочите объекты пакета в иерархическую структуру каталога, которая будет повторять структуру объектов пакета в целевой системе после установки. Если вы выполните эту процедуру до создания файла prototype, вы сэкономите время и усилия при создании этого файла.
Определите, сколько пакетов вам нужно создать и какие объекты будут находиться в каждом пакете.
Для получения справки о выполнении этого действия см. раздел Что следует принять во внимание перед сборкой пакета.
Создайте каталог для каждого пакета, который необходимо собрать.
Вы можете создать этот каталог в любом месте своей системы и назвать его по своему усмотрению. В примерах к этой главе предполагается, что каталог пакета имеет то же имя, что и аббревиатура пакета.
$ cd /home/jane $ mkdir SUNWcadap |
Упорядочите объекты пакета в каждом пакете в структуру каталогов под соответствующим каталогом пакета. Структура каталога должна повторять структуру объектов пакета в целевой системе после установки.
Например, для пакета приложений САПР SUNWcadap требуется следующая структура каталога.
Определитесь, где будет храниться информационные файлы. Если целесообразно, создайте каталог для хранения этих файлов в одном месте.
В данном примере предполагается, что файл pkginfo из раздела Как создать файл pkginfo был создан в домашнем каталоге Jane.
$ cd /home/jane $ mkdir InfoFiles $ mv pkginfo InfoFiles |
См. раздел Создание файла prototype с помощью команды pkgproto.
Файл prototype - это файл в кодировке ASCII, используемый для указания информации об объектах пакета. Каждая запись в файле prototype описывает объект, например файл данных, каталог, исходный файл или исполняемый объект. Записи в файле prototype состоят из нескольких информационных полей, разделенных пробелами. Обратите внимание на то, что поля должны следовать в определенном порядке. Строки с комментариями начинаются со знака диеза (#) и игнорируются.
Создать файлprototype можно с помощью текстового редактора или команды pkgproto. При создании этого файла в первый раз, вероятно, проще это сделать с помощью команды pkgproto, потому что она создает файл на основе ранее созданной иерархии каталогов. Если вы не упорядочили файлы в соответствии с описанием, приведенном в разделе Упорядочение содержимого пакета, перед вами стоит нелегкая задача создания файла prototype с нуля в своем любимом текстовом редакторе.
Ниже приведен пример формата каждой строки в файле prototype:
partftypeclasspathmajorminormodeownergroup |
part |
Необязательное числовое поле, позволяющее сгруппировать объекты пакета в части. Значение по умолчанию - 1. |
ftype |
Поле, состоящее из одного символа, указывающего на тип объекта. См. раздел Поле ftype. |
class |
Класс установки, к которому принадлежит объект. См. раздел Поле class. |
path |
Абсолютное или относительное имя пути, указывающее, в каком месте целевой системы будет находиться объект пакета. См. раздел Поле path. |
major |
Старший номер устройства для специальных блочных или символьных устройств. |
minor |
Младший номер устройства для специальных блочных или символьных устройств. |
mode |
Восьмеричный режим объекта (например, 0644). См. раздел Поле mode. |
owner |
Владелец объекта (например, bin или root). См. раздел Поле owner. |
group |
Группа, к которой принадлежит объект (например, bin или sys). См. раздел Поле group. |
Обычно определяются только поля ftype, class, path, mode, owner,и group. Эти поля описаны в следующих разделах. Для получения дополнительной информации по этим полям см. справочную страницу prototype(4).
Поле ftype или тип файла является односимвольным полем, обозначающим тип файла объекта пакета. Допустимые типы файлов представлены в следующей ниже таблице.
Таблица 2–3 Допустимые типы файлов в файле prototype
Допустимое значение типа файла |
Описание типа файла |
---|---|
f |
Стандартный исполняемый файл или файл данных |
e |
Файл, который изменяется во время установки или удаления (может быть общим для нескольких пакетов) |
v |
Непостоянный файл (содержимое которого будет меняться, например, файл журнала) |
d |
Каталог |
x |
Монопольный каталог, доступный только этому пакету (может содержать незарегистрированные журналы или информацию базы данных) |
l |
Ссылочный файл |
p |
Именованный канал |
c |
Специальное символьное устройство |
b |
Специальное блочное устройство |
i |
Информационный файл или сценарий установки |
s |
Символическая ссылка |
Поле class именует класс, к которому принадлежит объект. Использование классов является необязательной функцией для разработки пакета. Более подробно эта функция рассматривается в разделе Создание сценариев действий над классами.
Если классы не используются, объект принадлежит к классу none. При выполнении команды pkgmk для сборки пакета команда вставляет параметр CLASSES=none в файл pkginfo. У файлов типа i поле class должно быть пустым.
Поле path используется для определения местонахождения объекта пакета в целевой системе. Указать местоположение файла можно с помощью абсолютного (например, /usr/bin/mail) или относительного имени пути (например, bin/mail). Использование абсолютного имени пути означает, что местоположение объекта в целевой системе определяется пакетом и не может быть изменено. Объекты пакета с относительными именами пути являются перемещаемыми.
Перемещаемому объекту не требуется абсолютного пути в целевой системе. Вместо этого его местоположение определяется в ходе процесса установки.
Перемещаемыми могут быть отдельные объекты или все объекты пакета. Перед написанием сценария установки или созданием файла prototype необходимо решить, будут ли объекты пакета иметь фиксированное местоположение (например, сценарии запуска в каталоге /etc) или перемещаемое .
Существуют два типа перемещаемых объектов: коллективно перемещаемые и индивидуально перемещаемые.
Коллективно перемещаемые объекты расположены в месте, связанном с общей установочной базой, называемой базовым каталогом . Базовый каталог определяется в файле pkginfo с помощью параметра BASEDIR. Например, перемещаемый объект tests/generic в файле prototype требует, чтобы в файле pkginfo по умолчанию был установлен параметрBASEDIR. Пример:
BASEDIR=/opt |
В данном примере после установки объекта он будет расположен в каталоге /opt/tests/generic.
Единственным каталогом, куда можно устанавливать программное обеспечение, не являющееся базовым ПО Solaris, это каталог /opt.
По возможности старайтесь использовать коллективно перемещаемые объекты. В общем случае основная часть пакета может быть перемещаемой, а несколько файлов (например, файлы в каталогах /etc или /var) могут быть указаны как абсолютные. Однако, если пакет содержит множество различных перемещений, рекомендуется разделить пакет на несколько пакетов с явно указанными значениями BASEDIR в соответствующих файлах pkginfo.
Индивидуально перемещаемые объекты, в отличие от коллективно перемещаемых, не ограничены размещением в одном и том же каталоге. Для определения индивидуально перемещаемого объекта необходимо указать установочную переменную в поле path файла prototype. После определения установочной переменной нужно создать сценарий request, запрашивающий установщик о расположении перемещаемого базового каталога, или сценарий checkinstall для получения имени пути из данных файловой системы. Для получения дополнительной информации по сценарию request см. раздел Создание сценария request , а информация по сценарию checkinstall находится в разделе Сбор данных о файловой системе.
Управлять индивидуально перемещаемыми объектами сложно. Использование индивидуально перемещаемых объектов может привести к большому разнесению компонентов пакета, которые будет сложно изолировать при установке нескольких версий или архитектур пакета. По возможности старайтесь использовать коллективно перемещаемые объекты.
Параметрическое имя пути - это имя пути, содержащее спецификацию переменной. Например, /opt/$PKGINST/filename является параметрическим именем пути, поскольку включает спецификацию переменной $PKGINST. Значение спецификации переменной по умолчанию должно быть определено в файле pkginfo. Позднее это значение может быть изменено сценариями request или checkinstall.
Спецификация переменной должна стоять в начале или в конце имени пути или должна быть заключена между символами наклонной черты (/). Допускаются следующие формы параметрических имен пути.
$PARAM/tests tests/$PARAM/generic /tests/$PARAM |
После того как спецификация переменной определена, путь может быть вычислен как абсолютный или перемещаемый. В примере ниже файл prototype содержит следующую запись:
f none $DIRLOC/tests/generic |
Файл pkginfo содержит следующую запись:
DIRLOC=/myopt |
Имя пути $DIRLOC/tests/generic приобретает вид абсолютного имени пути /myopt/tests/generic независимо от того, был ли установлен параметр BASEDIR в файле pkginfo.
В данном примере файл prototype идентичен одному из предыдущих примеров, а в файле pkginfo содержатся следующие записи:
DIRLOC=firstcut BASEDIR=/opt |
Имя пути $DIRLOC/tests/generic будет выражено в виде перемещаемого имени пути /opt/firstcut/tests/generic.
Для получения дополнительной информации о параметрических именах путей см. раздел Использование параметрических базовых каталогов.
Поле path в файле prototype определяет расположение объекта в целевой системе. Если структура каталога не повторяет структуру, которую необходимо получить в целевой системе, то следует указать существующее местоположение объектов пакета в файле prototype. Для получения дополнительной информации о структурировании объектов в пакете см. раздел Упорядочение содержимого пакета.
Если структура области разработки отличается от желаемой структуры пакета, то можно использовать формат path1=path2 в поле path. В этом формате path1 означает расположение объекта в целевой системе, а path2 - расположение объектов в системе разработчика.
Этот же формат имени пути (path1=path2) можно использовать следующим образом: определить path1 в качестве перемещаемого имени объекта , а path2 - в качестве полного имени пути к этому объекту в системе разработчика.
path1 не должен содержать неопределенных переменных сборки, но может содержать неопределенные переменные установки. path2 не может содержать никаких неопределенных переменных, однако можно использовать переменные обоих типов. Для получения дополнительной информации о разнице между переменными установки, и переменными, создаваемыми в процессе сборки пакета, см. раздел Переменные среды пакета.
Для ссылок должен использоваться формат path1= path2, поскольку они создаются с помощью команды pkgadd. В общем случае путь path2 в ссылках никогда не должен быть абсолютным. Данный путь должен указываться относительно части пути path1, обозначающей каталог.
Вместо формата path1=path2 можно использовать команду !search. Для получения дополнительной информации см. раздел Указание пути поиска для команды pkgmk..
Поле mode может содержать восьмеричное число, знак вопроса (?) или спецификацию переменной. Восьмеричное число определяет режим объекта после его установки на целевую систему. Знак вопроса ? означает, что при установке объекта режим останется неизменным. Подразумевается, что объект с тем же именем уже существует в целевой системе.
Спецификация переменной в форме $mode означает, что данное поле будет установлено во время сборки пакета. Первая буква переменной должна быть строчной. Обратите внимание, что эта переменная должна быть определена во время сборки пакета либо в файле prototype, либо в качестве параметра команды pkgmk. Для получения дополнительной информации о разнице между переменными установки и переменными сборки пакета см. раздел Переменные среды пакета.
У файлов типа i (информационные файлы), l (жесткая ссылка) и s (символическая ссылка) это поле должно быть пустым.
Поле owner может содержать имя пользователя, знак вопроса (?) или спецификацию переменной. Имя пользователя не должно быть длиннее 14 символов и должно соответствовать имени, уже существующему в целевой системе (например, bin или root). Знак вопроса ? означает, что при установке объекта владелец (owner) останется неизменным. Подразумевается, что объект с тем же именем уже существует в целевой системе.
Спецификация переменной может быть указана в форме $ Owner или $owner, т.е. первая буква может быть как заглавной, так и строчной. Если переменная начинается со строчной буквы, то ее необходимо определить в период сборки пакета в файле prototype или в качестве параметра команды pkgmk. Если переменная начинается с заглавной буквы, то спецификация переменной будет внесена в файл pkginfo в качестве значения по умолчанию и может быть переопределена в ходе установки с помощью сценария request. Для получения дополнительной информации о разнице между переменными, создаваемыми в процессе установки, и переменными, создаваемыми в процессе сборки пакета, см. раздел Переменные среды пакета.
У файлов типа i (информационный файл) и lb (жесткая ссылка) это поле должно быть пустым.
Поле group может содержать имя группы, знак вопроса (?) или спецификацию переменной. Имя группы не должно быть длиннее 14 символов и должно соответствовать имени, уже существующему в целевой системе (например, bin или sys). Знак вопроса ? означает, что при установке объекта группа (group) останется неизменной. Подразумевается, что объект с тем же именем уже существует в целевой системе.
Спецификация переменной может быть указана в форме $ Group или $group, т.е. первая буква переменной может быть как заглавной, так и строчной. Если переменная начинается со строчной буквы, то ее необходимо определить в период сборки пакета в файле prototype или в качестве параметра команды pkgmk. Если переменная начинается с заглавной буквы, то спецификация переменной будет внесена в файл pkginfo в качестве значения по умолчанию и может быть переопределена в ходе установки с помощью сценария request. Для получения дополнительной информации о разнице между переменными установки и переменными сборки пакета см. раздел Переменные среды пакета.
У файлов типа i (информационный файл) и l (жесткая ссылка) это поле должно быть пустым.
При необходимости создания файла prototype с нуля можно использовать свой любимый текстовый редактор и добавлять по одной записи для каждого объекта пакета. Для получения дополнительной информации по формату этого файла см. раздел Формат файла prototype и справочную страницу prototype(4). После определения каждого объекта пакета можно включить в файл некоторые функции, описанные в разделе Добавление функций в файл prototype.
С помощью команды pkgproto можно создать базовый файл prototype при условии, что структура каталогов пакета была упорядочена в соответствии с процедурой, описанной в разделе Упорядочение содержимого пакета. Например, с помощью используемой в примерах структуре каталогов и файла pkginfo, описание которого дано в предыдущих разделах, команды для создания файла prototype будут выглядеть следующим образом:
$ cd /home/jane $ pkgproto ./SUNWcadap > InfoFiles/prototype |
В результате получится следующий файл prototype:
d none SUNWcadap 0755 jane staff d none SUNWcadap/demo 0755 jane staff f none SUNWcadap/demo/file1 0555 jane staff d none SUNWcadap/srcfiles 0755 jane staff f none SUNWcadap/srcfiles/file5 0555 jane staff f none SUNWcadap/srcfiles/file6 0555 jane staff d none SUNWcadap/lib 0755 jane staff f none SUNWcadap/lib/file2 0644 jane staff d none SUNWcadap/man 0755 jane staff f none SUNWcadap/man/windex 0644 jane staff d none SUNWcadap/man/man1 0755 jane staff f none SUNWcadap/man/man1/file4.1 0444 jane staff f none SUNWcadap/man/man1/file3.1 0444 jane staff |
Действительный владелец и группа, в которую входит сборщик пакета, записываются командой pkgproto. Полезным приемом считается использование команд chown -R и chgrp -R, указывающих владельца и группу, до выполнения команды pkgproto.
В приведенном выше примере создание файла prototype не закончено. В следующем разделе приводится информация по завершению создания этого файла.
Несмотря на то, что команда pkgproto очень полезна при создании первичного файла prototype, она не создает записей для всех объектов пакета, которые должны быть определены. Эта команда не создает полных записей. Команда pkgproto не делает ничего из перечисленного ниже.
Не создает полных записей для объектов типа v (непостоянные файлы), e (редактируемые файлы), x (монопольные каталоги) и i (информационные файлы или сценарии установки)
Не поддерживает множественные классы с единым вызовом
Как минимум необходимо изменить файл prototype и добавить в него объекты с типом файла i. Если информационные файлы и сценарии установки были сохранены на первом уровне каталога пакета (например, /home/jane/SUNWcadap/pkginfo), тогда запись в файле prototype будет выглядеть следующим образом:
i pkginfo |
Если же они не были сохранены на первом уровне каталога пакета, то потребуется указать из исходное местоположение. Пример:
i pkginfo=/home/jane/InfoFiles/pkginfo |
В качестве альтернативы можно использовать команду !search для указания местоположения, которое команда pkgmk будет искать при сборке пакета. Для получения дополнительной информации см. раздел Указание пути поиска для команды pkgmk..
Для добавления записей для объектов типа v, e и x используйте формат, описанный в разделе Формат файла prototype, или воспользуйтесь справочной страницей prototype(4).
Не забывайте всегда назначать класс для файлов типа e (редактируемые) и создавать для него связанный сценарий действия над классом. В противном случае файлы будут удалены в ходе удаления пакета, даже если указанное имя пути совместно используется другими пакетами.
При использовании команды pkgproto для создания базового файла prototype можно назначить все объекты пакета классу none или одному определенному классу. Как показано в разделе Пример. Создание файла prototypeс помощью команды pkgproto, базовая команда pkgproto назначает все объекты классу none. Чтобы назначить все объекты какому-либо определенному классу, можно использовать параметр -c. Пример:
$ pkgproto -c classname /home/jane/SUNWcadap > /home/jane/InfoFiles/prototype |
При использовании нескольких классов придется изменить файл prototype вручную и отредактировать поле class для каждого объекта. При использовании классов необходимо также определить параметр CLASSES в файле pkginfo, а также написать сценарии действий над классами. Использование классов является необязательным и подробно обсуждается в разделе Создание сценариев действий над классами.
При наличии файла prototype, созданного ранее при помощи команды pkgproto, как описано в разделе Пример. Создание файла prototypeс помощью команды pkgproto, в нем требуется произвести некоторые изменения.
Необходима запись для файла pkginfo.
Поле path необходимо перевести в формат path1=path2, поскольку источник пакета находится в каталоге /home/jane . Так как исходный пакет представляет собой иерархический каталог, а команда !search не может осуществлять поиск рекурсивно, проще использовать формат path1=path2.
Поля owner и group должны содержать имена существующих в целевой системе пользователей и групп. Следовательно, при указании владельца jane возникнет ошибка, так как данный владелец не является частью операционной системы SunOSTM.
Измененный файл prototype будет выглядеть следующим образом:
i pkginfo=/home/jane/InfoFiles/pkginfo d none SUNWcadap=/home/jane/SUNWcadap 0755 root sys d none SUNWcadap/demo=/home/jane/SUNWcadap/demo 0755 root bin f none SUNWcadap/demo/file1=/home/jane/SUNWcadap/demo/file1 0555 root bin d none SUNWcadap/srcfiles=/home/jane/SUNWcadap/srcfiles 0755 root bin f none SUNWcadap/srcfiles/file5=/home/jane/SUNWcadap/srcfiles/file5 0555 root bin f none SUNWcadap/srcfiles/file6=/home/jane/SUNWcadap/srcfiles/file6 0555 root bin d none SUNWcadap/lib=/home/jane/SUNWcadap/lib 0755 root bin f none SUNWcadap/lib/file2=/home/jane/SUNWcadap/lib/file2 0644 root bin d none SUNWcadap/man=/home/jane/SUNWcadap/man 0755 bin bin f none SUNWcadap/man/windex=/home/jane/SUNWcadap/man/windex 0644 root other d none SUNWcadap/man/man1=/home/jane/SUNWcadap/man/man1 0755 bin bin f none SUNWcadap/man/man1/file4.1=/home/jane/SUNWcadap/man/man1/file4.1 0444 bin bin f none SUNWcadap/man/man1/file3.1=/home/jane/SUNWcadap/man/man1/file3.1 0444 bin bin |
Помимо определения каждого объекта пакета в файле prototype, можно расширить его функциональность следующим образом.
Определить дополнительные объекты, которые будут создаваться во время установки пакета.
Создать ссылки во время установки.
Распределить пакеты по нескольким томам.
Организовать вложенные файлы prototype.
Установить значения по умолчанию для полей mode, owner и group.
Указать путь поиска для командыpkgmk.
Установить переменные среды.
В представленных ниже разделах содержится информация о том, как произвести указанные изменения.
С помощью файла prototype можно определять объекты, не поставляемые на распространяемом носителе. Если во время установки объекты требуемого типа не существуют, команда pkgadd создает эти объекты.
Для того чтобы указать, что объект будет создаваться на целевой системе, добавьте для него запись в файле prototype и укажите соответствующий тип файла.
Например, если на целевой системе необходимо создать каталог, отсутствующий на распространяемом носителе, следует добавить следующую запись в файл prototype:
d none /directory 0644 root other |
Для создания пустого файла на целевой системе запись для такого файла в файле prototype может принять следующий вид:
f none filename=/dev/null 0644 bin bin |
Единственными объектами, которые должны поставляться на распространяемом носителе, являются обычные файлы и сценарии редактирования (файлы типов e, v, f), а также каталоги, в которых они содержатся. Любые дополнительные объекты создаются без ссылки на поставляемые объекты, каталоги, именованные каналы, устройства, жесткие и символические ссылки.
Для создания ссылок во время установки пакета в записи файла prototype для ссылочного объекта укажите следующее:
Его тип в виде l (ссылка) или s (символическая ссылка).
Имя пути ссылочного объекта в формате path1=path2, где path1 - файл назначения, а path2 - исходный файл. В общем случае путь path2 в ссылках никогда не должен быть абсолютным. Данный путь должен указываться относительно части пути path1, обозначающей каталог. Например, запись в файле prototype, определяющая символическую ссылку, может выглядеть следующим образом:
s none etc/mount=../usr/etc/mount |
Создание относительных ссылок будет зависеть от способа установки пакета, то есть будет ли он установлен как абсолютный или перемещаемый пакет.
При сборке пакета с помощью команды pkgmk эта команда производит расчеты и действия, необходимые для упорядочения многотомного пакета. Многотомный пакет называется сегментированным пакетом.
Существует и другой способ указать, в какой части будет располагаться объект. Для этого следует воспользоваться необязательном полем part в файле prototype. Номер, указанный в этом поле, отменяет команду pkgmk и помещает компонент в часть, указанную в этом поле. Обратите внимание на то, что существует взаимно-однозначное соответствие между частями и томами для сменных носителей, отформатированных как файловые системы. Если тома были назначены разработчиком, при недостаточном количестве места на любом из томов команда pkgmk выдает ошибку.
Можно создать несколько файлов prototype, а затем включить их при помощи команды !include в один файл prototype. Вложение файлов может потребоваться для облегчения поддержки.
В следующем примере присутствуют три файла prototype. Редактируется главный файл (prototype). Два других файла (proto2 и proto3) включаются в этот файл.
!include /source-dir/proto2 !include /source-dir/proto3 |
Чтобы установить значения по умолчанию для полей mode, owner и group отдельных объектов пакета, необходимо вставить команду !default в файл prototype. Пример:
!default 0644 root other |
Действие команды !default начинается с места ее включения в файл и продолжается до его конца. Действие команды не распространяется на вложенные файлы.
Следует иметь в виду, что для каталогов (тип файла d) и редактируемых файлов (тип файла e), имеющихся в целевой системе (таких как /usr или /etc/vfstab), необходимо установить в значениях полей mode, owner и group в файле prototype вопросительный знак (?). Таким образом, не будут нарушены существующие параметры, измененные администратором сайта.
Если исходное расположение объектов пакета отличается от из расположения в целевой системе, и использование формата path1=path2, описанного в разделе Краткие замечания о расположении каталогов источника и приемника объекта, нежелательно, то можно использовать команду !search в файле prototype.
Например, если в домашнем каталоге был создан каталог pkgfiles, содержащий все информационные файлы и сценарии установки, то можно указать, что необходим поиск этого каталога при сборке пакета с помощью команды pkgmk.
Команда в файле prototype будет выглядеть следующим образом:
!search /home-dir/pkgfiles |
Запрос на поиск не распространяется на вложенные файлы. Кроме того, поиск ограничен определенными перечисленными каталогами. Рекурсивный поиск также не производится.
К файлу prototype можно добавлять команды и в следующей форме: !PARAM=value. Команды, представленные в такой форме, определяют переменные в существующей среде. При наличии нескольких файлов prototype действие этой команды распространяется на тот файл prototype , в котором она была определена.
Переменная PARAM может начинаться с заглавной или со строчной буквы. Если значение переменной PARAM неизвестно во время сборки пакета, то выполнение команды pkgmk прерывается, и выдается сообщение об ошибке. Для получения дополнительной информации о разнице между переменными установки и переменными сборки пакета см. раздел Переменные среды пакета.
Рекомендуется создавать информационные файлы и сценарии установки до создания файла prototype. Однако этот порядок не является обязательным. Файл prototype всегда можно отредактировать после изменения содержимого пакета. Для получения дополнительных данных об информационных файлах и сценариях установки см. Глава 3Расширение функциональности пакета (задачи).
Определите, какие объекты пакета будут абсолютными, а какие - перемещаемыми.
Для получения информации о выполнении этого этапа см. раздел Поле path.
Упорядочите объекты пакета таким образом, чтобы они повторяли свое расположение в целевой системе.
Если пакеты уже упорядочены так, как описано в разделе Упорядочение содержимого пакета, возможно, придется внести в них некоторые изменения в зависимости от того, какое решение было принято в Шаг 1. Если пакет еще не упорядочен, следует сделать это сейчас. Если пакет не будет упорядочен, использование команды pkgproto для создания файла prototype будет невозможно.
Если пакет содержит коллективно перемещаемые объекты, необходимо отредактировать файл pkginfo и присвоить параметру BASEDIR соответствующее значение.
Пример:
BASEDIR=/opt |
Для получения информации о коллективно перемещаемых объектах см. раздел Коллективно перемещаемые объекты.
Если пакет содержит индивидуально перемещаемые объекты, необходимо создать сценарий request, который будет предлагать установщику ввести соответствующее имя пути. Как вариант, можно создать сценарий checkinstall, который определит соответствующий путь на основе системных данных.
Ниже приведены ссылки на наиболее общие задачи.
Для создания сценария request см. раздел Создание сценария request .
Для создания сценария checkinstall см. раздел Сбор данных о файловой системе.
Для получения дополнительной информации об индивидуально перемещаемых объектах см. раздел Индивидуально перемещаемые объекты.
Измените владельца и группу во всех компонентах пакета таким образом, чтобы они соответствовали владельцу и группе в целевой системе.
Используйте команды chown -R и chgrp -R в каталоге пакета и каталоге информационных файлов.
Выполните команду pkgproto для создания базового файла prototype.
Команда pkgproto сканирует каталоги и создает базовый файл. Пример:
$ cd package-directory $ pkgproto ./package-directory > prototype |
Файл prototype может располагаться в любом месте системы. Для упрощения доступа и обслуживания информационных файлов и сценариев установки рекомендуется хранить их в одном месте. Для получения дополнительной информации о команде pkgproto см. справочную страницу pkgproto(1).
Откройте файл prototype в своем любимом текстовом редакторе и добавьте записи для файлов типа v, e, x и i.
Для получения информации об изменениях, которые, вероятно, придется сделать, см. раздел Настройка файла prototype, созданного с помощью команды pkgproto.
(Необязательное действие) При использовании нескольких классов отредактируйте файлы prototype и pkginfo. Используйте текстовый редактор для производства необходимых изменений и создания соответствующих сценариев действий над классами.
Для получения информации об изменениях, которые вероятно придется сделать, см. раздел Настройка файла prototype, созданного с помощью команды pkgproto и Создание сценариев действий над классами.
Откройте файл prototype в текстовом редакторе и переопределите имена путей, а также измените другие настройки полей.
Для получения дополнительной информации см. раздел Настройка файла prototype, созданного с помощью команды pkgproto.
(Необязательно) Откройте файл prototype в любом удобном текстовом редакторе и добавьте дополнительные функции к файлу prototype.
Для получения дополнительной информации см. раздел Добавление функций в файл prototype.
Сохраните изменения и выйдите из редактора.
Для перехода к следующей задаче перейдите по ссылке Как собрать пакет.
Для сборки пакета используйте команду pkgmk. Команда pkgmk выполняет следующие задачи:
Переводит все объекты, определенные в файле prototype, в формат каталога.
Создает устанавливаемый пакет, который используется в качестве входных данных команды pkgadd.
Простейшей формой этой команды является выполнение команды pkgmk без каких-либо параметров. Перед использованием команды pkgmk без параметров убедитесь, что в текущем рабочем каталоге содержится файл prototype пакета. Результат выполнения команды, файлы и каталоги записываются в каталог /var/spool/pkg.
При сборке пакета с помощью команды pkgmk она создает файл pkgmap, который заменяет файл prototype. Файл pkgmap из предыдущего примера имеет следующее содержимое:
$ more pkgmap : 1 3170 1 d none SUNWcadap 0755 root sys 1 d none SUNWcadap/demo 0755 root bin 1 f none SUNWcadap/demo/file1 0555 root bin 14868 45617 837527496 1 d none SUNWcadap/lib 0755 root bin 1 f none SUNWcadap/lib/file2 0644 root bin 1551792 62372 837527499 1 d none SUNWcadap/man 0755 bin bin 1 d none SUNWcadap/man/man1 0755 bin bin 1 f none SUNWcadap/man/man1/file3.1 0444 bin bin 3700 42989 837527500 1 f none SUNWcadap/man/man1/file4.1 0444 bin bin 1338 44010 837527499 1 f none SUNWcadap/man/windex 0644 root other 157 13275 837527499 1 d none SUNWcadap/srcfiles 0755 root bin 1 f none SUNWcadap/srcfiles/file5 0555 root bin 12208 20280 837527497 1 f none SUNWcadap/srcfiles/file6 0555 root bin 12256 63236 837527497 1 i pkginfo 140 10941 837531104 $ |
Формат этого файла очень схож с форматом файла prototype. Однако файл pkgmap содержит следующую информацию:
В первой строке указывается количество томов, на которых расположен пакет, и примерный размер пакета после его установки.
Например, : 1 3170 означает, что пакет содержится на одном томе и будет занимать примерно 3170 512-байтовых блоков после установки.
Имеются три дополнительных поля, в которых указываются размер, контрольная сумма и время изменения каждого объекта пакета.
Объекты пакета упорядочены в алфавитном порядке по классу и по имени пути, чтобы сократить время установки пакета.
Создайте файл pkginfo, если таковой отсутствует.
Поэтапные указания приведены в разделе Как создать файл pkginfo.
Создайте файл prototype, если таковой отсутствует.
Поэтапные указания приведены в разделе Создание файла prototype с помощью команды pkgproto.
Сделайте каталог, содержащий файл prototype, текущим рабочим каталогом.
Выполните сборку пакета.
$ pkgmk [-o] [-a arch] [-b base-src-dir] [-d device] [-f filename] [-l limit] [-p pstamp] [-r rootpath] [-v version] [PARAM=value] [pkginst] |
Перезаписывает текущую версию пакета.
Отменяет информацию об архитектуре, содержащуюся в файле pkginfo.
Запрашивает добавление параметра base-src-dir к началу перемещаемых имен путей, когда команда pkgmk осуществляет поиск объектов в системе разработчика.
Указывает, что пакет должен быть скопирован на устройство device. В качестве устройства может выступать абсолютное имя пути каталога, дискета или съемный диск.
Называет файл filename, который используется в качестве файла prototype. Имена по умолчанию - prototype или Prototype.
Определяет максимальный размер устройства вывода в 512-байтных блоках.
Отменяет определение производственной маркировки в файле pkginfo.
Требует, чтобы для обнаружения объектов в системе разработчика использовался корневой каталог rootpath.
Отменяет информацию о версии, содержащуюся в файле pkginfo.
Устанавливает глобальные переменные среды. Переменные, начинающиеся со строчной буквы, вычисляются во время сборки пакета. Переменные, начинающиеся с заглавной буквы, помещаются в файл pkginfo и используются во время установки.
Ссылается на пакет по его аббревиатуре или определенному экземпляру (например, SUNWcadap.4).
Для получения дополнительной информации см. справочную страницу pkgmk(1).
Проверьте содержимое пакета.
$ pkgchk -d device-name pkg-abbrev Checking uninstalled directory format package pkg-abbrev from device-name ## Checking control scripts. ## Checking package objects. ## Checking is complete. $ |
Указывает расположение пакета. Обратите внимание, что device-name может быть как полным именем пути каталога, так и идентификатором в случае использования ленточного накопителя или съемного диска.
Указывает имя одного или нескольких пакетов (разделенных пробелами), которые следует проверить. Если этот параметр отсутствует, команда pkgchk проверяет все имеющиеся пакеты.
Команда pkgchk выводит на печать перечень проверяемых параметров пакета и выводит на экран предупреждения или сообщения об ошибках. Для получения дополнительной информации о команде pkgchk см. раздел Проверка целостности пакета.
К ошибкам следует относиться очень серьезно. Ошибка может означать, что необходимо внести изменения в сценарий. Проверьте все ошибки и продолжите работу, если не согласны с результатом выполнения команды pkgchk.
В данном примере используется файл prototype, созданный в разделе Настройка файла prototype, созданного с помощью команды pkgproto.
$ cd /home/jane/InfoFiles $ pkgmk ## Building pkgmap from package prototype file. ## Processing pkginfo file. WARNING: parameter set to "system990708093144" WARNING: parameter set to "none" ## Attempting to volumize 13 entries in pkgmap. part 1 -- 3170 blocks, 17 entries ## Packaging one part. /var/spool/pkg/SUNWcadap/pkgmap /var/spool/pkg/SUNWcadap/pkginfo /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6 ## Validating control scripts. ## Packaging complete. $ |
Если пакет содержит перемещаемые файлы, то можно использовать параметр -b base-src-dir в команде pkgmk для указания имени пути, которое следует добавить к началу перемещаемых имен путей во время создания пакета. Этот параметр может быть полезен, если для перемещаемых файлов не использовался формат path1=path2 или командой !search не был указан путь поиска в файле prototype.
Команда выполняет сборку пакета со следующими характеристиками:
Сборка пакета осуществляется с помощью пробного файла prototype, созданного командой pkgproto. Для получения дополнительной информации см. Пример. Создание файла prototypeс помощью команды pkgproto.
Сборка пакета осуществляется без изменения полей path.
Пакет добавляет запись в файл pkginfo.
$ cd /home/jane/InfoFiles $ pkgmk -o -b /home/jane ## Building pkgmap from package prototype file. ## Processing pkginfo file. WARNING: parameter set to "system960716102636" WARNING: parameter set to "none" ## Attempting to volumize 13 entries in pkgmap. part 1 -- 3170 blocks, 17 entries ## Packaging one part. /var/spool/pkg/SUNWcadap/pkgmap /var/spool/pkg/SUNWcadap/pkginfo /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5 /var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6 ## Validating control scripts. ## Packaging complete. |
В этом примере пакет собирается в каталоге по умолчанию /var/spool/pkg с помощью параметра -o. Этот параметр перезаписывает пакет, созданный в Пример 2–2.
Если разместить информационные файлы пакета (например, pkginfo и prototype) и объекты пакета в двух разных каталогах, то можно создать пакет с помощью параметров -b base-src-dir и - r rootpath команды pkgmk. Если объекты пакета находятся в каталоге /product/pkgbin, а другие информационные файлы пакета в каталоге /product/pkgsrc, то можно использовать следующую команду для помещения пакета в каталог /var/spool/pkg:
$ pkgmk -b /product/pkgbin -r /product/pkgsrc -f /product/pkgsrc/prototype |
При желании можно использовать указанные ниже команды для достижения того же результата:
$ cd /product/pkgsrc $ pkgmk -o -b /product/pkgbin |
В данном примере команда pkgmk использует текущий рабочий каталог для поиска оставшихся частей пакета (таких, как информационные файлы prototype и pkginfo).
Для получения информации о добавлении необязательных информационных файлов и сценариев установки к пакету см. Глава 3Расширение функциональности пакета (задачи). После сборки пакета следует проверить его целостность. В Глава 4Проверка и запись пакета рассказано, как это сделать. В этой главе представлены поэтапные указания по записи проверенного пакета на распространяемый носитель.