
Данные инструкции написаны для серии статей под названием «Проект юного 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
Создадим каталог для сборки пакета (<package name>-<version>) и перейдем в него:
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 <justnikobird@yandex.ru> Mon, 25 Dec 2023 21:22:15 +0300
Отредактируем файл «control», где укажем все необходимые зависимости для пакета в строках «Depends» и «Recommends»:
Source: easy-rsa-lab Section: lab Priority: optional Maintainer: Nikolay <justnikobird@yandex.ru> 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».