Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,119 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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

  1. 1. Пакетирование для Debian Дмитрий Бородаенко Минск, 2012 SaM Solutions
  2. 2. 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
  3. 3. 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
  4. 4. 3. Постановка задачи пакетирования ◮ Разделение ОС на атомарные единицы – пакеты ◮ Установка, обновление и удаление пакетов ◮ Управление зависимостями ◮ Управление конфигурацией ◮ Контроль целостности
  5. 5. 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
  6. 6. 5. debian/control Source: package-name Section: web Priority: optional Maintainer: Team 1 <team1@example.org> Uploaders: John Doe <jdoe@example.org> Build-Depends: debhelper (>= 7) Standards-Version: 3.9.3 Package: package-name Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Something useful This package does something useful. . It can also be useless in some situations.
  7. 7. 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 <jdoe@example.org> Sun, 25 Mar 2012 15:56:38
  8. 8. 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 <jdoe@example.org> Sun, 25 Mar 2012 15:56:38 Добавить новую запись в debian/changelog: dch Получить текущую дату в правильном формате: date --rfc-2822
  9. 9. 7. debian/copyright Format: http://dep.debian.net/deps/dep5 Upstream-Name: package-name Source: http://package-name.org/ Files: * Copyright: 2012 Upstream Author <author@package-name.org> License: GPL-3+ License: GPL-3+ The files hereby included are free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. . On Debian systems, the full text of the GNU General Public License version 3 can be found in the file ‘/usr/share/common-licenses/GPL-3’.
  10. 10. 8. Управление зависимостями Depends: libc6 (>= 2.2.5), ruby | ruby-interpreter Recommends: package-name-plugins Suggests: bells-and-whistles Breaks: package-name-plugins (<< 2.0) Conflicts: other-package Provides: something-useful-virtual-package
  11. 11. 8. Управление зависимостями Depends: libc6 (>= 2.2.5), ruby | ruby-interpreter Recommends: package-name-plugins Suggests: bells-and-whistles Breaks: package-name-plugins (<< 2.0) Conflicts: other-package Provides: 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";
  12. 12. 9. debian/rules get-orig-source #!/usr/bin/make -f clean: dh_testdir patch dh_testroot $(MAKE) clean dh_clean clean build: dh_testdir build $(MAKE) PREFIX=/usr binary-arch: build build-arch build-indep dh_testdir dh_testroot dh_prep binary $(MAKE) install PREFIX=. . . binary-indep: build binary-arch binary-indep binary: binary-arch binary-indep
  13. 13. 10. debhelper для ленивых #!/usr/bin/make -f %: dh $@
  14. 14. 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/
  15. 15. 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/*
  16. 16. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами:
  17. 17. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами: 1. Не связываться с установочными скриптами
  18. 18. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами: 1. Не связываться с установочными скриптами 2. Пользоваться debhelper, он сам нагенерит всё, что надо 3. Если обойтись одним debhelper не выходит, не забывать в рукописные скрипты добавлять строчку #DEBHELPER# 4. Всегда тестировать не только установку и обновление, но и удаление пакета (и remove, и purge) Policy 6 – Package maintainer scripts and installation procedure
  19. 19. 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 clean builder = /usr/bin/git-pbuilder export-dir = ~/tmp/build export = INDEX ignore-new = true postbuild = lintian $GBP_CHANGES_FILE
  20. 20. 14. Собираем существующий пакет в cowbuilder ________________________________ / apt-get source package-name | cd package-name-2.0/ | | | pdebuild --pbuilder cowbuilder / -------------------------------- ^__^ (oo)_______ (__) )/ ||----w | || ||
  21. 21. 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
  22. 22. 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
  23. 23. 17. Управление конфигурационными файлами Пакет должен предоставлять готовую конфигурацию, соответствующую актуальной версии пакета, но не затирать пользовательские изменения при обновлении (Policy 10.7). 1. Простейший случай: /etc/package-name.conf 2. Уголок пользовательских настроек: /etc/package-name.conf.local /etc/package-name/conf.d/ 3. Явное указание конфигурационных файлов: debian/package-name.conffiles debian/package-name.ucf ucf умеет --three-way, но при неосторожном обращении может сбивать dpkg с толку (dpkg -S, dpkg -P, dpkg-divert)
  24. 24. 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.*
  25. 25. 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)
  26. 26. 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)
  27. 27. 21. Пакетирование демонов Важные файлы: debian/package-name.init debian/package-name.default debian/package-name.logrotate debian/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/LSBInitScripts Policy 9.3 – System run levels and init.d scripts Policy 10.8 – Log files
  28. 28. 22. Пакетирование бинарных библиотек libfoo-dev.deb libfoo1.deb libfoo.so libfoo.so.1.0 libfoo.a libfoo.so.1 Сборка библиотеки: dh_makeshlibs + dpkg-gensymbols + debian/symbols Сборка зависимого пакета: dh_shlibdeps + dpkg-shlibdeps + debian/shlibs.local Policy 8 – Shared libraries Policy 10.2 – Libraries https://wiki.debian.org/Multiarch
  29. 29. 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

×