Создание локального зеркала репозитория Arch Linux. Краткое руководство с использованием rsync и webfs.

Установка необходимых компонентов

Для быстрой развертки зеркала я использовал rsync, webfs, # /dev/brain :) Данное ПО было выбрано мной за простоту и скорость развертки.

Установка

pacman -S webfs rsync

Конфигурирование компонентов

Конфигурирование rsyncd

Для начала определимся с путями к зеркалу, в моем случае это ‘’‘/home/username/repo/arch/’‘’

Затем создадим конфигурационный файл, если его еще нет:

nano /etc/rsyncd.conf

или

vim /etc/rsyncd.conf

или

mcedit /etc/rsyncd.conf

тут уже вопрос вкуса и привычки.

Содержание примерно следующее:

1
2
3
4
5
6
7
8
9
    pid file = /var/run/rsyncd.pid 
motd file = /etc/rsync/rsyncd.motd 
syslog facility = local3 
timeout = 150 
max connections = 10 
 [archlinux] 
                 path = /home/psix/archive/repo/ 
                     comment = ArchLinux repo 
                 read only = yes

Конфигурирование webfsd

nano /etc/conf.d/webfsd

или

vim /etc/conf.d/webfsd

или

mcedit /etc/conf.d/webfsd

Содержимое файла у меня получилось таким:

WEBFSD_ARGS=“-p 8000 -u nobody -R /home/username/repo/arch/ -f index.html”

На этом стадия конфигурирования завершена, приступим написанию скриптов.

Написание скриптов

  • Скрипт синхронизации с зеркалом интернета

repo-update.sh

Сам скрипт:

1
2
3
4
5
6
7
8
9
 #!/bin/bash
 remote="mirror.datacenter.by::arch" 
 local="/home/username/repo/arch/" 
 repos=(core extra community community-staging community-testing gnome-unstable kde-unstable staging testing multilib multilib-testing pool iso) 
 for repo in "${repos[@]}"; do
      if [ "$repo" = "${repo#!}" ]; then 
                rsync -avzhP --delete "$remote/$repo" "$local"; 
       fi 
 done

Расшифровка по строкам:

  • Объявляем обработчик скрипта у нас это bash

  • Переменная remote указывает интернeт сервер, с которого мы синхронизируемся

  • Переменная local указывает директорию куда синхронизировать репозитории

  • Переменная repos является массивом названий репозитариев

  • Открываем цикл переборки массива repos

  • Проверяем наличие текущий индекс на наличие в массиве

  • Запускаем rsync с параметрами -avzhP —delete (описание параметров можно посмотреть выполнив в терминале man rsync) и подставляем наши переменные.

  • Заканчиваем проверку

  • Закрываем цикл

Недостатки

  • Невозможно пропустить ненужные пакеты

  • Нет проверки на доступность соеденения с интернетом

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

Все вышеуказанные недостатки очень просто исправить.

Дадим скрипту права на выполение:

chmod +x repo-update.sh

Скрипт запуска и остановки сервера

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #!/bin/bash
 case "$1" in 
 start)
     /etc/rc.d/rsyncd start
     /etc/rc.d/webfsd start
   ;;
 stop)
     /etc/rc.d/rsyncd stop
     /etc/rc.d/webfsd stop
   ;;
 restart)
     /etc/rc.d/rsyncd restart
     /etc/rc.d/webfsd restart
   ;;
      *) 
  echo "usage: $0 {start|stop|restart}"
 esac

Далее можно в /etc/rc.d/ создать файл repo и поместить туда скрипт, после чего дать ему права на выполнение

chmod +x /etc/rc.d/repo

и прописать в секцию daemons файла /etc/rc.conf

Запуск синхронизации по cron

Тут все очень просто :) создам файл cron со следующим содержанием:

30 */4 * * * /home/username/repo-update.sh

затем

$ crontab ./cron

На этом мы и закончим. Пожалуй мой метод далеко не без недостатков, но он работает и это самое главное :)

См. так же: