--- category: ru type: paper layout: paper tags: archlinux, настройка, linux title: Создание собственного репозитория short: creating-custom-repo description: Небольшая статья, посвященная созданию собственного репозитория для Archlinux. ---

Подготовка

Для начала находим сервер и желание с ним заниматься сексом. Для простоты, лучше, чтобы там стоял Archlinux, хотя, это и не совсем обязательно (можно создать отдельный корень под Arch). Из пакетов, пожалуй, нам понадобится только два, devtools и сам pacman:

{% highlight bash %} pacman -Sy devtools {% endhighlight %}

devtools - набор скриптов, предназначенный для автоматизации сборки пакетов в чистом чруте. Думаю, большинство мейнтейнеров Arch'а пользуются им.

Создадим рабочие директории:

{% highlight bash %} mkdir -p ~/arch/repo/{i686,x86_64} mkdir -p ~/arch/{prepare,root,staging} {% endhighlight %}

Директории ~/arch/repo/{i686,x86_64} для самого репозитория, ~/arch/prepare - директория, где будут лежать собранные пакеты, ~/arch/root - директория, где будет создан чистый чрут для сборки, ~/arch/staging - директория, откуда будут собираться пакеты.

Немного теории

Создаем директорию, расшариваем ее (например, по ftp). В ней две субдиректории - i686 и x86_64, для каждого типа архитектур соответственно. И наполняем их набором пакетов по Вашему усмотрению.

Процесс обновления репозитория можно разбить на следующие части:

  1. Создание PKGBUILD'ов (обновление их из AUR'а).
  2. Сборка пакетов для различных архитектур в чистом чруте.
  3. Подписывание пакетов.
  4. Создание списка пакетов.
  5. Обновление репозиториев:
    1. Удаление старых пакетов из базы и репозитория.
    2. Копирование новых пакетов.
    3. Обновление базы.
  6. Очистка.

Теперь по шагам.

Создание PKGBUILD'ов

Скачаем исходники для всех нужных пакетов из AUR'а:

{% highlight bash %} cd ~/arch/staging yaourt -G package-name {% endhighlight %}

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

Автоматически соберем каждый пакет:

{% highlight bash %} func_build() { PREPARE="$1" ROOT="$2" if grep "arch=('any')" PKGBUILD -q; then /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" else /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${ROOT}" fi /usr/bin/cp *.pkg.tar.xz "${PREPARE}" } export -f func_build # building cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; {% endhighlight %}

Для удобства рекомендую добавить в файл /etc/sudoers следующие строки:

{% highlight bash %} username ALL=NOPASSWD: /usr/bin/staging-i686-build username ALL=NOPASSWD: /usr/bin/staging-x86_64-build {% endhighlight %}

Подпись пакетов

{% highlight bash %} # signing cd "${PREPAREDIR}" for PACKAGE in $(/usr/bin/ls *.pkg.tar.xz); do /usr/bin/gpg -b ${PACKAGE} done {% endhighlight %}

Для удобства рекомендую настроить gpg-agent.

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

{% highlight bash %} # creating packages list i686_PACKAGES=$(/usr/bin/ls *.pkg.tar.xz | /usr/bin/grep "i686\|any") x86_64_PACKAGES=$(/usr/bin/ls *.pkg.tar.xz | /usr/bin/grep "x86_64\|any") echo "i686 packages: ${i686_PACKAGES}" echo "x86_64 packages: ${x86_64_PACKAGES}" {% endhighlight %}

Обновление репозиториев

Функция для удаления пакетов из базы данных и из репозитория:

{% highlight bash %} func_remove() { DBPATH="$1" PKGNAME="$2" /usr/bin/repo-remove ${DBNAME}.db.tar.gz ${PKGNAME} /usr/bin/repo-remove ${DBNAME}.files.tar.gz ${PKGNAME} /usr/bin/rm -f ${PKGNAME}* } export -f func_remove {% endhighlight %}

Обновление репозитория i686:

{% highlight bash %} # updating i686 repo cd "${REPODIR}/i686" for PACKAGE in ${i686_PACKAGES}; do PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') /usr/bin/find -name '${PKGNAME}*' -type f -exec /usr/bin/bash -c "func_remove "${DBNAME}" "${PKGNAME}"" \; /usr/bin/cp "${PREPAREDIR}/${PACKAGE}"{,.sig} . done /usr/bin/repo-add --new ${DBNAME}.db.tar.gz *.pkg.tar.xz /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz *.pkg.tar.xz {% endhighlight %}

Обновление репозитория x86_64:

{% highlight bash %} # updating x86_64 repo cd "${REPODIR}/x86_64" for PACKAGE in ${x86_64_PACKAGES}; do PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') /usr/bin/find -name '${PKGNAME}*' -type f -exec /usr/bin/bash -c "func_remove "${DBNAME}" "${PKGNAME}"" \; /usr/bin/cp "${PREPAREDIR}/${PACKAGE}"{,.sig} . done /usr/bin/repo-add --new ${DBNAME}.db.tar.gz *.pkg.tar.xz /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz *.pkg.tar.xz {% endhighlight %}

Очистка

{% highlight bash %} # clear cd "${PREPAREDIR}" /usr/bin/rm -rf * cd "${STAGINGDIR}" /usr/bin/rm -rf * {% endhighlight %}

Файл

Скрипт целиком. Скачиваем исходники для пакетов, запускаем скрипт (при необходимости, редактируем переменные) и радуемся жизни.

Использование репозитория

Просто добавляем в файл /etc/pacman.conf следующие строки:

{% highlight bash %} [$REPONAME] Server = ftp://$REPOADDRESS/repo/$arch {% endhighlight %}