локальный репозиторий centos7

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 и другие.