Настройка своего репозитория CentOS

Обновлено Обновлено: Опубликовано Опубликовано:

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

Подготовка сервера

Выполняем некоторые настройки безопасности сервера.

Firewall

Разрешаем порты, на которых наш сервер будет принимать запросы:

firewall-cmd --permanent --add-port={80,443}/tcp

firewall-cmd --reload

* в данном примере мы разрешаем запросы http и https.

SELinux

Данный модель безопасности лучше отключить. Для этого вводим две команды:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

* первая команда отключить его разово, вторая — на постоянной основе.

При необходимости использовать SELinux, читаем статью Настройка SELinux в CentOS 7.

Настройка веб-сервера

Репозиторий для загрузки и установки пакетов представляет из себя хранилище файлов, доступ к которым осуществляется по http протоколу. Для этого нам понадобиться развернуть веб-сервер.

В качестве последнего мы будем использовать nginx. Для его установки, устанавливаем репозиторий epel:

yum install epel-release

После ставим сам nginx:

yum install nginx

Разрешаем запуск веб-сервера:

systemctl enable nginx

Запускаем его:

systemctl start nginx

Открываем браузер и переходим по адресу http://<IP-адрес сервера> — мы должны увидеть приветствие NGINX:

Приветствие NGINX

Создание репозитория

Настроим свой репозиторий, в котором будут храниться установочные пакеты. Также настроим их автоматическую синхронизацию с репозиторием CentOS.

Устанавливаем необходимые утилиты для работы с локальным репозиторием:

yum install createrepo yum-utils

Создаем каталоги для репозитория:

mkdir -p /usr/share/nginx/html/repos/7/{os,updates}/x86_64

* в данном примере будет создан каталог /usr/share/nginx/html/repos/7, а внутри него каталоги os (стандартный репозиторий для установка пакетов) и updates (обновления), в каждой из которых каталог x86_64 (для систем x64 архитектуры x86).

Устанавливаем rsync:

yum install rsync

Синхронизируем наш будущий репозиторий с источником пакетов, например, с зеркалом от Яндекса:

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/

... ждем ...

После синхронизируем updates:

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/updates/x86_64/ /usr/share/nginx/html/repos/7/updates/x86_64/

Создаем репозитории:

createrepo -v /usr/share/nginx/html/repos/7/os/x86_64

createrepo -v /usr/share/nginx/html/repos/7/updates/x86_64

А также разрешаем группы:

createrepo /usr/share/nginx/html/repos/7/os/x86_64 -g /usr/share/nginx/html/repos/7/os/x86_64/repodata/repomd.xml

createrepo /usr/share/nginx/html/repos/7/updates/x86_64 -g /usr/share/nginx/html/repos/updates/os/x86_64/repodata/repomd.xml

* в некоторых репозиториях файл repomd.xml может иметь другое название, например, comps.xml.

Настраиваем nginx:

vi /etc/nginx/conf.d/default.conf

    ...
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        autoindex on;
    }
    ...

* в данном примере мы добавили autoindex on для удобства — это позволит просматривать содержимое репозитория в браузере.

Перезапускаем nginx:

systemctl restart nginx

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/repos/7 — мы должны увидеть список os и updates. Походив по нему, мы найдем список скачанных пакетов.

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

Чтобы гарантировать, что все пакеты будут скачиваться с локального репозитория, отключаем имеющиеся:

find /etc/yum.repos.d -type f -exec sed -i "s/enabled=1/enabled=0/g" {} \;

* в данном примере мы во всей файлах каталога /etc/yum.repos.d нашли и заменили enabled=1 на enabled=0.
* можно также поступить радикально и удалить репозитории командой
\rm /etc/yum.repos.d/*

Создаем файл с настройкой репозитория:

vi /etc/yum.repos.d/local.repo

[local]
name=Local Yum Repo
baseurl=http://192.168.0.10/repos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[local-update]
name=Local Yum Repo for update packages
baseurl=http://192.168.0.10/repos/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

* где local — название репозитория; name — описание; baseurl — базовый адрес http, по которому нужно искать пакеты; enabled — указание на включение или отключение репозитория; gpgcheck — включить или отключить проверку GPG сигнатур для пакетов.

Также можно задать приоритет для каждого из репозиториев:

priority=1

* 1 — наивысший приоритет.

Готово. Можно выполнить установку.

Если в процессе обновления или установки мы получим ошибку [Errno 14] PYCURL ERROR 22, выполняем команду yum clean all. Подробнее в статье Ошибка CentOS: [Errno 14] PYCURL ERROR 22 - The requested URL returned error: 404.

Посмотреть список установленных пакетов и с какого репозитория они были скачаны можно командой:

yum list installed

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

Для поддержания списка пакетов в актуальном состоянии необходимо постоянно обновлять установочные файлы в репозиториях. Это можно делать вручную и/или автоматическом режиме.

Ручное обновление

Для обновления репозитория выполняем синхронизацию с источником пакетов (также, как мы делали начальную синхронизацию):

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/

И обновляем служебную информацию:

createrepo --update /usr/share/nginx/html/repos/7/os/x86_64

Аналогично, со всеми остальными репозиториями.

Автоматическое обновление

Его суть сводится к запуску скрипта в cron. Сначала создадим папку для хранения скриптов, затем сам скрипт:

mkdir /scripts

vi /scripts/repos_update.sh

#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/
createrepo --update /usr/share/nginx/html/repos/7/os/x86_64

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/updates/x86_64/ /usr/share/nginx/html/repos/7/updates/x86_64/
createrepo --update /usr/share/nginx/html/repos/7/updates/x86_64

Разрешаем запуск скрипта на выполнение:

chmod +x /scripts/repos_update.sh

Добавляем задание в cron:

crontab -e

0 1 * * * /scripts/repos_update.sh

* в данном примере мы запускаем наш скрипт каждый день в час ночи.

Разные релизы CentOS

В одном репозитории мы можем легко хранить пакеты для различных релизов операционной системы CentOS (и не только CentOS, но и PPA). Для этого создаем каталог под новый релиз, синхронизируем его с источником и создаем из него репозиторий, например:

mkdir -p /usr/share/nginx/html/repos/6/{os,updates}/x86_64

* в данном примере предполагается использование репозитория для релиза 6.

Синхронизируем пакеты:

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/6/os/x86_64/ /usr/share/nginx/html/repos/6/os/x86_64/

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/6/updates/x86_64/ /usr/share/nginx/html/repos/6/updates/x86_64/

Создаем репозитории:

createrepo -v /usr/share/nginx/html/repos/6/os/x86_64

createrepo -v /usr/share/nginx/html/repos/6/updates/x86_64

Epel Repo

Для Epel репозитория схема добавления похожа, кроме метода синхронизации — синхронизация с yandex выполняется с помощью wget.

Создаем отдельную ветку каталога:

mkdir -p /usr/share/nginx/html/repos/epel/7/x86_64

Синхронизируем пакеты:

wget -r -nH -np -nc -R index.html* https://mirror.yandex.ru/epel/7/x86_64/ -P /usr/share/nginx/html/repos/

Создаем репозитории:

createrepo -v /usr/share/nginx/html/repos/epel/7/x86_64

При настройке клиента создаем файл с настройкой репозитория:

vi /etc/yum.repos.d/local-epel.repo

[local-epel]
name=Local Extra Packages for Enterprise Linux 7
baseurl=http://192.168.0.10/epel/$releasever/$basearch/
enabled=1
gpgcheck=0

По такому же принципу мы можем добавить любой репозиторий, например, rpmforge, remi, nginx и другие.

# CentOS # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет