Создаем собственный репозиторий для centos (на базе debian)



Репозиторий - это набор пакетов (в данном случае rpm), а также метаданные, которые считываются пакетным менеджером (в данном случае yum). Метаданные - это набор xml, содержащих контрольные суммы пакетов.



Обычно в метаданные входят следующие файлы:



repomd.xml: Файл-индекс, содержащий расположение, контрольную сумму и таймштампы остальных xml-файлов.

primary.xml.gz: Содержит детальную информацию о каждом пакете в репозитории: имя, версия, лицензия, зависимости, таймштампы, размер итп.

filelists.xml.gz: Содержит информацию о каждом файле и директории в каждом пакете репозитория

other.xml.gz: Содержит changelog, извлеченный из файла RPM SPEC для каждого файла в репозитории.



Что нужно чтоб репозиторий работал:

1) доступность - могут быть случаи, когда репозиторий нужен только локально, тогда вам не интересна доступность, иначе, нужно "раздавать" репозиторий с помощью веб или фтп сервера. Ничего особенного настраивать не нужно - только положите файлы так, чтобы к ним можно было обратиться по http\ftp\.. протоколам.

2) Собственно сам репозиторий - его мы будем скачивать с одного из публичных

3) Файлы индекса - о том что это такое рассказано выше.



Устанавливаем необходимые пакеты. Из пакете yum-utils нам пригодится конфиг и папка с репозиториями, lzma нужен для работы с xz архивами при создании репозитория. createrepo будет создавать индекс репозитория и помещать их в архивы в папке repodata.



# apt update

# apt upgrade

# apt install yum-utils createrepo lzma python-lzma

# mkdir /mirrors/centos



По умолчанию утилита reposync считывает конфиг yum'a и скачивает "enabled=1" репозитории. Поэтому в первую очередь нам необходимо создать нужные репы в папке /etc/yum/repos.d/.



Например, возьмем базовый репозиторий Centos-6 и Epel-7 (разные версии для полноты примера)



/etc/yum/repos.d/base-6.repo



[base-6]

name=CentOS-6 - Base

baseurl=http://mirror.yandex.ru/centos/6/os/x86_64/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

enabled=1







/etc/yum/repos.d/epel-release-7.repo



[epel-7]

name=Extra Packages for Enterprise Linux 7 - x86_64

baseurl=http://download.fedoraproject.org/pub/epel/7/x86_64/

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7



Созданные файлы в repos.d, по-умолчанию включены в yum.conf, поэтому по-умолчанию править конфиг не придется. Выполним теперь скачивание и синхронизацию:



# reposync -c /etc/yum/yum.conf --download_path=/mirrors/centos/

# createrepo -o /mirrors/centos/base-6/ /mirrors/centos/base-6/

# createrepo -o /mirrors/centos/epel-7/ /mirrors/centos/epel-7/



createrepo создаст индексы в папках repodata, расположеные каждая в своем репозитории. Это нарушает обычную структуру репозитория, но здесь вы вольны делать расположения как душе угодно, ведь вы контролируете репозиторий и вам его потом настраивать.



Выполним настройку со стороны клиента в файле, например, repo.repo



[epel-7]

name=Extra Packages for Enterprise Linux 7 - x86_64

baseurl=http://repo.infra.onsec.ru/centos/epel-7/

#failovermethod=priority

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7



Небольшое отступление. Поскольку хочется, чтобы зеркало работало с родными gpg ключами, то мы не производим переподписывание пакетов. Посему вам придется установить ключи выбранных репозиториев и на клиента и на сервер.

на сервере, например: rpm --import /etc/yum/keys/RPM-GPG-KEY-CentOS-SIG-SCLo

на клиенте - как обычно.



Еще одно замечание: createrepo поддерживает ключ —update, который после первичного создания репозитория не пересоздает индексы заново, а обновляет. это существенно ускоряет работу (вместо 5 минут - 15 секунд), однако он очень требователен к оперативной памяти. Например для репозитория свыше 9к пакетов потребуется 1,5гига оперативки. В случае нехватки памяти вываливается с ошибкой killed, а в логах видно ошибку out of mem. Полная же переинициализация репозитория к памяти вообще не требовательна. Поэтому внимательнее относитесь к использованию в production.