Присоединяйтесь!
Авторизация
репозиторий    apt-get    deb    dpkg   

Создаём собственный Raspbian репозиторий

31 May 2016 - Автор raspiman

В Windows для установки софта как правило следует запустить файл инсталятора и следовать его инструкциям в оконном режиме, задав папку для установки и т.д

В Linux концепция установки ПО полностью отличается. Хотя Windows-подобные инсталяторы встречаются и для Linux софта, наиболее распространёнными вариантами являются:

  • Установка ПО из исходных кодов
  • Установка ПО из бинарных пакетов

Второй вариант является самым простым и распространённым. В этой статье мы рассмотрим структуру таких пакетов, методику их создания, а также менеджер пакетов apt-get и создание репозитория, из которого apt-get может устанавливать ПО.

В мире Linux наиболее распространёнными форматами пакетов являются rpm ( используются в дистрибутивах Red Hat, Fedora), и deb (используются в дистрибутивах Debian, Ubuntu).

В Raspbian соответственно используются deb пакеты

Установка/удаление пакета производится утилитой dpkg:

установка: dpkg -i файл_пакета.deb

частичное удаление пакета: dpkg -r файл_пакета.deb Остаются настройки пакета, пользовательские данные и т.д

полное удаление пакета: dpkg -P файл_пакета.deb

дополнительные возможности dpkg:

dpkg -L название_пакета - список файлов, установленных пакетом в файловую систему.

dpkg -S имя_файла - покажет, какой пакет установил данный файл

dpkg -s название_пакета - вывод информации об установленном пакете.

dpkg -l - список установленных пакетов

dpkg -c файл_пакета.deb - список файлов, упакованных в deb пакет

dpkg -I файл_пакета.deb - информация о пакете

Deb пакет не установится, если в системе отсутствуют важные пакеты, от которых зависит работоспособность ПО, упакованного в deb пакет. Зависимости задаются разработчиком, при упаковке файлов в deb пакет.

Автоматически установить требуемые зависимости dpkg не может, поэтому для упрощения установки ПО в Linux были придуманы менеджеры пакетов.

В Raspbian используется менеджер пакетов apt-get.

Установка пакета осуществляется командой sudo apt-get install название_пакета

Во время выполнения данной команды apt-get произведёт поиск пакета в репозиториях, указанных в конфиге /etc/apt/sources.list, а также поиск всех зависимостей данного пакета, после чего будет произведена установка.

Обратите внимание, что apt-get ведёт поиск пакетов по локально сохранённому "индексу" пакетов. Поэтому периодически необходимо обновлять этот индекс командой sudo apt-get update

Удаление пакета осуществляется командой sudo apt-get remove название_пакета, если к команде добавить ключ -purge, то будут удалены и конфигурационные файлы пакета

Чтобы обновить все пакеты, установленные через apt-get до самой свежей версии используется команда sudo apt-get upgrade. Я этой функцией не пользуюсь без крайней необходимости - как показывает опыт, если что-то нормально работает, то это лучше не трогать

Создание собственных deb пакетов

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

Допустим вы разработчик ПО для raspberry pi, создали и скомпилировали программный комплекc, состоящий из бинарника my_raspi_soft и конфига к нему my_raspi_soft.conf

Для упрощения дистрибуции вашей программы упакуем её в deb-пакет и добавим его в собственный репозиторий, чтобы

ваши пользователи могли легко установить вашу программу командой apt-get my_raspi_soft install

Итак, создадим в удобном месте (например в домашней директории) папку (в дальнейшем я буду называть её директорией пакета), в которой будем создавать структуру пакета

mkdir  ~/my_raspi_soft

и установим инструменты необходимые для создания deb пакета:

sudo apt-get install dpkg lintian

В директории пакета создаём папку DEBIAN (в ней будут храниться служебные файлы пакета, необходимые для его правильной упаковки):

mkdir ~/my_raspi_soft/DEBIAN

и файловую структуру установки пакета - она указывает, куда копировать файлы пакета во время его установки. Допустим мы предполагаем, что во время установки пакета файл my_raspi_soft должен быть скопирован в /usr/bin, а его конфиг my_raspi_soft.conf в /etc/. Тогда файловая структура должна иметь вид:

mkdir -p ~/my_raspi_soft/usr/bin //после создания диретории помещаем в неё наш бинарник my_raspi_soft
mkdir ~/my_raspi_soft/etc //после создания диретории помещаем в неё наш конфиг  my_raspi_soft.conf

Теперь приступим к наполнению папки DEBIAN служебными файлами.

Главным служебным файлом является файл control, в него заносятся свойства пакета в формате свойство: значение свойства.

Свойства, которые добавляются в control файл (обязательные свойства я выделил жирным шрифтом):

Package - имя пакета. Именно оно используется при установке через apt-get install. Допустимо использовать латинские буквы, цифры и дефис (Package: my-raspi-soft)

Version - версия программы и пакета в формате версия_программы-версия_пакета. (пример: 0.9-1)

Maintainer - "мэйнтейнер", создатель пакета, ответственный за его обновление и т.д Формат вида имя email (Vasya )

Architecture - архитектура процессора, для которого предназначен пакет. В случае с Raspberry Pi это будет armhf

Section - категория ПО, упакованного в пакет. Перечень категорий:

admin, base, comm, contrib, devel, doc, editors, electronics, embedded, games, gnome, graphics, hamradio, interpreters, kde, libs, libdevel, mail, math, misc, net, news, non-free, oldlibs, otherosfs, perl, python, science, shells, sound, tex, text, utils, web, x11

Description - описание пакета

Depends - список зависимостей - пакетов, без которых не возможна работа нашей my_raspi_soft. Также можно указать требуюмую версию таких пакетов при помощи операторов <<, =, >>, <=, >=. Допустим в нашем проекте используется библиотека wiringPi. Тогда в config добавим строку - Depends:libwiringpi

Conflicts - список пакетов, с которыми конфликтует наша программа. Пока эти пакеты установлены в системе, установка пакета с нашей программой будет невозможна.

В итоге наш файл control будет выглядеть как-то так:

Package: my-raspi-soft
Version: 0.1-1
Section: misc
Architecture: armhf
Depends: libwiringpi
Maintainer: Vasya Description: My RasPi software

Это необходимый минимум служебных файлов для сборки deb пакета.

Какие ещё служебные файлы можно разместить в папке DEBIAN?

copyright - текст лицензии и декларация авторских прав

changelog - история изменений в специальном формате

conffiles - список файлов конфигурации (полный путь). Это нужно для того, чтобы при обновлении пакета можно было оставить старые настройки. Можно добавить сюда наш /etc/my_raspi_soft.conf

md5sums - контрольные суммы файлов пакета. можно заполнить так:

md5deep -r директория_пакета > директория_пакета/DEBIAN/md5sums

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

preinst - скрипт с таким именем выполняется до установки пакета

postinst - скрипт, выполняющийся после установки пакета

prerm - скрипт, выполняющийся перед удалением пакета

postrm - скрипт, выполняющийся после удаление пакета

Минимальная структура пакета создана, теперь можно приступать к его упаковке в deb файл!

Переходим на 1 папку выше директории пакета и выполняем команду

fakeroot dpkg-deb --build my_raspi_soft

Всё, пакет готов. Осталось лишь переименовать его согласно стандарту имяпакета_версия_архитектура.deb:

mv my_raspi_soft.deb my-raspi-soft_0.9-1_armhf.deb

В завершении протестируем пакет на ошибки при помощи lintian:

lintian my-raspi-soft_0.9-1_armhf.deb

Если ошибок нет, то можно закачивать пакет в репозиторий для последующего распространения

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

Нам потребуется сервер с установленным веб-сервером Apache (или любым другим).

Создаём в конфиге апача новый виртуальный хост для домена (например repo.yourserver.com), на котором будет висеть наш репозиторий. В настройках виртуального хоста обязательно разрешаем просмотр папок в DOCUMENT_ROOT (Options All Indexes)

В этом примере в качестве DOCUMENT_ROOT будет выступать директория - /home/repo/www

Создаём структуру репозитория:

# mkdir -p /home/repo/www/apt/pool/main
# mkdir -p /home/repo/www/apt/dists/stable/main/binary-armhf

Загружаем наш deb пакет my-raspi-soft_0.9-1_armhf.deb в /home/repo/www/apt/pool/main/

Создание GPG ключей

Публичный GPG ключ должен быть создан и затем скачан пользователями вашего репозитория. Если этого не сделать, то каждый раз при установке пакетов из вашего репозитория apt-get будет выводить предупреждение.

Создаём ключ командой:

gpg --gen-key

Проверяем ключ:

gpg --list-keys

Вывод этой команды будет примерно таким:

pub   2048R/CE123456 2012-09-02 [expires: 2022-08-31]
uid   My repo 

Далее:

# gpg --export -a CE123456 > ~/repo.key
# gpg --no-default-keyring --keyring /home/repo/www/apt/myrepo.gpg --import ~/repo.key
# rm ~/repo.key

Индексация и подпись пакетов

Чтобы клиентские менеджеры пакетов apt-get могли устанавливать пакеты из нашего репозитория, необходимо произвести индексацию пакетов, которые мы загрузили в /home/repo/www/apt/pool/main/

Для этого можно использовать вот такой несложный скрипт. Он произведёт индексацию всех пакетов в /home/repo/www/apt/pool/main, создаст файл /home/repo/www/apt/pool/main/Release, который содержит MD5 и SHA хэши всех файлов пакета и подпишет файл Release ключом Release.gpg.

Запускать этот файл нужно каждый раз после загрузки нового deb пакета в наш репозиторий (GPG_NAME заменить на параметр, который соответствует вашему ключу, созданному в предыдущем шаге)

#!/bin/bash

GPG_NAME=CE123456
REPONAME=stable
VERSION=6.0

for bindir in `find dists/${REPONAME} -type d -name "binary*"`; do
    arch=`echo $bindir|cut -d"-" -f 2`
    echo "Processing ${bindir} with arch ${arch}"

    overrides_file=/tmp/overrides
    package_file=$bindir/Packages
    release_file=$bindir/Release

    # Create simple overrides file to stop warnings
    cat /dev/null > $overrides_file
    for pkg in `ls pool/main/ | grep -E "(all|${arch})\.deb"`; do
        pkg_name=`/usr/bin/dpkg-deb -f pool/main/${pkg} Package`
        echo "${pkg_name} Priority extra" >> $overrides_file
    done

    # Index of packages is written to Packages which is also zipped
    dpkg-scanpackages -a ${arch} pool/main $overrides_file > $package_file
    # The line above is also commonly written as:
    # dpkg-scanpackages -a ${arch} pool/main /dev/null > $package_file
    gzip -9c $package_file > ${package_file}.gz
    bzip2 -c $package_file > ${package_file}.bz2

    # Cleanup
    rm $overrides_file
done

# Release info goes into Release & Release.gpg which includes an md5 & sha1 hash of Packages.*
# Generate & sign release file
cd dists/${REPONAME}
cat > Release <
Suite: ${REPONAME}
Version: ${VERSION}
Component: main
Origin: My Company
Label: My Repo
Architecture: armhf
Date: `date`
ENDRELEASE

# Generate hashes
echo "MD5Sum:" >> Release
for hashme in `find main -type f`; do
    md5=`openssl dgst -md5 ${hashme}|cut -d" " -f 2`
    size=`stat -c %s ${hashme}`
    echo " ${md5} ${size} ${hashme}" >> Release
done
echo "SHA1:" >> Release
for hashme in `find main -type f`; do
    sha1=`openssl dgst -sha1 ${hashme}|cut -d" " -f 2`
    size=`stat -c %s ${hashme}`
    echo " ${sha1} ${size} ${hashme}" >> Release
done

# Sign!
gpg --yes -u $GPG_NAME --sign -bao Release.gpg Release
cd

Сохраните код скрипта в /home/repo/www/apt/reindex.sh и запустите его:

chmod +x /home/repo/www/apt/reindex.sh
/home/repo/www/apt/reindex.sh

В результате выполнения скрипта, структура файлов в нашем репозитории примет вид:

/home/repo/www/apt/

/home/repo/www/apt/dists

/home/repo/www/apt/dists/stable

/home/repo/www/apt/dists/stable/Release

/home/repo/www/apt/dists/stable/Release.gpg

/home/repo/www/apt/dists/stable/main

/home/repo/www/apt/dists/stable/main/binary-armhf

/home/repo/www/apt/dists/stable/main/binary-armhf/Packages.gz

/home/repo/www/apt/dists/stable/main/binary-armhf/Packages.bz2

/home/repo/www/apt/dists/stable/main/binary-armhf/Packages

/home/repo/www/apt/pool

/home/repo/www/apt/pool/main

/home/repo/www/apt/pool/main/my-raspi-soft_0.9-1_armhf.deb

/home/repo/www/apt/reindex_stable.sh

/home/repo/www/apt/myrepo.gpg

Клиентские настройки для apt-get

Чтобы пользователи могли устанавливать ПО из вашего репозитория при помощи менеджера пакетов apt-get, они должны

1.добавить ваш репозиторий в /etc/apt/sources.list

deb http://repo.yourserver.com/ stable main

2.скачать ключ:

# cd /etc/apt/trusted.gpg.d/
# wget http://repo.yourserver.com/myrepo.gpg

3.Обновить локальный индекс пакетов apt-get

sudo apt-get update

После выполнения этих шагов ваша программа может быть установлена командой:

sudo apt-get install my-raspi-soft
31 May 2016
raspiman
автор статьи

Комментариев: 2

  1. Vitbas

    05 December 2019 - Ответить

    тут ошибка у вас в скрипте в этом блоке: # Release info goes into Release & Release.gpg which includes an md5 & sha1 hash of Packages.* # Generate & sign release file cd dists/${REPONAME} cat > Release < Suite: ${REPONAME} Version: ${VERSION} Component: main Origin: My Company Label: My Repo Architecture: armhf Date: `date` ENDRELEASE я сделал так: # Release info goes into Release & Release.gpg which includes an md5 & sha1 hash of Packages.* # Generate & sign release file cd dists/${REPONAME} touch Release echo "Suite: ${REPONAME}" >> Release echo "Version: ${VERSION}" >> Release echo "Component: main" >> Release echo "Origin: My Company" >> Release echo "Label: My Repo" >> Release echo "Architecture: armhf" >> Release echo "Date: `date`" >> Release

    • Vitbas

      05 December 2019 - ответить

      Прошу прощения не знаю как построчно вывести здесь файл

  2. Vitbas

    05 December 2019 - Ответить

    И есть еще проблема на стороне малинки с добавлением репозитория это вывод команды sudo apt-get update: W: GPG error: https://repo-rpi.elkamrm.com stable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4F55292A20C9509 W: The repository 'https://repo-rpi.elkamrm.com stable Release' is not signed. N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details. W: No Hash entry in Release file /var/lib/apt/lists/partial/repo-rpi.elkamrm.com_dists_stable_Release which is considered strong enough for security purposes W: Invalid 'Date' entry in Release file /var/lib/apt/lists/partial/repo-rpi.elkamrm.com_dists_stable_Release

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

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения