Thank you for reading this post, don't forget to subscribe!
Свой репозиторий может понадобиться в случае использования защищенного сегмента сети, желания сократить время загрузки пакетов, использовании своих сборок для установочных пакетов. Установка и настройка будет выполнена из командной строки.
Подготовка сервера
Выполняем некоторые настройки безопасности сервера.
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
* первая команда отключить его разово, вторая — на постоянной основе.
Настройка веб-сервера
Репозиторий для загрузки и установки пакетов представляет из себя хранилище файлов, доступ к которым осуществляется по http протоколу. Для этого нам понадобиться развернуть веб-сервер.
В качестве последнего мы будем использовать nginx. Для его установки, устанавливаем репозиторий epel:
yum install epel-release
После ставим сам nginx:
yum install nginx
Разрешаем запуск веб-сервера:
systemctl enable nginx
Запускаем его:
systemctl start nginx
Открываем браузер и переходим по адресу http://<IP-адрес сервера> — мы должны увидеть приветствие 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 -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
Настраиваем 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.
Посмотреть список установленных пакетов и с какого репозитория они были скачаны можно командой:
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 и другие.