- Описание процесса сборки пакета deb
- Подготовка системы
- Сборка из исходников
- Подготовка
- Создание файлов сборки (основные)
- Дополнительные файлы сборки
- Сборка пакета
- Описание служебных файлов
- Control
- Как собрать бинарный deb пакет: подробное HowTo
- Источники
- Подготовка
- Создание пакета: DEBIAN/*
- Скриптинг
- Собираем пакет! 🙂
- Создаём собственный репозиторий пакетов
- Финиш
Описание процесса сборки пакета 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. Процесс будет разбит на несколько этапов:
- Предварительная настройка.
- Создание файлов с инструкциями для сборки пакета.
- Выполнение сборки и проверки.
Рассмотрим каждый из этапов подробнее.
Подготовка
Создадим каталог с названием собираемого приложения (с учетом версии):
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.
Описываем правила компиляции пакета во время его сборки. Создаем файл:
* важно обратить внимание на факт, что содержимое файла может сильно отличаться в зависимости от того, что мы собираем и какой версии собираемое программное обеспечение. В данном примере мы создали файл для независимой работы — сборщик сам скачает исходник и распакует его в рабочий каталог (в данном примере, 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.
Пакет сформирован и должен находится в директории на уровень ниже:
Среди списка файлов мы должны увидеть пакет с нашим названием:
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
Источник Как собрать бинарный deb пакет: подробное HowToСегодня я расскажу на абстрактном примере как правильно создать *.deb пакет для Ubuntu/Debian. Пакет мы будем делать бинарный. Пакеты, компилирующие бинарники из исходников здесь не рассматриваются: осилив изложенные ниже знания, в дальнейшем по готовым примерам можно понять суть и действовать по аналогии 🙂 В статье не будет никакой лишней возни «вручную»: формат пакета эволюционировал в достаточно простую, а главное — логичную структуру, и всё делается буквально на коленке, с применением пары специализированных утилит. В качестве бонуса в конце статьи будет пример быстрого создания собственного локального репозитория: установка пакетов из репозитория позволяет автоматически отслеживать зависимости, и конечно же! — устанавливать всё одной консольной командой на нескольких машинах 🙂 Для тех, кто не хочет вдаваться в мощную систему установки софта в Linux, рекомендую посетить сайт проги CheckInstall: она автоматически создаёт deb-пакет из команды «make install» 😉 А мы вместе с любопытными — ИсточникиИнформация надёргана из многих мест, но вот два основных:
В статье подробно изложены основы создания пакетов, достаточные для получения достаточно мощного управления установкой приложений. Более продвинутые фичи опущены, но предложены прямые ссылки на документацию для интересующихся. ПодготовкаЗачем это всё?Да, CheckInstall умеет создавать рабочий пакет, но он не поддерживает все вкусности, на которые способны deb пакеты 🙂 А именно:
Что потребуетсяКонечно, для создания полноценного пакета хватит архиваторов tar, gz, ar, но можно исключить лишнюю возню, и воспользоваться инструментами, созданными для облегчения жизни 🙂 Что мы будем делатьДля примера будет рассмотрен некий скрипт /usr/bin/super.sh. Не важно что внутри, главное — как он появится на правильном месте 🙂 Подготовка папки/supersh . Далее будем называть её корень пакета. /supersh/DEBIAN # управляющая папка /supersh/usr/bin # путь к скрипту /supersh/usr/bin/ # копируем наш скрипт в нужное место Создание пакета: DEBIAN/*Как я уже сказал, папка DEBIAN содержит файлы, используемые при установке. Здесь я опишу (с примерами) каждый файл. DEBIAN/control: Основная информацияcontrol — центральный файл пакета, описывающего все основные свойства. Файл — текстовый, состоящий из пар «Атрибут: значение». Можно использовать комментарии: символ «#» в начале строки (возможность была добавлена в версии dpkg >= 1.10.11, надеяться на комментарии не стоит :).
Да, вот такие солидные возможности у контрольного файла 🙂 DEBIAN/copyright: © / лицензияТекст лицензии. Файл не обязателен, но лучше подчеркнуть своё авторство 😉 DEBIAN/changelog: история измененийChangelog в специальном формате: используется dpkg для получения номера версии, ревизии, дистрибутива и важности пакета. Лучше посмотреть в официальной документации 😉 а я лишь приведу пример: — o_O Tync Sun, 13 Dec 2009 00:11:46 +0300 DEBIAN/rules: правила компиляцииИспользуется для управления компиляцией пакета: это когда Architeture: source 🙂 DEBIAN/conffiles: список файлов конфигурацииОбычно пакеты содержат болванки конфигурационных файлов, например, размещаемых в /etc. Очевидно, что если конфиг в пакете обновляется, пользователь потеряет свой отредактированный конфиг. Эта проблема легко решается использованием папок типа «config.d», содержимое которых включается в основной конфиг, заменяя собой повторяющиеся опции. DEBIAN/dirs: список папок для создания«Список абсолютных путей к папкам, которые требуются программе, но по каким-либо причинам не создаются.» — гласит официальная документация. На практике – здесь перечисляются все папки, так или иначе используемые программой: и где лежат бинарники, и которые используются программой. DEBIAN/menu: создание пунктов менюХитрый файл для создания пунктов меню. У меня он так и не заработал 🙂 Складывается ощущение, что его содержимое используется либо в необычных оконных менеджерах, либо в каком-то консольном меню… или же использовалось ранее и было забыто 🙂 UPD: Правильный способ добавления пункта менюФайл /DEBIAN/menu создаёт неизвестно что и непонятно где: элементы графического меню всё равно не создаются. Поэтому будем делать правильно 🙂 Работа со скриптами установки пакета будет рассмотрена далее. DEBIAN/md5sums: контрольные суммы файловИспользуется для проверки целостности пакета. Важный файл. DEBIAN/watch: мониторинг сайта, откуда была скачана прогаФункция полезна, если Вы мэйнтейните от нескольких десятков пакетов, и уследить за всеми обновлениями сложно. И ещё пример для uscan(1): Лучше почитайте официальную документацию, такие мощные вещи нечастно требуются простым смертным 🙂 DEBIAN/cron.d: инсталляция заданий cronФайл содержит кусок crontab для инсталляции. Пример объясняет всё: DEBIAN/inid.d: init-скриптВ этот файл пишется содержимое init-скрипта. О написании init-скриптов в инете можно найти СкриптингМы подошли к самому интересному: встраиванию скриптов в deb пакеты. Скрипты позволяют управлять установкой, переустановкой и удалением пакета, выполняя действия, которые нельзя сделать простым копированием файлов в правильные места. Это может быть скачивание дополнительных файлов (как это делает flash-installer), изменение существующих, а также — вывод интерактивных (GUI или ncurses) диалогов, позволяющих пользователю сконфигурировать пакет под себя: например, mysql спрашивает какой установить пароль для root. DEBIAN/(preinst|postinst|prerm|postrm): скрипты установкиВсего можно создать до четырёх скриптов в одном пакете:
Обратите внимание, что ошибки, возникающие в этих скриптах никак не логируются: ничего интереснее кода возврата скрипта нигде не сохраняется, и логирование необходимо делать вручную! Пользователи одного моего пакета терпели неудачу при установке на Linux Mint, и не было даже возможности попросить у них лог ошибок (которого нету) чтобы выдебагать причину 🙂 # ======[ Trap Errors ]======# # Trap non-normal exit signals: . Ваш код установочного скрипта . exit 0 WARNING: болванка пока не тестировалась широко, проверьте лишний раз! На невозможность отладки наткнулся совсем недавно 🙂 DEBIAN/templates: шаблоны для диалоговКак уже было сказано, в скрипте DEBIAN/config можно задавать пользователю вопросы: ввести строку, выбрать один из вариантов, поставить галочку,… Этим занимается «библиотека» bash функций debhelper пакета debconf, умеющая кроме этого ещё массу полезных вещей. Здесь их не рассматриваю 🙂 Template — уникальный (в пределах одного пакета) идентификатор шаблона. Если в скрипте нужно вызвать определённый диалог — используется именно это имя.
Для шаблонов text, note, error также нет значения Default, так как они лишь отображают информацию 🙂 Основы использования debconf и debhelperЭто лишь работоспособные наброски. В оригинале почитать о шаблонах и работе с ними можно здесь: man 7 debconf-devel 🙂 # Подключение команд debconf case «$1» in # Обработка ответа Здесь уже кроется неприятная засада: обратите внимание, что функции db_input передаётся приоритет диалога medium. Для debconf можно установить минимальный приоритет: диалоги с приоритетом ниже которого не отображаются, а берётся значение по умолчанию (Default шаблона)! Чтобы этого ТОЧНО не случилось — используем приоритет critical 🙂 Кроме того, при установке из GUI порог вывода вопросов выше, и многие из них не отображаются вообще. И последнее: при удалении пакета командой purge — debconf должен также вычистить из своей базы сведения о пакете. Например, он сохраняет выбор пользователя при запросах db_input. Собираем пакет! 🙂Ура! Все нужные файлы созданы, лежат по нужным папочкам. Теперь пора собирать пакет 🙂 Автоматическая проверка пакетаСуществует утилита lintian, позволяющая проверить пакет и выявить типичные ошибки в его структуре. Делается это так: Установка пакета$ sudo dpkg -i supersh_1.0-1_all.deb Создаём собственный репозиторий пакетовТеперь у нас есть собственный пакет. Когда их будет несколько, и тем более — с зависимостями, окажется, что намного удобнее быстренько поднять собственный локальный микро-репозиторий, и включить его в список источников менеджера пакетов 🙂 Здесь я опишу быстрый HowTo «как создать свой репозиторий». Идею будет легко развить, почитывая соответствующую документацию 🙂 Описание будущего репозиторияЦентр репозитория — его описание. Главное в нём — список компонент репозитория. Мы создадим компоненты «soft» и «games». В нашем деле создания простого репозитория все поля не играют принципиальной роли, и используются лишь для визуального определения «что есть что» 🙂 Создание репозиторияРепозиторий описан! Теперь сгенерируем болванку на основе описания. Команды выполняются в корне репозитория: Управление пакетами в репозиторииВ корень репозитория кладём *.deb файлы для добавления, и добавляем их в компоненту soft дистрибутива karmic: ФинишВ статье рассмотрены материалы по созданию deb пакетов. Акцент сделан на моментах, для которых в сети нет достаточно наглядного описания. Надеюсь, что моя попытка изложить просто и понятно не провалилась 🙂
UPD: @ICD2 подсказывает, что есть GUIшная прога для создания пакетов: GiftWrap. Источник |