Пользователь
0,0
рейтинг
18 сентября 2008 в 09:16

Администрирование → Собираем deb-пакет. Часть 1

В репозитариях Ubuntu собрано огромное количество программ и библиотек. На сайтах самих программ достаточно часто встречаются deb-пакеты, которые можно скачать и установить. Однако все же бывает ситуация, когда нужного ПО нет в репозитариях или на сайте нельзя скачать пакет для Ubuntu, или, наконец, в репозитарии есть старая версия, но она вас не устраивает тем, что в ней присутствует досадный баг или нет нужной функциональности.


Не спешите качать исходники и делать ./configure && make && make install. Это приведет к тому что у вас возникнет каша из библиотек и софта, установленного вручную и через apt, управляться с которой станет очень тяжело. Гораздо лучше потратить побольше времени и приготовить deb-пакет, который уже потом установить используя apt. Преимущества же apt над ручной установкой очевидны.

Допустим мы находимся в ситуации, когда в следующей версии Ubuntu или Debian есть необходимая нам программа, а в текущей версии в репозитории ее нет.

Например, у меня на рабочем компьютере установлена Ubuntu 7.10 Gutsy и мне хочется установить программу Guake. В репозиториях Gutsy ее нет. На сайте deb-пакета под мою версию Ubuntu нет, потому придется делать его самому.

Отправляемся на сайт packages.ubuntu.com и ищем на нем guake в репозитариях для всех версий Ubuntu; обнаруживаю пакет для Ubuntu 8.10. Чем больше различие в версиях убунты, тем больше вероятность получения неожиданных проблем при бэкпортировании. Но что же, попробуем, судя по зависимостям проблем не должно быть слишком много.

Для бэкпортирования или сборки из исходников нам понадобятся определенные утилиты. Перед началом работы установим минимальный набор, который будет необходим для этого. Это пакеты debhelper, dh-make, devscripts, fakeroot, build-essential, automake, gnupg, lintia. Отмечу что для пакетирования конкретного софта будут требоваться дополнительные комплияторы, dev-версии библиотек, которые видимо лучше устанавливать когда они понадобятся.

После установки софта мы готовы к бэкпортированию guake.



  1. Подготовим директорию в которой будем работать:
    konstantin@konstantin-desktop:~$ mkdir -p /tmp/dev/deb/guake
    konstantin@konstantin-desktop:~$ cd !!:2
    cd /tmp/dev/deb/guake
    konstantin@konstantin-desktop:/tmp/dev/deb/guake$

  2. Заходим на страницу пакета и в колонке справа находим ссылку на dsc-файл (guake_0.3.1-3.dsc). Качаем исходные коды пакета при помощи dget:
    dget archive.ubuntu.com/ubuntu/pool/universe/g/guake/guake_0.3.1-3.dsc
  3. В результате у нас скачаны 3 файла с исходными кодами. Распаковываем командой
    konstantin@konstantin-desktop:/tmp/dev/guake$ dpkg-source -x guake_0.3.1-5.dsc
    gpg: Подпись создана Пнд 01 Сен 2008 08:07:22 VLAST ключом DSA с ID DD899610
    gpg: Не могу проверить подпись: открытый ключ не найден
    dpkg-source: extracting guake in guake-0.3.1
    dpkg-source: unpacking guake_0.3.1.orig.tar.gz
    dpkg-source: applying ./guake_0.3.1-5.diff.gz

  4. Перейдем в новый каталог
    konstantin@konstantin-desktop:/tmp/dev/guake$ cd guake-0.3.1/
  5. Выполняем dhc -i
    konstantin@konstantin-desktop:/tmp/dev/guake/guake-0.3.1$ dch -i
  6. В результате откроется редактор на файле guake-0.3.1/debian/changelog. Там уже будет вставлен необходимый шаблонный текст. останется лишь напротив звёздочки вписать что-нибудь вроде

    Backported from Interpid

    guake (0.3.1-5ubuntu1) gutsy; urgency=low

    * Backported from Interpid

    -- Konstantin Mikhaylov <konstantin@konstantin-desktop> Thu, 18 Sep 2008 15:07:30 +1100


  7. Начинаем процедуру сборки пакета
    konstantin@konstantin-desktop:/tmp/dev/guake/guake-0.3.1$dpkg-buildpackage -rfakeroot


    Скорее всего собрать пакет сходу не удастся из-за отсутствия некоторых библиотек. У меня так и вышло:
    konstantin@konstantin-desktop:/tmp/dev/guake/guake-0.3.1$ dpkg-buildpackage -rfakeroot
    dpkg-buildpackage: source package is guake
    dpkg-buildpackage: source version is 0.3.1-5ubuntu1
    dpkg-buildpackage: source changed by Konstantin Mikhaylov <konstantin@konstantin-desktop>
    dpkg-buildpackage: host architecture i386
    dpkg-buildpackage: source version without epoch 0.3.1-5ubuntu1
    dpkg-checkbuilddeps: Unmet build dependencies: autoconf libgtk2.0-dev intltool python-gtk2-dev
    dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
    dpkg-buildpackage: (Use -d flag to override.)


    Видим, что для сборки требуются autoconf, libgtk2.0-dev, intltool, python-gtk2-dev (после завершения мы можем их удалить, дабы не засорять систему). Устанавливаем их через apt и снова пытаемся собрать пакет. Если все пакеты необходимые для сборки успешно установлены, то начнется сборка пакета, в том числе выполнится configure, обработается make-файл и собственно скомпилируется сама программа.
  8. Смотрим что получилось
    konstantin@konstantin-desktop:/tmp/dev/guake/guake-0.3.1$ cd ..
    konstantin@konstantin-desktop:/tmp/dev/guake$ ls -l
    итого 702
    drwxr-xr-x 7 konstantin konstantin 984 2008-09-18 15:13 guake-0.3.1
    -rw-r--r-- 1 konstantin konstantin 2584 2008-09-18 15:04 guake_0.3.1-5.diff.gz
    -rw-r--r-- 1 konstantin konstantin 1320 2008-09-18 15:03 guake_0.3.1-5.dsc
    -rw-r--r-- 1 konstantin konstantin 2658 2008-09-18 15:12 guake_0.3.1-5ubuntu1.diff.gz
    -rw-r--r-- 1 konstantin konstantin 552 2008-09-18 15:12 guake_0.3.1-5ubuntu1.dsc
    -rw-r--r-- 1 konstantin konstantin 697 2008-09-18 15:13 guake_0.3.1-5ubuntu1_i386.changes
    -rw-r--r-- 1 konstantin konstantin 212372 2008-09-18 15:13 guake_0.3.1-5ubuntu1_i386.deb
    -rw-r--r-- 1 konstantin konstantin 481572 2008-09-18 15:04 guake_0.3.1.orig.tar.gz

  9. Устанавливаем полученный пакет
    konstantin@konstantin-desktop:/tmp/dev/guake$ sudo dpkg -i guake_0.3.1-5ubuntu1_i386.deb

    и пользуемся программой.


Нужно ли продолжение?
jtraub @jtraub
карма
47,1
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (44)

  • 0
    А вот интересно, вы же в пакете ничего кроме changelog не поменяли. Может быть с таким же успехом просто поставился бы пакет из Interpid?
    • 0
      А вы бы попробовали сначала :-)
      • +1
        Попробовал. Просто так не встало, вашим способом поставилось. Вопрос — какая же из команд чудесным образом модифицирует зависимости пакета?
        И вообще, откуда берутся ограничения версий библиотек, если они в control не прописаны? В собранном-то пакете они уже есть и, видимо, зависят от того в какой системе пакет собирался. Не разъясните? :)

        P.S. Спасибо, кстати, с наводку. Похоже, guake мне нравится больше, чем yakuake.
        • +4
          dpkg-gencontrol, который запускается dpkg-buildpackage
          • 0
            А вот интересно, кто и за что минусует?
            • +1
              Вы ИМ не понравились, немножко уравновешу :)
        • +2
          По сути dpkg-gencontrol берет из кэша apt версии пакетов, которые перечислены в control-файле (если, конечно, там уже не указана версия) и проставляет их. Поскольку эта инструкция предназначена для реальной машины с конкретной версией, то будут проставлены правильные версии.

          Если нужно создать пакет под другую версию убунту (т.е. скорее всего так под Interpid guake собирался), то пользуются pbuilder-ом или chroot-ом которые создают окружение нужное.

          Например,
          sudo pbuilder create --distribution <ubuntu_version> \
          --othermirror «deb archive.ubuntu.com/ubuntu <ubuntu_version> main restricted universe multiverse»

          Ну и там уже дальше снова сработает dpkg-gencontrol, который проставит версии
          • 0
            Ага, спасибо, стало понятнее :)
        • +1
          Никакого чудо-модифицирования не происходит. Просто бинарные пакеты зависят не только от библиотек, но и от их конкретных версий. В случае с пакетом для Interpid наверняка есть привязка к более новой libc, хотя исходники и со старой соберутся.
        • –3
          это магическим образом происходит при сборке…
    • 0
      Зависит от зависимостей. Судя по всему он встал бы и так :)))
    • 0
      konstantin@konstantin-desktop:/tmp/dev/guake$ wget http://mirrors.kernel.org/ubuntu/pool/universe/g/guake/guake_0.3.1-3_i386.deb --17:02:49-- http://mirrors.kernel.org/ubuntu/pool/universe/g/guake/guake_0.3.1-3_i386.deb => `guake_0.3.1-3_i386.deb' Преобразование адреса mirrors.kernel.org... 204.152.191.39, 204.152.191.7 Устанавливается соединение с mirrors.kernel.org|204.152.191.39|:80... соединились. Запрос HTTP послан, ожидание ответа... 200 OK Длина: 216 338 (211K) [text/plain] 100%[===============================>] 216 338 4.51K/s ETA 00:00 17:03:38 (5.63 KB/s) - `guake_0.3.1-3_i386.deb' сохранён [216338/216338]
      Пробуем ставить
      konstantin@konstantin-desktop:/tmp/dev/guake$ sudo dpkg -i guake_0.3.1-3_i386.deb Выбор ранее не выбранного пакета guake. (Чтение базы данных... на данный момент установлено 236218 файлов и каталогов.) Распаковывается пакет guake (из файла guake_0.3.1-3_i386.deb)... dpkg: зависимости пакетов не позволяют настроить пакет guake: guake зависит от libglib2.0-0 (>= 2.16.0), однако: Версия libglib2.0-0 в системе 2.14.1-1ubuntu1. guake зависит от libgtk2.0-0 (>= 2.13.6), однако: Версия libgtk2.0-0 в системе 2.12.0-1ubuntu3. guake зависит от libpango1.0-0 (>= 1.21.3), однако: Версия libpango1.0-0 в системе 1.18.3-0ubuntu1. guake зависит от python-central (>= 0.6.7), однако: Версия python-central в системе 0.5.15ubuntu2. dpkg: не удалось обработать параметр guake (--install): проблемы зависимостей -- оставляем не настроенным При обработке следующих пакетов произошли ошибки: guake
      Упс…
      А вот теперь пробуем ставить бэкпортированный пакет
      konstantin@konstantin-desktop:/tmp/dev/guake$ sudo dpkg -i guake_0.3.1-5ubuntu1_i386.deb [sudo] password for konstantin: (Чтение базы данных... на данный момент установлено 236262 файлов и каталогов.) Подготовка к замене пакета guake 0.3.1-3 (используется файл guake_0.3.1-5ubuntu1_i386.deb)... Распаковывается замена для пакета guake ... Настраивается пакет guake (0.3.1-5ubuntu1) ... konstantin@konstantin-desktop:/tmp/dev/guake$
      • 0
        Тьфу… Побились переводы строк.
  • +7
    Нужно ли продолжение?

    Нужно!
    • –5
      Жду с нетерпением!
      • +1
        и за что минусы?
        • +1
          это понять ни тебе, ни мне, к сожалению, не суждено.

          к примеру, каждый раз, когда я упоминаю Господа Бога, мне ставят минусы. и сейчас поставят, но у меня карма и хабрасила и так неважные, так что по фигу.
    • 0
      Было бы неплохо описать как собрать в пакет свои программы\наборы скриптов, я когда то собирал под дебиан, но это было давно, уже забыл, хотя это очень полезно при разворачивании нескольких однотипных серверов, вес конфиги в deb пакете + pre-install и post-install… если кому нибуть интересно, то могу выделить несколько часиков и написать подробную статейку как это делать…
      • 0
        ну давай, дерзай!
        карму поднимут =)
  • +1
    Дабы не засорять систему и для чистоты сборки, лучше уж pbuilder использовать.
    • 0
      Собственно это способ «по-быстрому». Я в следующий раз собственно и собирался рассказать про pbuilder
      • +1
        тогда надо :)
  • +2
    я бы порекомендовал обратиться к первоисточникам — документации по сборке пакетов в debian.
    Написана уже очень давно — и избавляет от необходимости изобретать велосипеды.
    • 0
      Да собственно это ни разу не изобретение велосипедов. Вы почитайте maintaners guide
      • 0
        ну раз обратились к источникам, то почитайте документацию к apt-src, это раз.
        И еще еще замечательная команда — debuild binary
        А для удовлетворения зависимостей можно запустить /usr/lib/pbuilder/pbuilder-satisfydepends — и ничего ручками делать уже и не придется
  • –3
    А не проще ли использовать ./configure && make && checkinstall?
    • +1
      Ну правда придется дополнительно установить сам checkinstall, но это не составит большого труда, ипо dtb-пакет найти несложно.
      • 0
        Тем что в таком случае зависимости пакета удовлетворяются и помечаются как установленные автоматически и при удалении пакета, если никто больше не использует эти зависимости (библиотеки) в первую очередь, они будут автоматически удалены.
  • +1
    Спасибо за статью.
    Кстати я слышал что Guake немного тормознутый. Поставил себе yeahconsole вроде всем доволен. Если интересно — сравните :)
  • +1
    В пункте 3: РаспАОвываем командой
    • 0
      Спасибо. Исправил.
  • +1
    режет глаз «репозитАрий»
    • 0
      А черт его знает как правильно. Просто есть слово «депозитарий».
      Кстати, вот так repository переводится в словаре Lingvo:
  • 0
    Спасибки. Продолжение нужно. А как сделать deb пакет, если исходники не make-ом компилируются, а чем-нибудь другим, как например у linuxdcpp?
    • 0
      Пример rules для linuxdcpp можно посмотреть скачать сорцы из репо: apt-get source linuxdcpp. Так же довольно просто можно собирать готовые бинарники в пакет maximum-value.blogspot.com/2008/09/deb_17.html
  • 0
    ждем статью про cpack :)
  • 0
    Огромное спасибо за статью, мне как раз было очень нужно — и именно по поводу бекпортирования!
    Только вопрос- может лучше писать с расчетом, что пакеты публикуются сразу в личном PPA?
  • 0
    Выполняем dhc -i

    Опечатка, надо dch -i

  • 0
    а мне больше stjerm нравиться, маленькая, простая и легко настраиваемая консоль
  • 0
    В общем верно, за исключением названия: собираем deb-пакет лучше заменить на что-нибудь типа «собираем backport», т.к. здесь мы его только build-им, а всё остальное уже сделано.
    И ещё один момент — зависимости можно притянуть с помощью apt-get если соответствующий репозиторий подключен: sudo apt-get build-dep guake
  • 0
    спасибо за мануал, очень юзабельно.
    только вот проблема у меня возникла — deb не создался.
    создался целый каталог с уже готовой и собранной программой Mozilla Firefox 3.0.5, а деба нету. Даже наутилусом смотрел, и поиск юзал — нет там .deb файлов.

    DSC фокса: archive.ubuntu.com/ubuntu/pool/main/f/firefox-3.0/firefox-3.0_3.0.5+nobinonly-0ubuntu0.8.10.1.dsc
    У меня Ubuntu 8.10 Intrepid Ibex
    • 0
      пардон, затупил.
      deb лежали папкой выше, целым ешелоном.
  • 0
    ткните пожалуйста носом, где покурить основательный мануал по сборке/разборке deb пакетов.
    хочется собрать из srpm в deb, перенеся все патчи, ну и changelog
  • 0
    > Видим, что для сборки требуются autoconf, libgtk2.0-dev, intltool, python-gtk2-dev (после завершения мы можем их удалить, дабы не засорять систему). Устанавливаем их через apt и снова пытаемся собрать пакет.

    Надеюсь, через apt-get build-dep имя_пакета? :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.