1. Предисловие
Быть ответственным за машину означает заботиться как об аппаратном обеспечении, так и о программных компонентах. Как повседневный системный администратор видит, что гораздо лучше устанавливать программное обеспечение как пакет программ, а не как набор исходных файлов. Это снижает затраты на правильное обслуживание системы.
Пакеты, которые доступны у предпочитаемого вами дистрибьютора, проверяются и контролируются специалистом по сопровождению пакетов. Он протестировал программное обеспечение и заверяет, что оно подходит для других программных пакетов, доступных в дистрибутиве. Более того, пакет подписан ключом GPG от сопровождающего пакета. Это гарантирует целостность пакета и показывает, что пакет получен из надежного источника.
Формат пакета зависит от вашего дистрибутива Linux. Выбранные форматы следующие:
deb
Пакеты, используемые в: Debian GNU / Linux , Ubuntu , Армбиан , Linux Mint , Knoppix
rpm
Пакеты, используемые в: Красная Шапка , Fedora , CentOS , OpenSuse
tgz and txz
Пакеты, используемые в: Slackware
tar.xz
Пакеты, используемые в: Arch Linux
В этом документе кратко объясняется, как собрать пакет для Debian GNU / Linux. Для получения подробной информации о формате пакета Debian и инструментах для поддержки системы Linux на основе `deb` вы можете заглянуть в книгу управления пакетами Debian. [dpmb] Эти документы необходимы для создания пакетов для Debian GNU / Linux:
- Руководство нового сопровождающего Debian [dnmg]
- Справочник разработчика Debian [ГДР]
- Учебник по упаковке Debian [жестяная банка]
- Руководство по политике Debian [dpm]
Пакет, с которым мы будем работать, называется `helloworld` и имеет номер версии 0.1. В демонстрационных целях он просто содержит один скрипт Python, который выводит известное сообщение Hello, world !:
#!/usr/bin/python print ('Hello, world!')
2. Требования
2.1. Ключ GPG
В качестве шага 1 приготовьте ключ GPG. В дальнейшем ключ понадобится для подписи посылки. Имейте в виду, что неподписанные пакеты не заслуживают доверия и не могут быть частью вселенной Debian.
Если у вас еще нет ключа GPG, создайте его. Вы можете выполнить следующие три шага. Первая команда генерирует новый ключ, вторая экспортирует ваш новый ключ в отдельный файл, а третья добавляет ключ в вашу личную связку ключей.
$ gpg --gen-key $ gpg -a --output ~/.gnupg/YOUR_NAME.gpg --export 'YOUR NAME' $ gpg --import ~/.gnupg/YOUR_NAME.gpg
Во время создания убедитесь, что задано правильное имя _YOUR NAME_. Обычно используется комбинация имени и фамилии. Это имя должно быть точно таким же в пакете при создании контрольного файла пакета Debian. Дополнительную информацию о GPG можно найти в Руководстве по конфиденциальности GNU [gph].
2.2. Цепочка упаковочного инструмента
Для сборки пакета Debian с исходным кодом в вашей системе требуются следующие программные пакеты:
- строительный
- autoconf
- автопроизводитель
- autotools-dev
- dh-make
- debhelper
- сценарии разработки
- подделка
- xutils
- Lintian
- строитель
Как пользователь `root` вы можете установить их, используя следующую команду:
# apt-get install build-essential autoconf automake autotools-dev dh-make debhelper devscripts fakeroot xutils lintian pbuilder
2.3. Подготовьте программное обеспечение к упаковке
Мы должны подготовить каталог для сборки пакета. Создайте каталог для подготовки среды, в которой мы будем собирать пакет:
$ mkdir -p ~./build/helloworld/0.1
Скопируйте сжатый архив tar.gz в каталог:
$ cp helloworld-0.1.tar.gz ~./build/helloworld/0.1
Перейдите в каталог и извлеките пакет:
$ cd ~./build/helloworld/0.1 ~/build/helloworld/0.1$ tar -xzf helloworld-0.1.tar.gz
Теперь каталог содержит как исходный код в отдельном каталоге, так и сжатый архив:
~/build/helloworld/0.1$ ls helloworld-0.1 helloworld-0.1.tar.gz
3. Дебианизация
На этом этапе мы добавим файлы, относящиеся к пакету Debian. Вот почему этот шаг называется _Дебианизация_ программного обеспечения. Это делается в несколько этапов.
3.1 Подготовьте структуру пакета
Перейдите в каталог, в котором хранится весь исходный код пакета. В нашем примере пакет содержит только файл helloworld.py:
~$ cd build/helloworld/0.1/helloworld-0.1 ~/build/helloworld/0.1/helloworld-0.1$ ls helloworld.py
Давайте добавим файлы, относящиеся к пакету Debian. В игру вступает инструмент dh_make. Переключатель `-e` использует данный адрес в качестве адреса электронной почты в поле` Maintainer` файла `debian / control`. Вместо этого при создании пакета используйте свой собственный адрес электронной почты. Не забывайте использовать тот же адрес электронной почты, который соответствует вашему ключу GPG.
Ключ `-f` использует данный файл как исходный архив и пропускает копирование текущего дерева программы в` program.orig`.
~/build/helloworld/0.1/helloworld-0.1$ dh_make -e [email protected] -f ../helloworld-0.1.tar.gz
В приглашении вас попросят выбрать тип создаваемого пакета. Для выбора _ single binary_ введите `s`.
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s Maintainer name : Frank Hofmann Email-Address : [email protected] Date : Sat, 04 Nov 2017 21:16:13 +0100 Package Name : helloworld Version : 0.1 License : blank Type of Package : Single Hit to confirm: Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the helloworld Makefiles install into $DESTDIR and not in / .
В результате образуется каталог с именем `debian`:
~/build/helloworld/0.1/helloworld-0.1$ ls debian helloworld.py
Этот каталог содержит все файлы, относящиеся к пакету.
3.2. Настройте контрольный файл
Файл `debian / control` хранит зависимости, необходимые _для сборки_ пакета. Используя команду `dpkg-depcheck -d. / Configure`, вы получите список со всеми необходимыми пакетами. В нашем случае нет необходимости в дополнительном пакете, потому что Python - это интерпретируемый язык.
Затем мы должны отредактировать файл `debian / control` и добавить значения, специфичные для пакета. В нашем примере это выглядит так:
Source: helloworld Section: python Priority: optional Maintainer: Frank Hofmann < [email protected] > Build-Depends: debhelper (>= 9) Standards-Version: 3.9.5 Homepage: http://www.efho.de/ #Vcs-Git: git://anonscm.debian.org/collab-maint/helloworld.git #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/helloworld.git;a=summary Package: helloworld Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python Description: Prints Hello World in Python Prints Hello World in Python
3.3. Отрегулируйте файл авторских прав
Файл `debian / copyright` содержит лицензионную информацию для программного пакета. Он подготовлен к выпуску по лицензии GNU Public License 2 (GPLv2). В нашем примере это выглядит так:
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: helloworld Source: http://www.efho.de/ Files: debian/* Copyright: 2017 Frank Hofmann < [email protected] > License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in '/usr/share/common-licenses/GPL-2'.
3.4. Отрегулируйте файл журнала изменений
После информации об авторских правах необходимо изменить файл `debian / changelog`. В нашем примере мы добавляем информацию Первоначальный выпуск.
helloworld (0.1-1) unstable; urgency=low * Initial release -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100
На данный момент это все, что нам нужно - теперь, наконец, мы можем собрать пакет.
4. Соберите пакет.
Чтобы собрать пакет, нам нужно переместиться на один каталог вверх и выполнить следующую команду:
~/build/helloworld/0.1/helloworld-0.1$ dpkg-buildpackage -rfakeroot
Параметр `-rfakeroot` позволяет` dpkg-buildpackage` запускать команды от имени привилегированного пользователя с помощью команды `fakeroot`. Это необходимо для подготовки пакета, а также для создания файлов и каталогов.
Приведенная выше команда приводит к более длинному списку выходных сообщений (показанному здесь в немецкоязычной среде):
dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellversion 0.1-1 dpkg-buildpackage: Quelldistribution unstable dpkg-buildpackage: Quellen geändert durch Frank Hofmann < [email protected] > dpkg-buildpackage: Host-Architektur amd64 dpkg-source --before-build helloworld-0.1 fakeroot debian/rules clean dh clean dh_testdir dh_auto_clean dh_clean dpkg-source -b helloworld-0.1 dpkg-source: Information: Quellformat 3.0 (quilt) wird verwendet dpkg-source: Information: helloworld wird unter Benutzung des existierenden ./helloworld_0.1.orig.tar.gz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.debian.tar.xz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.dsc gebaut debian/rules build dh build dh_testdir dh_auto_configure dh_auto_build dh_auto_test fakeroot debian/rules binary dh binary dh_testroot dh_prep dh_auto_install dh_installdocs dh_installchangelogs dh_perl dh_link dh_compress dh_fixperms dh_strip dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dpkg-gencontrol: Warnung: Feld Depends von Paket helloworld: unbekannte Substitutionsvariable ${shlibs:Depends} dh_md5sums dh_builddeb dpkg-deb: Paket helloworld wird in ../helloworld_0.1-1_amd64.deb gebaut. dpkg-genchanges <../helloworld_0.1-1_amd64.changes dpkg-genchanges: kompletter Quellcode beim Hochladen hinzufügen dpkg-source --after-build helloworld-0.1 dpkg-buildpackage: Alles hochzuladen (Originalquellen enthalten) signfile helloworld_0.1-1.dsc Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren. Benutzer: 'Frank Hofmann (Hofmann EDV) < [email protected] > ' 4096-Bit RSA Schlüssel, ID D431AC07, erzeugt 2014-09-05
4.1. Проверка пакета
Поздравляем - вам удалось собрать пакет Debian - да! А теперь посмотрим на упаковку поближе. Здесь в игру вступает `lintian`. Этот инструмент проверяет ваш пакет, чтобы выявлять нарушения строгих правил, которым должны соответствовать пакеты Debian.
Чтобы запустить тесты, введите следующую команду:
lintian helloworld_0.1-1_amd64.deb
Инструмент не обнаруживает нарушения правил, но также орфографические ошибки и неправильные символы. Переключатель «–pedantic» требует, чтобы «lintian» был более критичным, чем обычно. Как вы можете видеть ниже, lintian немного сварливый и обнаружил три предупреждения и одну ошибку.
За исключением первого предупреждения, мы можем легко осчастливить `lintian` и скорректировать содержимое пакета в соответствии с набором правил. Предупреждение `new-package-should-close-itp-bug` означает, что в пакете ITP нет отчета об ошибке (ITP означает _intended to package_). Для обычного пакета Debian отчет об ошибке должен быть отправлен в программу отслеживания ошибок для пакета ITP, чтобы уведомить других о том, что вы собираетесь начать упаковывать это программное обеспечение.
4.2. Предупреждение: `readme-debian-contains-debmake-template
Файл `README.Debian` предназначен для хранения дополнительных заметок относительно этого пакета. `dh_make` создал для нас этот файл:
helloworld for Debian --------------------- -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100
В нашем примере у нас нет дополнительной информации, поэтому мы можем удалить файл.
4.3. Предупреждение: `описание-начинается-с-ведущими-пробелами`
Это предупреждение возникает из-за того, что более подробное описание нашего пакета в файле `debian / control` начинается с нескольких пробелов. Как только мы удалим один пробел, предупреждение исчезнет.
4.4. Ошибка: `description-synopsis-is-duplicated`
Каждый пакет требует как краткого, так и более подробного описания в `debian / control`. Эта ошибка возникает из-за того, что оба описания идентичны. Как только мы расширили более подробное описание, ошибка исчезнет.
5. Ссылки и справочные материалы
- [ddr] Андреас Барт, Адам Ди Карло, Рафаэль Герцог, Лукас Нуссбаум, Кристиан Шварц, Ян Джексон: Справочник разработчика Debian
- [Dnmg] Иосип Родин, Осаму Аоки: Руководство нового сопровождающего Debian
- [dpmb] Аксель Бекерт, Франк Хофманн: Книга по управлению пакетами Debian
- [dpm] Руководство по политике Debian
- [жестяная банка] Учебник по упаковке Debian
- [gph] Справочник по конфиденциальности GNU
- [lushpaiPackage] Алекс Лушпай: Как создать пакет debian из исходного кода
6. Благодарности
Автор благодарит Аксель Бекерт а также Герольд Руппрехт за поддержку и критику при подготовке этой статьи.