Зеркало репозитория¶
Процедура создания зеркала репозитория¶
Для примера предположим что репозиторий помещается в /srv/repo, а синхронизация выполняется от имени пользователя repo.
- Установить пакет sisyphus-mirror:
apt-get install sisyphus-mirror
- Поправить конфигурационный файл
/etc/sisyphus-mirror/sisyphus-mirror.conf
- DESTROOT - путь до папки с копией репозитория (для примера
/srv/repo
) - SRCROOT - источник для синхронизации. Должно быть указано одно из зеркал altlinux (обычно лучше всего - яндекс: rsync://mirror.yandex.ru/altlinux).
- LIST - список версий для синхронизации через пробел. Для p8 - p8/branch
- ARCH="noarch x86_64 x86_64-i586" - список архитектур для синхронизации
- DESTROOT - путь до папки с копией репозитория (для примера
- Создать отдельного пользователя для синхронизации
useradd -m -d /srv/repo repo chmod o+rX /srv/repo
- Создать задание для периодической синхронизации:
echo "0 3 * * * /usr/bin/sisyphus-mirror" | crontab -u repo -
- Установить веб-сервер, например, nginx:
apt-get install nginx
- Создать файл конфигурации сервера для nginx в /etc/nginx/sites-available.d/repo.conf:
server { listen 80; server_name basealt-srv-repo.adm72.local; access_log /var/log/nginx/repo-access.log; error_log /var/log/nginx/repo-error.log; location / { root /srv/repo; autoindex on; } }
- Сделать ссылку в /etc/nginx/sites-enabled.d/:
ln -s /etc/nginx/sites-available.d/repo.conf /etc/nginx/sites-enabled.d/repo.conf
- Запустить nginx:
systemctl enable --now nginx
- Запустить синхронизацию репозиториев в ручную:
su -l -c 'sisyphus-mirror -i' repo
(рекомендуется запускать внутри screen или tmux)
По окончании первой синхронизации репозиторий готов к использованию.
Для уменьшения размера синхронизируемых данных можно использовать файл с исключениями /etc/sisyphus-mirror/exclude
. Исключения можно сгенерировать по ссылке http://sisyphus.ru/ru/rsync.shtml
Более подробная документация доступна в составе пакета: ls /usr/share/doc/sisyphus-mirror-*/README*
Процедура создания локального репозитория¶
Предположим что репозиторий размещается в /srv/repo/local, компонент назывется local.
Обратите внимание: процедура частично повторяет процедуру по созданию зеркала. Одинаковые шаги выполняются только один раз на сервер.
- Создать отдельного пользователя для управления репозиторием
useradd -m -d /srv/repo repo chmod o+rX /srv/repo
- Установить необходимые пакеты:
apt-get install /usr/bin/packages
- Создать скрипты для добавления пакетов и обновления метаданных:
cat > /usr/local/bin/create_repo.sh << EOT #!/bin/sh REPO_DIR="$1" REPO_NAME="$2" for i in i586 i686 x86_64 noarch; do mkdir -p "$REPO_DIR/$i/base" "$REPO_DIR/$i/RPMS.$REPO_NAME" done EOT cat > /usr/local/bin/generate_metadata.sh << EOT #!/bin/sh REPO_DIR="$1" REPO_NAME="$2" for arch in i586 i686 x86_64 noarch; do genbasedir --bloat --progress --topdir=$REPO_DIR $arch $REPO_NAME done EOT cat > /usr/local/bin/add_packages.sh << EOT #!/bin/sh REPO_DIR="$1" REPO_NAME="$2" PACKAGES_DIR="$3" #Arguments: <path_to_first_packet> <path_to_second_packet> <rpm_attr_to_compare (EPOCH, VERSION, RELEASE)> cmp_packets_attr(){ if [ $# -lt 3 ];then echo "cmp_packets_attr: needs 3 arguments" exit 4 fi f1="$1" f2="$2" attr="$3" a1=`rpm -qp --queryformat "%{$attr}" $f1` a2=`rpm -qp --queryformat "%{$attr}" $f2` zero="(none)" if [ "$a1" = "$zero" -a "$a2" != "$zero" ]; then return -1 fi if [ "$a1" != "$zero" -a "$a2" = "$zero" ]; then return 1 fi return `/usr/bin/rpmevrcmp $a1 $a2` } #Arguments: <path_to_first_packet> <path_to_second_packet> cmp_packets(){ if [ -z "$1" -o -z "$2" ];then echo "cmp_packets: needs 2 argument" exit 3 fi f1="$1" f2="$2" for attr in EPOCH SERIAL VERSION RELEASE; do cmp_packets_attr "$f1" "$f2" $attr if [ ! $? -eq 0 ];then return $? fi done return $? } pkglst=`/usr/bin/packages $PACKAGES_DIR | sort -u -k1,1 | cut -f3` for pkg in $pkglst; do file="$PACKAGES_DIR/$pkg" arch=`rpm -qp --queryformat %{ARCH} "$file"` rpm_name=`rpm -qp --queryformat %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm "$file"` tofile="$REPO_DIR/$arch/RPMS.$REPO_NAME/$rpm_name" if [ ! -e $tofile ];then cp "$file" "$tofile" continue fi cmp_packets "$file" "$tofile" if [ $? -gt 0 ];then cp -f "$file" "$tofile" fi done EOT chmod +x /usr/local/bin/{generate_metadata.sh,add_packages.sh,create_repo.sh}
- Создать структуру репозитория:
create_repo.sh /srv/repo/local local
- Установить веб-сервер, например, nginx:
apt-get install nginx
- Создать файл конфигурации сервера для nginx в /etc/nginx/sites-available.d/repo.conf:
server { listen 80; server_name basealt-srv-repo.adm72.local; access_log /var/log/nginx/repo-access.log; error_log /var/log/nginx/repo-error.log; location / { root /srv/repo; autoindex on; } }
- Сделать ссылку в /etc/nginx/sites-enabled.d/:
ln -s /etc/nginx/sites-available.d/repo.conf /etc/nginx/sites-enabled.d/repo.conf
- Запустить nginx:
systemctl enable --now nginx
Для добавления пакетов из папки /tmp/packages используется команда add_packages.sh /srv/repo/local local /tmp/packages
. После добавления/удаления пакетов в репозитории нужно обновить метаданные командой generate_metadata.sh /srv/repo/local local