Пакетирование для debian/ubuntu
DESCRIPTION
Автор - Дмитрий Бородаенко (Debian Project, ex-SaM Solutions Dept6 head). Краткий вводный курс по пакетированию программного обеспечения средствами Debian/Ubuntu. Прочитан в апреле 2012 года для сотрудников отдела Linux & Embedded SaM Solutions. Публикуется по договоренности с лектором. Видео: http://bit.ly/13Tw24sTRANSCRIPT
Пакетирование для Debian
Дмитрий Бородаенко
Минск, 2012SaM Solutions
1. План
1. Постановка задачи пакетирования
2. Формат исходного пакета: 2.0 (.diff.gz), 3.0 (.debian.tar.gz)
3. Метаданные: control, changelog, copyright
4. Управление зависимостями: Depends, Recommends и т.д.
5. Сборочный скрипт: debian/rules, debhelper
6. Установочные скрипты: preinst, postinst, prerm, postrm
7. Установка и настройка сборочной среды
8. Сборка готового пакета с pbuilder
9. Создание нового пакета с нуля: gbp, dh-make
10. Обновление пакета: gbp, gbp-pq
11. Управление конфигурационными файлами
12. Передел файлов между пакетами: alternatives, dpkg-divert
13. Пакетирование демонов: init, default, logrotate, udev
14. Пакетирование бинарных библиотек
15. Пакетирование библиотек Ruby: gem2deb
2. Ресурсы
Документация:
◮ Debian Policy Manual (debian-policy)
◮ Debian New Maintainers’ Guide (maint-guide)
◮ Debian Developer’s Reference (developers-reference),section 6 (Best Packaging Practices)
◮ Debian Developers Corner (w.d.o/devel)
Инструменты:
◮ dpkg-dev
◮ debhelper
◮ lintian
◮ devscripts
◮ git-buildpackage, pristine-tar, gbp-pq
◮ pbuilder, cowbuilder
3. Постановка задачи пакетирования
◮ Разделение ОС на атомарные единицы – пакеты
◮ Установка, обновление и удаление пакетов
◮ Управление зависимостями
◮ Управление конфигурацией
◮ Контроль целостности
4. Формат исходного пакета Debian
Пакет собственного (native) ПО:package-name_ <version>.dsc
<version>.tar.gz
Пакет внешнего (upstream) ПО, формат 2.0:package-name_ <upstream>-<debian>.dsc
<upstream>.orig.tar.gz
<upstream>-<debian>.diff.gz
Пакет внешнего (upstream) ПО, формат 3.0:package-name_ <upstream>-<debian>.dsc
<upstream>.orig.tar.gz
<upstream>-<debian>.debian.tar.gz
5. debian/control
Source: package-nameSection: webPriority: optionalMaintainer: Team 1 <[email protected]>Uploaders: John Doe <[email protected]>Build-Depends: debhelper (>= 7)Standards-Version: 3.9.3
Package: package-nameArchitecture: anyDepends: ${shlibs:Depends}, ${misc:Depends}Description: Something usefulThis package does something useful..It can also be useless in some situations.
6. debian/changelog
package-name (2.0-1) unstable; urgency=low
[John Doe]* New upstream version:
- new foo-bar feature (Closes: #12345678).
[Jane Roe]* Fixed typo in description.
-- John Doe <[email protected]> Sun, 25 Mar 2012 15:56:38
6. debian/changelog
package-name (2.0-1) unstable; urgency=low
[John Doe]* New upstream version:
- new foo-bar feature (Closes: #12345678).
[Jane Roe]* Fixed typo in description.
-- John Doe <[email protected]> Sun, 25 Mar 2012 15:56:38
Добавить новую запись в debian/changelog: dchПолучить текущую дату в правильном формате: date --rfc-2822
7. debian/copyright
Format: http://dep.debian.net/deps/dep5Upstream-Name: package-nameSource: http://package-name.org/
Files: *Copyright: 2012 Upstream Author <[email protected]>License: GPL-3+
License: GPL-3+The files hereby included are free software; you can redistribute itand/or modify it under the terms of the GNU General PublicLicense as published by the Free Software Foundation; eitherversion 3 of the License, or (at your option) any later version..On Debian systems, the full text of the GNU General PublicLicense version 3 can be found in the file‘/usr/share/common-licenses/GPL-3’.
8. Управление зависимостями
Depends: libc6 (>= 2.2.5), ruby | ruby-interpreterRecommends: package-name-pluginsSuggests: bells-and-whistlesBreaks: package-name-plugins (<< 2.0)Conflicts: other-packageProvides: something-useful-virtual-package
8. Управление зависимостями
Depends: libc6 (>= 2.2.5), ruby | ruby-interpreterRecommends: package-name-pluginsSuggests: bells-and-whistlesBreaks: package-name-plugins (<< 2.0)Conflicts: other-packageProvides: something-useful-virtual-package
Правила объявления зависимостей:Policy 7 – Declaring relationships between packagesПравила сравнения номеров версий:Policy 5.6.12 – Version
Отключить установку Recommends по умолчанию:/etc/apt/apt.conf.d/60recommends:APT::Install-Recommends "False";
9. debian/rules
get-orig-source
patch
clean
build-arch build-indep
binary
binary-arch binary-indep
build
#!/usr/bin/make -f
clean:
dh_testdir
dh_testroot
$(MAKE) clean
dh_clean
build:
dh_testdir
$(MAKE) PREFIX=/usr
binary-arch: build
dh_testdir
dh_testroot
dh_prep
$(MAKE) install PREFIX=. . .
binary-indep: build
binary: binary-arch binary-indep
10. debhelper для ленивых
#!/usr/bin/make -f
%:
dh $@
10. debhelper для ленивых
#!/usr/bin/make -f
%:
dh $@
override_dh_compress:
dh_compress -X.dia
override_dh_auto_configure:
dh_auto_configure -- --with-foo --disable-bar
override_dh_installudev:
dh_installudev --name=useful
override_dh_install:
dh_install
my_code_mangler --path=debian/package-name/
11. Конфигурация скриптов debhelper
debian/package-name.install (dh_install):
data/* /usr/share/package-name/
debian/package-name.docs (dh_installdocs):
README
debian/package-name.manpages (dh_installman):
man/*
12. Установочные скрипты: {pre,post}{inst,rm}
Правила работы с установочными скриптами:
12. Установочные скрипты: {pre,post}{inst,rm}
Правила работы с установочными скриптами:
1. Не связываться с установочными скриптами
12. Установочные скрипты: {pre,post}{inst,rm}
Правила работы с установочными скриптами:
1. Не связываться с установочными скриптами
2. Пользоваться debhelper, он сам нагенерит всё, что надо
3. Если обойтись одним debhelper не выходит, не забывать врукописные скрипты добавлять строчку #DEBHELPER#
4. Всегда тестировать не только установку и обновление, но иудаление пакета (и remove, и purge)
Policy 6 – Package maintainer scripts and installation procedure
13. Установка и настройка сборочной среды
cowbuilder --create --distribution sid \--basepath /var/cache/pbuilder/base-sid.cow
build-essential:libc6-dev, gcc, g++, make, dpkg-dev
~/.gbp.conf:[DEFAULT]cleaner = fakeroot debian/rules cleanbuilder = /usr/bin/git-pbuilderexport-dir = ~/tmp/buildexport = INDEXignore-new = truepostbuild = lintian $GBP_CHANGES_FILE
14. Собираем существующий пакет в cowbuilder
________________________________
/ apt-get source package-name \
| cd package-name-2.0/ |
| |
\ pdebuild --pbuilder cowbuilder /
--------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
15. Собираем новый пакет с нуля
Создаём чистый репозиторий git:mkdir package-name
cd package-name
git init
Втягиваем внешние исходники:git-import-orig –pristine-tar -u2.0 ../package-name-2.0.tar.gz
Создаём рыбу пакета:dh_make
git add debian/
Правим файлы в debian/, пока не соберётся:git-buildpackage
Помечаем коммит версией пакета:git commit
git tag debian/2.0-1
16. git-buildpackage
Ветки:
◮ master – исходники пакета
◮ upstream – внешние исходники
◮ pristine-tar – дельта для воссоздания внешних архивов
Работа с патчами:
◮ gbp-pq import – создать ветку patch-queue/master изсодержимого debian/patches/
◮ git commit, git rebase -i, . . .
◮ gbp-pq rebase – переписать patch-queue/master под новыйвнешний релиз
◮ gbp-pq export – сформировать набор патчей для quilt изкоммитов в patch-queue/master
17. Управление конфигурационными файлами
Пакет должен предоставлять готовую конфигурацию,соответствующую актуальной версии пакета, но не затиратьпользовательские изменения при обновлении (Policy 10.7).
1. Простейший случай:/etc/package-name.conf
2. Уголок пользовательских настроек:/etc/package-name.conf.local/etc/package-name/conf.d/
3. Явное указание конфигурационных файлов:debian/package-name.conffilesdebian/package-name.ucf
ucf умеет --three-way, но при неосторожном обращении можетсбивать dpkg с толку (dpkg -S, dpkg -P, dpkg-divert)
18. debconf
debian/package-name.templates:Template: package-name/foo
Type: string
Default: foo
Description: Enter foo
Please enter foo in the field below.
debian/package-name.config:. /usr/share/debconf/confmodule
db_get package-name/foo
FOO=”$RET”
Документация:
◮ debconf-doc – debconf(7), debconf-devel(7)
◮ debian-policy – debconf_specification.*
19. alternatives
Примеры: java, ruby, vi, x-terminal-emulator
Преимущества:
◮ переключение между целыми наборами альясов:ruby + irb + ri + ман-страницы
◮ автоматический выбор набора с высшим приоритетом
Недостатки:
◮ требуется активное соучастие всех альтернативных пакетов
◮ все пакеты должны содержать одинаковый набор альясов
update-alternatives \--install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 10 \--slave /usr/bin/irb irb /usr/bin/irb1.9.1
update-alternatives --remove ruby /usr/bin/ruby1.9.1
Документация: Policy F, update-alternatives(8)
20. dpkg-divert
Примеры: dash, pentium-builder
Преимущества:
◮ можно защитить локальную версию файла от перезаписи
◮ можно отбирать любые файлы у любого пакета
Недостатки:
◮ каждый файл отбирается и отслеживается отдельно
◮ не умеет грабить награбленное
◮ не дружит с ldconfig, ucf
dpkg-divert --package pentium-builder --rename \--divert /usr/bin/gcc.real /usr/bin/gcc
dpkg-divert --package pentium-builder --rename \--remove /usr/bin/gcc
Документация: Policy G, dpkg-divert(8)
21. Пакетирование демонов
Важные файлы:debian/package-name.initdebian/package-name.defaultdebian/package-name.logrotatedebian/package-name.useful.udev
Памятка демоновода:
1. Параметры запуска демона устанавливаются в default
2. Каталог /run очищается при перезагрузке, так что/run/package-name/ надо создавать в init, а не в postinst
3. Вывод сообщений: . /lib/lsb/init-functions
4. Демонизация: start-stop-daemon
https://wiki.debian.org/LSBInitScriptsPolicy 9.3 – System run levels and init.d scriptsPolicy 10.8 – Log files
22. Пакетирование бинарных библиотек
libfoo.so
libfoo.a libfoo.so.1
libfoo.so.1.0
libfoo-dev.deb libfoo1.deb
Сборка библиотеки:dh_makeshlibs + dpkg-gensymbols + debian/symbols
Сборка зависимого пакета:dh_shlibdeps + dpkg-shlibdeps + debian/shlibs.local
Policy 8 – Shared librariesPolicy 10.2 – Librarieshttps://wiki.debian.org/Multiarch
23. gem2deb
Сделать рыбу пакета: gem2deb ruby-pg-0.11.0.tar.gz
debian/rules:%:
dh $@ --buildsystem=ruby --with=ruby
Дополнительные шаги:
1. Убрать все упоминания require ’rubygems’
2. Проверить ruby-test-files.yaml, при необходимости заменитьна ruby-tests.rb
3. Если пакет работает не со всеми версиями Ruby, поправитьXS-Ruby-Versions
https://wiki.debian.org/Teams/Ruby/Packaging