Linux build deb package

Описание процесса сборки пакета deb

Данная инструкция является шпаргалкой по сборке пакетов для deb-систем (Debian, Ubuntu, Mint и так далее). Мы рассмотрим пример работы с исходниками nginx, а также разберем подробнее опции, которые можно задействовать при сборке. На практике, данное действие не имеет смысла, так как уже собранный nginx можно получить на сайте разработчика или в репозитории системы, но для нас важно понять процесс сборки, после чего можно будет применить данные знания для своих проектов.

Подготовка системы

Процесс сборки требует установки дополнительных компонентов, что приводит к скоплению мусора из ненужных пакетов. Рекомендуется делать сборку на отдельном компьютере или в контейнере Docker. Подробнее об установке последнего в инструкции Установка Docker на Linux.

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

1. Установка пакетов:

apt-get install dpkg-dev devscripts wget

  • dpkg-dev — содержит набор инструментов для работы с исходными файлами для пакетов deb.
  • devscripts — набор скриптов для сборки пакетов.
  • wget — утилита для загрузки файлов по http. Нужна для загрузки архивов с исходниками.

2. Создание пользователя.

Делать готовые установочные сборки пакетов очень опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории. Стоит создать отдельного пользователя и работать под ним. Однако, если мы работаем в специальной виртуальной среде или контейнере Docker, нам это не страшно. Тогда данный пункт можно пропустить и работать из-под root.

useradd builder -m

* в данном примере мы создадим пользователя builder. Опция -m сразу создаст домашний каталог для пользователя.

Теперь заходим под данным пользователем — последующие команды мы будем выполнять от него:

3. Создадим каталог, в котором будет происходит сборка:

mkdir -p debbuild

Перейдем в debbuild:

Мы готовы к сборке.

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

В нашем примере мы возьмем исходники для сборки nginx (для выполнения configure, make, make install . ) и соберем из них свой пакет для установки NGINX. Процесс будет разбит на несколько этапов:

  1. Предварительная настройка.
  2. Создание файлов с инструкциями для сборки пакета.
  3. Выполнение сборки и проверки.

Рассмотрим каждый из этапов подробнее.

Подготовка

Создадим каталог с названием собираемого приложения (с учетом версии):

mkdir -p nginx-1.20.1/debian

* в нем обязательно каталог debian.

Перейдем в созданный каталог:

Теперь создадим несколько важных файлов.

Создание файлов сборки (основные)

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

1. Control-файл.

Это основной файл с описанием процесса сборки. Вводим:

Пример для нашего случая:

Source: nginx
Section: misc
Priority: optional
Maintainer: Dmitriy Moks
Build-Depends: libpcre3-dev,
zlib1g-dev
Standards-Version: 1.20.1
Homepage: https://nginx.org

Package: nginx
Architecture: amd64
Provides: nginx
Description: NGINX packages.
The description can be written in several lines.
Each line have to be 73 chars maximum.

* значения для опции Build-Depends задаются экспериментально — лучше всего попробовать сначала собрать требуемый пакет вручную, чтобы понять, какие потребуется доустановить пакеты. Рекомендуется это делать на чистой системе, чтобы не получить искаженный результат (на используемой системе уже могут быть пакеты, которых не будет на другом компьютере, где будет происходить сборка).
* более подробное описание файла control представлено ниже.

2. Файл changelog.

В данном файле описывается история изменений пакета. Также сборщик берет из этого файла номер версии и релиза.

Создаем файл командой:

nginx (1.20.1) stable; urgency=medium
* Initial release
— Dmitriy Mosk Tue, 03 Aug 2021 17:34:42 +0300

* в файле указано, что первые изменения внес Dmitriy Mosk 03 августа. Для начала сборки этого будет достаточно. Описание ниже.

3. Файл rules.

Читайте также:  Как поменять язык windows professional

Описываем правила компиляции пакета во время его сборки. Создаем файл:

* важно обратить внимание на факт, что содержимое файла может сильно отличаться в зависимости от того, что мы собираем и какой версии собираемое программное обеспечение. В данном примере мы создали файл для независимой работы — сборщик сам скачает исходник и распакует его в рабочий каталог (в данном примере, nginx). Также мне пришлось переопределить этап dh_usrlocal, так как на нем возникала ошибка, связанная с невозможностью удалить каталог командой rmdir.
* в нашей системе должен быть установлен wget, как и все остальные утилиты, которыми мы захотим воспользоваться.
* более подробное описание файла rules ниже.

4. Файл compat.

Указываем на уровень совместимости с debhelper (вспомогательный инструмент для сборки пакетов). Создаем файл:

* на момент обновления инструкции рекомендовано использовать версию не ниже 9. Сама по себе сборка без данного файла (или при указании версии ниже 9) запустится, но быстро остановится с ошибкой dh_auto_clean: Compatibility levels before 9 are deprecated (level X in use), где Х — текущий уровень совместимости.

Дополнительные файлы сборки

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

1. Файл postinst.

Является скриптом, который будет запущен после установки пакета на целевой системе. Любые постинсталляционные настройки можно выполнить с его помощью, например:

#!/bin/sh
# postinst script for dmosk
#
# see: dh_installdeb(1)

* в данном примере мы просто создадим учетную запись dmosk. Опция set -e говорит о том, что при возникновении ошибки, необходимо сразу прервать работу скрипта.

Может быть использован более сложный сценарий с обработкой аргументов, например:

case «$1» in
configure)
systemctl is-enabled —quiet nginx && systemctl disable nginx
;;

upgrade)
systemctl is-active —quiet nginx
;;

*)
echo «postinst called with unknown argument \`$1′» >&2
exit 1
;;
esac

* таким образом, при установке приложения посредством, например, команды apt-get upgrade, после инсталляции будет выполнена только команда sytemctls is-active —quiet nginx.

2. Файл postrm.

Это скрипт, который выполнится после удаления пакета:

#!/bin/sh
# postrm script for dmosk
#
# see: dh_installdeb(1)

rm -rf /var/log/app
rm -rf /opt/app/test

* в данном примере мы предположили, что после удаления нужно удалить 2 каталога /var/log/app и /opt/app/test.

3. Файл preinst.

Скрипт выполнения перед установкой пакета.

4. Файл prerm.

Скрипт выполнения перед удалением пакета.

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

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

Проверяем, что у нас установлены необходимые пакеты и, при необходимости, установим их:

* команда является частью пакета devscripts, который мы установили в начале инструкции. Она читает опцию Build-Depends файла control и устанавливает необходимые пакеты.

Выполним сборку командой:

debuild -us -uc -b

Если мы все сделали правильно, в конце мы увидим что-то на подобие:

W: nginx: missing-depends-line
E: nginx: no-copyright-file
E: nginx: description-starts-with-package-name
E: nginx: dir-in-usr-local usr/local/nginx/
E: nginx: dir-in-usr-local usr/local/nginx/conf/
E: nginx: file-in-usr-local usr/local/nginx/conf/fastcgi.conf
W: nginx: file-in-unusual-dir usr/local/nginx/conf/fastcgi.conf
E: nginx: file-in-usr-local usr/local/nginx/conf/fastcgi.conf.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/fastcgi.conf.default
E: nginx: file-in-usr-local usr/local/nginx/conf/fastcgi_params
W: nginx: file-in-unusual-dir usr/local/nginx/conf/fastcgi_params
E: nginx: file-in-usr-local usr/local/nginx/conf/fastcgi_params.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/fastcgi_params.default
E: nginx: file-in-usr-local usr/local/nginx/conf/koi-utf
W: nginx: file-in-unusual-dir usr/local/nginx/conf/koi-utf
E: nginx: file-in-usr-local usr/local/nginx/conf/koi-win
W: nginx: file-in-unusual-dir usr/local/nginx/conf/koi-win
E: nginx: file-in-usr-local usr/local/nginx/conf/mime.types
W: nginx: file-in-unusual-dir usr/local/nginx/conf/mime.types
E: nginx: file-in-usr-local usr/local/nginx/conf/mime.types.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/mime.types.default
E: nginx: file-in-usr-local usr/local/nginx/conf/nginx.conf
W: nginx: file-in-unusual-dir usr/local/nginx/conf/nginx.conf
E: nginx: file-in-usr-local usr/local/nginx/conf/nginx.conf.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/nginx.conf.default
E: nginx: file-in-usr-local usr/local/nginx/conf/scgi_params
W: nginx: file-in-unusual-dir usr/local/nginx/conf/scgi_params
E: nginx: file-in-usr-local usr/local/nginx/conf/scgi_params.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/scgi_params.default
E: nginx: file-in-usr-local usr/local/nginx/conf/uwsgi_params
W: nginx: file-in-unusual-dir usr/local/nginx/conf/uwsgi_params
E: nginx: file-in-usr-local usr/local/nginx/conf/uwsgi_params.default
W: nginx: file-in-unusual-dir usr/local/nginx/conf/uwsgi_params.default
E: nginx: file-in-usr-local usr/local/nginx/conf/win-utf
W: nginx: file-in-unusual-dir usr/local/nginx/conf/win-utf
E: nginx: dir-in-usr-local usr/local/nginx/html/
E: nginx: file-in-usr-local usr/local/nginx/html/50x.html
W: nginx: file-in-unusual-dir usr/local/nginx/html/50x.html
E: nginx: file-in-usr-local usr/local/nginx/html/index.html
W: nginx: file-in-unusual-dir usr/local/nginx/html/index.html
E: nginx: dir-in-usr-local usr/local/nginx/logs/
E: nginx: dir-in-usr-local usr/local/nginx/sbin/
E: nginx: file-in-usr-local usr/local/nginx/sbin/nginx
W: nginx: file-in-unusual-dir usr/local/nginx/sbin/nginx
Finished running lintian.

Читайте также:  Острый шрифт windows 10

Пакет сформирован и должен находится в директории на уровень ниже:

Среди списка файлов мы должны увидеть пакет с нашим названием:

nginx-1.20.1 nginx_1.20.1_amd64.build nginx_1.20.1_amd64.changes
nginx-dbgsym_1.20.1_amd64.deb nginx_1.20.1_amd64.buildinfo nginx_1.20.1_amd64.deb

Описание служебных файлов

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

Control

Данный файл содержит основную информацию о собираемом пакете. Рассмотрим по отдельности обязательные опции и дополнительные.

Основные (без которых сборщик вернет ошибку):

Опция Описание Пример
Source Определяет имя пакета источника. nginx
Maintainer Имя и адрес электронной почты сборщика пакета. Dmitriy Moks
Package Имя собираемого пакета. nginx
Architecture Архитектура собираемого пакета. amd64

Дополнительные опции файла control:

Опция Описание
Section Классификация задачи, для которой может быть использовано приложение.
Чаще всего применяются: misc, utils, net, mail, text, x11.
Возможные значения: admin, base, comm, contrib, devel, doc, editors, electronics, embedded, games, gnome, graphics, hamradio, interpreters, kde, libs, libdevel, mail, math, misc, net, news, non-free, oldlibs, otherosfs, perl, python, science, shells, sound, tex, text, utils, web, x11.
Priority Определяет важность пакета для системы.
Возможные варианты: required, standard, optional, extra, important.
Влияет на поведение при удалении — например, пакет, отмеченный как required, не может быть удален.
Build-Depends Перечисляет список пакетов, которые требуются для сборки.
Если в системе не будет перечисленных пакетов, сборщик вернет ошибку.
Есть разные форматы записи, например:
1. Перечисляем зависимости: libpcre3-dev, zlib1g-dev
2. Используем логическое или: apache2 | httpd, php — в данном примере мы трубем, чтобы были установлены php и одни из веб-серверов (apache2 или httpd).
3. Указание версии: libpcre3-dev (= 13), zlib1g-dev (> 14),
apache2 (>= 15),
httpd (

— Josip Rodin Mon, 22 Mar 2010 00:37:31 +0100

  • первая строчка указывает на:
    • имя пакета (gentoo).
    • версию (0.9.12-1).
    • релиз (unstable).
    • важность пакета (urgency=medium).
  • вторая строка является примером для описания изменения. Таких строк, начинающихся со звездочки, может быть несколько.
  • третья строка — имя и адрес автора правок и дата редактирования.

Источник

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

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

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

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

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

Давайте создадим для этого примера небольшую программу на Си. Она будет называться hellolosst и будет выводить на экран строку Hello from losst.ru в терминал при запуске. Сначала создайте папку hellolosst и перейдите в неё:

mkdir hellolosst
cd hellolosst

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

#include
int main() <
printf(«Hello from losst.ru\n»);
>

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

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: hellolosst
Version: 1.0
Section: unknown
Priority: optional
Depends: libc6
Architecture: amd64
Essential: no
Installed-Size: 20
Maintainer: losst.ru
Description: Print hello from losst line

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

  • 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. Каждый файл просто содержит набор скриптов, которые надо выполнить. Например:

#!/bin/bash
echo «Hello from losst installed»

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

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

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

dpkg-deb —build ./package

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

sudo apt install

После этого исполняемый файл программы появится в /usr/bin, а сообщение из postinst будет выведено после установки.

Выводы

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

Источник

Читайте также:  Windows 10 home key install
Оцените статью