Пакетирование для debian/ubuntu

29
Пакетирование для Debian Дмитрий Бородаенко Минск, 2012 SaM Solutions

Upload: samsolutionsby

Post on 30-May-2015

1.449 views

Category:

Documents


3 download

DESCRIPTION

Автор - Дмитрий Бородаенко (Debian Project, ex-SaM Solutions Dept6 head). Краткий вводный курс по пакетированию программного обеспечения средствами Debian/Ubuntu. Прочитан в апреле 2012 года для сотрудников отдела Linux & Embedded SaM Solutions. Публикуется по договоренности с лектором. Видео: http://bit.ly/13Tw24s

TRANSCRIPT

Page 1: Пакетирование для Debian/Ubuntu

Пакетирование для Debian

Дмитрий Бородаенко

Минск, 2012SaM Solutions

Page 2: Пакетирование для Debian/Ubuntu

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

Page 3: Пакетирование для Debian/Ubuntu

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

Page 4: Пакетирование для Debian/Ubuntu

3. Постановка задачи пакетирования

◮ Разделение ОС на атомарные единицы – пакеты

◮ Установка, обновление и удаление пакетов

◮ Управление зависимостями

◮ Управление конфигурацией

◮ Контроль целостности

Page 5: Пакетирование для Debian/Ubuntu

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

Page 6: Пакетирование для Debian/Ubuntu

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.

Page 7: Пакетирование для Debian/Ubuntu

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

Page 8: Пакетирование для Debian/Ubuntu

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

Page 9: Пакетирование для Debian/Ubuntu

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’.

Page 10: Пакетирование для Debian/Ubuntu

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

Page 11: Пакетирование для Debian/Ubuntu

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";

Page 12: Пакетирование для Debian/Ubuntu

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

Page 13: Пакетирование для Debian/Ubuntu

10. debhelper для ленивых

#!/usr/bin/make -f

%:

dh $@

Page 14: Пакетирование для Debian/Ubuntu

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/

Page 15: Пакетирование для Debian/Ubuntu

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/*

Page 16: Пакетирование для Debian/Ubuntu

12. Установочные скрипты: {pre,post}{inst,rm}

Правила работы с установочными скриптами:

Page 17: Пакетирование для Debian/Ubuntu

12. Установочные скрипты: {pre,post}{inst,rm}

Правила работы с установочными скриптами:

1. Не связываться с установочными скриптами

Page 18: Пакетирование для Debian/Ubuntu

12. Установочные скрипты: {pre,post}{inst,rm}

Правила работы с установочными скриптами:

1. Не связываться с установочными скриптами

2. Пользоваться debhelper, он сам нагенерит всё, что надо

3. Если обойтись одним debhelper не выходит, не забывать врукописные скрипты добавлять строчку #DEBHELPER#

4. Всегда тестировать не только установку и обновление, но иудаление пакета (и remove, и purge)

Policy 6 – Package maintainer scripts and installation procedure

Page 19: Пакетирование для Debian/Ubuntu

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

Page 20: Пакетирование для Debian/Ubuntu

14. Собираем существующий пакет в cowbuilder

________________________________

/ apt-get source package-name \

| cd package-name-2.0/ |

| |

\ pdebuild --pbuilder cowbuilder /

--------------------------------

\ ^__^

\ (oo)\_______

(__)\ )\/\

||----w |

|| ||

Page 21: Пакетирование для Debian/Ubuntu

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

Page 22: Пакетирование для Debian/Ubuntu

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

Page 23: Пакетирование для Debian/Ubuntu

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)

Page 24: Пакетирование для Debian/Ubuntu

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.*

Page 25: Пакетирование для Debian/Ubuntu

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)

Page 26: Пакетирование для Debian/Ubuntu

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)

Page 27: Пакетирование для Debian/Ubuntu

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

Page 28: Пакетирование для Debian/Ubuntu

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

Page 29: Пакетирование для Debian/Ubuntu

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