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

Хабр, привет!
В этой статье хотим поделиться, как создать локальный репозиторий в 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
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
<comps />
Если бы мы изначально взяли более крупный репозиторий (например, rhel-7-server-rpms), то увидели бы там долгожданную информацию о группах:
# grep "<id>" /xxxxxxxxxxxx/x86_64/rhel-7-server-rpms/comps.xml
<id>virtualization-client</id>
<id>large-systems</id>
<id>mariadb-client</id>
<id>virtualization-hypervisor</id>
<id>print-server</id>
<id>development</id>
<id>backup-client</id>
<id>web-server</id>
<id>x11</id>
<id>directory-server</id>
<id>console-internet</id>
<id>dns-server</id>
<id>legacy-x</id>
<id>hardware-monitoring</id>
<id>debugging</id>
<id>postgresql</id>
<id>mainframe-access</id>
<id>postgresql-client</id>
<id>dial-up</id>
<id>smart-card</id>
<id>guest-agents</id>
<id>file-server</id>
<id>load-balancer</id>
<id>legacy-unix</id>
<id>kde-desktop</id>
<id>ftp-server</id>
<id>infiniband</id>
<id>system-admin-tools</id>
--------- 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
Теперь можем зеркалировать репозитории дальше, но уже с большим уровнем понимания и адекватно задаче, которую мы решаем. В то же время, если выбирать более быстрый способ создания репозитория, то мы сразу лишаем себя части функционала и доступа к ценным данным, в частности, к группам, специальным атрибутам пакетов и т.д.