added guide to make deb package
This commit is contained in:
parent
4ace38f58d
commit
faad7b0de0
220
content/posts/2025/linux/make-deb.md
Normal file
220
content/posts/2025/linux/make-deb.md
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
---
|
||||||
|
title: "📦 Создание .deb пакета | dpkg-deb"
|
||||||
|
date: 2025-06-03T14:35:45+03:00
|
||||||
|
draft: false
|
||||||
|
tags: [linux, package, tutorial]
|
||||||
|
---
|
||||||
|
|
||||||
|
> Заметка является моим вольным переводом статьи
|
||||||
|
**internal / pointers**:
|
||||||
|
[Building binary deb packages: a practical guide](https://www.internalpointers.com/post/build-binary-deb-package-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` соответствуют определенному соглашению об именовании:
|
||||||
|
|
||||||
|
```text
|
||||||
|
<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. Создание рабочего каталога
|
||||||
|
|
||||||
|
Создайте временный рабочий каталог, в который будет помещен ваш пакет.
|
||||||
|
Следуйте тому же соглашению об именовании, которое было рассмотрено ранее.
|
||||||
|
Например:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir hello_1.0-1_arm64
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🗃️ 2. Создание внутренней структуры
|
||||||
|
|
||||||
|
Поместите файлы программы туда, куда они должны быть установлены в целевой системе.
|
||||||
|
Например, необходимо, чтобы программа была установлена в `/usr/local/bin`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir -p hello_1.0-1_arm64/usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
Флаг `-p` для команды `mkdir` создаст вложенные каталоги.
|
||||||
|
Далее нужно скопировать исполняемый файл в этот каталог:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cp ~/YourProjects/Hello/hello hello_1.0-1_arm64/usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 🕵🏻♀️ 3. Создание управляющего файла
|
||||||
|
|
||||||
|
Файл `control` находится в каталоге `DEBIAN`.
|
||||||
|
Обратите внимание на заглавные буквы. Аналогичный каталог с именем `debian` (в нижнем регистре)
|
||||||
|
используется для хранения исходного кода так называемых [пакетов с исходным кодом](https://www.debian.org/doc/debian-policy/ch-source.html).
|
||||||
|
Это руководство посвящено бинарным пакетам, поэтому оно нам не нужно.
|
||||||
|
|
||||||
|
Давайте сначала создадим папку `DEBIAN`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir helloworld_1.0-1_arm64/DEBIAN
|
||||||
|
```
|
||||||
|
|
||||||
|
А затем создайте пустой управляющий файл:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
touch helloworld_1.0-1_arm64/DEBIAN/control
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 📝 4. Заполнение управляющего файла
|
||||||
|
|
||||||
|
Файл `control` - это просто список полей данных. Для бинарных пакетов существует минимальный набор обязательных полей:
|
||||||
|
|
||||||
|
* `Package` – название программы;
|
||||||
|
* `Version` – версия программы;
|
||||||
|
* `Architecture` – целевая архитектура;
|
||||||
|
* `Maintainer` – имя и адрес электронной почты лица, ответственного за обслуживание пакета;
|
||||||
|
* `Description` – краткое описание программы.
|
||||||
|
|
||||||
|
Для примера:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Package: hello
|
||||||
|
Version: 1.0
|
||||||
|
Architecture: arm64
|
||||||
|
Maintainer: Ivan Sumkin <info@test.com>
|
||||||
|
Description: Программа, которая приветствует вас.
|
||||||
|
Вы можете добавить более подробное описание здесь. Обратите внимание на пробелы в начале этого абзаца.
|
||||||
|
```
|
||||||
|
|
||||||
|
Файл `control` может содержать дополнительные полезные поля, такие как [`раздел`](https://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections),
|
||||||
|
к которому он принадлежит, или [список зависимостей](https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps).
|
||||||
|
|
||||||
|
Последнее чрезвычайно важно, если для корректной работы вашей программы требуются внешние библиотеки.
|
||||||
|
При желании вы можете заполнить его вручную, но есть вспомогательные инструменты, которые облегчат эту задачу.
|
||||||
|
Как это сделать будет показано в следующих нескольких абзацах.
|
||||||
|
|
||||||
|
|
||||||
|
### 🛠️ 5. Создание `deb` пакета
|
||||||
|
|
||||||
|
Это последний шаг. Вызовите `dpkg-deb` следующим образом:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dpkg-deb --build --root-owner-group <package-dir>
|
||||||
|
```
|
||||||
|
|
||||||
|
Итак, в нашем примере:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dpkg-deb --build --root-owner-group <helloworld_1.0-1_arm64>
|
||||||
|
```
|
||||||
|
|
||||||
|
Флаг `--root-owner-group` делает все содержимое пакета `deb` принадлежащим пользователю `root`, что является стандартным способом.
|
||||||
|
Без такого флага все файлы и папки принадлежали бы пользователю, которые могли бы отсутствовать в системе, в которую был бы установлен deb-пакет.
|
||||||
|
|
||||||
|
Приведенная выше команда сгенерирует файл `.deb` рядом с рабочим каталогом или выдаст сообщение об ошибке,
|
||||||
|
если что-то не так или отсутствует внутри пакета.
|
||||||
|
Если операция прошла успешно, пакет `,deb` готов к распространению.
|
||||||
|
|
||||||
|
|
||||||
|
## 🎯 Тестирование `deb` пакета
|
||||||
|
|
||||||
|
Рекомендуется протестировать ваш deb-пакет после его создания.
|
||||||
|
Вы можете установить его как любой другой обычный deb-пакет:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo dpkg -i <package>
|
||||||
|
```
|
||||||
|
|
||||||
|
Убедитесь, что его также можно легко удалить. Вы можете просто удалить пакет:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo dpkg -r <appname>
|
||||||
|
```
|
||||||
|
|
||||||
|
Или удалить его вместе с конфигурационными файлами (если таковые имеются):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo dpkg -P <appname>
|
||||||
|
```
|
||||||
|
|
||||||
|
Убедитесь, что приложение было удалено правильно, выполнив:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dpkg -l | grep <appname>
|
||||||
|
```
|
||||||
|
|
||||||
|
Команда `dpkg -l` выводит список всех установленных пакетов, в то время как `grep` выполняет поиск по `<имя_программы>`.
|
||||||
|
Если приложение было удалено правильно, выходные данные должны быть пустыми.
|
||||||
|
|
||||||
|
|
||||||
|
### 🐞 Иногда установка `.deb` идёт неправильно
|
||||||
|
|
||||||
|
Особенно, когда вы имеете дело со сценариями до/после установки или удаления, которые в какой-то момент дают сбой.
|
||||||
|
Это типичное сообщение об ошибке от `dpkg`, что препятствует какому-либо прогрессу.
|
||||||
|
|
||||||
|
```text
|
||||||
|
Package is in a very bad inconsistent state - you should reinstall it before attempting a removal.
|
||||||
|
```
|
||||||
|
|
||||||
|
Хитрость заключается в том, чтобы переместить все ссылки на ваш поврежденный пакет в безопасное место
|
||||||
|
(например, в каталог `/tmp`), а затем принудительно удалить его, например, так:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo mv /var/lib/dpkg/info/<packagename>.* /tmp/
|
||||||
|
sudo dpkg --remove --force-remove-reinstreq <packagename>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 👨👩👦 Забота о внешних зависимостях
|
||||||
|
|
||||||
|
Вы можете сгенерировать их автоматически с помощью `dpkg-shlibdeps`. Программа проанализирует ваш двоичный код и выполнит поиск внешних символов.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dpkg-shlibdeps -O path/to/binary/file
|
||||||
|
```
|
||||||
|
|
||||||
|
Флаг `-O` выведет зависимости.
|
||||||
|
Скопируйте выход терминала и вставьте его в раздел `Depends` вашего файла `DEBIAN/control`.
|
||||||
|
После этого вы можете избавиться от файла `debian/control`.
|
||||||
|
|
||||||
|
|
||||||
|
## 🤖 Запускайте скрипты до или после установки и удаления пакета
|
||||||
|
|
||||||
|
Четыре файла: `postinst`, `preinst`, `postrm` и `prerm` называются сценариями сопровождающего.
|
||||||
|
|
||||||
|
Эти файлы находятся в каталоге `DEBIAN` и, как следует из их названий,
|
||||||
|
`preinst` и `postinst` запускаются до и после установки,
|
||||||
|
в то время как `prerm` и `postrm` выполняются до и после удаления.
|
||||||
|
Они должны быть помечены как исполняемые файлы.
|
||||||
|
Кроме того, не забудьте указать права доступа: они должны быть в диапазоне от `0555` до `0775`.
|
Loading…
x
Reference in New Issue
Block a user