Product SiteDocumentation Site

Глава 15. Создание пакета Debian

15.1. Пересборка пакета из его исходного кода
15.1.1. Получение исходного кода
15.1.2. Внесение изменений
15.1.3. Запуск пересборки
15.2. Сборка вашего первого пакета
15.2.1. Метапакеты или пакеты-пустышки
15.2.2. Простое файловое хранилище
15.3. Создание репозитория пакетов для APT
15.4. Как стать сопровождающим пакета
15.4.1. Учимся создавать пакеты
15.4.2. Процесс принятия
Нередко администратор, постоянно имеющий дело с пакетами Debian, со временем чувствует необходимость в создании своих собственных пакетов или изменении существующего пакета. Цель этой главы состоит в том, чтобы ответить на наиболее распространенные вопросы в этой области, а также предоставить необходимые базовые знания для использования инфраструктуры Debian наилучшим образом. Если повезет, после попытки приложить руку к созданию локальных пакетов вы даже можете почувствовать потребность в том, чтобы пойти дальше и присоединиться к самому Проекту Debian!

15.1. Пересборка пакета из его исходного кода

Пересборка двоичного пакета требуется при ряде обстоятельств. В некоторых случаях администратору нужна функциональность программы, для активации которой необходима компиляция из исходного кода с определенной опцией; в других программное обеспечение, упакованное в установленной версии Debian, недостаточно актуально. В последнем случае администратору обычно нужно собрать более свежий пакет, взятый из более новой версии Debian — например Testing или даже Unstable — чтобы новый пакет заработал в дистрибутиве Stable; эта операция называется «бэкпортирование». Как обычно, прежде чем приступать к такой задаче, следует проверить, не был ли такой пакет уже создан, — для этого достаточно беглого взгляда на страницу данного пакета в Системе отслеживания пакетов Debian.

15.1.1. Получение исходного кода

Пересборка пакета Debian начинается с получения его исходного кода. Самый простой способ - использовать команду apt-get source package-name. Эта команда требует наличия строки deb-src в файле /etc/apt/sources.list и актуальных индексных файлов (т.е. apt-get update). Эти условия уже должны быть выполнены, если вы следовали инструкциям из главы, посвященной настройке APT (см. Раздел 6.1, «Содержимое файла sources.list»). Однако обратите внимание, что вы будете загружать исходные пакеты из версии Debian, указанной в строке deb-src.
Если вам нужна другая версия, вам может потребоваться загрузить её вручную с зеркала Debian или с веб-сайта. Это включает в себя получение двух или трёх файлов (с расширениями *.dsc - для Debian Source Control - *.tar.comp, и иногда *.diff.gz или *.debian.tar. comp - comp принимает одно из значений gz, bz2 или xz в зависимости от используемого средства сжатия), то выполните команду dpkg-source -x file.dsc. Если файл *.dsc доступен непосредственно по заданному URL, есть еще более простой способ получить его целиком с помощью команды dget URL. Эта команда (которую можно найти в пакете devscripts) получает файл *.dsc по указанному адресу, затем анализирует его содержимое и автоматически получает файл или файлы, на которые в нем есть ссылки. После того, как всё загружено, он проверяет целостность загруженных исходных пакетов с помощью dscverify, и извлекает исходный пакет (если не используется опция -d или --download-only). Если не указана опция -u, потребуется связка ключей Debian.

15.1.2. Внесение изменений

Для примера возьмём пакет samba.
$ apt source samba
Reading package lists... Done
NOTICE: 'samba' packaging is maintained in the 'Git' version control system at:
https://salsa.debian.org/samba-team/samba.git -b bookworm
Please use:
git clone https://salsa.debian.org/samba-team/samba.git -b bookworm
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 18.5 MB of source archives.
Get:1 http://deb.debian.org/debian bookworm/main samba 2:4.17.12+dfsg-0+deb12u1 (dsc) [4,466 B]
Get:2 http://deb.debian.org/debian bookworm/main samba 2:4.17.12+dfsg-0+deb12u1 (tar) [18.2 MB]
Get:3 http://deb.debian.org/debian bookworm/main samba 2:4.17.12+dfsg-0+deb12u1 (diff) [273 kB]
Fetched 18.5 MB in 0s (59.1 MB/s)
dpkg-source: info: extracting samba in samba-4.17.12+dfsg
dpkg-source: info: unpacking samba_4.17.12+dfsg.orig.tar.xz
dpkg-source: info: unpacking samba_4.17.12+dfsg-0+deb12u1.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying libsmbclient-ensure-lfs-221618.patch
dpkg-source: info: applying hurd-compat.patch
dpkg-source: info: applying [...]
Источник пакета теперь доступен в каталоге, названном в честь исходного пакета и его версии (samba-4.17.12+dfsg); именно здесь мы будем работать над нашими локальными изменениями.
Первое, что необходимо сделать, это изменить версию пакета, чтобы пересобранные пакеты можно было отличить от оригинальных, предоставляемых Debian. Если предположить, что текущая версия — 2:4.17.12+dfsg-0+deb12u1, мы можем создать версию 2:4.17.12+dfsg-0+deb12u1+falcot1, что явно указывает на происхождение пакета. Номер версии становится выше, чем у пакета, предоставленного Debian, таким образом, пакет можно будет легко установить как обновление оригинального пакета. Такое изменение лучше всего осуществляется с помощью команды dch (Debian CHangelog) из пакета devscripts.
$ cd samba-4.17.12+dfsg
$ dch --local +falcot
Последняя команда вызывает текстовый редактор (sensible-editor — это должен быть ваш любимый редактор, если он указан в переменной окружения VISUAL или EDITOR, а в противном случае редактор по умолчанию) для того, чтобы документировать изменения, внесенные данной пересборкой. Этот редактор показывает нам, что dch действительно изменила файл debian/changelog.
В случае, если требуются изменения в опциях сборки, они вносятся в файл debian/rules, который управляет шагами процесса сборки пакета. В простейших случаях строки, относящиеся к начальной конфигурации (./configure …) или к собственно сборке ($(MAKE) … или make … или cmake … или …) легко обнаружить. Если эти команды не вызываются явно, они, вероятно, являются побочным эффектом другой явной команды; в этом случае обратитесь к их документации, чтобы выяснить, как изменить поведение по умолчанию. В случае пакетов, использующих dh, может понадобиться переопределить команду dh_auto_configure или dh_auto_build (подробности см. на соответствующих страницах руководства и debhelper(7) для получения объяснений о том, как этого добиться).
В зависимости от локальных изменений в пакетах может потребоваться также обновление файла debian/control, который содержит описание создаваемых пакетов. В частности, этот файл содержит строки Build-Depends, контролирующие список зависимостей, которые должны быть удовлетворены на этапе сборки пакета. Они часто ссылаются на версии пакетов, содержащиеся в дистрибутиве, откуда взят исходный код, но которые могут быть недоступны в дистрибутиве, используемом для пересборки. Не существует автоматизированного способа определить, является ли зависимость реальной, или же она указана только с целью гарантировать выполнение сборки исключительно с последней версией библиотеки, — это единственный доступный способ заставить autobuilder использовать данную версию пакета во время сборки, из-за чего сопровождающие Debian часто используют строго версионированые сборочные зависимости.
Если вы точно знаете, что эти сборочные зависимости слишком строги, не стесняйтесь ослабить их локально. Чтение файлов, документирующих стандартный способ сборки программного обеспечения — эти файлы часто называют INSTALL — поможет выяснить соответствующие зависимости. В идеале все зависимости должны быть удовлетворены из дистрибутива, используемого для пересборки; в противном случае начинается рекурсивный процесс, в результате которого пакеты, упомянутые в поле Build-Depends, должны быть бэкпортированы раньше целевого пакета. Некоторые пакеты могут не требовать бэкпортирования, и их можно установить как есть в процессе сборки (ярким примером является debhelper). Обратите внимание, что процесс бэкпортирования может стать лавинообразным, если вы не будете осторожны. Поэтому бэкпорты должны быть сведены к абсолютному минимуму, насколько это возможно.

15.1.3. Запуск пересборки

Когда все необходимые изменения внесены в исходный код, мы можем запустить создание собственно двоичного пакета (файл .deb). Весь процесс управляется командой dpkg-buildpackage.

Пример 15.1. Пересборка пакета

$ dpkg-buildpackage -us -uc
[...]
Предыдущая команда может потерпеть неудачу, если поле Build-Depends не было обновлено, или если соответствующие пакеты не установлены. В таком случае можно отменить эту проверку, пройдя -d на dpkg-buildpackage. Однако явное игнорирование этих зависимостей рискует провалиться на более позднем этапе. Хуже того, пакет может показаться правильным, но не будет работать должным образом: некоторые программы автоматически отключают некоторые из своих функций, когда необходимая библиотека не доступна во время создания. Переключатель всё ещё может быть очень полезным, если вы только хотите создать исходный пакет, который, как предполагается, будет передан для очистки среды сборки, как описано в КРАТКИЙ ЭКСКУРС Сборка пакетов в chrooted и виртуальных окружениях.
Другие варианты, используемые в приведенном выше примере, убедитесь, что ни исходный пакет .dsc (-us), ни произведённый файл .changes (-uc) не подписаны криптографическим ключом сборщика пакетов после успешной сборки.
В большинстве случаев разработчики Debian используют программу более высокого уровня, такую как debuild; она запускает dpkg-buildpackage как обычно, но также добавляет вызов программы, выполняющей множество проверок пакета на соответствие политике Debian. Этот сценарий также очищает окружение, так что локальные переменные окружения не «загрязняют» сборку пакета. Команда debuild — один из инструментов набора devscripts, который берёт на себя часть работы по обеспечению постоянства и настройке, чтобы сделать задачу сопровождающего более лёгкой.