Работа с DEB-пакетами
Данные инструкции написаны для серии статей под названием »Проект юного DevOps»:
Сборка Deb-пакета
Процесс сборки DEB-пакета состоит из следующих этапов:
Данные о лабораторном стенде | Данные о собираемой программе |
NAME=«Ubuntu» VERSION=»22.04.3 LTS (Jammy Jellyfish)» ID_LIKE=debian PRETTY_NAME=«Ubuntu 22.04.3 LTS» | Easy-rsa 3.0.8 Generated: Wed Sep 9 15:59:45 CDT 2020 SSL Lib: OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) Source Repo: https://github.com/OpenVPN/easy-rsa Расположение в OC: /home/nikolay/easy-rsa |
Установка инструментов для сборки
Скачаем инструменты для сборки пакетов:
sudo apt-get install -y dh-make devscripts
dh_make — это инструмент командной строки, используемый в системах, основанных на Debian, для упрощения процесса создания базовой структуры каталогов и файлов-шаблонов для упаковки программного обеспечения. После выполнения dh_make
мы получим набор файлов и каталогов, формирующих начальную структуру пакета Debian.
devscripts — это набор утилит и сценариев, предназначенных для облегчения работы разработчиков и сопровождающих пакетов. Этот пакет включает в себя множество инструментов, предназначенных для автоматизации различных задач, связанных с пакетированием программного обеспечения в формате Debian.
В частности, мы будем использовать утилиту »debuild», которая упрощает процесс сборки Debian-пакета из исходного кода. Она автоматизирует множество шагов, включая компиляцию, установку файлов и создание пакета в формате .deb
.
Программы, участвующие в сборке пакета, будет искать наше имя и адрес электронной почты в переменных окружения DEBFULLNAME
и DEBEMAIL
. Их определение раз и навсегда избавит нас от необходимости многократно вводить их. Добавим следующие две строки в конец файла »~/.bashrc»:
export DEBEMAIL="justnikobird@yandex.ru"
export DEBFULLNAME="Nikolay"
Применим новую среду окружения:
source ~/.bashrc
Подготовка файлов для сборки
Создадим каталог »deb» в домашней директории и перейдем в него:
mkdir ~/deb && cd ~/deb
Создадим каталог для сборки пакета (
mkdir easy-rsa-lab-0.1 && cd easy-rsa-lab-0.1
Перенесем файлы программы в данную директорию:
cp -r ~/easy-rsa ~/deb/easy-rsa-lab-0.1
Важная заметка при сборке пакета Easy-RSA
После переноса рабочей директории Easy-RSA необходимо убедиться, что в директории »easy-rsa/pki» отсутствуют файлы c информацией о сгенерированных запросов и ключах:
└─ pki
├── certs_by_serial
├── ecparams
├── issued
├── openssl-easyrsa.cnf
├── private
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
└── safessl-easyrsa.cnf
Подготовка среды для сборки пакета
Запустим инструмент, который создаст начальную структуру будущего пакета:
dh_make --indep --createorig
Maintainer Name : Nikolay
Email-Address : justnikobird@yandex.ru
Date : Mon, 25 Dec 2023 21:22:15 +0300
Package Name : easy-rsa-lab
Version : 0.1
License : blank
Package Type : indep
Are the details correct? [Y/n/q]
В результате программа создаст директорию »debian», в которой будут храниться все конфигурационные файлы, перейдем в нее и удалим лишние файлы:
cd debian/
rm *.ex
rm README.*
В результате удаления, в директории останутся следующие файлы:
changelog
control
copyright
easy-rsa-lab-docs.docs
rules*
source/
Структура фалов директории «debian»
changelog: Содержит записи о внесенных изменениях в пакет, включая номера версий, даты и описание каждого изменения. Этот файл является важным для сопровождения и отслеживания эволюции программного обеспечения.
control: Содержит метаданные о пакете Debian. В нем содержится информация, такая как имя пакета, версия, архитектура, зависимости, данные о сопровождающем и другая важная информация о пакете.
copyright: Данный файл предоставляет информацию об авторских правах и лицензионных условиях программного обеспечения, упаковываемого в пакет. В нем содержатся сведения о лицензиях, в соответствии с которыми распространяется программное обеспечение, а также о правообладателях.
easy-rsa-lab-docs.docs: Файл документации, который должн быть включены в пакет. Файл документации может включать в себя руководства, инструкции или другую текстовую информацию, относящуюся к программному обеспечению.
rules: Представляет собой файл, используемый системой упаковки Debian для сборки и упаковки программного обеспечения. В нем содержатся инструкции по сборке программного обеспечения, месту установки файлов и другие задачи, связанные с упаковкой.
source/: Данный каталог обычно содержит исходный код программного обеспечения, упаковываемого в пакет. Здесь размещается оригинальный архив с исходным кодом (часто файл с расширением .tar.gz
). Содержимое этого каталога обычно извлекается в процессе сборки.
install: Файл, который предназначен для определения того, какие файлы и директории следует установить и куда их устанавливать во время процесса установки пакета.
postinst: Bash-скрипт, который выполняется после успешной установки пакета. Здесь можно определить необходимые после установки действия, такие как настройка, добавление пользователей и т.д.
postrm: Bash-скрипт, который выполняется после успешного удаления пакета. Здесь можно определить необходимые действия, такие как очистка, удаление временных файлов и т.д.
preinst: Bash-скрипт, который выполняется перед установкой новой версии пакета. Здесь можно определить предварительные действия перед установкой.
prerm: Bash-скрипт, который выполняется перед удалением старой версии пакета. Здесь можно определить предварительные действия перед удалением.
Создадим и отредактируем файл »install», где укажем название файлов или директорий и место их установки в системе через пробел — в нашем случае укажем место установки целой директории »easy-rsa» по пути »/usr/share»:
echo "easy-rsa/ usr/share" >/home/nikolay/deb/easy-rsa-lab-0.1/debian/install
Отредактируем файл »changelog»:
easy-rsa-lab (0.1-1) UNRELEASED; urgency=medium
* Initial release
-- Nikolay Mon, 25 Dec 2023 21:22:15 +0300
Отредактируем файл »control», где укажем все необходимые зависимости для пакета в строках «Depends» и «Recommends»:
Source: easy-rsa-lab
Section: lab
Priority: optional
Maintainer: Nikolay
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: https://github.com/OpenVPN/easy-rsa
#Vcs-Browser: https://salsa.debian.org/debian/easy-rsa
#Vcs-Git: https://salsa.debian.org/debian/easy-rsa.git
Rules-Requires-Root: no
Package: easy-rsa-lab
Architecture: all
Depends: openssl
Recommends: opensc
Description: Simple shell based CA utility
This package eases the creation of certificates, for example for openvpn clients.
This was formerly part of the openvpn package.
Пояснение файла control
Source: Исходное имя пакета. Указывает на исходный пакет, из которого будет создан Debian-пакет.
Section: Поле определяет раздел (категорию) Debian, в который пакет будет классифицирован после установки.
Priority: Определяет приоритет пакета.
Maintainer: Поле указывает на того, кто поддерживает пакет, и его контактную информацию.
Build-Depends: Указывает на зависимости сборки, необходимые для построения пакета.
Standards-Version: Указывает на версию Debian Policy, с которой собирается данный пакет.
Homepage: Ссылка на домашнюю страницу проекта.
Rules-Requires-Root: Указывает на то, что для выполнения сборки не требуется root-прав.
Package: Имя бинарного пакета.
Architecture: Указывает архитектуру, на которой может быть установлен пакет.
Depends: Список пакетов, от которых зависит пакет во время выполнения.
Recommends: Список пакетов, которые рекомендуется установить вместе с данным пакетом.
Description: Описание пакета — предоставляет краткую информацию о том, что делает пакет.
Сборка пакета
Наконец выполним сборку пакета:
debuild -b -us -uc
Опции debuild
-b: Указывает debuild
построить бинарный пакет. В упаковке Debian процесс создания пакета включает два основных этапа: построение бинарного пакета и построение исходного пакета. Опция -b
указывает, что нужно построить только бинарный пакет.
-us: Указывает debuild
исключить подписание исходных пакетов. В упаковке Debian обычно принято подписывать пакеты с использованием ключа GPG для обеспечения их целостности и подлинности. Однако опция -us
пропускает подписание исходного пакета.
-uc: Указывает debuild
исключить подписание файла изменений. Файл изменений является частью исходного пакета Debian и содержит информацию о внесенных изменениях в пакет. Опция -uc
пропускает подписание этого файла.
-i: Используется для игнорирования зависимостей сборки в процессе построения пакета. Когда вы используете опцию -i
с debuild
, это указывает процессу сборки игнорировать отсутствующие зависимости сборки. Это может быть полезно в определенных ситуациях, когда вы хотите продолжить сборку даже в случае отсутствия некоторых зависимостей. Однако будьте осторожны при использовании этой опции, так как она может привести к успешной сборке, но с потенциальными проблемами во время выполнения, если отсутствуют важные зависимости.
В результате, мы получим собранный пакет »/home/nikolay/deb/easy-rsa-lab_0.1–1_all.deb»
Для установки пакета, необходимо применить следующую команду:
sudo dpkg -i /home/nikolay/deb/easy-rsa-lab_0.1-1_all.deb
Пересборка Deb-пакета
Задача:
Нам необходимо добавить в пакет OpenVPN свои файлы и пересобрать пакет заново.
Итак приступим!
Распаковка пакета
Скачаем исходный пакет программы в домашнюю директорию:
sudo apt-get download openvpn=2.5.5-1ubuntu3
Создадим временную директорию для работы с пакетом:
mkdir ~/deb
Распакуем скачанный пакет во временную директорию:
dpkg-deb -R ~/openvpn_2.5.5-1ubuntu3_amd64.deb ~/deb
В результате распаковки пакетов мы имеем следующую структуру:
deb
├── DEBIAN
│ ├── conffiles
│ ├── config
│ ├── control
│ ├── md5sums
│ ├── postinst
│ ├── postrm
│ ├── preinst
│ ├── prerm
│ └── templates
├── etc
│ ├── default
│ ├── init.d
│ ├── network
│ └── openvpn
├── lib
│ └── systemd
├── usr
│ ├── include
│ ├── lib
│ ├── sbin
│ └── share
└── var
└── log
Директория »DEBIAN» хранит в себе данные для сборки пакета, а остальные директории являются данными самой программы.
Расшифровка файлов в директории DEBIAN
conffiles: Файл, в котором перечислены файлы конфигурации, которые могут быть изменены пользователем. При обновлении пакета, если эти файлы были изменены, пользователю будет предложено решить, сохранить ли его текущую версию или принять новую.
config: Файл, содержащий параметры конфигурации для пакета. Эти параметры используются в процессе установки и обновления пакета.
control: Основной файл, содержащий метаданные о пакете, такие как имя, версия, описание, зависимости, конфликты и другие свойства. Этот файл является ключевым для системы управления пакетами Debian.
md5sums: Файл, содержащий контрольные суммы (MD5) для всех файлов в пакете. Это используется для проверки целостности файлов во время установки.
postinst: Bash-скрипт, который выполняется после успешной установки пакета. Здесь можно определить необходимые после установки действия, такие как настройка, добавление пользователей и т.д.
postrm: Bash-скрипт, который выполняется после успешного удаления пакета. Здесь можно определить необходимые действия, такие как очистка, удаление временных файлов и т.д.
preinst: Bash-скрипт, который выполняется перед установкой новой версии пакета. Здесь можно определить предварительные действия перед установкой.
prerm: Bash-скрипт, который выполняется перед удалением старой версии пакета. Здесь можно определить предварительные действия перед удалением.
templates: Bash-скрипт, содержащий шаблоны, используемые для создания интерактивных пакетов, которые запрашивают информацию у пользователя в процессе установки.
Изменение содержимого пакета
Скопируем в структуру пакета новые файлы и поменяем владельца на пользователя от имени которого выполнялась распаковка пакета:
sudo cp /etc/openvpn/server/server.conf ~/deb/etc/openvpn/server/
sudo cp -r /etc/openvpn/clients_config ~/deb/etc/openvpn/
sudo chown nikolay:nikolay ~/deb/etc/openvpn/server/server.conf
sudo chown -R nikolay:nikolay ~/deb/etc/openvpn/clients_config
Отредактируем название и версию пакета в файле »DEBIAN/control» в следующих строках:
Package: openvpn-lab
Version: 2.5.5
Перезапишем контент фала »DEBIAN/md5sums»:
cd ~/deb
find . -type f -not -path "./DEBIAN/*" -exec md5sum {} + | sort -k 2 | sed 's/\.\/\(.*\)/\1/' > DEBIAN/md5sums
Пояснение работы команды
find. -type f -not -path »./DEBIAN/*» -exec md5sum {} +:
find:
Команда для поиска файлов и директорий;.:
Начинать поиск с текущей директории;-type f:
Искать только обычные файлы (не директории и не символьные ссылки);-not -path "./DEBIAN/*":
Исключить файлы, которые находятся в директорииDEBIAN
;-exec md5sum {} +:
Для каждого найденного файла выполнить командуmd5sum
, которая вычисляет MD5-сумму содержимого файла.
| sort -k 2:
|:
Оператор конвейера, который передает вывод команды слева в команду справа;sort -k 2:
Сортирует строки по второму полю (в данном случае, по имени файла). Это нужно для того, чтобы контрольные суммы были упорядочены по имени файлов.
| sed 's/./.∗.∗/\1/':
|:
Оператор конвейера, передает вывод команды слева в команду справа;sed 's/\.\/\(.*\)/\1/':
командаsed
используется для замены строк в формате./filename
наfilename
. Таким образом, она убирает./
из путей файлов, делая их относительными.
> DEBIAN/md5sums:
>:
Оператор перенаправления вывода, который отправляет вывод команды слева в файл справа.DEBIAN/md5sums:
Записывает результат в файлmd5sums
в директорииDEBIAN
.
Сборка пакета
Выполним обратную сборку пакета:
dpkg-deb -b ~/deb ~/openvpn-lab_2.5.5_amd64.deb
Пакет успешно пересобран!
Также если вам интересна работа с RPM-пакетами, то предлагаю ознакомиться с моей статьей »Сборка RPM-пакета из исходников Python».