Создание копии репозитория rpm пакетов при помощи mrepo

Основная цель данной статьи - описание процедуры создания локального репозитория rpm пакетов для дистрибутива Red Hat Enterpise Linux 5 при помощи утилиты mrepo.

Установка:
Последнюю версию (на момент написания статьи 0.8.6) собранную в rpm пакет можно скачать по ссылке: mrepo-0.8.6-1.noarch.rpm.
Также для установки данной утилиты нужно поставить пакет createrepo.
Устанавливаем данный пакеты следующими командами:

rpm -iUhv http://dag.wieers.com/rpm/packages/createrepo/createrepo-0.4.8-1.el5.rf.noarch.rpm
rpm -iUhv http://contrib.ru/sites/default/files/mrepo-0.8.6-1.noarch.rpm

Для создания создания репозитория для утилиты apt требуется, чтобы данный пакет был установлен на том сервере, где создается репозиторий.
Подготовка закончена.

Настройка сервера:
После установки всех необходимых пакетов приступаем к созданию инфраструктуры репозитория. В данной статье все файлы репозитория располагаются в папке /opt/mrepos. Советую выделить под данный раздел не менее 40 Gb дискового пространства, так как зеркалирование 2-3 крупных репозиториев (epel, rpmforge, ovzkernel) занимает достаточно много места. У меня данный раздел оформлен как LVM партиция, чтобы можно было сделать resize или снапшот в случае необходимости.
Для доступа других серверов к репозиторию - необходимо установить на сервере любой WEB сервер. По умолчанию, в составе пакета mrepo идет конфигурационный файл для WEB сервера apache.

lvcreate -n repos -L 40G VG0
mkdir /opt/mrepos/
mkfs.ext3 /dev/VG0/repos
echo "/dev/VG0/repos /opt/mrepos ext3 defaults 0 0" >> /etc/fstab
mount -a

Настройка утилиты mrepo:

mkdir /opt/mrepos/rhel5s-x86_64

Теперь регистрируем нашу систему в Red Hat Network.

gensystemid -u RHN_user -p RHN_password --release=5Server --arch=x86_64 /opt/mrepos/rhel5s-x86_64/

Для успешной регистрации необходимо как минимум 1 свободная подписка на основной и дополнительные каналы обновления ПО. Например, у вас есть 6 зарегистрированных лицензионных ключей и 6 описанных серверов. Необходимо освободить 1 подписку на каналы ПО в настройках любого сервера. Для этого нужно выбрать сервер, далее перейти в закладку Software -> Software Channels. В ней выбрать:
Base Channel: None - disable this service.
Также нужно снять все подписки на дополнительные каналы ПО.

При запуске программы возможно возникновение ошибки:

No rhnuuid config option found in /etc/sysconfig/rhn/up2date-uuid.

В данном случае нужно создай данный файл и добавить следующую информацию:

uuid[comment]=Universally Unique ID for this server
rhnuuid=1e4c1cf1-2bcd-4b88-b988-d6b1a6fd1f51

Где значение для параметра rhnuuid создается при помощи программы uuidgen.

В результате выполнения команды gensystemid создается xml файл systemid с описанием системы и некоторых параметров специально для RHN. Аналогичный файл создается и при регистрации в RHN при помощи стандартных средств ОС. По умолчанию он сохраняется в директории /etc/sysconfig/rhn, так что по идее можно его просто скопировать в /opt/mrepos/rhel5s-x86_64/ и mrepo будет его использовать.

Используем следующие конфигурационные файлы:

Основной конфигурационный файл для утилиты mrepo:

cat /etc/mrepo.conf

### Configuration file for mrepo

### The [main] section allows to override mrepo's default settings
### The mrepo-example.conf gives an overview of all the possible settings
[main]
srcdir = /opt/mrepos
wwwdir = /opt/mrepos/www
confdir = /etc/mrepo.conf.d/
hardlink = yes
shareiso = yes

arch = x86_64

mailto = root@localhost
smtp-server = localhost

#rhnlogin = rhnlogin:rhnpassword

metadata = repomd repoview yum apt

### Any other section is considered a definition for a distribution
### You can put distribution sections in /etc/mrepo.conf.d/
### Examples can be found in the documentation at:
###     /usr/share/doc/mrepo-0.8.6/dists/.

Дополнительный конфигурационный файл для утилиты mrepo. Он описывает логику создания репозитория для RHEL 5.
В разделе iso данного конфигурационного файла добавил 3-и диска скачанные из RHN. Удобно, когда установочные диски доступны для сетевой установки.

cat /etc/mrepo.conf.d/rhel5s.conf

### Name: Red Hat Enterprise Server v5
### URL: http://www.redhat.com/

[rhel5s]
name = Red Hat Enterprise Server $release ($arch)
release = 5
#arch = i386 x86_64 ia64 ppc s390 s390x
arch = x86_64
metadata = repomd repoview yum apt

### ISO images
#iso = rhel-$release-server-$arch-disc?.iso rhel-$release-server-srpms-disc?.iso
iso = rhel-server-5.3-x86_64-dvd.iso rhel-server-5.3-source-dvd.iso rhel-server-supplementary-5.3-x86_64-disc1.iso

### Additional repositories
updates = rhns:///rhel-$arch-server-5
vt = rhns:///rhel-$arch-server-$repo-5
supplementary = rhns:///rhel-$arch-server-$repo-5
fastrack = rhns:///rhel-$arch-server-$repo-5
rhn-tools = rhns:///$repo-rhel-$arch-server-5

### RPMforge repository
#rpmforge = rsync://apt.sw.be/pub/freshrpms/pub/dag/redhat/el$release/en/$arch/RPMS.dag/
#rpmforge = ftp://apt.sw.be/pub/dag/pub/redhat/el$release/en/$arch/RPMS.dag/
rpmforge = http://apt.sw.be/redhat/el$release/en/$arch/RPMS.dag/

### OpenVZ repositories
ovzkernel = http://download.openvz.org/kernel/rhel5/
ovztemplate = http://download.openvz.org/template/
ovzutils = http://download.openvz.org/utils/

### Fedora EPEL packages (incompatible with RPMforge)
epel = http://download.fedora.redhat.com/pub/epel/$release/$arch/

### Custom repository for your own RPM packages
custom =

Конфигурационный файл WEB сервера Apache:

cat /etc/httpd/conf.d/mrepo.conf

### Directory-based for the main server
Alias /mrepo /opt/mrepos/www
Alias /yam /opt/mrepos/www

<Directory /opt/mrepos/www>
	Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
	IndexOptions NameWidth=* DescriptionWidth=*

	### Authentication options
	#order deny,allow
	#deny from all
	#allow from 127.0.0.1
	#allow from horsea.3ti.be
	#allow from pikachu.3ti.be

	#AuthUserFile /var/mrepo/auth/.htpasswd
	#Require user bert dag dries thias
	
	HeaderName HEADER.shtml
	ReadmeName README.shtml

	AddDescription "CDROM ISO file" .iso
	AddDescription "RPM packages" .rpm
	AddDescription "Yum 1.x header file" .hdr

	AddDescription "Mounted CDROM ISO" CD[0-9]
	AddDescription "Mounted CDROM ISO" disc[0-9]
	AddDescription "All RPM packages merged" RPMS.all
	AddDescription "Custom local RPM packages" RPMS.local
	AddDescription "OS RPM packages" RPMS.core
	AddDescription "OS RPM packages" RPMS.os
	AddDescription "OS update RPM packages" RPMS.updates
	AddDescription "YaST Online Update RPM packages" RPMS.you
	AddDescription "3rd party RPM packages" RPMS.
	AddDescription "OS source RPM packages" SRPMS

	AddDescription "Apt metadata" base
	AddDescription "Old-style Yum metadata" headers
	AddDescription "New-style Yum metadata" repodata
	AddDescription "Temporary Yum metadata" .newheaders

	AddDescription "CentOS 2 for x86" centos2-i386
	AddDescription "CentOS 3 for x86" centos3-i386
	AddDescription "CentOS 4 for alpha" centos4-alpha
	AddDescription "CentOS 4 for IA64" centos4-ia64
	AddDescription "CentOS 4 for ppc" centos4-ppc
	AddDescription "CentOS 4 for s/390" centos4-s390
	AddDescription "CentOS 4 for s/390x" centos4-s390x
	AddDescription "CentOS 4 for sparc" centos4-sparc
	AddDescription "CentOS 4 for x86" centos4-i386
	AddDescription "CentOS 4 for x86_64" centos4-x86_64
	AddDescription "CentOS 5 for alpha" centos5-alpha
	AddDescription "CentOS 5 for IA64" centos5-ia64
	AddDescription "CentOS 5 for ppc" centos5-ppc
	AddDescription "CentOS 5 for s/390" centos5-s390
	AddDescription "CentOS 5 for s/390x" centos5-s390x
	AddDescription "CentOS 5 for sparc" centos5-sparc
	AddDescription "CentOS 5 for x86" centos5-i386
	AddDescription "CentOS 5 for x86_64" centos5-x86_64
	AddDescription "Fedora Core 1 for x86" fc1-i386
	AddDescription "Fedora Core 1 for x86_64" fc1-x86_64
	AddDescription "Fedora Core 2 for x86" fc2-i386
	AddDescription "Fedora Core 2 for x86_64" fc2-x86_64
	AddDescription "Fedora Core 3 for x86" fc3-i386
	AddDescription "Fedora Core 3 for x86_64" fc3-x86_64
	AddDescription "Fedora Core 4 for x86" fc4-i386
	AddDescription "Fedora Core 4 for PPC" fc4-ppc
	AddDescription "Fedora Core 4 for x86_64" fc4-x86_64
	AddDescription "Fedora Core 5 for x86" fc5-i386
	AddDescription "Fedora Core 5 for PPC" fc5-ppc
	AddDescription "Fedora Core 5 for x86_64" fc5-x86_64
	AddDescription "Fedora Core 6 for x86" fc6-i386
	AddDescription "Fedora Core 6 for PPC" fc6-ppc
	AddDescription "Fedora Core 6 for x86_64" fc6-x86_64
	AddDescription "Red Hat Linux 6.2 for x86" rh62-i386
	AddDescription "Red Hat Linux 7.3 for x86" rh73-i386
	AddDescription "Red Hat Linux 8.0 for x86" rh80-i386
	AddDescription "Red Hat Linux 9 for x86" rh9-i386
	AddDescription "Red Hat Advanced Server 2.1 for x86" rhel2.1as-i386
	AddDescription "Red Hat Advanced Server 3 for PPC" rhel3as-ppc
	AddDescription "Red Hat Advanced Server 3 for s/390" rhel3as-s390
	AddDescription "Red Hat Advanced Server 3 for x86" rhel3as-i386
	AddDescription "Red Hat Advanced Server 3 for x86_64" rhel3as-x86_64
	AddDescription "Red Hat Advanced Server 4 for IA64" rhel4as-ia64
	AddDescription "Red Hat Advanced Server 4 for PPC" rhel4as-ppc
	AddDescription "Red Hat Advanced Server 4 for s/390" rhel4as-s390
	AddDescription "Red Hat Advanced Server 4 for x86" rhel4as-i386
	AddDescription "Red Hat Advanced Server 4 for x86_64" rhel4as-x86_64
	AddDescription "Red Hat Advanced Server 5 for IA64" rhel5as-ia64
	AddDescription "Red Hat Advanced Server 5 for PPC" rhel5as-ppc
	AddDescription "Red Hat Advanced Server 5 for s/390" rhel5as-s390
	AddDescription "Red Hat Advanced Server 5 for x86" rhel5as-i386
	AddDescription "Red Hat Advanced Server 5 for x86_64" rhel5as-x86_64
	AddDescription "Red Hat Enterprise Server 3 for x86" rhel3es-i386
	AddDescription "Red Hat Enterprise Server 3 for x86_64" rhel3es-x86_64
	AddDescription "Red Hat Enterprise Server 4 for x86" rhel4es-i386
	AddDescription "Red Hat Enterprise Server 4 for x86_64" rhel4es-x86_64
	AddDescription "Red Hat Enterprise Server 5 for x86" rhel5es-i386
	AddDescription "Red Hat Enterprise Server 5 for x86_64" rhel5es-x86_64
	AddDescription "Red Hat Workstation 3 for x86" rhel3ws-i386
	AddDescription "Red Hat Workstation 3 for x86_64" rhel3ws-x86_64
	AddDescription "Red Hat Workstation 4 for x86" rhel4ws-i386
	AddDescription "Red Hat Workstation 4 for x86_64" rhel4ws-x86_64
	AddDescription "Red Hat Workstation 5 for x86" rhel5ws-i386
	AddDescription "Red Hat Workstation 5 for x86_64" rhel5ws-x86_64
	AddDescription "SuSE Enterprise Server 8 for i386" sles8-i386
	AddDescription "SuSE Enterprise Server 9 for i386" sles9-i386
	AddDescription "Tao Linux 1 for i386" tao1-i386
	AddDescription "Tao Linux 1 for x86_64" tao1-x86_64
	AddDescription "Tao Linux 4 for i386" tao4-i386
	AddDescription "Tao Linux 4 for x86_64" tao4-x86_64
	AddDescription "Yellow Dog Linux 3.0 for PPC" yd3-ppc
	AddDescription "Yellow Dog Linux 4.0 for PPC" yd4-ppc
</Directory>

### Name based virtual-host named "mrepo"
### """"""""""""""""""""""""""""""""""""
### The purpose of this virtual host is to provide a URL http://mrepo/
### as a standard on your local network and map it to the correct IP
### for the different networks that have access to it.
#
#NameVirtualHost mrepo:80
#
#<VirtualHost mrepo:80>
#	ServerName mrepo
#	ServerAlias mrepo.3ti.be mrepo.localdomain
#	DocumentRoot /var/www/mrepo
#	ErrorLog logs/mrepo-error_log
#	CustomLog logs/mrepo-access_log combined
#</VirtualHost>

После изменения конфигурационный файлов запускаем утилиту mrepo:

mrepo -ugvvvv

Начнется процесс скачивания ПО со всех серверов перечисленных в конфигурационном файле. Также подмонтируются все iso образы, которые расположены в папке /opt/mrepos/ и указаны в конфигурационном файле в параметре iso.

Настройка клиента:

Для клиента yum:

Основной репозиторий RHN

cat /etc/yum.repos.d/a.os.repo

[os]
name=Main repository
baseurl=http://SERVERNAME/mrepo/rhel5s-x86_64/RPMS.os/
enabled=1
gpgcheck=0

Обновления из репозиторий RHN

cat /etc/yum.repos.d/b.updates.repo

[updates]
name=Updates repository
baseurl=http://SERVERNAME/mrepo/rhel5s-x86_64/RPMS.updates/
enabled=1
gpgcheck=0

Для клиента apt:

echo "rpm http://SERVERNAME/mrepo/ rhel5s-x86_64 os updates" >> /etc/apt/sources.list

Для обновления данного репозитория достаточно запускать mrepo -ugvvvv по требованию.

Решение проблем:

Во время настройки репозитория возникли 2-е проблемы:
1) Старая версия lftp клиента, у меня была установлена версия 3.7.1. Она некорректно работает с hardlink`ами. То есть иногда обновления репозитория зависало на этапе удаления пакета и его скачивания или просто входило в бесконечный цикл на данном этапе. Проблема решилась обновлением версии клиента до 3.7.8.

2) Скачивание пакетов из RHN. Пришлось после регистрации клиента при помощи gensystemid зайти в WEB интерфейс RHN и подписать сервер SERVERNAME-ARCH-mrepo на все доступные каналы распространения ПО. После этого подключение к RHN из утилиты mrepo стало проходить без проблем.
Но если в вашем случае и это не поможет. То укажите логин и пароль от RHN в основном конфигурационном файле в параметре rhnlogin.