Главная >> Инструкции >> Создание deb пакетов

Создание deb пакетов

Самый популярный способ распространения программ в Linux - это репозитории программного обеспечения. В репозиториях программы находятся в специальном формате. В Debian и основанных на нём дистрибутивах используется формат пакетов deb. В этих пакетах находится архив всех файлов программы, инструкции по их установке в системе для пакетного менеджера, а также другая служебная информация.

В этой статье мы рассмотрим как собрать deb пакет для своей программы без использования каких-либо сторонних инструментов. Мы не будем рассматривать подпись пакетов для репозиториев, потому что для каждого вида репозиториев команды будут отличаться.


Содержание статьи

Создание deb пакетов

Шаг 1. Подготовка

Давайте создадим для этого примера небольшую программу на Си. Она будет называться hellolosst и будет выводить на экран строку Hello from losst.pro в терминал при запуске. Сначала создайте папку hellolosst и перейдите в неё:

mkdir hellolosst
cd hellolosst

Затем поместите в неё файл с исходным кодом:

vi hellolosst.c

#include <stdio.h>
int main(){
printf("Hello from losst.pro\n");
}

Для компиляции программы выполните такую команду:

gcc hellolosst.c -o hellolosst

Затем вы можете её выполнить:

./hellolosst

Таким образом, теперь у нас есть программа, которую надо упаковать в deb пакет.

2. Создание манифеста

В каждом deb пакете содержаться не только файлы самой программы, но и файл манифеста, в котором описан пакет, его зависимости и параметры. Этот файл имеет название control и должен находится в папке DEBIAN. Для сборки пакета будем использовать папку package, чтобы файлы программы не путались с исходными файлами и те не попали в пакет. Создайте эти папку:

mkdir -p package/DEBIAN

Прежде чем вы сможете создать этот файл надо узнать несколько вещей. Первым делом надо посмотреть размер файлов программы, поскольку в данном случае файл один, достаточно посмотреть его размер:

du -k ./hellolosst

Если файлов несколько, то можно удалить исходники и посмотреть общий размер папки с файлами программы. Дальше надо понять от каких пакетов будет зависеть ваша программа. Для этого воспользуйтесь командой objdump:

objdump -p ./hellolosst | grep NEEDED

В данном случае программе необходима только libc. Чтобы посмотреть в каком пакете она находится выполните:

dpkg -S libc.so.6

Пакет называется libc6. Затем создайте файл манифеста со следующим содержимым:

vi package/DEBIAN/control

Package: hellolosst
Version: 1.0
Section: unknown
Priority: optional
Depends: libc6
Architecture: amd64
Essential: no
Installed-Size: 20
Maintainer: losst.pro <admin@losst.pro>
Description: Print hello from losst line

Это минимальный набор параметров в файле манифеста. Вот их значение:

  • Package - имя пакета;
  • Version - версия программы в пакете, будет использована при обновлении пакета;
  • Section - категория пакета, позволяет определить зачем он нужен;
  • Priority - важность пакета, для новых пакетов, которые ни с чем не конфликтуют обычно прописывают optional, кроме того доступны значения required, important или standard;
  • Depends - от каких пакетов зависит ваш пакет, он не может быть установлен, пока не установлены эти пакеты;
  • Recommends - необязательные пакеты, но тем не менее они обычно устанавливаются по умолчанию в apt;
  • Conflicts - пакет не будет установлен, пока в системе присутствуют перечисленные здесь пакеты;
  • Architecture - архитектура системы, в которой можно установить этот пакет, доступные значения: i386, amd64, all, последнее означает, что архитектура не имеет значения;
  • Installed-Size - общий размер программы после установки;
  • Maintainer - указывает кто собрал этот пакет и кто отвечает за его поддержку;
  • Description - краткое описание пакета.

3. Расположение файлов

Манифест готов. Теперь в папке пакета надо создать структуру папок, аналог того, что есть в корневой файловой системе. В данном случае надо создать папку usr/bin и поместить туда исполняемый файл:

mkdir -p package/usr/bin

mv ./hellolosst package/usr/bin

4. Скрипты установки

Несмотря на то, что система установки пакетов очень мощная и позволяет делать многое, некоторые вещи всё же сделать нельзя. Для решения этой проблемы была предусмотрена возможность выполнять скрипты перед установкой пакета и после. Аналогично это работает для удаления пакета - перед и после. Эти скрипты называются preinst, postinst, prerm и postrm. Каждый файл просто содержит набор скриптов, которые надо выполнить. Например:

vi package/DEBIAN/postinst

#!/bin/bash
echo "Hello from losst installed"

Разработчики Debian не рекомендуют использовать эти скрипты без крайней надобности, поскольку они дают вам полный контроль над системой пользователя и вы можете случайно что-то повредить. Обычно эти скрипты используются для того чтобы задавать пользователям вопросы и на основе этого генерировать конфигурационные файлы.

5. Сборка и проверка пакета

Осталось собрать настроенный пакет. Для этого используйте такую команду:

dpkg-deb --build ./package

Теперь вы знаете как как собрать deb пакет. После завершения сборки можете установить его с помощью apt:

sudo apt install ~/hellolosst.deb

После этого исполняемый файл программы появится в /usr/bin, а сообщение из postinst будет выведено после установки.

Выводы

В этой небольшой статье мы рассмотрели как выполняется создание deb пакета с помощью инструмента dpkg-deb. Как видите, всё очень просто. Вам достаточно написать манифест и расположить файлы там, где они должны быть. Мы рассмотрели здесь только самые основы. На самом деле создание пакетов намного сложнее. Существует целый набор утилит debhelpers, которые используются на различных этапах сборки и установки deb пакетов, подробнее обо всём этом вы можете прочитать в официальной документации.

Creative Commons License
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

9 комментариев к “Создание deb пакетов”

  1. А как быть если не одна зависимость а несколько? Их надо через запятую указывать в Depends: или нужно для каждой зависимости писать Depends: зависимость Depends: зависимость ?

    Ответить
  2. Если надо создавать пакеты под несколько дистрибутивов -Debian+Ubuntu или даже разные версии убунт, то приходится править control-файл в несколько раз. Что, очевидно, не удобно.
    Когда я писал LxQt меня это задолбало, и я написал скрипт для препроцессинга и сборки deb пакетов. С тех пор много воды утекло, я уже не разрабатываю LxQt и не знаю используют ли они мой скрипт, но я до сих пор пользуюсь этим скриптом для сборки пары своих проектов.

    Вот сам скрипт - https://github.com/SokoloffA/makeDeb

    Пример использования - https://github.com/SokoloffA/makeDeb/tree/master/examples/ttaenc

    Ответить
  3. Для создания пакетов deb пользуюсь скриптами, типа этого:
    =================
    #!/bin/env bash

    name="fonts-go"
    fontname="go"

    # Создаем каталог source и загружаем в него шрифты go
    mkdir source
    ( cd source; git clone https://go.googlesource.com/image )

    # Создаем дерево каталогов пакета
    install -v -d -m755 ${name}/etc/fonts/conf.d
    install -v -d -m755 ${name}/etc/fonts/conf.avail
    install -v -d -m755 ${name}/usr/share/appdata

    # Устанавливаем ttf-шрифты в свой каталог
    install -Dm644 source/image/font/gofont/ttfs/Go-*.tt[fc] -t ${name}/usr/share/fonts/truetype/${fontname}

    # Записываем конфиг 33-go-fonts-fontconfig.conf
    echo '

    Cambria

    Go

    Go

    Cambria

    ' > ${name}/etc/fonts/conf.avail/33-${fontname}-fontconfig.conf

    # Записываем конфиг 63-go-fonts-fontconfig.conf
    echo '

    serif

    Go

    Go

    serif

    ' > ${name}/etc/fonts/conf.avail/63-${fontname}-fontconfig.conf

    # Делаем симлинки
    ( cd ${name}/etc/fonts/conf.d ; ln -sf /etc/fonts/conf.avail/33-${fontname}-fontconfig.conf . )
    ( cd ${name}/etc/fonts/conf.d ; ln -sf /etc/fonts/conf.avail/63-${fontname}-fontconfig.conf . )

    # Добавляем метаданные AppStream
    echo '
    <!-- Copyright 2017 Vincent Batts -->

    go-fonts
    CC-BY-3.0
    go-fonts
    golang fonts

    Produced specifically for the Go Project by Bigelow and Holmes type foundry.

    vbatts_at_redhat_dot_com
    https://blog.golang.org/go-fonts

    ' > ${name}/usr/share/appdata/${fontname}.metainfo.xml

    # Создаем каталог DEBIAN

    mkdir ${name}/DEBIAN

    # Вписываем в него контрольную сумму всех устанавливаемых файлов пакета
    ( cd ${name}; md5sum etc/fonts/conf.avail/* > md5sum;
    md5sum etc/fonts/conf.d/* >> md5sum;
    md5sum usr/share/appdata/* >> md5sum;
    md5sum usr/share/fonts/truetype/${fontname}/* >> md5sum )
    mv ${name}/md5sum ${name}/DEBIAN/

    # Вписываем в него файл control
    echo 'Package: fonts-go
    Source: fonts-go
    Version: 1.0
    Architecture: all
    Maintainer: LinuxMint Developers
    Section: fonts
    Priority: optional
    Description: width-compatible fonts for improved on-screen readability
    Produced specifically for the Go Project by Bigelow and Holmes type foundry.
    Original-Maintainer: Debian Fonts Task Force
    ' > ${name}/DEBIAN/control

    # Вписываем в него файл conffiles
    echo '/etc/fonts/conf.avail/33-go-fontconfig.conf
    /etc/fonts/conf.avail/63-go-fontconfig.conf
    ' > ${name}/DEBIAN/conffiles

    # Добавляем скрипт срабатывающий после установки пакета
    echo '#!/bin/sh
    set -e

    if [ -x /usr/bin/fc-cache ]; then
    /usr/bin/fc-cache -f
    fi
    ' > ${name}/DEBIAN/postinst
    chmod ugo+x ${name}/DEBIAN/postinst

    # Добавляем скрипт срабатывающий после удаления пакета
    echo '#!/bin/sh
    set -e

    if [ -x /usr/bin/fc-cache ]; then
    /usr/bin/fc-cache -f
    fi
    ' > ${name}/DEBIAN/postrm
    chmod ugo+x ${name}/DEBIAN/postrm

    # Создаем пакет *.deb
    fakeroot dpkg -b ${name}/ .
    =============================

    Ответить
  4. Здравствуйте, я действовал по инструкции но мне выдаёт ошибку:
    sudo apt install ~/hellolosst.deb
    Чтение списков пакетов… Готово
    E: В командной строке указан неподдерживаемый файл /home/*имя домашнего каталога*/hellolosst.deb
    Что делать?

    Ответить

Оставьте комментарий