Проект

Общее

Профиль

Зеркало репозитория

Процедура создания зеркала репозитория

Для примера предположим что репозиторий помещается в /srv/repo, а синхронизация выполняется от имени пользователя repo.

  1. Установить пакет sisyphus-mirror: apt-get install sisyphus-mirror
  2. Поправить конфигурационный файл /etc/sisyphus-mirror/sisyphus-mirror.conf
    1. DESTROOT - путь до папки с копией репозитория (для примера /srv/repo)
    2. SRCROOT - источник для синхронизации. Должно быть указано одно из зеркал altlinux (обычно лучше всего - яндекс: rsync://mirror.yandex.ru/altlinux).
    3. LIST - список версий для синхронизации через пробел. Для p8 - p8/branch
    4. ARCH="noarch x86_64 x86_64-i586" - список архитектур для синхронизации
  3. Создать отдельного пользователя для синхронизации
    useradd -m -d /srv/repo repo
    chmod o+rX /srv/repo
    
  4. Создать задание для периодической синхронизации: echo "0 3 * * * /usr/bin/sisyphus-mirror" | crontab -u repo -
  5. Установить веб-сервер, например, nginx: apt-get install nginx
  6. Создать файл конфигурации сервера для 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;
       }
    }
    
  7. Сделать ссылку в /etc/nginx/sites-enabled.d/: ln -s /etc/nginx/sites-available.d/repo.conf /etc/nginx/sites-enabled.d/repo.conf
  8. Запустить nginx: systemctl enable --now nginx
  9. Запустить синхронизацию репозиториев в ручную: 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.

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

  1. Создать отдельного пользователя для управления репозиторием
    useradd -m -d /srv/repo repo
    chmod o+rX /srv/repo
    
  2. Установить необходимые пакеты: apt-get install /usr/bin/packages
  3. Создать скрипты для добавления пакетов и обновления метаданных:
    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}
    
  4. Создать структуру репозитория: create_repo.sh /srv/repo/local local
  5. Установить веб-сервер, например, nginx: apt-get install nginx
  6. Создать файл конфигурации сервера для 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;
       }
    }
    
  7. Сделать ссылку в /etc/nginx/sites-enabled.d/: ln -s /etc/nginx/sites-available.d/repo.conf /etc/nginx/sites-enabled.d/repo.conf
  8. Запустить nginx: systemctl enable --now nginx

Для добавления пакетов из папки /tmp/packages используется команда add_packages.sh /srv/repo/local local /tmp/packages. После добавления/удаления пакетов в репозитории нужно обновить метаданные командой generate_metadata.sh /srv/repo/local local

Добавить изображение из буфера обмена (Максимальный размер: 24,4 МБ)