RHEL: создание локального репозитория-зеркала для просветленных

Пришёл ученик к мастеру. И спросил:
— Что вы делали до просветления? Как жили?
Мастер ответил:
— Колол дрова, носил воду, готовил еду.
— А что вы делаете после просветления? — спросил ученик.
— Колю дрова, ношу воду, готовлю еду, — ответил мастер.
— А что изменилось?
— Да всё!

2ee6b279a0cd7eb46cd2865888cfe8aa.png

Хабр, привет!

В этой статье хотим поделиться, как создать локальный репозиторий в RHEL на качественно новом уровне понимания и почему это важно. На проектах мы в «Инфосистемы Джет» неоднократно сталкивались с этой задачей. Поначалу делали зеркало быстро, но по мере погружения пришло понимание, что мы лишаем себя части ценного функционала и данных.

Начнем с азов. Для чего нужен репозиторий, знают практически все. Но что он еще умеет? Давайте разбираться.

1)  Мы можем устанавливать пакеты группами. Например, после minimal install вы передумали и решили установить GUI. В этом случае необязательно устанавливать пакеты вручную. Достаточно найти подходящую группу и выполнить ею инсталляцию:

# yum --disablerepo=* --enablerepo=rhel-7-server-rpms group list
Loaded plugins: product-id, search-disabled-repos, subscription-manager
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Available Environment Groups:
   Minimal Install
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
Available Groups:
   Compatibility Libraries
   Console Internet Tools
   Development Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done

2) Мы можем устанавливать пакеты по Eratta (не по именам):

# yum --disablerepo=* --enablerepo=rhel-7-server-rpms updateinfo list
Loaded plugins: product-id, search-disabled-repos, subscription-manager
rhel-7-server-rpms                                                                                                                            | 3.5 kB  00:00:00     
(1/2): rhel-7-server-rpms/7Server/x86_64/updateinfo                                                                                           | 4.3 MB  00:00:03     
(2/2): rhel-7-server-rpms/7Server/x86_64/primary_db                                                                                           |  94 MB  00:00:11     
RHBA-2018:3230 bugfix         GeoIP-1.5.0-13.el7.x86_64
RHBA-2019:2224 bugfix         GeoIP-1.5.0-14.el7.x86_64
RHBA-2017:2925 bugfix         NetworkManager-1:1.8.0-11.el7_4.x86_64
RHBA-2018:0778 bugfix         NetworkManager-1:1.10.2-13.el7.x86_64
RHBA-2018:1406 bugfix         NetworkManager-1:1.10.2-14.el7_5.x86_64
RHBA-2018:2000 bugfix         NetworkManager-1:1.10.2-16.el7_5.x86_64
RHBA-2018:3207 bugfix         NetworkManager-1:1.12.0-6.el7.x86_64
RHBA-2018:3349 bugfix         NetworkManager-1:1.12.0-7.el7_6.x86_64
RHSA-2018:3665 Important/Sec. NetworkManager-1:1.12.0-8.el7_6.x86_64
RHBA-2019:0519 bugfix         NetworkManager-1:1.12.0-10.el7_6.x86_64
RHBA-2019:2302 bugfix         NetworkManager-1:1.18.0-5.el7.x86_64
RHBA-2019:2601 bugfix         NetworkManager-1:1.18.0-5.el7_7.1.x86_64
RHBA-2020:0381 bugfix         NetworkManager-1:1.18.0-5.el7_7.2.x86_64
RHBA-2020:1162 bugfix         NetworkManager-1:1.18.4-3.el7.x86_64

3) Возможна установка и по конкретным патчам безопасности CVE (Common Vulnerabilities and Exposures):  

# yum --disablerepo=* --enablerepo=rhel-7-server-rpms updateinfo list cves
Loaded plugins: product-id, search-disabled-repos, subscription-manager
 CVE-2018-1000135 bugfix         NetworkManager-1:1.12.0-6.el7.x86_64
 CVE-2018-15688   Important/Sec. NetworkManager-1:1.12.0-8.el7_6.x86_64
 CVE-2020-10754   Moderate/Sec.  NetworkManager-1:1.18.8-1.el7.x86_64
 CVE-2018-1000135 bugfix         NetworkManager-config-server-1:1.12.0-6.el7.noarch
 CVE-2018-15688   Important/Sec. NetworkManager-config-server-1:1.12.0-8.el7_6.noarch
 CVE-2020-10754   Moderate/Sec.  NetworkManager-config-server-1:1.18.8-1.el7.noarch
 CVE-2018-1000135 bugfix         NetworkManager-libnm-1:1.12.0-6.el7.x86_64

4)    Мы можем синхронизировать репозитории не полностью, а «частично», с информацией только по пакетам, которые были добавлены.  

Теперь давайте попробуем создать зеркало. На просторах интернета вы можете столкнуться с множеством упрощенных рекомендаций: выполнили reposync, затем createrepo, и готово. Так ли это? Достаточно ли это? И да, и нет, — отчасти это справедливо для RHEL версий 8 и 9.

Давайте посмотрим на сам механизм синхронизации, структуру репозитория при использовании различных опций, а потом и на различия в поведении разных версий.

Подготовительные шаги

В нашем случае мы переносимся в прошлое и начинаем наш экскурс с RHEL7. Проверяем, что установлены необходимые пакеты:

# yum list installed | egrep 'yum-utils|createrepo'
createrepo.noarch                0.9.9-28.el7                @rhel-7-server-rpms
yum-utils.noarch                 1.1.31-54.el7_8             @rhel-7-server-rpms

Если их нет, то устанавливаем:

# yum install yum-utils createrepo

Создаем папку, которую будем использовать для репозитория:

# mkdir /habr

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

Выполняем синхронизацию репозитория rhel-7-server-ansible-2.4-rpms:

# reposync --repoid=rhel-7-server-ansible-2.4-rpms  -p /habr/
(1/23): ansible-2.4.1.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(2/23): ansible-2.4.0.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:07     
(3/23): ansible-2.4.2.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:04     
(4/23): ansible-2.4.3.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:06     
(5/23): ansible-2.4.4.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:06     
(6/23): ansible-2.4.5.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:04     
(7/23): ansible-2.4.6.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:03     
(8/23): ansible-doc-2.4.0.0-1.el7ae.noarch.rpm                                                                                                                               | 751 kB  00:00:04     
(9/23): ansible-doc-2.4.1.0-1.el7ae.noarch.rpm                                                                                                                               | 752 kB  00:00:03     
(10/23): ansible-doc-2.4.3.0-1.el7ae.noarch.rpm                                                                                                                              | 762 kB  00:00:03     
(11/23): ansible-doc-2.4.2.0-1.el7ae.noarch.rpm                                                                                                                              | 762 kB  00:00:04     
(12/23): ansible-doc-2.4.4.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:03     
(13/23): ansible-doc-2.4.5.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:05     
(14/23): ansible-doc-2.4.6.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:03     
(15/23): libtomcrypt-1.17-23.el7.x86_64.rpm                                                                                                                                  | 224 kB  00:00:04     
(16/23): libtommath-0.42.0-4.el7.x86_64.rpm                                                                                                                                  |  35 kB  00:00:03     
(17/23): python-ecdsa-0.11-4.el7.noarch.rpm                                                                                                                                  |  69 kB  00:00:02     
(18/23): python-httplib2-0.9.1-2.1.el7.noarch.rpm                                                                                                                            | 115 kB  00:00:03     
(19/23): python-paramiko-2.1.1-2.el7ae.noarch.rpm                                                                                                                            | 267 kB  00:00:03     
(20/23): python-paramiko-2.1.1-4.el7.noarch.rpm                                                                                                                              | 268 kB  00:00:02     
(21/23): python2-jmespath-0.9.0-4.el7ae.noarch.rpm                                                                                                                           |  39 kB  00:00:03     
(22/23): python-passlib-1.6.5-1.1.el7.noarch.rpm                                                                                                                             | 488 kB  00:00:03     
(23/23): sshpass-1.06-1.el7.x86_64.rpm                                                                                                                                       |  21 kB  00:00:02

Теперь посмотрим на структуру того, что у нас синхронизировалось. Внутри указанной для reposync директории была создана поддиректория с именем репозитория, а в нем — директория Packages c пакетами:

# ls -la /habr
итого 0
drwxr-xr-x.  3 root root  44 Jan 16 15:29 .
dr-xr-xr-x. 21 root root 273 Jan 16 11:00 ..
drwxr-xr-x.  3 root root  22 Jan 16 15:29 rhel-7-server-ansible-2.4-rpms

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/
итого 0
drwxr-xr-x. 3 root root 22 Jan 16 15:29 .
drwxr-xr-x. 3 root root 44 Jan 16 15:29 ..
drwxr-xr-x. 6 root root 42 Jan 16 15:29 Packages

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/Packages/
итого 8
drwxr-xr-x. 6 root root   42 Jan 16 15:29 .
drwxr-xr-x. 3 root root   22 Jan 16 15:29 ..
drwxr-xr-x. 2 root root 4096 Jan 16 15:29 a
drwxr-xr-x. 2 root root   90 Jan 16 15:29 l
drwxr-xr-x. 2 root root 4096 Jan 16 15:30 p
drwxr-xr-x. 2 root root   43 Jan 16 15:30 s

Нам остается только выполнить createrepo:

# createrepo -v /habr/rhel-7-server-ansible-2.4-rpms/
Spawning worker 0 with 23 pkgs
Worker 0: reading Packages/a/ansible-2.4.0.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.1.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.2.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.3.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.4.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.5.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.6.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.0.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.1.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.2.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.3.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.4.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.5.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.6.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/l/libtomcrypt-1.17-23.el7.x86_64.rpm
Worker 0: reading Packages/l/libtommath-0.42.0-4.el7.x86_64.rpm
Worker 0: reading Packages/p/python-ecdsa-0.11-4.el7.noarch.rpm
Worker 0: reading Packages/p/python-httplib2-0.9.1-2.1.el7.noarch.rpm
Worker 0: reading Packages/p/python-paramiko-2.1.1-2.el7ae.noarch.rpm
Worker 0: reading Packages/p/python-paramiko-2.1.1-4.el7.noarch.rpm
Worker 0: reading Packages/p/python-passlib-1.6.5-1.1.el7.noarch.rpm
Worker 0: reading Packages/p/python2-jmespath-0.9.0-4.el7ae.noarch.rpm
Worker 0: reading Packages/s/sshpass-1.06-1.el7.x86_64.rpm
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Starting other db creation: Tue Jan 16 15:37:26 2024
Ending other db creation: Tue Jan 16 15:37:26 2024
Starting filelists db creation: Tue Jan 16 15:37:26 2024
Ending filelists db creation: Tue Jan 16 15:37:26 2024
Starting primary db creation: Tue Jan 16 15:37:26 2024
Ending primary db creation: Tue Jan 16 15:37:27 2024
Sqlite DBs complete

Теперь у нас есть работоспособный репозиторий, который мы можем опубликовать для других серверов через подходящий протокол (http, https, ftp). Посмотрим на состав файлов:

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/
итого 4
drwxr-xr-x. 4 root root   38 Jan 16 15:37 .
drwxr-xr-x. 3 root root   44 Jan 16 15:29 ..
drwxr-xr-x. 6 root root   42 Jan 16 15:29 Packages
drwxr-xr-x. 2 root root 4096 Jan 16 15:37 repodata

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/repodata/
итого 320
drwxr-xr-x. 2 root root   4096 Jan 16 15:37 .
drwxr-xr-x. 4 root root     38 Jan 16 15:37 ..
-rw-r--r--. 1 root root 194421 Jan 16 15:37 5d3a98988d64c0fba42cf6f38c00cc7a56ece841967ad5c1b1f0e23c14c6dbb8-filelists.xml.gz
-rw-r--r--. 1 root root   9455 Jan 16 15:37 74446747bb7badc70ec2d426db315fa40c2e4a9a6d24656d350b31c5f4a0b9e5-other.sqlite.bz2
-rw-r--r--. 1 root root  76944 Jan 16 15:37 9c3e51467bb460465294f072070df75f03c748e4a5a47bed869668eefbbc5d40-filelists.sqlite.bz2
-rw-r--r--. 1 root root  14000 Jan 16 15:37 ac4fd8f904f96e48a5a140819f4d6602251f2c155a18617568fb830298824dde-primary.sqlite.bz2
-rw-r--r--. 1 root root   5213 Jan 16 15:37 b24363dba2ecb22acf7afe41d8f79fb0ca33fad510b23c7d45336d687f1a6eac-other.xml.gz
-rw-r--r--. 1 root root   5849 Jan 16 15:37 c335203528188fd8d50943a2ba2c4e1724460dbd1cebcc8c7c330b5ad22721c8-primary.xml.gz
-rw-r--r--. 1 root root   2983 Jan 16 15:37 repomd.xml

Внутри repodata мы видим следующие файлы, каждый из которых содержит определенные данные:

  • primary.xml.gz — информация о каждом файле в репозитории: имя, версия, зависимости, время, размер и т. д. (обеспечивает работу yum info имя-пакета);

  • filelists.xml.gz — информация о файлах и директориях внутри пакетов (обеспечивает работу yum provides имя-файла);

  • other.xml.gz — информация об изменениях из RPM SPEC файлов для каждого пакета в репозитории;

  • *-.sqlite.bz2 — эта же информация, но в формате sqlite;

  • repomd.xml — индекс-файл всего репозитория.

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

Переходим к демонстрации и создаем репозиторий для локального использования:

# cat /etc/yum.repos.d/habr.repo
[rhel-7-habr]
name = RHEL7-habr 
baseurl = file:///habr/rhel-7-server-ansible-2.4-rpms
enabled = 1
gpgcheck = 0

Теперь смотрим информацию об Errata:

# yum --disablerepo=* --enablerepo=rhel-7-habr updateinfo list available
Loaded plugins: product-id, search-disabled-repos, subscription-manager
rhel-7-habr                                                                                                                                                             | 2.9 kB  00:00:00     
updateinfo list done

Ничего нет.

Следующим шагом смотрим, какие группы пакетов содержатся в данном репозитории. Но для быстрой загрузки я взял совсем небольшой репозиторий без групп. Это не страшно, и мы ниже посмотрим, откуда берется информация о группах.

Синхронизация после просветления

Чего же нам не хватило и как сделать «правильное» зеркало?

Для начала нам нужно выполнить синхронизацию с ключами --download-metadata и --downloadcomps. Это позволит нам получить файлы comps.xml и updateinfo.xml.gz из оригинального репозитория:

# reposync --repoid=rhel-7-server-ansible-2.4-rpms --download-metadata --downloadcomps -p /habr/
(1/23): ansible-2.4.1.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(2/23): ansible-2.4.0.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:06     
(3/23): ansible-2.4.2.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(4/23): ansible-2.4.3.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(5/23): ansible-2.4.4.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(6/23): ansible-2.4.5.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:05     
(7/23): ansible-doc-2.4.0.0-1.el7ae.noarch.rpm                                                                                                                               | 751 kB  00:00:04     
(8/23): ansible-2.4.6.0-1.el7ae.noarch.rpm                                                                                                                                   | 7.6 MB  00:00:04     
(9/23): ansible-doc-2.4.1.0-1.el7ae.noarch.rpm                                                                                                                               | 752 kB  00:00:03     
(10/23): ansible-doc-2.4.2.0-1.el7ae.noarch.rpm                                                                                                                              | 762 kB  00:00:03     
(11/23): ansible-doc-2.4.4.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:03     
(12/23): ansible-doc-2.4.3.0-1.el7ae.noarch.rpm                                                                                                                              | 762 kB  00:00:03     
(13/23): ansible-doc-2.4.6.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:03     
(14/23): ansible-doc-2.4.5.0-1.el7ae.noarch.rpm                                                                                                                              | 763 kB  00:00:04     
(15/23): libtommath-0.42.0-4.el7.x86_64.rpm                                                                                                                                  |  35 kB  00:00:02     
(16/23): libtomcrypt-1.17-23.el7.x86_64.rpm                                                                                                                                  | 224 kB  00:00:03     
(17/23): python-ecdsa-0.11-4.el7.noarch.rpm                                                                                                                                  |  69 kB  00:00:03     
(18/23): python-httplib2-0.9.1-2.1.el7.noarch.rpm                                                                                                                            | 115 kB  00:00:03     
(19/23): python-paramiko-2.1.1-2.el7ae.noarch.rpm                                                                                                                            | 267 kB  00:00:03     
(20/23): python-paramiko-2.1.1-4.el7.noarch.rpm                                                                                                                              | 268 kB  00:00:02     
(21/23): python2-jmespath-0.9.0-4.el7ae.noarch.rpm                                                                                                                           |  39 kB  00:00:02     
(22/23): python-passlib-1.6.5-1.1.el7.noarch.rpm                                                                                                                             | 488 kB  00:00:04     
(23/23): sshpass-1.06-1.el7.x86_64.rpm                                                                                                                                       |  21 kB  00:00:02

Уже знакомое нам начало, когда внутри указанной директории была создана еще одна — с именем репозитория:

# ls -la /habr/
total 0
drwxr-xr-x.  3 root root  44 Jan 16 10:54 .
dr-xr-xr-x. 20 root root 260 Jan 16 10:33 ..
drwxr-xr-x.  3 root root 146 Jan 16 10:54 rhel-7-server-ansible-2.4-rpms

Но ее содержимое немного отличается:

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/
total 20
drwxr-xr-x. 3 root root   146 Jan 16 10:54 .
drwxr-xr-x. 3 root root    44 Jan 16 10:54 ..
drwxr-xr-x. 6 root root    42 Jan 16 10:54 Packages
-rw-r--r--. 1 root root   124 Jan 16 10:54 comps.xml
-rw-r--r--. 1 root root 10638 Jan 16 10:54 eb6cb5ebcd095094b88bec99ab6557daa2c0dc6a305c540e7e6267298376687e-updateinfo.xml.gz
-rw-r--r--. 1 root root  2155 Jan 16 10:54 productid

Что нового появилось:

  • comps.xml — файл, описывающий группы, в которые могут быть объединены пакеты;

  • *-updateinfo.xml.gz — файл, описывающий Errata, к которым относятся пакеты;

  • productid — сертификат, описывающий продукт, распространяемый через данный репозиторий.    

Давайте заглянем в файл productid при помощи специальной утилиты и посмотрим, что данный файл описывает:

# rct cat-cert /habr/rhel-7-server-ansible-2.4-rpms/productid 

+-------------------------------------------+
	Product Certificate
+-------------------------------------------+

Certificate:
	Path: /habr/rhel-7-server-ansible-2.4-rpms/productid
	Version: 1.0
	Serial: xxxxxxxxxxxxxxxxxxxxx
	Start Date: 2017-09-13 10:33:12+00:00
	End Date: 2037-09-08 10:33:12+00:00

Subject:
	CN: Red Hat Product ID [xxxxxxxxxxxxxxxxxxxxx]

Issuer:
	C: US
	CN: Red Hat Entitlement Product Authority
	O: Red Hat, Inc.
	OU: Red Hat Network
	ST: North Carolina
	emailAddress: ca-support@redhat.com

Product:
	ID: 408
	Name: Red Hat Ansible Engine
	Version: 2.4
	Arch: x86_64
	Tags: ansible-2,ansible-2.4
	Brand Type: 
	Brand Name: 

Как я уже сказал ранее, в выбранном репозитории нет групп, а следовательно, в файле comps.xml нет ничего полезного:

# cat comps.xml 


Если бы мы изначально взяли более крупный репозиторий (например, rhel-7-server-rpms), то увидели бы там долгожданную информацию о группах:  

# grep  "" /xxxxxxxxxxxx/x86_64/rhel-7-server-rpms/comps.xml 
    virtualization-client
    large-systems
    mariadb-client
    virtualization-hypervisor
    print-server
    development
    backup-client
    web-server
    x11
    directory-server
    console-internet
    dns-server
    legacy-x
    hardware-monitoring
    debugging
    postgresql
    mainframe-access
    postgresql-client
    dial-up
    smart-card
    guest-agents
    file-server
    load-balancer
    legacy-unix
    kde-desktop
    ftp-server
    infiniband
    system-admin-tools
--------- cut ---------------------

Теперь, когда мы узнали о содержимом репозиториев чуть больше, давайте создадим наш репозиторий почти привычным способом, но с ключом -g comps.xml:

# createrepo -v /habr/rhel-7-server-ansible-2.4-rpms/ -g comps.xml

Таким образом, мы добавим информацию о группах:

# createrepo -v --update -g comps.xml /habr/rhel-7-server-ansible-2.4-rpms/
Scanning old repo data
Could not find valid repo at: /habr/rhel-7-server-ansible-2.4-rpms/
Spawning worker 0 with 23 pkgs
Worker 0: reading Packages/a/ansible-2.4.0.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.1.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.2.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.3.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.4.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.5.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-2.4.6.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.0.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.1.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.2.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.3.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.4.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.5.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/a/ansible-doc-2.4.6.0-1.el7ae.noarch.rpm
Worker 0: reading Packages/l/libtomcrypt-1.17-23.el7.x86_64.rpm
Worker 0: reading Packages/l/libtommath-0.42.0-4.el7.x86_64.rpm
Worker 0: reading Packages/p/python-ecdsa-0.11-4.el7.noarch.rpm
Worker 0: reading Packages/p/python-httplib2-0.9.1-2.1.el7.noarch.rpm
Worker 0: reading Packages/p/python-paramiko-2.1.1-2.el7ae.noarch.rpm
Worker 0: reading Packages/p/python-paramiko-2.1.1-4.el7.noarch.rpm
Worker 0: reading Packages/p/python-passlib-1.6.5-1.1.el7.noarch.rpm
Worker 0: reading Packages/p/python2-jmespath-0.9.0-4.el7ae.noarch.rpm
Worker 0: reading Packages/s/sshpass-1.06-1.el7.x86_64.rpm
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Starting other db creation: Tue Jan 16 16:47:12 2024
Ending other db creation: Tue Jan 16 16:47:12 2024
Starting filelists db creation: Tue Jan 16 16:47:12 2024
Ending filelists db creation: Tue Jan 16 16:47:13 2024
Starting primary db creation: Tue Jan 16 16:47:13 2024
Ending primary db creation: Tue Jan 16 16:47:13 2024
Sqlite DBs complete

Посмотрим на созданные папки и файлы. В самой папке репозитория всё по-прежнему:

# ls -la /habr/rhel-7-server-ansible-2.4-rpms
total 24
drwxr-xr-x. 4 root root   162 Jan 16 16:47 .
drwxr-xr-x. 3 root root    44 Jan 16 10:54 ..
drwxr-xr-x. 6 root root    42 Jan 16 10:54 Packages
-rw-r--r--. 1 root root   124 Jan 16 10:54 comps.xml
-rw-r--r--. 1 root root 10638 Jan 16 10:54 eb6cb5ebcd095094b88bec99ab6557daa2c0dc6a305c540e7e6267298376687e-updateinfo.xml.gz
-rw-r--r--. 1 root root  2155 Jan 16 10:54 productid
drwxr-xr-x. 2 root root  4096 Jan 16 16:47 repodata

А в repodata у нас появились файлы comps (выделены жирным). Это говорит о том, что теперь список групп будет доступен (если бы он был):

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/repodata/
total 328
drwxr-xr-x. 2 root root   4096 Jan 16 16:47 .
drwxr-xr-x. 4 root root    162 Jan 16 16:47 ..
-rw-r--r--. 1 root root 194421 Jan 16 16:47 5d3a98988d64c0fba42cf6f38c00cc7a56ece841967ad5c1b1f0e23c14c6dbb8-filelists.xml.gz
-rw-r--r--. 1 root root   9455 Jan 16 16:47 74446747bb7badc70ec2d426db315fa40c2e4a9a6d24656d350b31c5f4a0b9e5-other.sqlite.bz2
-rw-r--r--. 1 root root  76944 Jan 16 16:47 9c3e51467bb460465294f072070df75f03c748e4a5a47bed869668eefbbc5d40-filelists.sqlite.bz2
-rw-r--r--. 1 root root    124 Jan 16 16:47 a27718cc28ec6d71432e0ef3e6da544b7f9d93f6bb7d0a55aacd592d03144b70-comps.xml
-rw-r--r--. 1 root root  14000 Jan 16 16:47 ac4fd8f904f96e48a5a140819f4d6602251f2c155a18617568fb830298824dde-primary.sqlite.bz2
-rw-r--r--. 1 root root   5213 Jan 16 16:47 b24363dba2ecb22acf7afe41d8f79fb0ca33fad510b23c7d45336d687f1a6eac-other.xml.gz
-rw-r--r--. 1 root root   5849 Jan 16 16:47 c335203528188fd8d50943a2ba2c4e1724460dbd1cebcc8c7c330b5ad22721c8-primary.xml.gz
-rw-r--r--. 1 root root    133 Jan 16 16:47 e1211eb62da7048afd2c51cba1e3e0038f4a90ccadb099ce6092050fb276f5d2-comps.xml.gz
-rw-r--r--. 1 root root   3681 Jan 16 16:47 repomd.xml

Но у нас по-прежнему нет информации об Errata:

# yum --disablerepo=* --enablerepo=rhel-7-habr updateinfo list available
Loaded plugins: product-id, search-disabled-repos, subscription-manager
rhel-7-habr                                                                                                                                                             | 2.9 kB  00:00:00     
updateinfo list done

Для решения этой задачи нужно выполнить:

# gzip eb6cb5ebcd095094b88bec99ab6557daa2c0dc6a305c540e7e6267298376687e-updateinfo.xml.gz

# cp eb6cb5ebcd095094b88bec99ab6557daa2c0dc6a305c540e7e6267298376687e-updateinfo.xml repodata/updateinfo.xml

# modifyrepo repodata/updateinfo.xml repodata/
Wrote: /habr/rhel-7-server-ansible-2.4-rpms/repodata/updateinfo.xml.gz
           type = updateinfo
       location = repodata/eb89e725f7b8ee97b7e6b1f37bfdcfa2193136a7bb6b3645c3e2581388053f8a-updateinfo.xml.gz
       checksum = eb89e725f7b8ee97b7e6b1f37bfdcfa2193136a7bb6b3645c3e2581388053f8a
      timestamp = 1705441735
  open-checksum = f157fad9b0976407328d65ec66466d3a1577fe0ab22a6117898b1ce429370e99
Wrote: /habr/rhel-7-server-ansible-2.4-rpms/repodata/repomd.xml

Содержимое repodata обновилось, и появился файл *-updateinfo.xml.gz:

# ls -la /habr/rhel-7-server-ansible-2.4-rpms/repodata/
total 388
drwxr-xr-x. 2 root root   4096 Jan 16 16:48 .
drwxr-xr-x. 4 root root    159 Jan 16 16:47 ..
-rw-r--r--. 1 root root 194421 Jan 16 16:47 5d3a98988d64c0fba42cf6f38c00cc7a56ece841967ad5c1b1f0e23c14c6dbb8-filelists.xml.gz
-rw-r--r--. 1 root root   9455 Jan 16 16:47 74446747bb7badc70ec2d426db315fa40c2e4a9a6d24656d350b31c5f4a0b9e5-other.sqlite.bz2
-rw-r--r--. 1 root root  76944 Jan 16 16:47 9c3e51467bb460465294f072070df75f03c748e4a5a47bed869668eefbbc5d40-filelists.sqlite.bz2
-rw-r--r--. 1 root root    124 Jan 16 16:47 a27718cc28ec6d71432e0ef3e6da544b7f9d93f6bb7d0a55aacd592d03144b70-comps.xml
-rw-r--r--. 1 root root  14000 Jan 16 16:47 ac4fd8f904f96e48a5a140819f4d6602251f2c155a18617568fb830298824dde-primary.sqlite.bz2
-rw-r--r--. 1 root root   5213 Jan 16 16:47 b24363dba2ecb22acf7afe41d8f79fb0ca33fad510b23c7d45336d687f1a6eac-other.xml.gz
-rw-r--r--. 1 root root   5849 Jan 16 16:47 c335203528188fd8d50943a2ba2c4e1724460dbd1cebcc8c7c330b5ad22721c8-primary.xml.gz
-rw-r--r--. 1 root root    133 Jan 16 16:47 e1211eb62da7048afd2c51cba1e3e0038f4a90ccadb099ce6092050fb276f5d2-comps.xml.gz
-rw-r--r--. 1 root root  10617 Jan 16 16:48 eb89e725f7b8ee97b7e6b1f37bfdcfa2193136a7bb6b3645c3e2581388053f8a-updateinfo.xml.gz
-rw-r--r--. 1 root root   4098 Jan 16 16:48 repomd.xml
-rw-r--r--. 1 root root  41064 Jan 16 16:48 updateinfo.xml

И теперь всё заработало:

# yum --disablerepo=* --enablerepo=rhel-7-habr updateinfo list available
Loaded plugins: product-id, search-disabled-repos, subscription-manager
rhel-7-habr                                                                                                                                                                  | 4.0 kB  00:00:00     
(1/2): rhel-7-habr/group_gz                                                                                                                                                  |  133 B  00:00:00     
(2/2): rhel-7-habr/updateinfo                                                                                                                                                |  10 kB  00:00:00     
RHEA-2017:2806 enhancement   ansible-2.4.0.0-1.el7ae.noarch
RHBA-2017:3119 bugfix        ansible-2.4.1.0-1.el7ae.noarch
RHBA-2017:3406 bugfix        ansible-2.4.2.0-1.el7ae.noarch
RHBA-2018:0283 bugfix        ansible-2.4.3.0-1.el7ae.noarch
RHBA-2018:1212 bugfix        ansible-2.4.4.0-1.el7ae.noarch
RHSA-2018:2022 Moderate/Sec. ansible-2.4.5.0-1.el7ae.noarch
RHSA-2018:2152 Moderate/Sec. ansible-2.4.6.0-1.el7ae.noarch
RHEA-2017:2806 enhancement   ansible-doc-2.4.0.0-1.el7ae.noarch
RHBA-2017:3119 bugfix        ansible-doc-2.4.1.0-1.el7ae.noarch
RHBA-2017:3406 bugfix        ansible-doc-2.4.2.0-1.el7ae.noarch
RHBA-2018:0283 bugfix        ansible-doc-2.4.3.0-1.el7ae.noarch
RHBA-2018:1212 bugfix        ansible-doc-2.4.4.0-1.el7ae.noarch
RHSA-2018:2022 Moderate/Sec. ansible-doc-2.4.5.0-1.el7ae.noarch
RHSA-2018:2152 Moderate/Sec. ansible-doc-2.4.6.0-1.el7ae.noarch
RHEA-2017:2806 enhancement   libtomcrypt-1.17-23.el7.x86_64
RHEA-2017:2806 enhancement   libtommath-0.42.0-4.el7.x86_64
RHEA-2017:2806 enhancement   python-ecdsa-0.11-4.el7.noarch
RHEA-2017:2806 enhancement   python-httplib2-0.9.1-2.1.el7.noarch
RHEA-2017:2806 enhancement   python-paramiko-2.1.1-2.el7ae.noarch
RHSA-2018:1213 Low/Sec.      python-paramiko-2.1.1-4.el7.noarch
RHEA-2017:2806 enhancement   python-passlib-1.6.5-1.1.el7.noarch
RHBA-2017:3119 bugfix        python2-jmespath-0.9.0-4.el7ae.noarch
RHEA-2017:2806 enhancement   sshpass-1.06-1.el7.x86_64
updateinfo list done

Возвращаемся и примеряем полученную информацию на RHEL8 и 9.

Помним две вещи:

1. При использовании reposync нам нужно использовать ключ --download-metadata.

2. В таком случае выполнять createrepo не требуется, так как reposync выкачает всё.

Теперь примеры. Если мы работаем без ключа --download-metadata:

# reposync  --repoid=ansible-2.8-for-rhel-8-x86_64-rpms  -p /habr/
Failed to set locale, defaulting to C.UTF-8
Updating Subscription Management repositories.
Red Hat Ansible Engine 2.8 for RHEL 8 x86_64 (RPMs)                                                                                                                 2.2 kB/s | 4.0 kB     00:01    
(1/18): sshpass-1.06-3.el8ae.x86_64.rpm                                                                                                                             8.3 kB/s |  27 kB     00:03    
(2/18): ansible-2.8.1-1.el8ae.noarch.rpm                                                                                                                            2.9 MB/s |  15 MB     00:05    
(3/18): ansible-2.8.0-1.el8ae.noarch.rpm                                                                                                                            2.8 MB/s |  15 MB     00:05    
(4/18): ansible-2.8.2-1.el8ae.noarch.rpm                                                                                                                            3.0 MB/s |  15 MB     00:04    
(5/18): ansible-2.8.4-1.el8ae.noarch.rpm                                                                                                                            4.4 MB/s |  15 MB     00:03    
(6/18): ansible-2.8.3-1.el8ae.noarch.rpm                                                                                                                            4.2 MB/s |  15 MB     00:03    
(7/18): ansible-2.8.7-1.el8ae.noarch.rpm                                                                                                                            4.8 MB/s |  15 MB     00:03    
(8/18): ansible-2.8.6-1.el8ae.noarch.rpm                                                                                                                            4.5 MB/s |  15 MB     00:03    
(9/18): ansible-2.8.5-2.el8ae.noarch.rpm                                                                                                                            3.5 MB/s |  15 MB     00:04    
(10/18): ansible-2.8.10-1.el8ae.noarch.rpm                                                                                                                          5.2 MB/s |  15 MB     00:02    
(11/18): ansible-2.8.8-1.el8ae.noarch.rpm                                                                                                                           4.9 MB/s |  15 MB     00:02    
(12/18): ansible-2.8.11-1.el8ae.noarch.rpm                                                                                                                          4.9 MB/s |  15 MB     00:02    
(13/18): ansible-2.8.12-1.el8ae.noarch.rpm                                                                                                                          6.7 MB/s |  15 MB     00:02    
(14/18): ansible-2.8.13-1.el8ae.noarch.rpm                                                                                                                          5.2 MB/s |  15 MB     00:02    
(15/18): ansible-2.8.15-1.el8ae.noarch.rpm                                                                                                                          5.6 MB/s |  15 MB     00:02    
(16/18): ansible-2.8.16-1.el8ae.noarch.rpm                                                                                                                          5.4 MB/s |  15 MB     00:02    
(17/18): ansible-2.8.17-1.el8ae.noarch.rpm                                                                                                                          4.6 MB/s |  15 MB     00:03    
(18/18): ansible-2.8.18-1.el8ae.noarch.rpm                                                                                                                          3.5 MB/s |  15 MB     00:04    

# ls -la /habr/
total 0
drwxr-xr-x.  3 root root  48 Jan 17 02:26 .
dr-xr-xr-x. 20 root root 261 Jan 17 02:22 ..
drwxr-xr-x.  3 root root  22 Jan 17 02:26 ansible-2.8-for-rhel-8-x86_64-rpms

ls -la /habr/ansible-2.8-for-rhel-8-x86_64-rpms/
total 0
drwxr-xr-x. 3 root root 22 Jan 17 02:26 .
drwxr-xr-x. 3 root root 48 Jan 17 02:26 ..
drwxr-xr-x. 4 root root 24 Jan 17 02:26 Packages

А если используем его, то видим вот такую картину:

reposync  --repoid=ansible-2.8-for-rhel-8-x86_64-rpms --download-metadata -p /habr/
Failed to set locale, defaulting to C.UTF-8
Updating Subscription Management repositories.
Red Hat Ansible Engine 2.8 for RHEL 8 x86_64 (RPMs)                                                                                                                 2.3 kB/s | 4.0 kB     00:01    
Red Hat Ansible Engine 2.8 for RHEL 8 x86_64 (RPMs)                                                                                                                 389 kB/s | 2.0 MB     00:05    
(1/18): sshpass-1.06-3.el8ae.x86_64.rpm                                                                                                                             8.8 kB/s |  27 kB     00:03    
(2/18): ansible-2.8.0-1.el8ae.noarch.rpm                                                                                                                            3.4 MB/s |  15 MB     00:04    
(3/18): ansible-2.8.1-1.el8ae.noarch.rpm                                                                                                                            3.3 MB/s |  15 MB     00:04    
(4/18): ansible-2.8.2-1.el8ae.noarch.rpm                                                                                                                            4.1 MB/s |  15 MB     00:03    
(5/18): ansible-2.8.3-1.el8ae.noarch.rpm                                                                                                                            5.1 MB/s |  15 MB     00:02    
(6/18): ansible-2.8.4-1.el8ae.noarch.rpm                                                                                                                            4.0 MB/s |  15 MB     00:03    
(7/18): ansible-2.8.5-2.el8ae.noarch.rpm                                                                                                                            6.1 MB/s |  15 MB     00:02    
(8/18): ansible-2.8.6-1.el8ae.noarch.rpm                                                                                                                            5.0 MB/s |  15 MB     00:02    
(9/18): ansible-2.8.7-1.el8ae.noarch.rpm                                                                                                                            6.7 MB/s |  15 MB     00:02    
(10/18): ansible-2.8.8-1.el8ae.noarch.rpm                                                                                                                           5.5 MB/s |  15 MB     00:02    
(11/18): ansible-2.8.11-1.el8ae.noarch.rpm                                                                                                                          5.1 MB/s |  15 MB     00:02    
(12/18): ansible-2.8.10-1.el8ae.noarch.rpm                                                                                                                          4.1 MB/s |  15 MB     00:03    
(13/18): ansible-2.8.12-1.el8ae.noarch.rpm                                                                                                                          6.5 MB/s |  15 MB     00:02    
(14/18): ansible-2.8.13-1.el8ae.noarch.rpm                                                                                                                          6.1 MB/s |  15 MB     00:02    
(15/18): ansible-2.8.15-1.el8ae.noarch.rpm                                                                                                                          6.0 MB/s |  15 MB     00:02    
(16/18): ansible-2.8.16-1.el8ae.noarch.rpm                                                                                                                          4.8 MB/s |  15 MB     00:03    
(17/18): ansible-2.8.17-1.el8ae.noarch.rpm                                                                                                                          5.5 MB/s |  15 MB     00:02    
(18/18): ansible-2.8.18-1.el8ae.noarch.rpm                                                                                                                          5.5 MB/s |  15 MB     00:02    

# ls -la /habr/ansible-2.8-for-rhel-8-x86_64-rpms/
total 4
drwxr-xr-x. 4 root root   38 Jan 17 02:21 .
drwxr-xr-x. 3 root root   48 Jan 17 02:21 ..
drwxr-xr-x. 4 root root   24 Jan 17 02:21 Packages
drwxr-xr-x. 2 root root 4096 Jan 17 02:21 repodata

# ls -la /habr/ansible-2.8-for-rhel-8-x86_64-rpms/repodata/
total 2032
drwxr-xr-x. 2 root root    4096 Jan 17 02:21 .
drwxr-xr-x. 4 root root      38 Jan 17 02:21 ..
-rw-r--r--. 1 root root    3692 Jan 17 02:21 3a043c6ae0d22cb4fb861f6d56899bfbb361fc943c7636ea303b399aa4341106-primary.xml.gz
-rw-r--r--. 1 root root    2139 Jan 17 02:21 50b9a47d-c1b0-4bb1-bc44-1a8c9d9d60f3
-rw-r--r--. 1 root root   13854 Jan 17 02:21 5d2bf6693fa72826821286a65c1977320c0f75c94440391799a1cc23caef2774-primary.sqlite.bz2
-rw-r--r--. 1 root root 1052960 Jan 17 02:21 7c580f8bd872b59639aa04280dd3818115ad10c3eb8fea8c1ce924b27ad9c501-filelists.xml.gz
-rw-r--r--. 1 root root     124 Jan 17 02:21 a27718cc28ec6d71432e0ef3e6da544b7f9d93f6bb7d0a55aacd592d03144b70-comps.xml
-rw-r--r--. 1 root root   35694 Jan 17 02:21 af5e04be034d62dd035f39b31eb60e1f1b8a26b78f5a91edb9c80a13ea86fdb3-other.sqlite.bz2
-rw-r--r--. 1 root root  922059 Jan 17 02:21 b728eb62aa7e4f6d9ddcef3aee6fade1d89c921323f7f486edb48e629828ccbc-filelists.sqlite.bz2
-rw-r--r--. 1 root root   10323 Jan 17 02:21 d37c42017eefb515ac68f1c14bbe6024d051907690b93a9abf90fee70a54fe58-other.xml.gz
-rw-r--r--. 1 root root    5130 Jan 17 02:21 ecddb990a73ab03a16976494303a3ba388dffa64fd0aab6bf670e1139c3fd1a0-updateinfo.xml.gz
-rw-r--r--. 1 root root    4127 Jan 17 02:21 repomd.xml

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

© Habrahabr.ru