Создание пользовательского репозитория RPM Package Manager

RPM Package Manager: это низкоуровневый менеджер пакетов, используемый во всех дистрибутивах семейства Red Hat, таких как Fedora и Red Hat Enterprise Linux. 

Пакет rpm (Package Manager) - это пакет, содержащий программное обеспечение, предназначенное для установки с помощью этой системы управления пакетами, пакеты rpm обычно распространяются через репозитории программного обеспечения. В этой заметки мы узнаем, как создать пользовательский репозиторий rpm и как настроить наш дистрибутив на использование его в качестве источника программного обеспечения.

В рамках данной заметки мы создадим наш пользовательский репозиторий на локальной машине с IP 192.168.0.39, которая будет использоваться в качестве http-сервера. На этой машине, первое, что нам нужно сделать, это установить пакет createrepo. Дистрибутив, установленный на удаленной машине, не обязательно должен быть rpm-дистрибутивом. В нашем случае, например, на сервере установлена система Debian, поэтому для установки пакета нам нужно выполнить следующую команду:

$ sudo apt-get update && sudo apt-get install createrepo

Как мы уже говорили, в нашем конкретном примере мы хотим, чтобы программное обеспечение, размещенное в нашем пользовательском репозитории, было доступно по протоколу HTTP, поэтому нам нужно установить HTTP-сервер; в данном случае мы будем работать с Apache:

$ sudo apt-get install apache2

После установки пакетов мы можем приступить к созданию нашего rpm-репозитория.

Создание хранилища.

Корень документа VirtualHost по умолчанию, созданный при установке Apache в Debian, - /var/www/html. На данном этапе мы можем выбрать создание VirtualHost для нашего репозитория или просто создать каталог репозитория как часть стандартного. Для простоты информации в этой заметки мы рассмотрим последний вариант:

$ sudo mkdir /var/www/html/repo

Каталог repo, который мы создали с помощью приведенной выше команды, внутри стандартного VirtualHost DocumentRoot, будет содержать наши пакеты и станет основой нашего хранилища. Чтобы лучше структурировать его, мы хотим создать несколько подкаталогов, названных в честь дистрибутива, его версии и архитектуры пакетов, которые мы хотим сделать доступными. Предположим, например, мы хотим использовать репозиторий для Fedora 33 x68_64, мы должны выполнить следующую команду:

$ sudo mkdir -p /var/www/html/repo/fedora/releases/33/x86_64

Следующий шаг заключается в наполнении репозитория. Все, что нам нужно сделать, это поместить пакеты, которые мы хотим сделать доступными, в соответствующий каталог репозитория. В данном случае, в качестве примера, я заполню репозиторий пакетом, полученным путем компиляции редактора VSCode из исходного кода. Пакет называется code-1.56.0-1617183449.el8.x86_64.rpm. После его копирования наша файловая структура должна выглядеть следующим образом:

repo
└── fedora
    └── releases
        └── 33
            └── x86_64
                └── code-1.56.0-1617183449.el8.x86_64.rpm

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

$ sudo createrepo /var/www/html/repo/fedora/releases/33/x86_64

Команда создаст метаданные хранилища в каталоге с именем repodata на основе пакетов, содержащихся в целевом каталоге, и должна запускаться заново каждый раз, когда хранилище обновляется новыми пакетами или удаляются старые пакеты. После запуска команды наша структура каталогов будет выглядеть следующим образом:

repo
└── fedora
    └── releases
        └── 33
            └── x86_64
                ├── code-1.56.0-1617183449.el8.x86_64.rpm
                └── repodata
                    ├── 22ab1d1d123bb7d7cde556bf8a8ac4daf9cdb75572f40ebdd2f399908cb7f6b9-other.xml.gz
                    ├── 26ed9b63868b2e0263dfa817e21921c4e7542c1be9f6b7875381bba6bd78d1c6-primary.sqlite.bz2
                    ├── 50fc300a761812761cf9a8413a619da23cf336d49999753568ce19a97c025d44-other.sqlite.bz2
                    ├── a523f54b5fcd0720c182969f991f51e125728a361f31237725dc9418d5e126ea-primary.xml.gz
                    ├── af2fa9ea5deaffca5ffc9f3e524155defa8cfa5656962845a45c8b0e984f3e19-filelists.sqlite.bz2
                    ├── f95849cf860f1184b97d30000ea1f9f1c35edd6d625dcd387453187510dd4a18-filelists.xml.gz
                    └── repomd.xml

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

Добавление хранилища в качестве источника программного обеспечения.

Давайте перейдем к нашему дистрибутиву на базе rpm и посмотрим, как его настроить, чтобы использовать наш пользовательский репозиторий в качестве источника программного обеспечения. Файлы конфигурации репозитория находятся в каталоге /etc/yum.repos.d и должны иметь расширение .repo. Заглянув внутрь каталога, мы можем увидеть уже существующие:

$ ls /etc/yum/repos.d
fedora-cisco-openh264.repo   fedora-updates-testing-modular.repo
fedora-modular.repo          fedora-updates-testing.repo
fedora.repo                  rpmfusion-free.repo
fedora-updates-modular.repo  rpmfusion-free-updates.repo
fedora-updates.repo          rpmfusion-free-updates-testing.repo

Теперь давайте создадим нашу пользовательскую конфигурацию репозитория. Внутри файла, в качестве минимального набора информации, мы должны предоставить:

  • Идентификатор хранилища.
  • Имя репозитория.
  • Базовый адрес репозитория.
  • Статус репозитория.
  • Проверять ли gpg-подпись пакетов или нет.

Мы сохраним эту информацию в файле ownrepo.repo, вот его содержание:

[ownrepo]
name=Own repository
baseurl=http://192.168.0.39/repo/fedora/releases/$releasever/$basearch
enabled=1
gpgcheck=0

Определение, указанное внутри скобок ([ownrepo]), является идентификатором репозитория и должно быть уникальным во всех определениях репозитория. С помощью ключа name мы задаем человекочитаемое имя хранилища в виде строки. Это необязательно; если имя не указано, в качестве имени будет использоваться идентификатор хранилища.

С помощью ключа baseurl мы указываем список URL-адресов хранилища. URL должны быть разделены пробелом или запятой. В нашем примере мы указали только один URL, но вы можете заметить, что мы использовали в нем две переменные:

  • $releasever
  • $basearch

В результате расширения первой из них, $releasever, будет получена версия выпуска операционной системы, в данном случае 33, поскольку мы устанавливаем наш репозиторий на систему Fedora 33. Вторая переменная, $basearch, будет расширена в строку, представляющую базовую архитектуру системы, которая в нашем случае является x86_64.

Ключ enabled требует булево значение, которое определяет, считать ли хранилище активным или нет. Последний ключ, который мы использовали, это gpgcheck: он также требует булево значение и используется для определения того, должна ли выполняться проверка подписи gpg для пакетов, установленных из хранилища. В нашем примере мы просто отключили проверку, поскольку репозиторий предназначен только для личного использования.

Теперь, когда наш репозиторий настроен, мы можем попробовать установить пакет кода из него, просто выполнив команду:

$ sudo dnf install code
Own repository                                                                    451 kB/s |  13 kB     00:00
Dependencies resolved.
==================================================================================================================
 Package              Architecture           Version                                Repository               Size
==================================================================================================================
Installing:
 code                 x86_64                 1.56.0-1617183449.el8                  ownrepo                 100 M

Transaction Summary
==================================================================================================================
Install  1 Package

Total download size: 100 M
Installed size: 294 M

Как только мы дадим утвердительный ответ на запрос и подтвердим его, пакет будет установлен в нашей системе.

В этой заметки мы узнали, как легко создать пользовательский rpm-репозиторий с помощью утилиты createepo, а также рассмотрели, как создать конфигурационный файл dnf на нашем дистрибутиве, чтобы использовать его в качестве источника программного обеспечения. Мы рассмотрели минимальное подмножество ключей, которые можно использовать в конфигурации репозитория; за более подробным списком вы можете обратиться к официальной документации dnf.


Изначально разработанный компанией Red Hat для Red Hat Linux, RPM стал использоваться во многих дистрибутивах Linux и был портирован на другие операционные системы.