Журнал LinuxFormat - перейти на главную

LXF118:DrBrown3

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Собираем пакеты Debian

Deb’ы Возможно, лучшее, что есть в Debian – это система управления пакетами, поэтому познакомимся с APT и создадим свои Deb-файлы.

В данной статье мы заглянем внутрь Deb-пакета и пока жем, как собрать его самому. Deb-файл – это архив архивов. Его формат описан в странице руководства по Deb. На верхнем уровне это архив ar, внутри которого (обычно) три файла. Туда мы можем легко проникнуть:

$ ar x /var/cache/apt/archives/sox_14.0.0-5_i386.deb
$ ls
control.tar.gz data.tar.gz debian-binary

LXF118 46 1.jpgПрепарирование Deb. Верхний уровень можно распаковать с помощью ar, а нижние — с помощью tar.

Файл debian-binary можно пропустить, он содержит только номер версии формата пакета (в данном слу чае 2.0). Файл data.tar.gz – это сжатый tar-архив реального содержимого пакета: файлов, которые будут скопированы куда нужно при его установке. Ниже приведены примеры строк из вывода – они дадут вам общее представление; этот пакет состоит из нескольких исполняемых файлов и кое-какой документации:

$ tar tf data.tar.gz
./usr/bin/sox
./usr/lib/mime/packages/sox
./usr/share/doc/sox/
./usr/share/doc/sox/README.Debian

Наконец, файл control.tar.gz содержит управляющую информацию о пакете:

$ tar tf control.tar.gz
./
./postinst
./postrm
./md5sums
./control

Здесь postinst и postrm – скрипты, выполняемые сразу после установки и уда ления пакета соответственно. В сценарии postinst можно, например, добавить приложение в меню рабочего стола, зарегистрировать MIME-тип, запустить или перезапустить службу или собрать информацию о пользователе для начального файла настроек. В скрипте postrm можно, например, удалить файлы, которые созданы пакетом и не являются частью его самого. Есть еще скрипты preinst и prerm, они запускаются непосредственно перед установкой или удалением пакета. Например, скриптом prerm останавливают работающий сервис, который собрались удалить.

Файл md5sums хранит контрольные суммы файлов пакета, а в файле control собрана оставшаяся метаинформация. Вот (отредак тированный) пример:

 Package: sox
 Version: 14.0.0-5
 Depends: libc6, libltdl3, libsamplerate0, libsox0
 Recommends: libsox-fmt-base, libsox-fmt-alsa
 Suggests: libsox-fmt-all
 Section: sound
 Priority: optional
 Description: Swiss army knife of sound processing

Control – обычный текстовый файл, содержащий именованные поля, по одному на строку. Его формат описан на man-странице deb-control. Обязательны четыре его атрибута: Package, Version, Maintainer и Description.

Обратите внимание, что строка Depends: в файле control означает абсолютную зависимость. Если A зависит от B, то A не может запускаться без B и программа управления пакетами не разрешит установить A, ес ли B у вас нет. Однако в файле control можно указать и более слабые зависимости. Например, строка Recommends: используется для перечис ления пакетов, которые обычно должны устанавливаться вместе с данным. Еще более слабый вариант, строка Suggests:, описывает пакеты, способные улучшить работу данного. Например, пакет sox, показанный выше, зависит от библиотеки libsox0, рекомендует установку libsox-fmt-base (минимальный набор библиотек форматов sox) и советует пакет libsox-fmt-all (метапакет, добав ляющий к декодеру библиотеки для большинства существующих аудиоформатов). Для установленного пакета всю эту информацию можно получить командой

 $ apt-cache show sox

Выкатим собственные пакеты

LXF118 47 1.jpgМинимальная структура директорий для создания пакета Deb. Выходной файл (сам Deb) можно поместить в любой каталог.

Как же создать Deb-файл? Я начал с двух маленьких скриптов helloworld и world, примерно таких:

 #! /bin/bash
 echo -n hello
world
world:
 #! /bin/bash
 echo ‘ world’

Предполагая, что они на ходятся в каталоге, который входит в мой путь поиска, я могу запустить helloworld и увидеть то, что ожидал:

 $ helloworld
 hello world

Я разбил задачу на две программы, потому что хочу создать два Deb-пакета (по одному на ка ж дую из них) и сделать эти пакеты зависимыми друг от друга. В частности, пакет helloworld будет зависеть от пакета world. Начнем с пакета world. Потребуется организовать достаточно специфичную структуру каталогов. Сначала создадим директорию wdir для работы:

 cd; mkdir wdir; cd wdir

Внутри создадим подкаталог debian, а в нем – иерархию, повторяющую структуру каталогов установленного пакета. В этом примере установленный пакет состоит только из скрипта world, и я решил установить его в /usr/local/bin. Поэтому моя структура каталогов была очень простой, и я создал ее так:

$ mkdir -p debian/usr/local/bin
$ cp world debian/usr/local/bin/

Затем я создал контрольный файл с описанием пакета. Он выглядит так:

Package: world
Version: 1.1-1
Maintainer: Chris Brown <chris@example.com>
Description: Program to print “world”
Section: utils
Priority: optional
Architecture: all
Depends: bash

Отметьте, что в качестве Architecture: я указал all. Так как наши программы являются сценариями, они не привязаны к конкретной двоичной архитектуре, такой как i386 или Sparc. Я скопировал свой контрольный файл в подкаталог DEBIAN внутри каталога debian (туда, где его найдет программа сборки пакетов).

$ mkdir debian/DEBIAN
$ cp /home/chris/control debian/DEBIAN/

Теперь можно собрать пакет:

$ dpkg-deb --build debian/ .

Готово! Теперь в текущем каталоге есть пакет world_1.1-1_all.deb, и я могу установить его так же, как и любой другой.

$ sudo dpkg -i world_1.1-1_all.deb
Selecting previously deselected package world.
(Reading database ... 174457 files and directories currently installed.)
Unpacking world (from .../chris/wdir/world_1.1-1_all.deb) ...
Setting up world (1.1-1) ...

Таким же манером я собрал второй пакет helloworld, только, конечно, с другими данными в файле control. В частности, строка зависимостей в контрольном файле пакета helloworld выглядит так:

Depends: bash, world

Мал, но хорошо сложен

Хотя мои пакеты world и helloworld могут показаться тривиальными, все же это полноправные члены мира пакетов Debian. Ими можно управлять и запрашивать о них информацию с помощью стандартных утилит. Например, просмотрим контрольную информацию пакета или его содержимое:

$ dpkg -L world
/.
/usr
/usr/local
/usr/local/bin
/usr/local/bin/world

Управление зависимостями тоже работает. Если попробовать установить helloworld без установки wolrld, dpkg не позволит нам этого сделать:

$ sudo dpkg -i helloworld_1.1-1_all.deb ...

dpkg: dependency problems prevent configuration of
helloworld:
helloworld depends on world; however:
Package world is not installed.

Такой же результат я получу, попробовав удалить пакет world:

$ sudo dpkg -r world
dpkg: dependency problems prevent removal of world:
helloworld depends on world.

Теперь, пока какой- нибудь разработчик Debian не пожаловался, что я огрубляю процесс, позвольте признаться, что в нынешнем виде мои пакеты не прошли бы отбор на включение в дистрибутив Debian. Соответствие пакета политике проверяет программа Lintian. Мой позорно провалился:

$ lintian world_1.1-1_all.deb
E: world: dir-in-usr-local usr/local/bin/
E: world: file-in-usr-local usr/local/bin/world
W: world: file-in-unusual-dir usr/local/bin/world
W: world: non-standard-executable-perm usr/local/bin/world 0744 != 0755
E: world: no-copyright-file
E: world: extended-description-is-empty
E: world: depends-on-essential-package-without-using-version depends: bash

Мы видим: не хватает файла авторских прав, скрипт устанавливается в каталог, который (хотя он и подходит для моих целей) не соответствует политике Debian, у скриптов нет прав на выполнение для всех пользователей, а еще я наивно указал зависимость от Bash, и совершенно зря: он и так объявлен обязательным (essential).

Виртуальные и метапакеты

Debian поддерживает концепции виртуальных пакетов и метапакетов. Они упрощают управление пакетами (или усложняют его – смотря как посмотреть). Виртуальный пакет – это имя, применяемое для одного или нескольких физических пакетов с одинаковой базовой функциональностью. Примеры имен виртуальных пакетов – imap-client и pdf-viewer. Чтобы объявить (реальный) пакет kdpf средством просмотра PDF, добавьте в его контрольный файл строку Provides: pdf-viewer В контрольных файлах других пакетов, зависящих от средства просмотра PDF (неважно какого), должна быть строка Depends: pdf-viewer Другие виртуальные пакеты – c-compiler, dhcp-client, ftp-server и mp3-decoder. В метапакетах нет реального содержимого, они просто определяют список зависимостей. С их помощью можно установить несколько пакетов одной командой. Например, метапакет build-essential, если добавить его, гарантирует, что будут установлены такие пакеты, как gcc, g++ и make. LXF

Руководство по политике Debian

Руководство по политике Debian (Debian Policy Manual) – большой (140‑страничный) документ, описывающий создание пакета в довольно формальных терминах и с большой детализацией. В нем также рассмотрена раскладка файловой системы и содержатся четкие инструкции по написанию скриптов управления сервисами из /etc/init.d и рекомендованные диапазоны UID для системных и пользовательских учетных записей.

Просмотреть его можно на сайте http://www.debian.org/doc/debian-policy, а PDF-версию загрузить с сайта http://www.debian.org/doc/debian-policy/policy.pdf.gz

Персональные инструменты
купить
подписаться
Яндекс.Метрика