Jurik-Phys.Net.Ru

~ Простота и ясность ~

Инструменты пользователя

Инструменты сайта


Боковая панель

Категории

Контакты

itechnology:linux-pkg-deb


Внимание!
Сайт Jurik-Phys.Net сменил адрес: Jurik-Phys.Net.Ru


Инструкция по сборке deb пакета

Сборка deb пакета на примере сервиса pingfinder-msgd

Планируемый результат

Пакет pingfinder-msgd должен устанавливать:

  • исполняемый файл:
    /usr/bin/pingfinder-msgd
  • unit файл сервиса systemd:
    /usr/lib/systemd/system/pingfinder-msgd.service
  • примеры файлов конфигурации:
    /usr/share/doc/pingfinder-msgd/examples/
  • рабочий каталог сервиса:
    /var/lib/pingfinder/msgd/

Также в систему должен быть добавлен пользователь pingfinder для выполнения сервиса, пакет должен иметь зависимость от используемой библиотеки Qt.

Установка необходимых утилит Debian packaging

На Debian:

# apt install debhelper dpkg-dev devscripts

Создание рабочей структуры в корне проекта

debian/
├── source
│      └── format
├── changelog
├── control
├── install
├── pingfinder-msgd.postinst
├── pingfinder-msgd.postrm
├── pingfinder-msgd.service
└── rules

format

Если Debian packaging не найдёт файл debian/source/format, то будет использовать формат исходного пакета 1.0, для современного Debian-пакета предпочтительно использовать 3.0 (quilt)

  • format:
    3.0 (quilt)

Важно. Формат 3.0 (quilt) предполагает наличие исходного архива проекта .orig.tar.xz, без него сборка не состоится. На первых этапах можно обойтись версией исходного пакета 1.0:

  • format:
    1.0

changelog

Для автоматического формирования файла debian/changelog используется скрипт generate-changelog.sh, который формирует changelog на основании истории Git, а версию пакета берёт из CMakeLists.txt.

control

Это один из главных файлов пакета. В нём описываются сам пакет и его зависимости.

Source: pingfinder-msgd
Section: misc
Priority: optional
Maintainer: Yury Ovsyannikov <jurik.phys@gmail.com>
Build-Depends: debhelper-compat (= 13),
               cmake,
               qt6-base-dev
Standards-Version: 4.7.0
Rules-Requires-Root: no

Package: pingfinder-msgd
Architecture: any
Depends: ${shlibs:Depends},
         ${misc:Depends}
         adduser
Description: PingFinder message daemon
 Background service for scheduling and sending SMS messages to
 PingFinder clients.

Здесь:

  • Build-Depends - зависимости, необходимые для сборки пакета.
  • Depends: ${shlibs:Depends} - зависимости установленного бинарника. Debian автоматически подставит необходимые runtime-библиотеки, включая Qt, если они действительно используются ELF-бинарником.
  • Standards-Version: 4.7.0 - декларация о том, какой версии стандартов Debian Policy соответствует пакет.
  • adduser нужен для корректного создания системного пользователя Debian-способом

install

В этом файле необходимо указать, какие дополнительные файлы требуется поместить в пакет.

examples/config/clients.json   usr/share/doc/pingfinder-msgd/examples
examples/config/transport.json usr/share/doc/pingfinder-msgd/examples

Необходимо отметить, что в общем случае запись вида debian/pingfinder-msgd.service usr/lib/systemd/system не требуется для помещения systemd юнита в нужное место т.к., dh_installsystemd сам его обработает и поместит в требуемое место файловой иерархии.

В противном случае, один и тот же service-файл попадает в .deb дважды, вызывая проблемы при установке пакета:

dpkg-deb -c pingfinder-msgd_0.0.3-1_amd64.deb | grep 'pingfinder-msgd.service'
-rw-r--r-- root/root       230 2026-09-24 15:06 ./lib/systemd/system/pingfinder-msgd.service
-rw-r--r-- root/root       230 2026-09-24 15:06 ./usr/lib/systemd/system/pingfinder-msgd.service

pingfinder-msgd.postinst

Исполняемый скрипт debian/pingfinder-msgd.postinst выполняет настройку окружения pingfinder-msgd после установки или обновления пакета:

  • создаёт системного пользователя и группу pingfinder, если они ещё не существуют;
  • создаёт marker-файл .msgd-user-created, позволяющий определить, был ли пользователь создан данным пакетом;
  • создаёт каталоги:
    • /etc/pingfinder/msgd/ — конфигурация сервиса;
    • /var/lib/pingfinder/msgd/ — постоянные данные;
  • устанавливает для обоих каталогов владельца pingfinder:pingfinder и права 0700.

▸ Исходный код pingfinder-msgd.postinst

▾ Исходный код скрипта pingfinder-msgd.postinst

#!/bin/sh
set -e
 
USER_NAME="pingfinder"
 
CONFIG_DIR="/etc/pingfinder/msgd"
RUNTIME_DIR="/var/lib/pingfinder/msgd"
 
STATE_DIR="/var/lib/pingfinder"
USER_CREATED_MARKER="${STATE_DIR}/.msgd-user-created"
 
case "$1" in
    configure)
        if ! getent passwd "$USER_NAME" >/dev/null 2>&1; then
            adduser \
                --system \
                --group \
                --no-create-home \
                --disabled-login \
                "$USER_NAME"
 
            mkdir -p "$STATE_DIR"
            touch "$USER_CREATED_MARKER"
            chmod 600 "$USER_CREATED_MARKER"
        fi
 
        install -d \
            -o "$USER_NAME" \
            -g "$USER_NAME" \
            -m 700 \
            "$CONFIG_DIR"
 
        install -d \
            -o "$USER_NAME" \
            -g "$USER_NAME" \
            -m 700 \
            "$RUNTIME_DIR"
        ;;
esac
 
exit 0


pingfinder-msgd.postrm

Исполняемый скрипт debian/pingfinder-msgd.postrm выполняет действия после удаления или полного удаления (purge) пакета:

  • при remove удаляет каталог данных /var/lib/pingfinder/msgd/;
  • при purge дополнительно удаляет конфигурацию /etc/pingfinder/msgd/;
  • при purge удаляет системного пользователя и группу pingfinder, только если они были созданы этим пакетом;
  • удаляет marker-файл .msgd-user-created;
  • удаляет /var/lib/pingfinder, если после этого он пуст;

▸ Исходный код pingfinder-msgd.posrm

▾ Исходный код скрипта pingfinder-msgd.postrm

#!/bin/sh
set -e
 
USER_NAME="pingfinder"
CONFIG_DIR="/etc/pingfinder/msgd"
RUNTIME_DIR="/var/lib/pingfinder/msgd"
STATE_DIR="/var/lib/pingfinder"
USER_CREATED_MARKER="${STATE_DIR}/.msgd-user-created"
 
case "$1" in
    remove)
        # Runtime data is not preserved.
        rm -rf "$RUNTIME_DIR"
        ;;
    purge)
        # Configuration is removed only on purge.
        rm -rf "$CONFIG_DIR"
 
        # Remove the user only if this package created it.
        if [ -f "$USER_CREATED_MARKER" ]; then
            if getent passwd "$USER_NAME" >/dev/null 2>&1; then
                deluser --system "$USER_NAME"
            fi
 
            if getent group "$USER_NAME" >/dev/null 2>&1; then
                delgroup --system "$USER_NAME"
            fi
        fi
 
        rm -f "$USER_CREATED_MARKER"
 
        # Remove the state directory if it is now empty.
        rmdir "$STATE_DIR" 2>/dev/null || true
        ;;
esac
exit 0


pingfinder-msgd.service

Systemd-юнит pingfinder-msgd.service служит для запуска и управления демоном pingfinder-msgd:

  • запускает /usr/bin/pingfinder-msgd от имени пользователя и группы pingfinder;
  • использует тип запуска simple;
  • запускается после инициализации сетевого стека;
  • автоматически перезапускает демон при аварийном завершении с таймаутом 10 минут;
  • подключается к стандартной цели multi-user.target.

▸ Исходный код pingfinder-msgd.service

▾ Исходный код скрипта pingfinder-msgd.service

[Unit]
Description=PingFinder Message Daemon
After=network.target
 
[Service]
Type=simple
User=pingfinder
Group=pingfinder
ExecStart=/usr/bin/pingfinder-msgd
Restart=on-failure
RestartSec=600
 
[Install]
WantedBy=multi-user.target


rules

Это основной сценарий сборки Debian-пакета. Для CMake современный минимальный вариант:

#!/usr/bin/make -f
 
%:
	dh $@

Необходимо помнить, что перед dh $@ должен быть TAB, а не пробел. Также файл необходимо сделать исполняемым:

chmod +x debian/rules

На этом этапе debhelper сам выполнит стандартные этапы с использованием CMake:

configure
build
install
strip
generate dependencies
build .deb
...

Install rules в CMakeLists.txt

Чтобы Debian packaging смог установить приложение, CMake должен иметь install rules:

install(TARGETS pingfinder-msgd
    RUNTIME DESTINATION bin
)

Скрипт сборки deb пакета

Поскольку для сборки пакета уже требуется наличие файла changelog, то генерацию этого файла надо вызывать до основного этапа сборки deb пакета.

Реализовать это можно с помощью скрипта scripts/build-deb.sh:

#!/bin/bash
 
REPO_ROOT=$(git rev-parse --show-toplevel)
 
"${REPO_ROOT}/scripts/generate-changelog.sh"
 
cd "$REPO_ROOT"
 
dpkg-buildpackage -us -uc

Сделать исполняемым:

chmod +x build-deb.sh

Очистка после сборки

В корне проекта необходимо выполнить:

dpkg-buildpackage -T clean
itechnology/linux-pkg-deb.txt · Последнее изменение: — jurik_phys

Инструменты страницы