Веб-страничка Дмитрия Кашина

Зеркалирование репозитория Debian - это просто!

Русский / English

Зачем делать репозиторий?

Иногда возникает необходимость иметь с собой репозиторий. Причины тому бывают самые разные. Но чаще всего дело в том, что необходмо произвести установку там, где доступ к интернету затруднён или отсутствует.

Существует множество утилит для создания зеркал. Я лично имел опыт работы с ftpsync и apt-mirror, но ни один из этих инструментов у меня не прижился. Первый, хоть и рекомендован сообществом, работает только в один поток, а второй имеет довольно скудную документацию. Но что более неприятно, зеркала, которые у меня получались с их помощью, имели тенденцию быстро расти.

Сравнительно недавно появилась новая утилита aptly, предназначенная для управления репозиториями. Разрабатывает её Андрей Смирнов, мой соотечественник. Пишется утилита на новомодном языке Go, основной репозиторий находится на github.

Утилита сходу понравилась хорошей документацией и продуманным дизайном. В данной статье мы рассмотрим подробнее практику работы с ней.

Aptly как он есть

Логика работы aptly базируется на трёх концепциях: заркала, снимка и публикации. Зеркало - это связывание адреса репозитория и его локальной копии. Зеркала можно синхронизировать с репозиториями, а также с них можно делать снимки. Снимок - это набор пакетов, которые находились в репозитории в некоторый момент времени. Единожды сделав снимок с зеркала Вы получаете гарантию, что входящий в него пакет не будет удалён при обновлении зеркала, и он всегда будет Вам доступен, если Вы захотите опубликовать его. Публикация же - это набор пакетов из одного или нескольких снимков в той форме, в которой её ожидает APT. То есть обычное дерево каталогов, которое мы можем видеть в любом репозитории, составленное из жёстких ссылок на соответствующие файлы во внутреннем хранилище aptly.

Также есть возможность создавать собственные репозитории и оперировать в них пакетами, делать репозитории-фильтры, утягивая в них интересующие вас пакеты вместе с их зависимостями. И это всё объединено одним интерфейсом, работающим с одной базой пакетов.

Поскольку aptly обладает весьма хорошей документацией, я не стану повторяться и рассказывать, как пользоваться этой утилитой. Вместо этого мы сосредоточимся на том, какие проблемы могут возникнуть при её использовании.

Сборка вручную

Во-первых, надо учитывать, что утилита ещё молодая. В ней перманентно кипит работа над поиском и исправлением багов, и самый правильный подход для работы с ней - собирать её вручную.

Для того, чтобы собрать её, необходимо поставить пакет golang, а затем выполнить следующие команды:

go get -u github.com/mattn/gom
mkdir -p $GOPATH/src/github.com/smira/aptly
git clone https://github.com/smira/aptly $GOPATH/src/github.com/smira/aptly
cd $GOPATH/src/github.com/smira/aptly
gom -production install
gom build -o $GOPATH/bin/aptly

Разумеется не помешает предварительно экспортировать переменную $GOPATH. Можете поставить любой путь - эта переменная всего лишь указывает, куда будут ставиться локальные библиотеки Go.

Куда более интересная штука, это gom, который ставится первой командой. Это система разрешения зависимостей между программами на Go. Если коротко, то он ищет, скачивает и компилирует все зависимости программы, так что программист может не беспокоиться о сборочном окружении - за него всё будет сделано. Как CPAN, но для Go.

И ещё неплохо выставить пути к бинарникам Go. Я дописал в свой .zshrc следующее:

# golang local libraries
export GOPATH="$HOME/golang"
export PATH="$GOPATH/bin:$PATH"

Сборка от автора

Если Вы всё же по каким-то причинам не хотите собирать проект вручную, то в Debian уже есть пакет aptly. Весьма устаревший но более-менее рабочий.

% apt-cache policy aptly
aptly:
  Installed: (none)
  Candidate: 0.7.1-1
  Version table:
     0.8-1 0
          1 file:/home/freehck/.aptly/public/ sid/main amd64 Packages
        100 /var/lib/dpkg/status
     0.7.1-1 0
        500 file:/home/freehck/.aptly/public/ jessie/main amd64 Packages

Также Вы можете подключить репозиторий автора:

deb http://repo.aptly.info/ squeeze main

Автоматизация

Инструмент хороший, но нуждается в небольшой доработке для своих нужд. В идеале хотелось бы, чтобы хотя бы раз в сутки обновлялись все зеркала, а вместе с ними и все публикации. Специально для этих целей я написал скрипт repo-update.sh, который Вы можете скачать моего репозитория:

Внимание! Я хочу особо отметить, что repo-update.sh находится в активной разработке, и теоретически статья может слегка "отстать" от самого скрипта. Чтобы наверняка не возникло никаких казусов, выполните, например, repo-update.sh -h, и прочитайте какие есть флаги и действия на данный момент. Также в комментариях в начале скрипта может быть полезная информация об использовании.

% git clone http://git.freehck.ru/repos/aptly-scripts.git

Чтобы им воспользоваться, всё, что нужно сделать, это создать несколько зеркал с именами вида '$release/$component'.

% aptly mirror create sid/main http://mirror.yandex.ru/debian/ sid main
# % aptly mirror create <...>

Затем надо создать публикации:

% repo-update.sh -l- create

В процессе работы у Вас будет несколько раз спрошен пароль от Вашего gpg-ключа для того, чтобы подписать новосозданный репозиторий. Если Вы не желаете постоянно вводить его, можете один раз записать его после флага -g.

Возможно, Вас несколько удивляет, что Вы должны подписать зеркало своим ключом, но к сожалению это связано с тем, что утилита aptly пока не поддерживает настоящее зеркалирование. Она лишь позволяет создать новый репозиторий с тем же набором пакетов. Однако возможность по созданию полноценного зеркала сейчас в разработке.

После выполнения предыщущей команды у вас появятся полноценные зеркала, которые уже можно прописать в sources.list:

deb [arch=amd64] file:///home/freehck/.aptly/public wheezy main contrib non-free
deb [arch=amd64] file:///home/freehck/.aptly/public wheezy-backports main contrib non-free
deb [arch=amd64] file:///home/freehck/.aptly/public wheezy-updates main contrib non-free
#deb [arch=amd64] http://mirror.yandex.ru/debian wheezy main contrib non-free
#deb [arch=amd64] http://mirror.yandex.ru/debian wheezy-backports main contrib non-free
#deb [arch=amd64] http://mirror.yandex.ru/debian wheezy-updates main contrib non-free
deb [arch=i386] http://mirror.yandex.ru/debian wheezy main contrib non-free

Не забудьте также добавить свой ключ GPG в APT, и затем обновить кэш:

% gpg -a --export 6EC2678964B72E36 | sudo apt-key add -
% sudo apt-get update

Ну и последний штрих. Чтобы обновлять свои зеркала необходимо прописать в сrontab что-то вроде этого:

0 4 * * *     repo-update.sh -g <your-password> -b update && apt-get update -qq

Замечу, что apt-get update в отличие от repo-update.sh требует привелегий root, поэтому имеет смысл разнести их по разным планировщикам: для root и для пользователя, от имени которого идёт зеркалирование.

Ну, вот вроде и всё. Я постараюсь держать статью более-менее актуальной текущему состоянию дел с aptly и repo-update.sh.

Последние изменения: 10 Октябрь 2014