Внутреннее устройство
Они содержат исполняемые файлы, настройки, библиотеки и другие файлы, необходимые для установки и работы ПО.
Посмотреть содержимое deb-пакета можно утилитой ar (предшественник tar):
Видно, что по сути deb-пакет состоит из двух архивов и файла debian-binary, в котором указывается версия формата пакета и убедиться в этом можно так:
debian-binary - файл, в котором указывается версия формата пакета
data.tar.xz - архив, где хранятся все данные программы (конфиги, библиотеки, исполняемые файлы и т.п.)
control.tar.xz - архив, где хранятся метаданные и некоторые maintainer-ские скрипты
Метаданные выглядят примерно так:
Package: bat-musl
Version: 0.23.0
Section: utils
Priority: optional
Maintainer: David Peter <mail@david-peter.de>
Homepage: https://github.com/sharkdp/bat
Architecture: amd64
Provides: bat
Conflicts: bat
Description: cat(1) clone with wings.
A cat(1) clone with syntax highlighting and Git integration.
Там могут указываться:
- Package (Имя пакета)
- Version (Версия)
- Architecture (Архитектура процессора)
для которого предназначено ПО - Maintainer
тот, кто поддерживает пакет - Installed-Size (Размер)
- Depends (Зависимости пакета)
В зависимостях указывают список программ с версиями или без, нужные для корректной работы ПО. Зависимости перечисляются либо через запятые, что означает логическое “И”, либо через вертикальные линии (|), что означает логическое “ИЛИ”. То есть, например, нужно поставить один из этих пакетов: “gpgv | gpgv2 | gpgv1”, а у тех, которые перечислены через запятую нет альтернатив.
При установке ПО подтягиваются автоматически и зависимости. - Recommends (Рекомендуемые пакеты)
Хоть и необязательные пакеты, но их лучше установить, ибо часто перечисленные в этом пункте пакеты довольно полезны. - Suggests (Предлагаемые пакеты)
Необязательные пакеты, которые могут помочь как-то данному ПО, но и без них оно будет работать. - Conflicts (Конфликтуемые с ПО пакеты)
ПО не может быть установлено рядом с перечисленными пакетами. - Breaks (Несовместимости)
Говорит о том, что установка данного ПО повредит перечисленным пакетам. - Replaces (Заменяет)
Перечисляются пакеты, которые будут заменены данным ПО - Provides (Предоставляет)
Перечисляются пакеты, которые могут быть установлены вместо данного ПО
В архиве control.tar.xz
могут также хранится некоторые скрипты:
- postinst
Выполняется после установки пакета - postrm
Выполняется после удаления пакета - preinst
Выполняется до установки пакета - prerm
Выполняется до удаления пакета
Схема выполнения этих скриптов (установки и удаления пакетов) выглядит примерно так:
Обновление пакетов
При обновлении пакетов тоже задействуются “pre” и “post” скрипты. Там схема побольше, но суть там в том, что обновление пакета - это его удаление и установка новой версии.
В том же месте могут находиться файлы:
- debconf
Используется для хранения настроек, связанных с установкой и настройкой пакета - md5sums
В нем содержатся хэш-суммы для всех файлов пакета - conffiles
В нем перечисляются файлы пакета, которые должны обрабатываться как файлы конфигурации (конфиги). Их можно изменять и тогда dpkg попытается сохранить их во время установки.
Сборка deb-пакетов
Попробую обернуть shell скрипт в deb-пакет. Буду пробовать сделать deb-пакет для vliquid (скрипт, который искажает видео эффектом liquid-scale). Для этого понадобится две программы:
Создаем папку, где будем работать и копируем туда скрипт vliquid:
Версии пакета
Версии программы принято писать в таком виде “<major>.<minor>.<patch>”, то есть “версия 1.2.1”, например.
Major версия меняется, если изменения не совместимы с предыдущей версией
Minor версия меняется, если изменения обратно совместимы
Patch версия меняется, если были сделаны обратно совместимые и, обычно, мелкие исправления ошибок, например.
dh-make-у нужны будут имя и email maintainer-а пакета - можно просто прописать следующие строки в .zshrc, чтобы упростить ему работу:
И создадим шаблон из папки vliquid-1.0/:
dh_make
создал директориюdebian/
с неким содержимым.
В этой папке находятся (перечислено не всё):
- шаблоны README
- файлы .ex
Примеры, например preinst.ex, который если переименовать в preinst - попадет в deb-пакет - файл rules
набор инструкций для сборки deb-пакетов, похожий на Makefile - control
с метаданными
В моем случае *.ex файлы и README.* не понадобятся, поэтому можно:
Нужен еще файл install, с помощью которого передастся инфа утилите debuild, собирающей пакет, какие файлы должны быть в него включены. Пишем туда название скрипта и путь, куда хочешь его положить:
vliquid usr/bin
Можно также отредактировать файл changelog, если нужно добавить инфу об изменениях, версиях. Там лежит такой шаблон:
vliquid (1.0-1) unstable; urgency=medium
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
-- test <test@mail.ru> Sat, 20 May 2023 23:02:21 +0300
Я просто уберу лишнее:
vliquid (1.0-1) unstable; urgency=medium
* Initial release.
-- test <test@mail.ru> Sat, 20 May 2023 23:02:21 +0300
Также изменять файл changelog можно утилитой dch - просто нужно ввести эту команду и откроется шаблон с новой версией.
Запускаем debuild
Вне папки vliquid-1.0/ появились пакет и другие файлы.
Установка пакета:
Удаление пакета:
Подпись пакета
Если пары gpg ключей нет - надо сгенерировать:
Меняю версию:
И rebuild-им пакет, но уже подписывая изменения:
О подписи gpg-ключами
Name и email в паре gpg ключей должны совпадать с $DEBEMAIL $DEBFULLNAME, которые мы прописывали в ~/.zshrc
Иначе подпись не произойдет.
Полезный короткий гайд: Простейший способ собрать свой deb-пакет с данными