- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
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
Файл 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
Выкатим собственные пакеты
Как же создать 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