 | Упаковывание программного обеспечения
В начале был tarball
Для настройки программного обеспечения в Linux требуется гораздо меньше усилий, чем вы могли бы подумать. В Linux есть довольно четкий стандарт того, где файлы различных типов должны находиться, и установка специального программного обеспечения, в сущности, требует простого размещения правильных файлов в правильных местах.
Инструмент Linux tar (для "ленточных архивов", даже если не нужно, и обычно не нужно, использует формат ленты) прекрасно подходит для создания архивов файлов с указанными местоположениями в файловой системе.
Для дистрибутива вы можете сжать архив tar при помощи gzip (или bzip2). См. заключительную главу этого руководства о резервном копировании для получения дополнительной информации об этих утилитах. Сжатый tar архив обычно обозначают расширениями .tar.gz или .tgz (или .tar.bz2).
Ранние дистрибутивы Linux (и некоторые современные, такие как Slackware) используют простой tar архив как механизм развертывания дистрибутива. Для специализированных дистрибутивов собственного программного обеспечения систем Linux, поддерживаемых централизованно, такой способ остается самым доступным.
Специальные форматы архивов
Различные языки программирования и другие инструменты, появляющиеся вместе со специальными дистрибутивами, обычно не имеют предпочтений между дистрибутивами Linux и даже другими операционными системами. Python имеет свой собственный формат архива и инструменты distutils; Perl использует архивы CPAN; Java использует .jar файлы; Ruby использует .gem. Большинство неязыковых приложений имеют стандартную систему для установки плагинов или других инструментов для расширения базовых возможностей приложений.
Например, чтобы установить пакет Python вы можете использовать такой формат пакета как DEB или RPM, но часто разумнее следовать тому стандарту, для которого пакет создан. Конечно, для системных утилит и приложений и для большинства пользовательских приложений, тот стандарт, который используется, и есть стандарт дистрибутива Linux. Но для некоторых инструментов, написанных на специальных языках программирования, проще использовать какой-то ваш специальный инструмент вместо предложенного дистрибутивом или платформой (или внутреннее, или внешнее использование является конечной целью).
"Большая двойка" форматов пакетов
Есть два главных формата пакетов, используемые дистрибутивами Linux: Redhat Package Manager (RPM) и Debian (DEB). Оба они подобны в своих целях, но различны в деталях. Это форматы для "расширенного" архива файлов. Продвинутость, обеспеченная этими форматами пакетов, включает аннотации для номера версии, зависимости одного приложения от других приложений или библиотек, удобочитаемые описания инструментов пакета и общий механизм для управления установкой, обновлением или удалением инструментов пакета.
В формате DEB, вложенный конфигурационный файл control содержит большинство метаданных пакета. Для файлов RPM, эту роль играет файл spec. Более полные детали правильного создания пакетов в любом формате находятся вне этого учебного пособия, а здесь мы выделим только основы.
Что находится в .deb файле?
Пакет DEB создан при помощи инструмента архивирования, родственника tar -- ar (или другим более высокоуровневым инструментом, который использует ar). Поэтому мы можем использовать только ar, чтобы увидеть, что находится в .deb файле. Обычно используют высокоуровневые инструменты, такие как dpkg, dpkg-deb или apt-get, чтобы фактически работать с пакетом DEB. Например:
% ar tv unzip_5.51-2ubuntu1.1_i386.deb
rw-r--r-- 0/0 4 Aug 1 07:23 2005 debian-binary
rw-r--r-- 0/0 1007 Aug 1 07:23 2005 control.tar.gz
rw-r--r-- 0/0 133475 Aug 1 07:23 2005 data.tar.gz
|
Debian-бинарный файл просто содержит версию DEB (в настоящее время 2.0). Архив data.tar.gz содержит собственно файлы приложений - исполняемые, документацию, страницы помощи, файлы конфигурации и так далее.
Архив control.tar.gz представляется самым интересным. Давайте посмотрим на пакет DEB, который мы выбрали:
% tar tvfz control.tar.gz
drwxr-xr-x root/root 0 2005-08-01 07:23:43 ./
-rw-r--r-- root/root 970 2005-08-01 07:23:43 ./md5sums
-rw-r--r-- root/root 593 2005-08-01 07:23:43 ./control
|
Как мы могли бы ожидать, md5sums содержит смесь шифров всех файлов дистрибутива в целях проверки. Файл control сообщает, где находятся метаданные. В некоторых случаях вы могли бы также захотеть включить в control.tar.gz скрипты postinst и prerm, чтобы принять специальные меры после установки или, соответственно, перед удалением.
Создание control-файла DEB
Инсталляционные скрипты могут делать то, что мог бы делать скрипт shell. (Посмотрите на некоторые примеры в существующих пакетах, чтобы понять, что имеется в виду.) Но такие скрипты являются дополнительными, и часто в них нет необходимости. Для .deb пакета необходим его control-файл. Формат этого файла содержит различные поля метаданных, и лучше всего это можно проиллюстрировать на примере:
% cat control
Package: unzip
Version: 5.51-2ubuntu1.1
Section: utils
Priority: optional
Architecture: i386
Depends: libc6 (>= 2.3.2.ds1-4)
Suggests: zip
Conflicts: unzip-crypt (<< 5.41)
Replaces: unzip-crypt (<< 5.41)
Installed-Size: 308
Maintainer: Santiago Vila <sanvila@debian.org>
Description: De-archiver for .zip files
InfoZIP's unzip program. With the exception of multi-volume archives
(ie, .ZIP files that are split across several disks using PKZIP's /& option),
this can handle any file produced either by PKZIP, or the corresponding
InfoZIP zip program.
.
This version supports encryption.
|
В основном, кроме специальных случаев, ваш control-файл должен выглядеть точно также, как и этот. Для неконкретизированных типов процессоров – либо скрипты, либо пакеты документации, либо исходный код - используют Architecture: all.
Создание DEB пакета
Создание пакета DEB происходит при помощи dpkg-deb. Мы не можем здесь раскрыть все секреты изготовления хороших пакетов, но основная идея в том, что необходимо создать рабочий каталог ./debian/, и поместить в него необходимое содержание перед запуском dpkg-deb. Вы можете пожелать установить соответствующие права на ваши файлы после установки. Например:
% mkdir -p ./debian/usr/bin/
% cp foo-util ./debian/usr/bin # copy executable/script
% mkdir -p ./debian/usr/share/man/man1
% cp foo-util.1 ./debian/usr/share/man/man1 # copy the manpage
% gzip --best ./debian/usr/share/man/man1/foo-util.1
% find ./debian -type d | xarg chmod 755 # set dir permissions
% mkdir -p ./debian/DEBIAN
% cp control ./debian/DEBIAN # first create a matching 'control'
% dpkg-deb --build debian # create the archive
% mv debian.deb foo-util_1.3-1all.deb # rename to final package name
|
Еще о создании DEB пакета
В предыдущем примере можно увидеть, что локальная структура каталогов внутри ./debian/ организовывается так, чтобы соответствовать намеченной инсталляционной структуре. Для создания хорошего пакета необходимо еще несколько пунктов.
 |
Что находится в .rpm файле?
RPM придерживается немного другой стратегии при создании пакетов, чем DEB. Его файл конфигурации называют spec, а не control, но файл spec делает больше, чем файл control. Все детали шагов, необходимых для предустановки, постустановки, предудаления и непосредственно установки, содержатся, как вложенные скрипты, в конфигурации spec. Фактически, формат spec даже содержит макросы для общих действий.
Пакеты RPM создают при помощи утилиты rpm -b. Например:
% rpm -ba foo-util-1.3.spec # perform all build steps
|
Этот процесс сборки пакетов базируется не на специфически названных каталогах, как в случае с DEB, а скорее на каталогах, прописанных в более сложном файле spec.
Создание метаданных RPM
Основные метаданные в RPM очень похожи на аналогичные в DEB. Например, foo-util-1.3.spec мог бы содержать что-то похожее на следующее:
# spec file for foo-util 1.3
Summary: A utility that fully foos
Name: foo-util
Version: 1.3
Release: 1
Copyright: GPL
Group: Application/Misc
Source: ftp://example.com/foo-util.tgz
URL: http://example.com/about-foo.html
Distribution: MyLinux
Vendor: Acme Systems
Packager: John Doe <jdoe@acme.example.com>
%description
The foo-util program is an advanced fooer that combines the
capabilities of OneTwo's foo-tool and those in the GPL bar-util.
|
Скрипты в RPM
Несколько разделов в RPM spec-файле могут содержать небольшие скрипты shell. Они включают:
-
%prep:
Шаги, которые нужно предпринять, чтобы получить готовую сборку, например, удалить более ранние сборки. Часто следующий макрос полезен и достаточен:
-
%build:
Шаги, чтобы фактически собрать пакет. Если вы используете средство make, то можно написать:
-
%install: Шаги, чтобы установить пакет. И опять, если вы используете make, это могло бы означать:
-
%files:
Вы должны включать список файлов, которые являются частью пакета. Даже если бы ваш Makefile использовал эти файлы, то менеджер пакетов (rpm) не будет знать о них, если вы не включите их сюда:
%files
%doc README
/usr/bin/foo-util
/usr/share/man/man1/foo-util.1
|
|  |