• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Пакетирование для Debian/Ubuntu
 

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

on

  • 1,500 views

Автор - Дмитрий Бородаенко (Debian Project, ex-SaM Solutions Dept6 head). Краткий вводный курс по пакетированию программного ...

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

Statistics

Views

Total Views
1,500
Views on SlideShare
874
Embed Views
626

Actions

Likes
0
Downloads
3
Comments
0

6 Embeds 626

http://l.lj-toys.com 377
http://mlug.linux.by 243
https://twitter.com 2
http://cloud.feedly.com 2
http://prlog.ru 1
http://feedly.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Пакетирование для Debian Дмитрий Бородаенко Минск, 2012 SaM 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-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.
    • 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
    • 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
    • 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’.
    • 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
    • 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";
    • 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
    • 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 clean builder = /usr/bin/git-pbuilder export-dir = ~/tmp/build export = INDEX ignore-new = true postbuild = 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.conffiles debian/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.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
    • 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
    • 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