Pull to refresh

Работа с DEB-пакетами

Level of difficultyMedium
Reading time9 min
Views5.3K

Данные инструкции написаны для серии статей под названием «Проект юного 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».

Tags:
Hubs:
Total votes 1: ↑1 and ↓0+1
Comments12

Articles