Создание deb пакета в Linux Ubuntu
Подготовка системы
Делать готовые установочные сборки пакетов опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории
Поэтому если это не тестовый образ docker или не тестовая виртуальная машина, тогда следует создать отдельного пользователя
Пакеты которые могут пригодиться:
build-essential - установка повлечёт за собой загрузку других пакетов, требуемых для основы среды сборки
autoconf, automake и autotools-dev — данные утилиты (смотрите info autoconf, info automake) используются во многих современных программах для создания сценариев настройки и файла Makefile. В пакете autotools-dev содержатся самые новые версии некоторых файлов auto- и документация по их применению
debhelper и dh-make — пакет dh-make необходим для создания скелета нашего будущего пакета. Для этого он будет использовать некоторые инструменты из пакета debhelper. Использовать их необязательно, но они сильно упрощают процесс создания и поддержки пакетов
devscripts — данный пакет содержит сценарии, полезные для сопровождающих пакет
fakeroot — эта утилита позволяет имитировать права суперпользователя, что необходимо для некоторых этапов процесса сборки
gnupg — инструмент, позволяющий подписывать пакеты цифровой подписью. Это особенно важно, если вы хотите распространять пакеты среди других людей
lintian — это средство проверки пакетов Debian, которое сообщает о распространённых ошибках после сборки
patch — данная утилита изменяет исходный файл в соответствии со списком различий между файлами, полученным при помощи программы diff
patchutils — данный пакет содержит несколько утилит для работы с заплатами, например lsdiff, interdiff и filterdiff.
pbuilder — этот пакет содержит программы, которые используются для создания и поддержки среды chroot
quilt — пакет помогает управлять большими наборами заплат, отслеживая каждое сделанное изменение
xutils-dev — пакет содержит программы, которые используются при сборке пакетов для X11, например с их помощью генерируется Makefile из набора макрофункций
useradd builder -m
apt update
apt install dpkg-dev devscripts equivs wget
dpkg-dev — содержит набор инструментов для работы с исходными файлами для пакетов deb.
devscripts — набор скриптов для сборки пакетов.
equivs — необходим для запуска утилиты mk-build-deps для установки зависимых пакетов.
wget — утилита для загрузки файлов по http. Нужна для загрузки архивов с исходниками.
#Создадим каталог, в котором будет происходит сборка
mkdir -p debbuild
cd debbuild
Каталог debian
Файлы в каталоге debian:
control — основной файл с описание собираемого пакета и его зависимостей. Этот файл содержит информацию, которая используется программами dpkg, dselect, apt-get, apt-cache, aptitude и некоторыми другими инструментами для работы c пакетами
changelog — файл с описанием истории изменения пакета. В нем cодержится название раздела в дистрибутиве, к которому относится пакет с исходным кодом.
Архив Debian разбит на несколько областей: main (свободное ПО), non-free (не совсем свободное ПО) и contrib (свободное ПО, зависящее от несвободного ПО).
rules — файл с правилами компиляции пакета во время его сборки
postinst — скрипт, запускаемый после установки пакета
postrm — скрипт, запускаемый после удаления пакета
preinst — скрипт, запускаемый перед установкой пакета
prerm — скрипт, запускаемый перед удалением пакета
Полное описание файлов содержится в Debian Policy:
https://www.debian.org/doc/debian-policy/
Для сборки пакета под конкретные версии различных дистрибутивов Linux быстрее и удобнее всего использовать отдельные chroot-окружения.
Chroot-окружение — это самый простой способ запустить Linux внутри Linux, например, запустить архитектуру arm64 (aarch64) под архитектурой amd64 (x86_64).
Подробнее об этом здесь:
https://docs.astralinux.ru/latest/mobile/apackage/#
Источник: https://www.debian.org/doc/debian-policy/
Дополнительные скрипты установки
Для решения некоторых проблем была предусмотрена возможность выполнять скрипты перед установкой пакета и после. Аналогично это работает для удаления пакета - перед и после. Эти скрипты называются preinst, postinst, prerm и postrm
Например:
package/DEBIAN/postinst
Простая сборка пакета
#В папке проекта создаем обязательный каталог DEBIAN
mkdir -p package/DEBIAN
#Создаем файл манифеста с минимальным набором параметров:
Package: helloworld
Version: 1.0
Section: unknown
Priority: optional
Depends: openssh
Architecture: amd64
Essential: no
Installed-Size: 40
Maintainer: netbash.ru
Description: Print hello world
Package - имя пакета;
Version - версия программы в пакете, будет использована при обновлении пакета;
Section - категория пакета, определяет его назначение. Архив Debian разбит на несколько областей: main (свободное ПО), non-free (не совсем свободное ПО) и contrib (свободное ПО, зависящее от несвободного ПО).
Priority - важность пакета, для новых пакетов, которые ни с чем не конфликтуют обычно прописывают optional, доступны значения required, important или standard;
Priority - указывается насколько важен данный пакет
Приоритет optional, обычно, назначается новым пакетам, которые не конфликтуют с другими, имеющими приоритет required, important или standard.
Depends - зависимости пакета, без которых основной пакет не может быть установлен;
Пакет не будет установлен, пока не установлены пакеты, от которых он зависит. Используйте этот тип зависимости, если ваша программа гарантировано не будет работать (или вызовет какие-нибудь серьезные проблемы) при отсутствии какого-то пакета.
Pre-Depends - в этом поле указываются более важные зависимости, чем в Depends. Пакет не будет установлен, если какие-либо пакеты из числа таких зависимостей не установлены, либо не правильно настроены
Recommends - необязательные пакеты, обычно устанавливаются по умолчанию в apt. Используйте это поле для пакетов, которые не обязательны, но обычно используются с вашей программой
Conflicts - пакет не будет установлен, пока в системе присутствуют перечисленные здесь пакеты;
Breaks - Если пакет будет установлен, то работоспособность всех перечисленных пакетов будет нарушена. Чаще всего, в поле Breaks указываются пакеты с уточнением версии типа «старее чем».
Architecture - архитектура системы, в которой можно установить этот пакет, доступные значения: i386, amd64, all, последнее означает, что архитектура не имеет значения;
Architecture: any
Генерируемый двоичный пакет зависит от архитектуры, обычно определяемой компилируемым языком.
Architecture: all
Генерируемый двоичный пакет не зависит от архитектуры, обычно в нём содержится текст, изображения или сценарии интерпретируемого языка.
Installed-Size - общий размер программы после установки;
Maintainer - кто собрал этот пакет и кто отвечает за его поддержку;
Description - краткое описание пакета.
Vcs-* для указания местонахождения системы контроля версий
Vcs-Git: https://anonscm.debian.org/git/collab-maint/gentoo.git
Для каждого пакета в списке можно указать версии, которых касается данная зависимость. Версии указываются в круглых скобках после имени пакета и должны состоять из символа сравнения, за которым следует номер версии. Допустимыми символами сравнения являются: <<, <=, =, >= и >> для «строго раньше», «раньше или равно», «в точности равно», «равно или позже» и «строго позже», соответственно. Например:
Depends: foo (>= 1.2), libbar1 (= 1.3.4)
Conflicts: baz
Recommends: libbaz4 (>> 4.0.7)
Suggests: quux
Replaces: quux (<< 5), quux-foo (<= 7.6)
Сборка
#Создаем структуру папок
#Собираем пакет
dpkg-deb --build ./package
Проверка
После создания пакета мы можем проверить, есть ли в нём файлы, с помощью команды dpkg:
dpkg -c test.deb
Чтобы в дальнейшем соответствовать стандартам упаковки Debian, мы можем провести линтинг пакета package. Для этого мы используем инструмент под названием lintian.
После выполнения команды мы можем увидеть одну или несколько ошибок, отмеченных как E, и предупреждений, отмеченных как W.
lintian test.deb
Источник: https://www.baeldung.com/linux/create-debian-package
Создание файлов сборки (основные)
Для выполнения сборки нужно создать, минимум, 4 файла.
1. Control-файл.
#vim debian/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 (short description).
The description can be written in several lines.
Each line have to be 73 chars maximum.
(long description)
2. Файл changelog.
В данном файле описывается история изменений пакета. Также сборщик берет из этого файла номер версии и релиза.
vim debian/changelog
nginx (1.20.1) stable; urgency=medium
* Initial release
-- Dmitriy Mosk Tue, 03 Aug 2021 17:34:42 +0300
3. Файл rules.
Описываем правила компиляции пакета во время его сборки. Создаем файл:
vim debian/rules
#!/usr/bin/make -f
export DH_VERBOSE = 1
url='http://nginx.org/download/nginx-1.20.1.tar.gz'
build_dir='nginx'
override_dh_auto_clean:
if [ ! -f $(build_dir) ]; then rm -rf $(build_dir); fi
mkdir $(build_dir)
dh_auto_clean
override_dh_auto_configure:
wget $(url) -O $(build_dir).tar.gz
tar -xzf $(build_dir).tar.gz -C $(build_dir)/ --strip-components=1
rm -f $(build_dir).tar.gz
cd $(build_dir) && ./configure
override_dh_usrlocal:
%:
dh $@ --sourcedirectory=$(build_dir)/
* важно обратить внимание на факт, что содержимое файла может сильно отличаться в зависимости от того, что мы собираем и какой версии собираемое программное обеспечение. В данном примере мы создали файл для независимой работы — сборщик сам скачает исходник и распакует его в рабочий каталог (в данном примере, nginx).
4. Файл compat.
Указываем на уровень совместимости с debhelper. Другими словами, какой версии debhelper соответствует процесс сборки. На это влияет, какие хелперы будут запускаться и как будет проходить сборка.
vim debian/compat
12
нам необходимо использовать номер в соответствии с версией debhelper, для который мы писали правила сборки. Если мы укажем, скажем, 13, а тестировали сборку и правила на версии 9, то можем получить ряд ошибок
md5sums
Для создания данного файла можно использовать следующую команду из каталога проекта
md5sum $(find * -type f -not -path 'DEBIAN/*') > DEBIAN/md5sums
mkdir mydeb
cd mydeb
#Каталог для архивирования и папка debian в нем
mkdir -p testprog-1.2.1/debian
cd testpog-1.2.1
vim debian/control
#Следующее содержимое
Source: testprog
Section: misc
Priority: optional
Maintainer: Anatoliy Chichinov <89261969132@mail.ru>
Build-Depends: libpcre3-dev,
zlib1g-dev
Standards-Version: 1.2.1
Homepage: https://netbash.ru
Package: testprog
Architecture: amd64
Provides: testprog
Description: testprog packages.
The description can be written in several lines.
Each line have to be 73 chars maximum.
vim program.c
#include
int main(){
printf("Hello from losst.ru\n");
}
#changelog номер сборки и дата последнего изменения
vim debian/changelog
#Содержимое
testprog (1.2.1) stable; urgency=medium
* Initial release
-- Anatoliy Chichinov <89261969132@mail.ru> Tue, 07 Aug 2022 20:34:42 +0300
vim /debian/compat
#Содержимое
9 #Уровень совместимости с debhelper






