Deb из исходников. Готовим deb из наших бинарников

→ Инструкция по сборке deb-пакета

В сети существует не мало статей о том как собрать deb-пакет, но к сожалению не все из них будут понятны для разработчика, который решил сделать сборку впервые. Итак, у вас есть код. Он полезен, хорош, но требует некоторых навыков и усилий при установке на сервер или десктоп. Чтобы избежать ручной работы связанной с копированием файлов, манипуляций с базой данных, настройкой скриптов start-stop (для демонов) и настройкой конфигов, вы решили собрать все в deb-пакет.

В идеале, правильный deb-пакет должен быть подписан gpg-ключом. Иначе apt будет считать пакет ненадежным и будет выдавать соответствующее предупреждение. Но эту часть мы пока пропустим. Мануал о том как создать gpg-ключ и как подписать deb-пакет gpg-ключом рассмотрим позднее.

Шаг 1. Устанавливаем утилиты, которые потребуются для сборки вашего пакета :

Sudo apt-get install autoconf automake libtool autotools-dev dpkg-dev fakeroot

Шаг 2. Создаем корневой каталог для будущего пакета и копируем все файлы вашей утилиты в этот каталог, которые потребуются для работы и установки . Например:

Mkdir -p /home/username/deb/my_package cp /some_source_files /home/username/deb/my_package

Если ваша утилита будет находиться в папке:

/usr/local/share/my_project

/home/username/deb/my_package/usr/local/share/my_project

Шаг 3. Создаем в корне пакета каталог DEBIAN.

Имя каталога обязательно должно состоять из заглавных букв. В данном каталоге содержится мета-информация которая используется при установке.

Cd /home/username/deb/my_package mkdir DEBIAN

Далее, в каталоге DEBIAN создаем обязательный текстовый файл - control . В данном файле содержится основная информация о пакете. В файле, на каждой строке содержатся пары ключ-значение, разделенные двоеточием.

Cd ./DEBIAN touch control

Пример файла:

Package: my-package Version: 1.0.0 Provides: my-package Maintainer: Vasiliy Batareikin Architecture: all Section: web Priority: optional Pre-Depends: gcc, make, perl (>= 5.10), mysql-server Depends: gcc, make, perl (>= 5.10), perlmagick, mysql-server, unzip, rar Description: My first debian package

Package – Имя пакета. Допустимые символы . Обязательный параметр .

Version – Версия пакета. Обязательный параметр .

Provides – Имя приложения регистрируемое в системе.

Maintainer – Имя и почта мэйнтейнера пакета. Обязательный параметр .

Architecture – Архитектура процессора, для которой предназначен пакет. Обязательный параметр .

Section – Определяет группу приложений. Обязательный параметр .

Priority – Приоритет пакета. Параметр определяет насколько важен ваш пакет в системе.

Pre-Depends – Список пакетов через запятую, которые необходимы в процессе установки вашего пакета. Менеджер пакетов автоматически усатновит указанные пакеты.

Depends – Список пакетов через запятую, которые требуются для работы этого пакета. Менеджер пакетов автоматически усатновит указанные пакеты.

Description – Описание пакета. Обязательный параметр .

Если при установке или удалении пакета необходимо выполнить определенные действия, можно использовать специальные скрипты. Создаем их и ставим права на исполнение:

Cd ./DEBIAN touch preinst postinst prerm postrm chmod 775 preinst postinst prerm postrm

preinst – Выполняется перед установкой пакета.

postinst – Выполняется сразу после установки пакета.

prerm – Выполняется непосредственно перед удалением пакета.

postrm – Выполняется сразу после удаления пакета.


Шаг 4 . Сборка пакета .

Поднимаемся на один уровень с корневой папкой пакета и выполняем сборку.

Эта статья не завершена. Вы можете помочь в ее написании

    Исправив стилистику статьи

    Добавив больше информации о подготовке исходных кодов для дебианизации

Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT , которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное

./ configure && make && make install make uninstall

но не все исходники это поддерживают, а что ещё чаще - исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).

Классификация случаев сборки

Возможны следующие случаи сборки пакетов:

    Сборка из исходников;

    Сборка из бинарных файлов;

исходники или бинарные файлы берутся:

    Не из репозитория;

    Из репозитория другого дистрибутива;

    Из репозитория другого выпуска Ubuntu, из PPA или из Debian;

дебианизация:

    Недоступна;

    Берётся из репозитория Ubuntu, из PPA или из Debian:

    • Из другой версии программы;

      Из текущей версии программы:

      • Не из репозитория текущего выпуска Ubuntu;

        Из репозитория текущего выпуска Ubuntu;

причина сборки:

    Ни в репозитории Ubuntu текущего выпуска, ни в PPA нет нужной версии программы;

    Доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета);

    И то, и другое.

Сборка из исходников

Что необходимо

Полное Руководство начинающего разработчика Debian доступно .

К сожалению, на русском, информация немного устарела, свежая инструкция доступна на английском. Но принципы не изменились, поэтому если интересны детали лучше прочитать руководство от и до.

Нам понадобятся как минимум программы, устанавливаемые командой

sudo apt-get install autoconf automake libtool autotools-dev dpkg-dev fakeroot

Можно так же autobook - это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.

Создание ключа шифрования

Этот шаг не обязателен, его можно пропустить.

Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования . В открывшемся окне, в меню Ключ → Новый ключ , выбираем ключ pgp . Заполняем поля Полное имя и Электронный адрес .

В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
Поэтому отнеситесь к созданию ключа очень ответственно.
Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол - думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.

Можно завести ящик, если ещё нет, на каком-нибудь популярном почтовом сервере: например, gmail.com или yandex.ru .
Это позволит в будущем легко связаться с вами человеку, который вас не знает, но по той или иной причине встретил «вещь», подписанную вами.
Далее вас спросят ввести пароль, как дополнительную защиту. Он может быть полезен, если вы будете использовать закрытый ключ на машинах, которым вы не можете на 100% доверять. Обратная сторона - вам придётся вводить пароль каждый раз, как только вы будете что-то подписывать.

Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME , и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.

Итак, вы создали ключ - теперь его можно будет использовать при создании пакетов.
Для этого, в файл ~/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh ~/.zshrc), нужно вписать переменные

Export DEBEMAIL=ваш@имейл

На основании e-mail будет искаться ключ в pgp, при подписи пакета.
Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой

dch -i

для того, чтобы в изменения вписался ваш e-mail. А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse → Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
Для этого, в меню Правка→Параметры на закладке Публикация ключей необходимо поставить галку Публиковать ключи… .
Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи .

Дебианизация недоступна

Итак, у нас есть только gcoolprog-0.5.3.tar.gz .

Обычно я выполняю следующие действия:

Предварительно подготавливаю рабочую директорию

"http://<путь до файла>" #можно конечно и просто через браузер скачать но обычно так быстрее

Получаем файл gcoolprog-0.5.3.tar.gz . Распакуем его перейдем в полученный каталог:

tar zxvf gcoolprog-0.5.3.tar.gz cd gcoolprog-0.5.3

Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию!

./ configure --prefix =/ usr && make

Если команда выполнилась успешно, то осталось только дебианизировать.

Дебианизация

Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры - создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
Для этого, в корне исходных текстов, выполним

Dh_make --createorig

На что мы должны получить следующий диалог

Type of package: single binary, multiple binary, library, kernel module or cdbs? s Maintainer name: denis Email-Address: [email protected] Date: Mon, 13 Aug 2007 12:40:33 +0400 Package Name: gcoolprog Version: 0.5.3 License: blank Type of Package: Single Hit to confirm:

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

Но мы с вами молодцы и всё у нас прошло без ошибок - появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение.ex) с примерами на все случаи жизни.

Description:

Вместо и (без угловых кавычек) нужно вписать описание, что это за программа.
Именно эти сведения увидит пользователь, когда посмотрит описание пакета.
Второй момент - это поправить файл debian/rules
в секции binary-arch : нужно раскомментировать (т.е. убрать # в начале строки)

Dh_install

без этого мы получим пустой пакет.
Иногда debian/rules содержит лишь:

%: dh $@

Что приемлемо с использованием debhelper.
Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.

Сборка пакета

Теперь, соберём пакет:

В директории выше, т.е. в ~/src/gcoolprog/0.5.3, мы получим файлы

Gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz

Вот теперь мы можем установить пакет

dpkg -i * .deb

Дебианизация берётся из репозитория Ubuntu, из PPA или из Debian

Дебианизация берётся из другой версии программы

В этом случае, очень удобно взять дебианизацию оттуда и поправить для новой версии.

Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.

Ниже я не буду комментировать то, что описано в предыдущем решении.

mkdir ~/ src/ gcoolprog mkdir ~/ src/ gcoolprog/ 0.5.3 cd ~/ src/ gcoolprog/ 0.5.3 wget "http://<путь до файла>"

получаем файл gcoolprog-0.5.3.tar.bz2

bunzip2 gcoolprog-0.5.3.tar.bz2 gzip gcoolprog-0.5.3.tar mv gcoolprog-0.5.3.tar.gz gcoolprog_0.5.3.orig.tar.gz

теперь распаковываем его

tar zxvf ./ gcoolprog_0.5.3.orig.tar.gz

скачиваем предыдущую версию с http://packages.ubuntu.com или http://packages.debian.org , файл gcoolprog_0.5.1.diff.gz (в самом низу в секции More Information on gcoolprog)

wget "http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.1.diff.gz" gunzip gcoolprog_0.5.1.diff.gz patch -p0 < ./ gcoolprog_0.5.1.diff

получаем директорию

~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.1/ debian

копируем каталог gcoolprog-0.5.1/debian в директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3

cp -a ~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.1/ debian ~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.3 dch -i

этой командой изменяется файл debian/changelog например увидим

Gcoolprog (0.5.1-1ubuntu2) feisty; urgency =low * -- denis < ubuntu_user@ mail.ru>

но поскольку у нас версия 0.5.3, то нужно изменить значения на

Gcoolprog (0.5.3-1ubuntu1) feisty; urgency =low * New upstream release. -- denis < ubuntu_user@ mail.ru> Mon, 13 Aug 2007 14 :13 :27 +0400

сохраните изменения. Теперь можно выполнить команду сборки в пакет.

Dpkg-buildpackage -rfakeroot

получим файлы

cd .. ls -1 gcoolprog_0.5.3-1 .diff.gz gcoolprog_0.5.3-1 _i386.changes gcoolprog_0.5.3-1 _i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i * .deb

Дебианизация берётся из текущей версии программы

Дебианизация берётся не из репозитория текущего выпуска Ubuntu

Для Debian нужно использовать сайт http://packages.debian.org , для Ubuntu - http://packages.ubuntu.com . Тогда, например, в Ubuntu ищем пакет gcoolprog в репозитории будущего релиза.

Предварительно подготовим рабочую директорию

mkdir ~/ src/ gcoolprog mkdir ~/ src/ gcoolprog/ 0.5.3 cd ~/ src/ gcoolprog/ 0.5.3

теперь скачиваем три файла

wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .dsc wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3.orig.tar.gz wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .diff.gz

или тоже самое, но одной командой

Dget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .dsc

из пакета devscripts
затем распакуем командой

Dpkg-source -x ./ gcoolprog_0.5.3-1 .dsc

получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:

cd gcoolprog-0.5.3 dch -i gcoolprog (0.5.3-1ubuntu1) feisty; urgency =low * backport from gutsy -- denis < ubuntu_user@ mail.ru> Mon, 13 Aug 2007 14 :13 :27 +0400

теперь можно собирать пакет

Dpkg-buildpackage -rfakeroot

получим файлы

cd .. ls -1 . gcoolprog_0.5.3-1 .diff.gz gcoolprog_0.5.3-1 _i386.changes gcoolprog_0.5.3-1 _i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i * .deb

Дебианизация берётся из репозитория текущего выпуска Ubuntu

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

Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.

Скачиваем исходники:

cd ~/ src apt-get source gcoolprog

apt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).

Устанавливаем необходимые для сборки пакеты для разработки:

sudo apt-get build-dep gcoolprog

Собираем пакеты:

cd gcoolprog-0.5.3 debuild -b -us -uc

debuild следует запускать в директории исходников. Параметры -b -us -uc передаются программе dpkg-buildpackage. Первый требует собирать только бинарные пакеты, второй и третий - не подписывать цифровой подписью, соответственно, пакет исходников и файл.changes. Получившиеся в результате сборки пакеты будут в директории на один уровень выше.

Сборка из бинарных файлов

Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.

Предположим, что работаем в каталоге ~/tmp . Создадим подкаталог ~/tmp/someprog , чтобы распаковать файлы какого-нибудь пакета, нужно выполнить

dpkg -x ~./ tmp/ some-prog-123 .deb ./ someprog

Для того, чтобы извлечь контрольную информацию, выполним

mkdir ~/ tmp/ someprog/ DEBIAN dpkg -e ~/ tmp/ some-prog-123 .deb ./ someprog/ DEBIAN

ну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить

dpkg -b ./ someprog ~/ tmp/ some-prog-123 -new.deb

В каталоге ~/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге ~/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin ,нужно его поместить в каталог ~/tmp/someprog/usr/bin , ну и, соответственно, если что-то должно лежать в /etc , то в ~/tmp/someprog/etc и т.д.

Затем в ~/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл ~/tmp/someprog/DEBIAN/control , в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:

Package: libcurl3 Version: 7.15.2-2 Section: libs Priority: optional Architecture: i386 Depends: libc6 (>= 2.3.5-1), libcomerr2 (>= 1.33-3), libidn11 (>= 0.5.18), libkrb53 (>= 1.4.2), libssl0.9.8 (>= 0.9.8a-1),zlib1g (>= 1:1.2.1), ca-certificates Suggests: libldap2 Replaces: libcurl2 (<< 1:7.11.2-2) Installed-Size: 324 Maintainer: Domenico Andreoli Source: curl Description: Multi-protocol file transfer library libcurl is designed to be a solid, usable, reliable and portable multi-protocol file transfer library. . SSL support is provided by OpenSSL. To enable LDAP support package libldap2-dev is required. . This is the shared version of libcurl. . Homepage: http://curl.haxx.se

Ну а теперь собрать:

dpkg -b ./ someprog some-prog-123 -new.deb

Этой информации достаточно, чтобы собрать/пересобрать простенький пакет. На самом деле можно ещё запускать скрипты при установке пакета, при его удалении и много чего ещё, что нужно нормальному maintainer"у.

Создаём список пакетов:

$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz
Может быть, нам будет выведено сообщение типа:

Dpkg-scanpackages: warning: Packages in archive but missing from override file: dpkg-scanpackages: warning: fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero dpkg-scanpackages: info: Wrote 8 entries to output Packages file.
Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:

строчкой типа:

Deb file:///home/имя_пользователя/zips/virensdebianrepository ./
Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:

Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор Sublime Text 2 (отличная инструкция там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:
# apt-get install sublimetext

Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: sublimetext 0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded. Need to get 0 B/11.4 MB of archives. After this operation, 17.4 MB of additional disk space will be used. WARNING: The following packages cannot be authenticated! sublimetext Install these packages without verification ? Y Selecting previously deselected package sublimetext. (Reading database ... 247813 files and directories currently installed.) Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ... Setting up sublimetext (2.0.2) ... Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)

Заключение

Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с документацией и руководствами . Ещё можно воспользоваться программой , которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.

Отдельное спасибо тов. brainstream , который указал на баг в посте с отрисовкой окружения PRE. Такое бывает, когда доверяешь хаскельным поделкам вроде pandoc:-)

Да, если есть что добавить - пишите в комментариях, но учтите, что пост - именно на скорую руку, без нужды перечитывать фолианты Debian Packaging Guidelines и прочую квантовую физику.

Анонимный комментирует...

Ошибка у вас в тексте:
"Теперь, для того, чтобы установить Skype достаточно сделать:

# apt-get install sublimetext "

Анонимный комментирует...

Распаковывать пакеты можно через dpkg-deb:
$ dpkg-deb -x что.deb куда/

Анонимный комментирует...

Всегда использовал dpkg -e и dpkg -x для полной распаковки пакета и быстрой правки файлов или зависимостей в контрольных файлах. А так же использовал checkinstall вместо make install для создания пакета при компиляции чего либо. Мне кажется эти утилиты стоит упомянуть.

virens комментирует...

Сборка пакетов из исходников в Debian - это от лукавого! Я сейчас припомню свой опыт:

1. В deb-пакете должны быть прописаны майнтейнер и прочая чепуха, без которой (сюрприз-сюрприз!) пакет не соберется.

2. Вы собрали, установили и думаете, что на этом всё? Не тут-то было, добрый aptitude может снести пакет ко всем чертям при установке чего-то другого. Вам знакомо такое чувство: как? где? что? я же уже ставил этот пакет!!! Ну вот такой он aptitude - весь из себя православный, а значит, патриархальный и вольнодумства не позволяющий.

3. Поэтому срочно необходим маневр: aptitude hold package. "Что, хорошо держится? А теперь будьте любезны - отлепите!" (с) Поскольку с этого момента aptitude будет ругаться, что он не в состоянии разрулить зависимости, не снеся вашего пакета.

4. На этом нервы мои сдали... И я открыл для себя Gentoo, а мои волосы снова стали мягкими и шелковистыми!

virens комментирует...

@iv_vl комментирует...
И я открыл для себя Gentoo, а мои волосы...
Наглый пиар Генты?! В моём бложике??? Нет пути! ;-)

1. В deb-пакете должны быть прописаны майнтейнер и прочая чепуха
Стандартное policy - надо же знать, кому дать в морду за сломанный пакет:-) И потом, это всяко лучше того бедлама, который творится в RPM-ных федорах и зюзях.

2. Вы собрали, установили и думаете, что на этом всё? Не тут-то было, добрый aptitude может снести пакет ко всем чертям при установке чего-то другого.
Только если ты ставишь пакет старой версии - например, у меня стоит hold на IceWM, который я поставил из Lenny (придурок-майнтейнер запихнул в Squeeze айс с отломанным треем). Аптитуда тебя предупредит перед подобными манёврами, если что.

3. Поэтому срочно необходим маневр: aptitude hold package.... aptitude будет ругаться, что он не в состоянии разрулить зависимости
Это ложь и провокация: только если ты не влепил hold на что-нибудь типа gcc или glibc, нормально оно разруливать зависимости будет. В отличие от RPM-ов, которые любят сдаваться сразу в стиле "Ну не шмогла я, не шмогла" :-)

Проблемы с разруливанием зависимостей могут быть, это факт, но это лучше, чем жарить яичницу с беконом на процессоре в ожидании конца конпеляния гентой свежего KDE...

4. На этом нервы мои сдали...
Как-то ты быстро сдулся. Кстати, а как дела с зависимостями в генте? Как вы там живёте-то с конпелянием на каждый чих?
Я это...не троллинга ради.... народ интересуется.

iv_vl

Частенько возникает необходимость собрать пакет с какими либо файлами, из которых скомпилировать ничего нельзя. В моём случае это чаще всего самописные bash-скрипты, файл с public ключами ssh… Ещё интересная идея так же паковать архивы.

В рассмотренном ниже примере мы создадим один deb пакет с аж тремя вкусными штуками:
1) конфигурационные файлы nginx с нашего сервера
2) файл с public ключами для авторизации обладателей закрытой части этих ключей на сервере рутом
3) скрипт /usr/bin/ourscript.sh (неважно что он делает, по сути)

Принцип одинаковый, просто мне удобно показать сразу три примера. Пакет будет называться nginxsuperconfig

Предрекая вопросы «а зачем тебе fakeroot, если всё делаешь рутом?». Удобно . А главное — просто и быстро.

Начнем-с с создания нужных каталогов и копирования в эту структуру нужных нам файлов. Каталог DEBIAN должен быть написан именно большими буквами. Остальные каталоги — воссоздание структуры необходимых нам файлов с условным корнем в виде каталога /root/builder/nginxsuperconfig/. То есть всё, что лежит в этом каталоге (кроме DEBIAN) просто распакуется в корень. Как будто вы создадите tarболл с содержимым этого каталога и распакуете его в корень.
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/DEBIAN
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/etc
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/usr/bin
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/root/.ssh
root@builder:~# cp -r /etc/nginx /root/builder/nginxsuperconfig/etc
root@builder:~# cp /usr/bin/ourscript.sh /root/builder/nginxsuperconfig/usr/bin/
root@builder:~# cp /root/.ssh/authorized_keys /root/builder/nginxsuperconfig/root/.ssh/

Теперь нам понадобится написать файлы, описывающие свойства пакета. Обязательным является только файл DEBIAN/control. Для примера я ещё напишу несколько скриптов — один из них будет выполняться перед установкой пакета, второй — по окончанию и ещё один — при удалении пакета.

Напишем файл control:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/control
Я перечислю обязательные поля. На самом деле туда можно много чего написать, но это уже лучше поискать в сети:
Package: nginxsuperconfig
Version: 1.0-1
Section: misc
Priority: extra
Maintainer: inkvizitor68sl
Architecture: all
Depends: nginx, openssh-server, bash
Description: Example package
Package with nginx configs, ssh keys, example script.

Немного прокомментирую.
Package — название пакета.
Version — версия. Через дефис пишем «номер сборки». Например, если вы слегка поправили файл в содержимом, но версия пакета не сменилась. В данном случае мы сами решаем какая у нас версия, потому можно не париться и всегда ставить версия-1
Section — для случаев рассмотренных в примере больше всего подходит misc
Priority — аналогично, подходит extra
Maintainer — ваше имя/ник и почта
Depends — в простейшем случае через запятые перечисляем имена пакетов, которые должны быть установлены, чтобы ваш пакет работал. В нашем случае — nginx (мы же для него конфиг льем), openssh-server (а зачем ключи, если ssh сервера нет?), bash, без которого не запустится наш скрипт.
Description — строка с кратким описанием пакета (не более 70 символов). Следующие строки — полное описание пакета. Перенос строки — точка.

Теперь создадим нужные скрипты.
Выполняемый перед инсталляцией:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/preinst
#!/bin/bash
mv /etc/nginx /etc/nginx.bak
mv /root/.ssh/authorized_keys /root/.ssh/authorized_keys.old

Выполняемый после инсталляции:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/postinst
#!/bin/bash
/etc/init.d/nginx restart
chmod +x /usr/bin/ourscript.sh

Выполняемый после удаления:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/postrm
#!/bin/bash
rm -r /etc/nginx
mv /etc/nginx.bak /etc/nginx
rm /root/.ssh/authorized_keys
mv /root/.ssh/authorized_keys.old /root/.ssh/authorized_keys

Ещё можно создать выполняемый перед удалением скрипт:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/prerm

В общем-то всё готово к сборке пакета:
root@builder:~# cd /root/builder/
root@builder:~# fakeroot dpkg-deb --build nginxsuperconfig

Мы получим файл nginxsuperconfig.deb. Неплохо его ещё переименовать, чтобы в названии содержалась версия:
root@builder:~# mv nginxsuperconfig.deb nginxsuperconfig_1.0-1.deb

Вот в общем-то и всё. Напоминаю, что это простейший пример. Я не ставил перед собой задачи написать очередной огромный непонятный мануал про сборку пакетов. Я постарался описать именно простейший способ собрать свой собственный deb пакет с данными. Ах да, не забудьте, что таким способ можно собрать метапакет для личного использования. То есть пакет, который сам ничего не содержит, зато по зависимостям тянет всё нужное.
Куда слать вопросы, думаю, знаете =)

Постараюсь как можно доступнее изложить процесс создания deb пакетов на примере ruby-zookeper. Предупреждаю сразу, что описанный мной метод пакетирования ruby gems неправильный, лучше использовать gem2deb для этого, но т.к. из исходников с помощью gem2deb собрать ruby-zookeper последней версии у меня не получилось, то вот самый простой метод сборки.

Если вы будете собирать ruby пакеты, как рекомендуется, через gem2deb, то лучше добавьте строку

Export DH_RUBY_IGNORE_TESTS=all/export DH_RUBY_IGNORE_TESTS=all

в debian/rules.

Т.к. мы будем собирать ruby код, то нам понадобится ruby и набор инструментов для сборки deb пакетов.

Sudo apt-get install ruby dpkg-dev

Если у вас старая версия ruby, то в ней нет команды gem, придется устанавливать еще и пакет rubygems или обновлять ruby.

Теперь установим гем fpm , который соберет за нас deb пакет.

Sudo gem install fpm fpm -s gem -t deb zookeeper

В текущей директории у нас появился пакет rubygem-zookeeper_1.4.11_amd64.deb, казалось бы, что дело уже в шляпе, но т.к. нам нужен source пакет, для того, чтобы можно было собрать из него deb, например в OBS , то мы будем продолжать.

Создадим сборочную директорию

Cp rubygem-zookeeper_1.4.11_amd64.deb ~/ cd mkdir -p ruby-zookeeper/fakeroot cd ruby-zookeeper/fakeroot

Извлечем в нее содержание только что собранного пакета

Dpkg-deb -R ~/rubygem-zookeeper_1.4.11_amd64.deb ruby-zookeeper_1.4.11-1

Теперь будем создавать файлы, необходимые для сборки пакета. Они должны находиться в директории debian. Часть файлов мы можем скопировать из распакованного пакета.

Mkdir debian cp rubygem-zookeeper_1.4.11-1/DEBIAN/control debian/control

Отредактируем его до следующего состояния. Не забудьте поменять Maintainer

Source: ruby-zookeeper Maintainer: Section: ruby Build-Depends: debhelper (>= 7.0.50~) Priority: extra Homepage: https://github.com/slyphon/zookeeper Package: ruby-zookeeper Architecture: amd64 Depends: ${shlibs:Depends}, ${misc:Depends}, ruby Description: A low-level multi-Ruby wrapper around the ZooKeeper API bindings. For a friendlier interface, see http://github.com/slyphon/zk. Currently supported: MRI: {1.8.7, 1.9.2, 1.9.3}, JRuby: ~> 1.6.7, Rubinius: 2.0.testing, REE 1.8.7. . This library uses version 3.4.5 of zookeeper bindings.

Нам еще нужен debian/rules. Создадим его. override_dh_shlibdeps нужен, чтоб не проверять линковку библиотек zookeeper, т.к. она не проходит.

#!/usr/bin/make -f # -*- makefile -*- %: dh $@ override_dh_shlibdeps: true

Табуляции в debian/rules обязательны, заменить их на пробелы нельзя. Сделаем его исполняемым.

Chmod +x debian/rules

Usr/* var/*

Теперь создадим debian/changelog и запишем туда:

Ruby-zookeeper (1.4.11-1) UNRELEASED; urgency=medium * Initial release -- root Wed, 25 Nov 2015 20:01:55 +0300

Также нам еще нужен debian/compat

Echo 7 > debian/compat

Скопируем файлы, которые будут установлены, в локальную директорию и удалим папку с распакованным пакетом, она нам больше не пригодится.

Mv ruby-zookeeper_1.4.11-1/{usr,var} . rm -r ruby-zookeeper_1.4.11-1

Соберем новый пакет, а также source пакет.

Dpkg-buildpackage -rfakeroot -uc -F

В директории выше у нас появятся все необходимые файлы.

Ll .. total 5528 drwxr-xr-x 3 root root 4096 Dec 20 13:32 ./ drwx------ 12 root root 4096 Dec 20 13:31 ../ drwxr-xr-x 5 root root 4096 Dec 20 13:28 fakeroot/ -rw-r--r-- 1 root root 1261 Dec 20 13:32 ruby-zookeeper_1.4.11-1_amd64.changes -rw-r--r-- 1 root root 2375044 Dec 20 13:32 ruby-zookeeper_1.4.11-1_amd64.deb -rw-r--r-- 1 root root 565 Dec 20 13:32 ruby-zookeeper_1.4.11-1.dsc -rw-r--r-- 1 root root 3263381 Dec 20 13:32 ruby-zookeeper_1.4.11-1.tar.gz

Можно проверить содержимое получившегося deb пакета