About this document ...
Введение в создание пакетов для дистрибутива GNU Debian/Linux
This document was generated using the translator Version 2K.1beta (1.48)
Copyright © 1993, 1994, 1995, 1996, , Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, , Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html deb.tex
The translation was initiated by Zhenja Kaluta on 2002-12-12
Zhenja Kaluta 2002-12-12
Control
Формат файла control используются повсеместно в debian. Каждый пакет (бинарных и исходных кодов) содержит информацию о себе в этом формате, базы apt и dpkg хранятся в нем же.
Файлы control включают в себя одно или несколько2 описаний, разделенных пустыми строками. Каждая часть состоит из набора полей
Ключ: значение
Название поля -- регистронезависимо, но принято записывать его строчными буквами начиная с заглавной. Если значение многострочное, каждая новая строка должна начинаться с пробела. Чтобы отличить пустую строку в многострочном поле от границы между описаниями, следует использовать строку, состоящую из пробела и точки: `` .''.
Наиболее часто встречающиеся поля:
Package:
название бинарного пакета. Состоит из букв, цифр, знаков ``+'', ``-'', ``.''. Должно состоять как минимум из 2х символов, начинаться с буквы или цифры и быть не полностью из цифр. Также настоятельно рекомендуется, что бы имя состояло только из строчных букв.
Version:
Содержит версию пакета в формате
[epoch:]<upstream version>[-<debian revision>]
Maintainer:
Имя и e-mail ментейнера пакета.
Standards-Version:
Версия полиси, которому пакет удовлетворяет. Текущая -- 3.5.6.1.
Distribution:
В файле .changes указывает дистрибутив, для которого собирается пакет.
Зависимости:
См.
Description:
Описание пакета. Состоит из краткого одно строчного описания и много строчного.
Zhenja Kaluta 2002-12-12
Для чего нужна система управления пакетами
Система управления пакетами и собственно сами пакеты решают несколько задач, облегчающих администрирование системы:
выделение данных и программ в автономные единицы, которые можно целиком устанавливать, модернизировать и при необходимости удалять из системы, что облегчает, например, распространение программ;
контроль файлов в системе и целостности программ1;
отслеживание зависимостей программных пакетов друг от друга и конфликтов между ними. См. ;
Zhenja Kaluta 2002-12-12
Дополнительные файлы пакета
Если пакет использует библиотеки, устанавливает библиотеки, использует debconf, содержит конфигурационные файлы, то для его корректной инсталляции необходима дополнительная информация.
conffiles
список конфигурационных файлов пакета. Абсолютные пути, по одному на строчку. Они обрабатываются специальным образом.
md5sums
список md5 сумм файлов пакета по одному файлу на строчку.
shlibs
список разделяемых библиотек, которые устанавливаются с пакетом по строчке на библиотеку в формате
library-name soname-version-number dependencies
Например:
libz 1 zlib1g (>= 1:1.1.3)
config/templates
файлы debconf. См. .
Zhenja Kaluta 2002-12-12
Формат двоичного пакета deb
Пакет deb(5) есть архив ar, состоящий из трех файлов:
debian-binary
Текстовый файл, содержит одну строку -- версию формата. На сегодня это -- 2.0.
control.tar.gz
архив tar.gz, содержит текстовые файлы с управляющей информацией. Их содержание будет рассмотрено позже.
data.tar.gz
архив tar.gz, содержит собственно сами файлы, входящие в пакет.
Zhenja Kaluta 2002-12-12
Формат пакета исходных кодов
Итак, задача: есть некая программа в исходных кодах (tarball), необходимо создать создать из него набор, пригодный для сборки deb. Этот процесс называется дебианизацией программы. Для того чтобы дебианизировать программу, нужно в дереве ее исходников создать каталог debian/ и положить туда файлы:
control
- управляющий файл пакета исходных кодов. Содержит абзац для пакета исходников и по абзацу на пакет бинариков, создаваемых из этого пакета. Управляющая иформация для пакета исходников обычно состоит из полей:
Source
Section
Maintainer
Build-Depends (См. )
Standards-Version
rules
- основной файл построения пакета. Представляет собой исполняемый файл, который обязательно долен принимать параметры clean, binary, binary-arch, binary-indep, и build. Они не должны быть интерактивными. Удобно делать его в виде Makefile'а (первой строкой которого будет #!/usr/bin/make -f)
changelog
- журнал изменений Debian-сборки пакета. Формат этого файла строго зафиксирован, поскольку из него различными инструментами извлекается информация о версии и приоритете сборки, об исправленных багах, личности сборщика и т.п. Для генерации первой записи в этом файле можно воспользоваться скриптом dch из пакета devscripts.
Zhenja Kaluta 2002-12-12
Lintian
Утилита проверки пакета на корректность. Проверяет наличие распространенных ошибок, а так же соответствие полиси. Пакет задается 3мя способами: по имени файла, имени пакета, файлом .changes.
Zhenja Kaluta 2002-12-12
Литература
developers-reference
debian-policy
fhs
maint-guide
Zhenja Kaluta 2002-12-12
Обзор полезных утилит
Subsections
lintian
Пакет devscripts
Zhenja Kaluta 2002-12-12
Пакет devscripts
debuild
- утилита построение пакета из исходников. Вызывает dpkg-buildpackage и lintian. Параметры каждому можно передать;
dch
- добавляет запись в debian/changelog, в случае необходимости, изменяет название каталога. 3 основных режима:
append добавляет пометку об изменении в текущую запись;
increment добавляет новую запись, увеличивает Debian релилз.
newversion точно задает версию;
debclean
очищает дерево исходников (зовет debian/rules clean);
debpkg
оболочка над dpkg, передвызовом dpkg становится рутом;
debrelease
оболочка над dupload и dput
Zhenja Kaluta 2002-12-12
По существующей файловой системе пакета
Создаем каталог DEBIAN, содержащий control информацию, создаем пакет dpkg -b
Zhenja Kaluta 2002-12-12
Ручное
Создать 3 файла и за'ar'ить.
Zhenja Kaluta 2002-12-12
Сборка с использованием debhelper
В debian существует достаточное количество инструментов, помогающих автоматизировать процесс дебианизации. Рассмотрим debhelper(1), как наиболее часто встречающийся и рекомендованный в developers-reference. Пакет debhelper представляет собой набор скриптов dh_*, облегчающие процесс конфигурирования и компиляции программы, инсталяции ее и сборки в результирующий deb. Для работы с debhelper рекомендую воспользоваться программой dh_make из пакета dh-make.
приводим название каталога исходников к виду, необходимому для dh_make(8): <название пакета>-<версия>;
в корне каталога исходников зовем dh_make(8). Например,
dh_make -c gpl -e mycool@e-mail.com
идем в debian/ и правим необходимые файлы, удаляем ненужные
Подробнее о последнем пункте. Рассмотрим ситуацию генерации single binary (есть еще варианты multiple binary, library и kernel module) dh_make сгенерирует rules таким образом, что программа будет устанавливаться в debian/tmp (либо в debian/tmp/package в случае multi-binary пакета). Рассмотрим файлы:
changelog
- Готовый файл с единственной записью ``Initial release''
conffiles.ex
- файл состоит из комментария о его использовании. К слову, в conffiles коментарии # не поддерживаются, поэтому их нужно удалить4.
control
- Этот шаблон необходимо обязательно заполнить в соответствии с указанными выше правилами оформления файла control. Кроме того, debhelper поддерживает набор макросов. Например, в Depends: можно записать
${shlibs:Depends}
вместо списка библиотек;
${misc:Depends}
макрос раскрывается многими программами debhelper. Например, если Вы используете dh_installdebconf, то Вам необходим debconf, для dh_installxfonts понадобятся xutils. Эти зависимости и будут автоматически сгенерированы;
${perl:Depends}
генерируется dh_perl и содержит список используемых модулей perl.
copyright
- в этом файле кроме лиценции указывается информация об upstream, то есть производителе программы (где взяли, кто написал).
cron.d.ex
- файл в формате crontab(5). Будет установлен скриптом dh_installcron в $(prefix)/etc/cron.d/<package>
dirs
- содержит относительные пути каталогов, необходимых пакету. Обрабатывается dh_installdirs (он создает указаные каталоги)
docs
- список файлов, которые dh_installdocs установит в usr/share/doc/<package>. Подерживает маски. Корнем является корень дерева исходников (не debian/).
emacsen-install.ex
- Следующие три необходимы, если вы debian'изируете пакет для [X]emacs. Устанавливаются dh_installemacsen. Скрипт инталяции.
emacsen-remove.ex
- скрипт деинталяции.
emacsen-startup.ex
- пример lisp-файла инициализации. Установится в site-lisp.d
ex.package.doc-base
- TODO: почитать :)
init.d.ex
- пример скрипта для init.d, если программа в нем нуждается. dh_installinit установит его в etc/init.d/<package>.
manpage.1.ex
- шаблон man. Обрабатывается dh_installman
manpage.sgml.ex
- шаблон sgml для генерации man.
menu.ex
- шаблон для системы меню debian. dh_installmenu установит его в usr/lib/menu/<package>. Файл (формат описан в menufile(5L)) состоит из строк вида
?package(package-name):var1=value var2=varlue2
Возможные переменные:
needs
- тип дисплея, на котором запускается программа. Например, needs=x11;
section
- секция меню. Например, section=Apps/Programming. Структура меню описана в menu-policy;
icon
- иконка;
title
- текст пункта меню. Например, title=''Coolprog'';
command
- команда, выполняемая при выборе пункта меню.
Пример строки:
?package(foo):needs=x11 section=Apps/Programming title="Foo" command=''foo -coolkey''
postinst.ex, postrm.ex, preinst.ex, prerm.ex
- шаблоны ментейнеровских скриптов.
README.Debian
- описание особенностей сборки и использования пакета, специфичных для Debian.
watch.ex
- шаблон для автоматического апдейта пакета.
rules
- шаблон файла построения пакета. Рассмотрим его подробнее.
TODO: Рассмотреть rules в комментариях. Рассказать в них о dh_* скриптах.
#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess.
# Uncomment this to turn on verbose mode. #export DH_VERBOSE=1
# This is the debhelper compatibility version to use. export DH_COMPAT=3
# These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
В следующие строки дают возможность указав в переменной окружения DEB_BUILD_OPTIONS debug и/или nostrip собрать пакет с отладочной информацией.
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif
Правило для конфигурации. Не является обязательным, требуется из обязателного build. Исли пакет использует GNU autoconf (как тот, что я взял для примера), то вставит и вызов configure. В данном случае указано, что для построения файла config.status необходим файл configure и осуществить указанные действия.
Скрипт dh_testdir пытается проверить в нужном ли каталоге мы находимся (проверяет существование файлов debian/control и других)
config.status: configure dh_testdir
# Add here commands to configure the package. ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
От себя добавлю, что в большинстве случаев эта строчка не является целиком корректной. Необходимо в большинстве случаев добавлять -sysconfdir=/etc (аналогичная ситуация с /var)
Проверяем правило build-stamp, которое в свою очередь проверяет config-status. Этим добиваемся того, чтобы не производить перекомпиляцию пакета, если не было его переконфигурации.
build: build-stamp
build-stamp: config.status dh_testdir
# Add here commands to compile the package.
Собственно, сама сборка. Если необходимы дополнительные команды либо параметры make, их можно добавить сюда.
$(MAKE) #/usr/bin/docbook-to-man debian/package.sgml > mc.1
touch build-stamp
Правило очистки от предыдущей сборки dh_testroot проверяет, от рута ли мы собираем (используем fakeroot), dh_clean чистит дерево сборки от всевозможных core, backup'ов ...
clean: dh_testdir dh_testroot rm -f build-stamp
# Add here commands to clean up after the build process. -$(MAKE) distclean -test -r /usr/share/misc/config.sub && \ cp -f /usr/share/misc/config.sub config.sub -test -r /usr/share/misc/config.guess && \ cp -f /usr/share/misc/config.guess config.guess
dh_clean
Правило инсталяции скомпилированной програмы во временный каталог.
install: build dh_testdir dh_testroot dh_clean -k dh_installdirs
Инсталяция. На практике проще использовать
$(MAKE) DESTDIR=$(CURDIR)/debian/package
так как большинство autoconf программ это поддерживает.
# Add here commands to install the package into debian/package. $(MAKE) install prefix=$(CURDIR)/debian/package/usr
Построение пакета(ов). binary-indep - независимого от архитектуры, binary-arch - зависимого.
# Build architecture-independent files here. binary-indep: build install # We have nothing to do by default.
# Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot
Раскоментируйте, если используете debconf. Проставит config и templates (в DEBIAN), и добавит код в скрипты.
# dh_installdebconf
Проставим доки, указанные в debian/docs в usr/share/doc/package
dh_installdocs
Проставим файлы, указанные параметрами в usr/share/doc/examples
dh_installexamples
Проставим файлы меню в usr/lib/menu/package (если мы реализуем меню, скажем, мы - wm, то проставим debian/menu-method в etc/menu-methods/package. Добавим код, вызывающий update-menus(1) (скрипт debian'овской системы меню) в инсталяционные скрипты.
dh_installmenu
Проставим debian/logrotate в etc/logrotate.d
# dh_installlogrotate
Емаксовые пакеты
# dh_installemacsen
debian/pam в etc/pam.d/package
# dh_installpam
Если мы устанавливаем обработчик mime, проставит debian/mime в usr/lib/mime/packages/package и добавит вызовы update-mime. См. mime-policy и mailcap(5)
# dh_installmime
debian/init -> etc/init.d/package + update-rc.d в скрипты.
# dh_installinit
debian/cron -> etc/cron.d
dh_installcron
man и info
dh_installman
dh_installinfo
сделаем симлинки на undocumented для тех man-страниц, которых нет. Полезен ключ -A.
# dh_undocumented
dh_installchangelogs ChangeLog
dh_link
dh_strip
Сожмем файлы (man, info ...) и поправим симлинки на них.
dh_compress
Установим пермишены в соответствии с полиси
dh_fixperms
Сгенерируем список устанавливаемых библиотек shlib
# dh_makeshlibs
Установим скрипты, shlibs и conffiles, сгенерированные предыдущими скриптами в DEBIAN.
dh_installdeb
Посчитаем зависимости от перловых библиотек.
# dh_perl
Посчитаем зависимости от библиотек для замены ${shlibs:Depend}
dh_shlibdeps
Сгенерируем файл control подставив макросы.
dh_gencontrol
Сгенерируем суммы.
dh_md5sums
Запакуем это дело в deb.
dh_builddeb
binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install
Для сборки можно воспользоваться скриптом debuild из devscripts, либо dpkg-buildpackage из dpkg-dev (debuild пользуется ею). Запустив debuild в корне исходников получим на уровне выше готовый deb.
Next: Сборка с использованием программ
Up: Создание пакета исходных кодов
Previous: Формат пакета исходных кодов
  Contents
Zhenja Kaluta 2002-12-12
Сборка с использованием dpkg
Создаем каталог debian и необходимые файлы руками. Делаем правильный rules, dpkg -b.
Zhenja Kaluta 2002-12-12
Сборка с использованием программ из dpkg-dev
скрипты debhelper во многих случаях зовут скрипты более низкого уровня из пакета dpkg-dev. делаем шаблоны в debian/, пропускаем через dpkg-*, dpkg-buildpackage -b
Zhenja Kaluta 2002-12-12
Система зависимостей Debian
Система управления пакетами Debian имеет достаточно гибкую систему контроля зависимостей. Зависимости задаются в виде перечисления необходимых пакетов через запятую, возможно указывать несколько альтернативных пакетов через ``|''. Возможно привязать пакет к версии: версия указывается в скобках со знаком отношения <<, <=, =, >=, >> перед номером версии. Пример:
Depends: libc6 (>= 2.2.1), exim | mail-transport-agent
Зависимости можно разделить на 2 типа: зависимости бинарных пакетов и зависимости сборки пакетов.
Subsections
Зависимости бинарных пакетов
Зависимости сборки
Zhenja Kaluta 2002-12-12
Скрипты ментейнера пакета и процедура инсталляции
Скрипты - необязательная часть, исполняются автоматически системой управления пакетами во время установки/удаления пакетов. Служат для конфигурации/деконфигурации пакета. Например, они создают системных пользователей, необходимых для функционирования пакета, либо создают конфигурационные файлы (на основе базы debconf, что предпочтительно, либо задавая вопросы самостоятельно), прописываю/удаляют программу из меню и т.д.
Скрипты должны быть исполняемыми читаемыми файлами для всех и не должны быть доступны для записи другим, а также идемпотентны, то есть написаны таким образом, чтобы конечный результат их работы не зависел от количества запусков, и чтобы целостность системы не нарушалась при повторном их запуске.
Скрипты гарантированно имеют управляющий терминал, поэтому могут взаимодействовать с пользователем. Тем не менее, рекомендуется не злоупотреблять этим фактом и для автоматизации установки или обновления большого количества пакетов одновременно использовать систему debconf, которая может задавать пользователю вопросы о настройках всех устанавливаемых пакетов заранее, или же использовать сохраненный набор ответов при установке идентичной системы.
Параметры, с которыми вызываются скрипты:
preinst
install, upgrade, abort-upgrade
postinst
configure, abort-upgrade, abort-remove, abort-deconfigure
prerm
remove, upgrade, faled-upgrade, deconfigure
postrm
remove, purge, upgrade, failed-upgrade, abort-install, abort-upgrade, disappear
Процедура инсталляции проходит в 13 этапов3. Кратко, preinst и postrm зовутся, когда файлов пакета нет в файловой системе.
При корректной инсталяции порядок вызова следующий:
new-preinst install
<распаковываются файлы>
new-postinst install
При апгрейде:
old-prerm upgrade new-version
new-preinst upgrade old-version
<распаковываются файлы>
old-postrm upgrade new-version
<удаляются лишние файлы>
<заменяются основные файлы>
<заменяются скрипты>
<удаляются backup'ы>
<статус меняется на unpacked>
new-postinst configure
Zhenja Kaluta 2002-12-12
Создание двоичных пакетов deb из двоичных файлов
Subsections
По существующей файловой системе пакета
Ручное
Zhenja Kaluta 2002-12-12
Создание пакета исходных кодов
Subsections
Формат пакета исходных кодов
Сборка с использованием debhelper
Сборка с использованием программ из dpkg-dev
Сборка с использованием dpkg
Zhenja Kaluta 2002-12-12
Управляющие файлы двоичного пакета
Сюда входит файл control, скрипты и файлы подсистем debian.
Subsections
control
Скрипты ментейнера пакета и процедура инсталляции
Дополнительные файлы пакета
Zhenja Kaluta 2002-12-12
Зависимости бинарных пакетов
Бинарные пакеты могут для свой корректной работы требовать наличия других, отсутствия других, а также рекомендовать к установке другие пакеты, вместе с которыми данные будут обеспечивать большую функциональность.
Depends
Абсолютная зависимость. Пакет не будет сконфигурирован до тех пор, пока перечисленные пакеты не будут корректно сконфигурированы.
Pre-Depends
Также абсолютная зависимость, но более строгая. Не будет начинаться даже инсталляция пока эта зависимость не будет удовлетворена (необходима, если пакет используется, скажем, в инсталляционных скриптах)
Recomends
Строгая, но не абсолютная зависимость. Перечисляет пакеты, которые должны быть установлены с данным, кроме случаев необычных инсталляций. Например, kernel-sources настоятельно рекомендуют устанавливать gcc.
Suggests
Зависимость указывает на пакеты, не на шутку расширяющие функциональность данного. Например, те же kernel-sources указывают тут ncurses-dev так как конфигурировать с помощью make config не слишком весело.
Enchances
Имеет обратный смысл предыдущего. Перечисляет пакеты, функциональность которых расширяет данный пакет.
Conflicts
Указывает пакеты, вместе с которыми данный работать не может. Например, на машине может быть только один MTA, поэтому exim конфликтует с mail-transport-agent.
Replaces
Указывает пакеты, файлы которых заменяет. Если заменяет все файлы пакета, по пакет становится disappeared и помечается для удаления. Этим пользуются чтобы спровоцировать удаление конфликтующего пакета:
Provides: mail-transport-agent
Conflicts: mail-transport-agent
Replaces: mail-transport-agent
Provides
В debian существует система так называемых виртуальных пакетов. Большинство программ являются представителями какого либо класса (например, exim, sendmail, postfix - MTA). Поэтому в пакете, представляющем программу, полезно указать этот класс в поле Provides. Теперь, если какому-либо пакету необходима подобная функциональность, он может в поле Depends указать лишь название класса5 вместо того, чтобы перечислять все программы дистрибутива с подобной функциональностью. Так как физически не существует пакетов с такими именами, они называются виртуальными.
Zhenja Kaluta 2002-12-12
Зависимости сборки
Пакеты исходников могут потребовать наличия/отсутствия определенных бинарных пакетов для своей корректной сборки (например, компиляторов или библиотек)
Build-Depends,Build-Conflicts
зависимости должны быть удовлетворены в тот момент, когда debian/rules данного пакета вызывается с параметрами build, binary, binary-arch, build-arch, build-indep и binary-indep.
Build-Depends-Indep,Build-Conflicts-Indep
зависимости должны быть удовлетворены в тот момент, когда debian/rules данного пакета вызывается с параметрами build, binary, binary-arch, build-arch, build-indep и binary-indep.
Zhenja Kaluta 2002-12-12