Как создать deb файл

Обновлено: 04.07.2024

Я хочу создать файл DEB вручную. Я хотел бы просто предоставить папку, которая содержит данные для установки, и скрипт, который будет выполнен после установки.

@David, на самом деле я сделал это с помощью «dpkg-deb», это намного проще, поэтому я выбрал Gilles, перечислив файлы в папке с пакетом, чтобы получить четкое представление о файле для размещения там. Так что я думаю, что его ответ лучше .. @ Давид, я имею в виду, утверждать, что его ответ является производным, это одно, а "не очень хороший ответ"? Ответ Жиля превосходен; не имеет значения, был ли ваш ответ первым, он гораздо более полный. И нет ничего плохого в том, чтобы взять существующий ответ и расширить его; это хорошо

Создание исходного пакета

Я рекомендую сделать пакет с исходным кодом. Установите build-essential , debhelper , dh-make . Перейдите в каталог, в котором находятся файлы, которые вы хотите установить (имя каталога должно иметь форму $PACKAGE-$VERSION , например, myapp-4.2-1 для вашей первой попытки упаковки Myapp V4.2), и запустите dh_make --createorig . Ответь на вопросы. Debhelper создаст базовую инфраструктуру, необходимую для сборки пакета, сгенерировав файлы в подкаталоге, называемые debian как некоторые обязательные файлы, так и шаблоны для необязательных файлов. Вам может понадобиться изменить некоторые из этих файлов:

  • Отредактируйте, debian/rules чтобы собрать то, что требует сборки, и установите файлы в нужном месте. Если вам просто нужно скопировать некоторые файлы, а не компилировать что-либо, просто отредактируйте файл, debian/install чтобы указать, какие файлы должны быть установлены и куда.
  • Отредактируйте, debian/copyright чтобы добавить информацию о лицензии вашего пакета и информацию о том, где можно получить последнюю версию (если применимо).
  • Отредактируйте, debian/changelog чтобы удалить ссылку на ITP (это актуально, только если вы работаете над проектом Debian). Переименовать debian/postinst.ex в debian/postinst и добавить свои команды после установки там. Если вы позже обновите свой пакет, запустите, debchange -i чтобы добавить запись в журнал изменений или отредактируйте файл в Emacs (с установленным dpkg-dev-el ).

Запустите dpkg-buildpackage -rfakeroot -us -uc сборку .deb пакета (удалите, -us -uc если хотите подписать пакет с помощью ключа PGP).

Создание бинарного пакета напрямую

Если вы решите создать двоичный пакет напрямую, не собирая его из исходного пакета, что не очень легко, потому что инструментов для облегчения процесса не так много, вам понадобится некоторое базовое знакомство с форматом пакетов deb. Это описано в Руководстве по политике Debian , в частности гл. 3 (формат бинарных пакетов) , гл. 5 (контрольные файлы) , гл. 6 (сценарии установки) и приложение B (манипулирование двоичным пакетом) .

Вы должны убедиться, что ваш пакет устанавливает ожидаемые файлы /usr/share/doc/copyright (содержащие лицензию на содержимое пакета, а также где найти последнюю версию пакета) и /usr/share/doc/changelog.Debian.gz (содержащие журнал изменений пакета deb). Они вам не нужны, если вы собираетесь использовать пакет только внутри компании, но лучше иметь их.

О Debian и его производных

Если у вас есть инструменты Debian, используйте dpkg-deb для создания пакета. В каталог, содержащий данные для установки, добавьте каталог, называемый DEBIAN на верхнем уровне, содержащий управляющие файлы и сценарии сопровождающего.

Трудный путь

Если у вас нет инструментов Debian, создайте архив файлов, которые вы хотите упаковать data.tar.gz , с отдельным архивом контрольных файлов control.tar.gz (без подкаталогов) и текстовым файлом debian-binary с текстом 2.0 .

Вы должны по крайней мере, управляющий файл с полями Package , Maintainer , Priority , Architecture , Installed-Size , Version , и любые необходимые декларации зависимостей.

Сценарий, который будет выполнен после установки, вызывается postinst . Обязательно сделайте его исполняемым. Это идет рядом control .

Преобразование двоичного пакета из другого формата

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

Самый популярный способ распространения программ в Linux - это репозитории программного обеспечения. В репозиториях программы находятся в специальном формате. В Debian и основанных на нём дистрибутивах используется формат пакетов deb. В этих пакетах находится архив всех файлов программы, инструкции по их установке в системе для пакетного менеджера, а также другая служебная информация.

В этой статье мы рассмотрим как собрать deb пакет для своей программы без использования каких-либо сторонних инструментов. Мы не будем рассматривать подпись пакетов для репозиториев, потому что для каждого вида репозиториев команды будут отличаться.

Создание deb пакетов

Шаг 1. Подготовка

mkdir hellolosst
cd hellolosst

Затем поместите в неё файл с исходным кодом:


Для компиляции программы выполните такую команду:

gcc hellolosst.c -o hellolosst

Затем вы можете её выполнить:


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

2. Создание манифеста

В каждом deb пакете содержаться не только файлы самой программы, но и файл манифеста, в котором описан пакет, его зависимости и параметры. Этот файл имеет название control и должен находится в папке DEBIAN. Для сборки пакета будем использовать папку package, чтобы файлы программы не путались с исходными файлами и те не попали в пакет. Создайте эти папку:

mkdir -p package/DEBIAN

Прежде чем вы сможете создать этот файл надо узнать несколько вещей. Первым делом надо посмотреть размер файлов программы, поскольку в данном случае файл один, достаточно посмотреть его размер:

du -k ./hellolosst


Если файлов несколько, то можно удалить исходники и посмотреть общий размер папки с файлами программы. Дальше надо понять от каких пакетов будет зависеть ваша программа. Для этого воспользуйтесь командой objdump:

objdump -p ./hellolosst | grep NEEDED


В данном случае программе необходима только libc. Чтобы посмотреть в каком пакете она находится выполните:


Пакет называется libc6. Затем создайте файл манифеста со следующим содержимым:

Это минимальный набор параметров в файле манифеста. Вот их значение:

  • Package - имя пакета;
  • Version - версия программы в пакете, будет использована при обновлении пакета;
  • Section - категория пакета, позволяет определить зачем он нужен;
  • Priority - важность пакета, для новых пакетов, которые ни с чем не конфликтуют обычно прописывают optional, кроме того доступны значения required, important или standard;
  • Depends - от каких пакетов зависит ваш пакет, он не может быть установлен, пока не установлены эти пакеты;
  • Recommends - необязательные пакеты, но тем не менее они обычно устанавливаются по умолчанию в apt;
  • Conflicts - пакет не будет установлен, пока в системе присутствуют перечисленные здесь пакеты;
  • Architecture - архитектура системы, в которой можно установить этот пакет, доступные значения: i386, amd64, all, последнее означает, что архитектура не имеет значения;
  • Installed-Size - общий размер программы после установки;
  • Maintainer - указывает кто собрал этот пакет и кто отвечает за его поддержку;
  • Description - краткое описание пакета.

3. Расположение файлов

Манифест готов. Теперь в папке пакета надо создать структуру папок, аналог того, что есть в корневой файловой системе. В данном случае надо создать папку usr/bin и поместить туда исполняемый файл:

mkdir -p package/usr/bin

mv ./hellolosst package/usr/bin

4. Скрипты установки

Несмотря на то, что система установки пакетов очень мощная и позволяет делать многое, некоторые вещи всё же сделать нельзя. Для решения этой проблемы была предусмотрена возможность выполнять скрипты перед установкой пакета и после. Аналогично это работает для удаления пакета - перед и после. Эти скрипты называются preinst, postinst, prerm и postrm. Каждый файл просто содержит набор скриптов, которые надо выполнить. Например:

Разработчики Debian не рекомендуют использовать эти скрипты без крайней надобности, поскольку они дают вам полный контроль над системой пользователя и вы можете случайно что-то повредить. Обычно эти скрипты используются для того чтобы задавать пользователям вопросы и на основе этого генерировать конфигурационные файлы.

5. Сборка и проверка пакета

Осталось собрать настроенный пакет. Для этого используйте такую команду:

dpkg-deb --build ./package


Теперь вы знаете как как собрать deb пакет. После завершения сборки можете установить его с помощью apt:

sudo apt install


Выводы

В этой небольшой статье мы рассмотрели как выполняется создание deb пакета с помощью инструмента dpkg-deb. Как видите, всё очень просто. Вам достаточно написать манифест и расположить файлы там, где они должны быть. Мы рассмотрели здесь только самые основы. На самом деле создание пакетов намного сложнее. Существует целый набор утилит debhelpers, которые используются на различных этапах сборки и установки deb пакетов, подробнее обо всём этом вы можете прочитать в официальной документации.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

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


Способов создания deb-пакета довольно много. Я не буду здесь описывать крупные системы сборки, которые используются на сборочных серверах, ибо большинству это не нужно. Я опишу два наиболее простых способа создания своего пакета. Первым делом, нам нужно установить кое-какие инструменты для работы:

sudo apt-get install build-essential git automake devscripts make libtool fakeroot automake autotools-dev

Далее нужно создать цифровой ключ. Этот шаг не обязателен, но если вы планируете распространять свои пакеты, будет крайне мудрым решением подписать их своим ключом. Это позволит пользователю, скачавшему ваш пакет, удостовериться что именно вы его создали. Для создания ключа можно воспользовать графическими утилитами (Seahorse, Kgpg) либо в терминале:

Далее откройте файл

/.bashrc и в самый конец впишите строчки:

DEBEMAIL="ваш E-Mail который вы указали при создании ключа"
DEBFULLNAME="Ваше имя (или псевдоним)"
export DEBEMAIL DEBFULLNAME

Это позволит автоматически добавлять вашу цифровую подпись при подписании пакетов. Далее нам необходим архив с исходным кодом. Пример я буду проводить простой, так как в зависимости от сложности программы, необходима дополнительная настройка (создание постинсталяционных скриптов, правил сборки и т.д.). Предположим у нас есть архив с исходным кодом программы "Myprogramm" - myprogramm_1.0.tar.gz. Распакуем его в домашнюю директорию (или любую где вам удобнее). Обратите внимание: каталог после распаковки должен иметь имя myprogramm-1.0. Название и через дефис - номер версии. Теперь откроем терминал и выполним:

/myprogramm-1.0
dh_make --createorig

Пошли по порядку. В первой секции указывается имя пакета с исходным кодом. Далее секция ПО (в данном случае admin). Затем приоритет (опционально), имя сопровождающего и его E-Mail (то есть ваше), сборочные зависимости (пакеты необходимые для сборки), версия стандарта (на данный момент 3.9.7), далее идёт имя пакета после сборки, архитектура для которой он собирается (all означает все поддерживаемые архитектуры), секция ПО, приоритет, краткое описание и полное описание. Так как пример у нас простой, для начала этого хватит. Вы также можете открыть файл copyright и указать там своё имя и E-Mail. В файле Changelog находится список изменений каждой версии данного ПО. Так как это первая сборка, то нужно указать что это First Release, а также закрыть некий баг (отсутствие данного пакета в репозитории). Номер бага можно написать от балды. Если вы пересобираете пакет, то сперва измените его версию командой dch -i Файлы в каталоге debian с расширениями .ex - это примеры. При сборке более сложных пакетов, будут нужны и эти дополнительные файлы. Это к примеру послеустановочные скрипты (postinst), файл, проверяющий наличие новой версии тарболла с исходным кодом (watch) и так далее. Файл rules - это мейкфайл, правила для сборки пакета. Для простых программ его можно не менять, в остальных случаях - необходима его правка, для указания параметров сборки, или установки иконок. Много чего.

Теперь, когда вы заполнили файл control, можно приступать к сборке. Для этого находясь в каталоге с исходным кодом, выполните команду debuild. Система проведёт конфигурацию, скомпилирует программу, запакует в пакет, выполнит проверку на распространённые ошибки при дэбианизации и попросит дважды ввести пароль для вашего ключа (если вы его не создавали, то ничего не будет). Теперь в каталоге уровнем выше (в нашем случае в домашней директории), вы увидите несколько файлов, среди которых искомый deb-пакет. Теперь его можно установить командой sudo dpkg -i myprogramm-1.0-1.deb или в графическом менеджере Gdebi.

Вот таким образом можно собрать простой пакет. Но что делать, если вы не хотите засорять систему кучей сборочных зависимостей? Более того, при сборке некоторых пакетов, могут быть использованы некоторые изменённые файлы. К примеру более новые версии библиотек, если вы обновили систему из бэкпортов, или различные изменения в конфигах. На подобные случаи можно воспользоваться виртуальной машиной, контейнером или использовать специальный инструмент под названием pbulder. Pbuilder - это инструмент для создания чистого окружения, в котором находится только то, что необходимо для сборки. Система при этом не засоряется ненужными файлами, а сборка программы происходит в лабораторных условиях. Устанавливаем:

sudo apt install pbuilder

Я приведу пример своего конфига, с помощью которого можно будет собирать пакеты не только под разные релизы Debian, но и Ubuntu.

sudo nano /etc/pbuilderrc

Вставляем следующее содержимое:

BASETGZ="/home/sunderland93/pbuilder/$NAME-base.tgz"
DISTRIBUTION="$DIST"
BUILDRESULT="/home/sunderland93/pbuilder/$DIST/result/"
APTCACHE="/home/sunderland93/pbuilder/$NAME/aptcache/"
BUILDPLACE="/home/sunderland93/pbuilder/build/"
if $(echo $ | grep -q $DIST); then
MIRRORSITE="http://$DEBIAN_MIRROR/debian/"
COMPONENTS="main contrib non-free"
elif $(echo $ | grep -q $DIST); then
MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/"
COMPONENTS="main restricted universe multiverse"
else
echo "Неизвестный дистрибутив: @DIST"
exit 1
fi

Замените sunderland93 на своё имя в системе. Таким образом, мы сможем собирать пакеты для Debian 7, 8, testing и unstable, а также под Ubuntu 12.04, 14.04 и 16.04. Скачанные для сборки зависимости будут лежать в pbuilder/имя дистрибутива/aptcache. Это кстати очень полезно - у нас будет базовый архив, который не будет засорён левыми зависимостями и весить несколько гигабайт. И окружение будет готовиться индивидуально для каждой программы. Можно и вшить эти зависимости в базовый архив, но я не рекомендую это делать. Теперь давайте создадим базовый архив, содержащий чистое окружение для сборки. Для примера возьмём Debian 8 64-bit:

sudo DIST=jessie ARCH=amd64 pbuilder --create

Начнётся процесс создания архива. После того, как он будет готов, можно приступать к сборке программы. Для этого открываем терминал, переходим в каталог с исходным кодом, и выполняем:

sudo DIST=jessie ARCH=amd64 pdebuild

и ждём. Скачанные пакеты будут закешированны, и в следующий раз уже не буду качаться. После сборки, готовый deb-пакет появится в каталоге pbuilder/jessie/result. Вот и всё.

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

Содержание

Источники

Информация надёргана из многих мест, но вот два основных:

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

Подготовка

Зачем это всё?
Что потребуется
Что мы будем делать
Подготовка папки

В домашнем каталоге (или где удобно) создаём папку, в которой будут лежать все файлы будущего пакета: mkdir

/supersh . Далее будем называть её корень пакета.
В корне пакета создаём папку «DEBIAN» (заглавными буквами, это важно!). Эта папка содержит управляющую генерацией пакета информацию, и не копируется на диск при установке пакета.
Также корневая папка пакета содержит будущий «корень диска»: при установке пакета все файлы (кроме папки «debian») распаковываются в корень /. поэтому наш скрипт должен лежать по такому пути, относительно корня пакета: «usr/bin/super.sh»
Белым по чёрному:
mkdir -p

Создание пакета: DEBIAN/*

DEBIAN/control: Основная информация

Формат принят такой: <версия_программы>-<версия_пакета> .
Рекомендую всегда указывать версию пакета: при изменении структуры пакета цифра увеличивается на единичку.

Описание состоит из двух частей: короткое описание (70 символов) на той же строке, и длинное описание на последующих строках, начинающихся с пробела.

Эти зависимости могут потребоваться для скриптов установки пакета: например, пакет flash-installer требует wget

Список пакетов, требуемых для компиляции исходников.

DEBIAN/copyright: © / лицензия
DEBIAN/changelog: история изменений
DEBIAN/rules: правила компиляции
DEBIAN/conffiles: список файлов конфигурации
DEBIAN/dirs: список папок для создания

«Список абсолютных путей к папкам, которые требуются программе, но по каким-либо причинам не создаются.» — гласит официальная документация. На практике – здесь перечисляются все папки, так или иначе используемые программой: и где лежат бинарники, и которые используются программой.
По одной на строке. Например:
/var/log/supersh
/var/lib/supersh
Удобно использовать для создания нескольких пустых папок.

DEBIAN/menu: создание пунктов меню
UPD: Правильный способ добавления пункта меню
DEBIAN/md5sums: контрольные суммы файлов

Используется для проверки целостности пакета. Важный файл.
Заполняется так (cwd=корень пакета):
$ md5deep -r usr > DEBIAN/md5sums

DEBIAN/watch: мониторинг сайта, откуда была скачана прога
DEBIAN/cron.d: инсталляция заданий cron

0 4 * * * root [ -x /usr/bin/super.sh ] && usr/bin/super.sh

DEBIAN/inid.d: init-скрипт

В этот файл пишется содержимое init-скрипта. О написании init-скриптов в инете можно найти

Скриптинг

DEBIAN/(preinst|postinst|prerm|postrm): скрипты установки

Всего можно создать до четырёх скриптов в одном пакете:

  1. Trap non-normal exit signals:
  2. 1/HUP, 2/INT, 3/QUIT, 15/TERM, ERR

trap err_handler 1 2 3 15 ERR
function err_handler local exit_status=$
logger -s -p "syslog.err" -t "ootync.deb" "supersh.deb script '$0' error code $exit_status (line $BASH_LINENO: '$BASH_COMMAND')"
exit $exit_status
>

. Ваш код установочного скрипта .

DEBIAN/templates: шаблоны для диалогов

Варианты предлагаются в дополнительном атрибуте шаблона:

Варианты предлагаются в дополнительном атрибуте шаблона:

Основы использования debconf и debhelper

case "$1" in
configure|reconfigure)

echo "config called with unknown argument \`$1'" >&2
exit 1

Автоматическая проверка пакета

Существует утилита lintian, позволяющая проверить пакет и выявить типичные ошибки в его структуре. Делается это так:
$ lintian supersh_1.0-1_all.deb

Установка пакета

$ sudo dpkg -i supersh_1.0-1_all.deb

Создаём собственный репозиторий пакетов

Описание будущего репозитория
Создание репозитория

Репозиторий описан! Теперь сгенерируем болванку на основе описания. Команды выполняются в корне репозитория:
$ reprepro export
$ reprepro createsymlinks
И добавим готовый репозиторий в /etc/apt/sources.list:
deb file:///path/to/repo/ karmic soft games
Этот репозиторий можно также расшарить при помощи веб-сервера.

Управление пакетами в репозитории

Финиш

  • Создание source пакетов, компилирующих исходники: на примере Zabbix об этом отлично рассказал хабраюзер mahoro в своей статье
  • Debconf, debhelper в конфигурационных скриптах: читаем маны по debconf-devel и debhelper. Они также позволяют создать скелет пакета командой dh_make.
  • Продвинутые способы создания документации в пакетах: файлы DEBIAN/docs, DEBIAN/manpage.*
  • Создание init скриптов
  • Управление заданиями cron
  • Подписывание репозитория ключём gpg


UPD: @ICD2 подсказывает, что есть GUIшная прога для создания пакетов: GiftWrap
giftWrap

Читайте также: