📦 Создание .deb пакета | dpkg-deb
Заметка является моим вольным переводом статьи internal / pointers: Building binary deb packages: a practical guide
📄 Инструкция по созданию deb
пакета
Файл deb - это архив, содержащий данные программы и другие необходимые ресурсы.
Он используется для простого распространения и установки программ для Debian/Ubuntu и производных от них. Имеет расширение файла .deb
.
Файлы .deb
удобны, когда приложению необходимо позаботиться о дополнительных зависимостях,
выполнить интеграцию с рабочим столом, запускать сценарии до и после установки и так далее.
🩻 Анатомия deb
пакета
.deb
- это стандартный архив Unix, содержащий приложение и другие служебные файлы.
Наиболее важным из них является управляющий файл control file
в котором хранится информация о пакете и программе, которую он устанавливает.
Пакет .deb
содержит набор папок, имитирующих типичную файловую систему Linux, таких как /usr
, /usr/bin
, /opt
и так далее.
Файл, помещенный в один из этих каталогов, будет скопирован в то же место в реальной файловой системе во время установки.
Так, например, двоичный файл, помещенный в <.deb>/usr/local/bin/binaryfile
, будет установлен в /usr/local/bin/binaryfile
.
Все файлы пакетов .deb
соответствуют определенному соглашению об именовании:
<name>_<version>-<revision>_<architecture>.deb
То есть:
<name>
– название приложения;<version>
– номер версии приложения;<revision>
– номер версии текущего пакета;<architecture>
– аппаратная архитектура.
Например, необходимо сделать пакет для программы под названием hello
версии 1.0
, созданную для 64-разрядных процессоров ARM.
Имя файла .deb
будет выглядеть примерно так hello_1.0-1_arm64.deb
.
🧰 Создание deb
пакета
Убедитесь, что в вашей системе установлена программа dpkg-deb
: она необходима для создания окончательного архива.
📂 1. Создание рабочего каталога
Создайте временный рабочий каталог, в который будет помещен ваш пакет.
Следуйте тому же соглашению об именовании, которое было рассмотрено ранее.
Например:
mkdir hello_1.0-1_arm64
🗃️ 2. Создание внутренней структуры
Поместите файлы программы туда, куда они должны быть установлены в целевой системе.
Например, необходимо, чтобы программа была установлена в /usr/local/bin
:
mkdir -p hello_1.0-1_arm64/usr/local/bin
Флаг -p
для команды mkdir
создаст вложенные каталоги.
Далее нужно скопировать исполняемый файл в этот каталог:
cp ~/YourProjects/Hello/hello hello_1.0-1_arm64/usr/local/bin
🕵🏻♀️ 3. Создание управляющего файла
Файл control
находится в каталоге DEBIAN
.
Обратите внимание на заглавные буквы. Аналогичный каталог с именем debian
(в нижнем регистре)
используется для хранения исходного кода так называемых пакетов с исходным кодом.
Это руководство посвящено бинарным пакетам, поэтому оно нам не нужно.
Давайте сначала создадим папку DEBIAN
:
mkdir helloworld_1.0-1_arm64/DEBIAN
А затем создайте пустой управляющий файл:
touch helloworld_1.0-1_arm64/DEBIAN/control
📝 4. Заполнение управляющего файла
Файл control
- это просто список полей данных. Для бинарных пакетов существует минимальный набор обязательных полей:
Package
– название программы;Version
– версия программы;Architecture
– целевая архитектура;Maintainer
– имя и адрес электронной почты лица, ответственного за обслуживание пакета;Description
– краткое описание программы.
Для примера:
Package: hello
Version: 1.0
Architecture: arm64
Maintainer: Ivan Sumkin <info@test.com>
Description: Программа, которая приветствует вас.
Вы можете добавить более подробное описание здесь. Обратите внимание на пробелы в начале этого абзаца.
Файл control
может содержать дополнительные полезные поля, такие как раздел
,
к которому он принадлежит, или список зависимостей.
Последнее чрезвычайно важно, если для корректной работы вашей программы требуются внешние библиотеки.
При желании вы можете заполнить его вручную, но есть вспомогательные инструменты, которые облегчат эту задачу.
Как это сделать будет показано в следующих нескольких абзацах.
🛠️ 5. Создание deb
пакета
Это последний шаг. Вызовите dpkg-deb
следующим образом:
dpkg-deb --build --root-owner-group <package-dir>
Итак, в нашем примере:
dpkg-deb --build --root-owner-group <helloworld_1.0-1_arm64>
Флаг --root-owner-group
делает все содержимое пакета deb
принадлежащим пользователю root
, что является стандартным способом.
Без такого флага все файлы и папки принадлежали бы пользователю, которые могли бы отсутствовать в системе, в которую был бы установлен deb-пакет.
Приведенная выше команда сгенерирует файл .deb
рядом с рабочим каталогом или выдаст сообщение об ошибке,
если что-то не так или отсутствует внутри пакета.
Если операция прошла успешно, пакет ,deb
готов к распространению.
🎯 Тестирование deb
пакета
Рекомендуется протестировать ваш deb-пакет после его создания.
Вы можете установить его как любой другой обычный deb-пакет:
sudo dpkg -i <package>
Убедитесь, что его также можно легко удалить. Вы можете просто удалить пакет:
sudo dpkg -r <appname>
Или удалить его вместе с конфигурационными файлами (если таковые имеются):
sudo dpkg -P <appname>
Убедитесь, что приложение было удалено правильно, выполнив:
dpkg -l | grep <appname>
Команда dpkg -l
выводит список всех установленных пакетов, в то время как grep
выполняет поиск по <имя_программы>
.
Если приложение было удалено правильно, выходные данные должны быть пустыми.
🐞 Иногда установка .deb
идёт неправильно
Особенно, когда вы имеете дело со сценариями до/после установки или удаления, которые в какой-то момент дают сбой.
Это типичное сообщение об ошибке от dpkg
, что препятствует какому-либо прогрессу.
Package is in a very bad inconsistent state - you should reinstall it before attempting a removal.
Хитрость заключается в том, чтобы переместить все ссылки на ваш поврежденный пакет в безопасное место
(например, в каталог /tmp
), а затем принудительно удалить его, например, так:
sudo mv /var/lib/dpkg/info/<packagename>.* /tmp/
sudo dpkg --remove --force-remove-reinstreq <packagename>
👨👩👦 Забота о внешних зависимостях
Вы можете сгенерировать их автоматически с помощью dpkg-shlibdeps
. Программа проанализирует ваш двоичный код и выполнит поиск внешних символов.
dpkg-shlibdeps -O path/to/binary/file
Флаг -O
выведет зависимости.
Скопируйте выход терминала и вставьте его в раздел Depends
вашего файла DEBIAN/control
.
После этого вы можете избавиться от файла debian/control
.
🤖 Запускайте скрипты до или после установки и удаления пакета
Четыре файла: postinst
, preinst
, postrm
и prerm
называются сценариями сопровождающего.
Эти файлы находятся в каталоге DEBIAN
и, как следует из их названий,
preinst
и postinst
запускаются до и после установки,
в то время как prerm
и postrm
выполняются до и после удаления.
Они должны быть помечены как исполняемые файлы.
Кроме того, не забудьте указать права доступа: они должны быть в диапазоне от 0555
до 0775
.