diff --git a/_posts/2014-03-06-site-changes.html b/_posts/2014-03-06-site-changes.html index 9988d37..a3b32e6 100644 --- a/_posts/2014-03-06-site-changes.html +++ b/_posts/2014-03-06-site-changes.html @@ -2,7 +2,7 @@ category: en type: paper layout: paper -tags: сайт, github pages +tags: site, github pages title: Site changes short: site-changes description: I decided to change my site. You may find short list of changes below. diff --git a/_posts/2014-03-23-creating-custom-repo.html b/_posts/2014-03-23-creating-custom-repo.html new file mode 100644 index 0000000..e733632 --- /dev/null +++ b/_posts/2014-03-23-creating-custom-repo.html @@ -0,0 +1,143 @@ +--- +category: en +type: paper +layout: paper +tags: archlinux, configuration, linux +title: Creating own repository +short: creating-custom-repo +description: It is a short paper devoted to creation own ArchLinux repository. +--- +

Prepare

+

First find a server and desire to have sex with it. It is recommended to use Archlinux on it, but it is not necessarily - because you may create special root for Archlinux. Also you need two packages, devtools and pacman:

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

devtools is script set for building automation in the clean chroot. I think most of Arch maintainers use it.

+

Let's create working directories:

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

~/arch/repo/{i686,x86_64} are directories for repository, ~/arch/prepare is directory where compiled packages will be stored, ~/arch/root is one where clean chroot will be created, ~/arch/staging is one where packages will be built.

+ +

A bit of theory

+

Create directory, share it (using ftp, for example). It has two subdirectories - i686 and x86_64 - for each architecture respectively. And fill them with a set of packages.

+

Updating repository may be split into the following steps:

+
    +
  1. Creating PKGBUILDs (or updating them from AUR).
  2. +
  3. Packages building for each architecture in clean chroot.
  4. +
  5. Packages signing.
  6. +
  7. Creating the list of packages.
  8. +
  9. Repository update: +
    1. Removal old packages from database and repository.
    2. +
    3. Copying new packages
    4. +
    5. Repository update.
    +
  10. +
  11. Cleaning.
  12. +
+ +

Creating PKGBUILDs

+

Download source tarballs from AUR:

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

Packages building

+

Build each package automatically:

+{% 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}" +} + +# building +/usr/bin/cd "${STAGINGDIR}" +/usr/bin/find -name PKGBUILD -type f -execdir func_build "${PREPAREDIR}" "${ROOTDIR}" \; +{% endhighlight %} +

It is recommended to add the following lines to /etc/sudoers:

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

Packages signing

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

It is recommended to configure gpg-agent.

+ +

Creating the list of packages

+{% 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 %} + +

Repository update

+

Here is a function for removal packages from database and repository:

+{% 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}* +} +{% endhighlight %} +

i686 repository update:

+{% highlight bash %} +# updating i686 repo +/usr/bin/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/ls ${PKGNAME}* && 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 repository update:

+{% highlight bash %} +# updating x86_64 repo +/usr/bin/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/ls ${PKGNAME}* && 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 %} + +

Cleaning

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

File

+

Here is the script. Download source tarballs and run script (editing variables if it is necessary).

+ +

Repository usage

+

Just add following lines to /etc/pacman.conf:

+{% highlight bash %} +[$REPONAME] +Server = ftp://$REPOADDRESS/repo/$arch +{% endhighlight %} diff --git a/ru/_posts/2014-03-23-creating-custom-repo.html b/ru/_posts/2014-03-23-creating-custom-repo.html new file mode 100644 index 0000000..38df64a --- /dev/null +++ b/ru/_posts/2014-03-23-creating-custom-repo.html @@ -0,0 +1,144 @@ +--- +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. Подписывание пакетов.
  6. +
  7. Создание списка пакетов.
  8. +
  9. Обновление репозиториев: +
    1. Удаление старых пакетов из базы и репозитория.
    2. +
    3. Копирование новых пакетов.
    4. +
    5. Обновление базы.
    +
  10. +
  11. Очистка.
  12. +
+

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

+ +

Создание 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}" +} + +# building +/usr/bin/cd "${STAGINGDIR}" +/usr/bin/find -name PKGBUILD -type f -execdir 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 +/usr/bin/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}* +} +{% endhighlight %} +

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

+{% highlight bash %} +# updating i686 repo +/usr/bin/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/ls ${PKGNAME}* && 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 +/usr/bin/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/ls ${PKGNAME}* && 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 +/usr/bin/cd "${PREPAREDIR}" +/usr/bin/rm -rf * +/usr/bin/cd "${STAGINGDIR}" +/usr/bin/rm -rf * +{% endhighlight %} + +

Файл

+

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

+ +

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

+

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

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