SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Пакетирование для 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

Mais conteúdo relacionado

Mais procurados

Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
03 - Hadoop. HDFS Shell-команды
03 - Hadoop. HDFS Shell-команды03 - Hadoop. HDFS Shell-команды
03 - Hadoop. HDFS Shell-командыRoman Brovko
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхAnastasia Lubennikova
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"IT Event
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Anastasia Lubennikova
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовFuenteovejuna
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
02 - Hadoop. Архитектура HDFS
02 - Hadoop. Архитектура HDFS02 - Hadoop. Архитектура HDFS
02 - Hadoop. Архитектура HDFSRoman Brovko
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычностьStepan Tanasiychuk
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQLAnastasia Lubennikova
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Vipolnenie komand na servere
Vipolnenie komand na servereVipolnenie komand na servere
Vipolnenie komand na servereygoltsev
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Ontico
 

Mais procurados (20)

Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
03 - Hadoop. HDFS Shell-команды
03 - Hadoop. HDFS Shell-команды03 - Hadoop. HDFS Shell-команды
03 - Hadoop. HDFS Shell-команды
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данных
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
02 - Hadoop. Архитектура HDFS
02 - Hadoop. Архитектура HDFS02 - Hadoop. Архитектура HDFS
02 - Hadoop. Архитектура HDFS
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQL
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Команды Ms dos
Команды Ms dosКоманды Ms dos
Команды Ms dos
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Vipolnenie komand na servere
Vipolnenie komand na servereVipolnenie komand na servere
Vipolnenie komand na servere
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)
 

Destaque

Лінуксоўка ў новым фармаце
Лінуксоўка ў новым фармацеЛінуксоўка ў новым фармаце
Лінуксоўка ў новым фармацеsamsolutionsby
 
Презентация проекта E-Learning
Презентация проекта E-LearningПрезентация проекта E-Learning
Презентация проекта E-Learningsamsolutionsby
 
Профилирование и оптимизация производительности Ruby-кода
Профилирование и оптимизация производительности Ruby-кодаПрофилирование и оптимизация производительности Ruby-кода
Профилирование и оптимизация производительности Ruby-кодаsamsolutionsby
 
Lvee winter-2013-corporate linux-education_pynkin_shakhov
Lvee winter-2013-corporate linux-education_pynkin_shakhovLvee winter-2013-corporate linux-education_pynkin_shakhov
Lvee winter-2013-corporate linux-education_pynkin_shakhovsamsolutionsby
 
Linux Cluster next generation
Linux Cluster next generationLinux Cluster next generation
Linux Cluster next generationsamsolutionsby
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Destaque (7)

Лінуксоўка ў новым фармаце
Лінуксоўка ў новым фармацеЛінуксоўка ў новым фармаце
Лінуксоўка ў новым фармаце
 
Презентация проекта E-Learning
Презентация проекта E-LearningПрезентация проекта E-Learning
Презентация проекта E-Learning
 
Профилирование и оптимизация производительности Ruby-кода
Профилирование и оптимизация производительности Ruby-кодаПрофилирование и оптимизация производительности Ruby-кода
Профилирование и оптимизация производительности Ruby-кода
 
Lvee winter-2013-corporate linux-education_pynkin_shakhov
Lvee winter-2013-corporate linux-education_pynkin_shakhovLvee winter-2013-corporate linux-education_pynkin_shakhov
Lvee winter-2013-corporate linux-education_pynkin_shakhov
 
Penetration testing
Penetration testingPenetration testing
Penetration testing
 
Linux Cluster next generation
Linux Cluster next generationLinux Cluster next generation
Linux Cluster next generation
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

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

Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...it-people
 
Creating custom module
Creating custom moduleCreating custom module
Creating custom moduleyulia_tsyba
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package managercorehard_by
 
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014kamazee
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
poudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkgpoudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkgAndrey Fesenko
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к AnsibleIvan Grishaev
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоадаBadoo Development
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON
 
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)Ontico
 
Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасRuslan Sharipov
 
Debian Installer (D-I): Промышленная платформа создания специализированных ди...
Debian Installer (D-I): Промышленная платформа создания специализированных ди...Debian Installer (D-I): Промышленная платформа создания специализированных ди...
Debian Installer (D-I): Промышленная платформа создания специализированных ди...Vladimir Shakhov
 

Semelhante a Пакетирование для Debian/Ubuntu (20)

Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 
Docker 1.9
Docker 1.9Docker 1.9
Docker 1.9
 
Creating custom module
Creating custom moduleCreating custom module
Creating custom module
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
 
Package maintaining in Debian
Package maintaining in DebianPackage maintaining in Debian
Package maintaining in Debian
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
poudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkgpoudriere или как я перестал волноваться и полюбил pkg
poudriere или как я перестал волноваться и полюбил pkg
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 
Installcd Kyivbsd09
Installcd Kyivbsd09Installcd Kyivbsd09
Installcd Kyivbsd09
 
Yulia tsuba
Yulia tsubaYulia tsuba
Yulia tsuba
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
 
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
 
Perl in da shell
Perl in da shellPerl in da shell
Perl in da shell
 
Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
 
Debian Installer (D-I): Промышленная платформа создания специализированных ди...
Debian Installer (D-I): Промышленная платформа создания специализированных ди...Debian Installer (D-I): Промышленная платформа создания специализированных ди...
Debian Installer (D-I): Промышленная платформа создания специализированных ди...
 

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

  • 1. Пакетирование для Debian Дмитрий Бородаенко Минск, 2012 SaM Solutions
  • 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. 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. 3. Постановка задачи пакетирования ◮ Разделение ОС на атомарные единицы – пакеты ◮ Установка, обновление и удаление пакетов ◮ Управление зависимостями ◮ Управление конфигурацией ◮ Контроль целостности
  • 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. 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. 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. 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. 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. 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. 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. 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. 10. debhelper для ленивых #!/usr/bin/make -f %: dh $@
  • 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. 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. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами:
  • 17. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами: 1. Не связываться с установочными скриптами
  • 18. 12. Установочные скрипты: {pre,post}{inst,rm} Правила работы с установочными скриптами: 1. Не связываться с установочными скриптами 2. Пользоваться debhelper, он сам нагенерит всё, что надо 3. Если обойтись одним debhelper не выходит, не забывать в рукописные скрипты добавлять строчку #DEBHELPER# 4. Всегда тестировать не только установку и обновление, но и удаление пакета (и remove, и purge) Policy 6 – Package maintainer scripts and installation procedure
  • 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. 14. Собираем существующий пакет в cowbuilder ________________________________ / apt-get source package-name | cd package-name-2.0/ | | | pdebuild --pbuilder cowbuilder / -------------------------------- ^__^ (oo)_______ (__) )/ ||----w | || ||
  • 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. 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. 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. 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. 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. 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. 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. 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. 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