Развёртывание репозиториев Linux

Без синхронизаций и т.д., в варианте «есть хостинг» или «файловая помойка» и надо быстро выкатить хранилище пакетов для дистрибутива Linux (так чтобы можно было подключиться к этому репозиторию и поставить оттуда всё необходимое). Иногда обновляться в ручном режиме — копированием по тому же адресу с перезаписью. Раз в полгода или год. Задача типовая и я её опишу в полуавтоматическом режиме.

Репозиторий RHEL
1. Создаём ключ RPM-GPG-KEY. Стандартно.
$ cd ~
$ gpg --gen-key
$ gpg --export -a 'Name Surname (repo)' > RPM-GPG-KEY

2. Создаём файл ~/.rpmmacros следующего содержания:
%_signature gpg
%_gpg_path ~/.gnupg
%_gpg_name Name Surname (repo)

3. Создаём директорию repo, а в ней директории i386, i686 и x86_64. Переносим туда ключ RPM-GPG-KEY
$ mkdir -p repo repo/i386 repo/i686 repo/x86_64
$ mv RPM-GPG-KEY repo/RPM-GPG-KEY

4. Скачиваем и раскладываем по директориям пакеты для соответствующих архитектур. Для i386 и i686 в большинстве случаев будут идентичные пакеты. Для x86_64 может не существовать пакета (например, TeamViewer), в этом случае кладётся соответствующий пакет i686 и в большинстве случаев он в RHEL работает.

5. Кладём в директорию repo скрипт для подготовки репозитория.

6. Запускаем скрипт и отвечаем парольной фразой ключика на запрос.
$ chmod a+x
$ ./repo_rhel.sh

7. Закачиваем на хостинг директорию repo и описываем репозиторий в /etc/yum.repos.d/nobody.repo
[nobody]
name=nobody repo
baseurl=http://<IP-адрес>/repo/$basearch
gpgkey=http://<IP-адрес>/repo/RPM-GPG-KEY
enabled=1
gpgcheck=1
priority=1

8. Проверяем работу репозитория
# yum clean all
# yum list | grep nobody
Репозиторий Debian
1. Создаём ключ DEB-GPG-KEY. Стандартно.
$ cd ~
$ gpg --gen-key
$ gpg --export -a 'Name Surname (repo)' > DEB-GPG-KEY

2. Создаём файл ~/.rpmmacros следующего содержания:
%_signature gpg
%_gpg_path ~/.gnupg
%_gpg_name Name Surname (repo)

3. Создаём директорию repo, а в ней директории dists и pool. В них уже будет система каталогов. Переносим туда ключ DEB-GPG-KEY
$ mkdir -p repo/dists/nobody/soft/binary-i386
$ mkdir -p repo/dists/nobody/soft/binary-x86_64
$ mkdir -p repo/pool/soft/binary-i386/t/teamviewer
$ mkdir -p repo/pool/soft/binary-x86_64/t/teamviewer
$ mv DEB-GPG-KEY repo/DEB-GPG-KEY

4. В директории dists у нас будут храниться данные о пакетах, а в директории pool — сами пакеты. Причём из имени /binary-i386/t/teamviewer уже видно, что пакеты раскладываются по архитектурам, затем по буквенным директориям и затем по директориям с именами происходящими от названия содержащегося в них ПО (в них может лежать десяток пакетов необходимых конкретному ПО по его зависимостям). Т.е. имеется заданная иерархия.

5. Кладём в директорию repo скрипт для подготовки репозитория. Меняем в первой строчке скрипта key_pass=«password» на пароль Вашего ключа.

6. Запускаем скрипт и ждём когда он отработает.
$ chmod a+x
$ ./repo_debian.sh

7. Закачиваем на хостинг директорию repo и описываем репозиторий в /etc/apt/sources.list
deb http://<IP-адрес>/repo nobody soft

8. Проверяем работу репозитория
$ wget http://<IP-адрес>/repo/DEB-GPG-KEY
$ sudo apt-key add DEB-GPG-KEY
$ sudo apt-get clean
$ sudo apt-get update

Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 24

    +1
    • UFO just landed and posted this here
      0
      Интересно, что только в русском есть такая идиотская транскрипция латинского слова Repositōrium. Режет глаза невероятно, прямо как «раутер».
        0
        Слова раутер в русском языке нет, только в американском английском. А слово роутер вообще какая-то абракадабра.
          0
          Я в курсе, привел для сравнения. Сложно было придумать что-то аналогичное.
        +3
        Скажите, почему надо изобретать велосипед, а не взять что-то вроде mini-dinstall или reprepro? Настраивается на порядок проще, работает надёжнее, поддерживается апстримом.
          –3
          Наяву столкнулся с ситуацией когда умение создать репозиторий подавалось знакомыми людьми как некое «эксклюзивное знание». Как Вам такое звучание: «Система Сборки Репозитария»? Поменять одну «систему» на другую не было бы эффективно. Потому что «чёрный ящик» остался.

          Если выбросить из инструкций создание ключика, проверку репозиториев и прочую обёртку, то в остатке будет примитивный скрипт. Который в свою очередь сводится к командам createrepo для RHEL и dpkg-scanpackages для Debian. Достаточно показать это и становится понятно что здесь нет никаких «чёрных ящиков» и труд программистов не нужен. Задачу можно поручить любому специалисту, инструкции достаточно. Да и скриптики если разобраться не так уж нужны. Т.е. моей целью было понимание.
            0
            Так рассуждая, можно дойти до того, что и бэкап — простой скриптик, который scp гоняет туда-сюда, а браузер — всего лишь программа для передачи байтиков по http. И зачем тысячи программистов над ним трудятся? Можно же telnet'ом html странички смотреть!
            • UFO just landed and posted this here
                0
                Можно. Ваш аватар даже намекает на правило «не изобретать велосипеды». Однако, есть велосипеды, а есть понимание. Думаю Вы не будете всерьёз предлагать прочитать исходники браузера для того чтобы выучить HTML? Вам приходилось слышать фразы «науке неизвестно что такое электричество»? Хотя все эти люди учились в школе. Здесь ровно то же самое. Есть люди которые считают недоступным среднему уму создание репозитария, сборку ядра, пакета и т.п. Хотя у всех есть пальцы чтобы набрать 1 (одну) команду. Пользовался утилитами подобными reprepro, но статья о них — другая статья, с другой целевой аудиторией.
                  0
                  Если главной целью является понимание, это прекрасно. Заодно можно было бы поподробнее рассказать об устройстве репозитория.
                  Однако же в статье это преподносится как боевой инструмент. Именно это и вызывает здесь такое недоумение.
                    0
                    Боевой инструмент не очень коррелирует с «Иногда обновляться в ручном режиме — копированием по тому же адресу с перезаписью. Раз в полгода или год.» Мне важно понимание подхода и это понимание может быть стартовой точкой для специалиста. У меня есть конкретные примеры, просто не хочется описывать в комментариях разные заморочки на этот счёт. Боевые инструменты, устройство репозитория, свои заточенные системы «сборки репозитария», аналоги reprepro — остались за скобками.
                0
                Зачем? У меня репозиторий формируется одной командой без параметров при конфиге в 17 строк, из которых две — пустые. Хотите видеть? Пожалуйста:
                [DEFAULT]
                incoming_permissions = 0750
                mail_to = me@somewhere.org
                architectures = all, i386, amd64
                archive_style = flat
                dynamic_reindex = 1
                archivedir = ~/public_html/debian/
                generate_release = 1
                release_origin = lalala
                release_label = lalala
                release_description = Unofficial Debian packages maintained by me
                
                [experimental]
                release_suite = experimental
                
                [unstable]
                release_suite = unstable
                
                  0
                  Не то чтобы «эксклюзивное», но если дистрибутивов штук пять и более, при этом есть и самосборные пакеты, есть approx в официальные репы, то нужно скриптовать очень аккуратно и не у всех получается.
                    0
                    Согласен. Типовое применение — спец не хочет таскать пакеты по клиентам на flash-носителе, но и разворачивать свой репозитарий — не знает как подступиться. Понимание которого мы достигаем здесь: спец видит что всех сложностей у него — затраты времени на подготовку иерархии директорий и одна команда в скрипте который и сам по себе — инструкция. Да, он может заняться автоматизацией. Позже. Но ему будет от чего отталкиваться сейчас. Просто сказать: смотри reprepro или createrepo и кури маны было бы ещё проще. Но этот совет ему уже давали и допустим с закачиванием файлов на хостинг и вводом команд по бумажке он справляется.

                    Об «эксклюзивности»: кто-то когда-то строил репозитарий и у кого-то есть телефон этого человека, но никто не знает как его заставить что-то выложить и сколько заплатить, поэтому пока anykey ходит с flash-носителями. Неважно как зовут этого человека или компанию. Это часто встречающаяся ситуация в малом бизнесе где пытаются использовать Linux в обиходе, когда спустя некоторое время после внедрения обслуживание дошло до anykey.
                +2
                $ wget http://<IP-адрес>/repo/DEB-GPG-KEY
                $ sudo apt-key add DEB-GPG-KEY

                Это обычно объединяют в одну команду
                wget http://<IP-адрес>/repo/DEB-GPG-KEY -O - | sudo apt-key add -
                  +1
                  А ещё раз в тысячу лет наконец читают внимательно man apt-key и man gpg и получается
                  sudo apt-key adv --fetch-keys http://<IP-адрес>/repo/DEB-GPG-KEY
                  0
                  Какие только велосипеды не городят, лишь бы маны к reprepro не читать.
                    0
                    Ошибка в листинге
                    вместо
                    gpg —export -a 'Name Surname (repo)' > DEB-GPG-KEY
                    нужно
                    gpg --export -a 'Name Surname (repo)' > DEB-GPG-KEY
                    походу парсер скушал двойной тире
                      0
                      При тестировании не получается завести. При apt-get update получаю
                      W: Не удалось получить repo.loc/repo/dists/nobody/Release
                      E: Некоторые индексные файлы не скачались. Они были проигнорированы или вместо них были использованы старые версии.

                      и так же ошибка:

                      sky@dhcppc2:~/repo$ ./repo_debian.sh
                      dpkg-scanpackages: инфо: Записано 1 записей в выходной файл Packages.
                      dpkg-scanpackages: инфо: Записано 1 записей в выходной файл Packages.
                      md5sum: soft/binary-i386/Release: Нет такого файла или каталога
                      ls: невозможно получить доступ к soft/binary-i386/Release: Нет такого файла или каталога
                      md5sum: soft/binary-x86_64/Release: Нет такого файла или каталога
                      ls: невозможно получить доступ к soft/binary-x86_64/Release: Нет такого файла или каталога

                      * Singning Repositary *
                      Reading passphrase from file descriptor 0

                      Необходим пароль для доступа к секретному ключу пользователя: «User (My Repo) <gmail@gmail.com>»
                      2048-бит RSA ключ, ID E6A29EE1, создан 2013-02-10

                      * Singning i386 *
                      Reading passphrase from file descriptor 0

                      Необходим пароль для доступа к секретному ключу пользователя: «User (My Repo) <gmail@gmail.com>»
                      2048-бит RSA ключ, ID E6A29EE1, создан 2013-02-10

                      gpg: не могу открыть `Release': Нет такого файла или каталога
                      gpg: signing failed: ошибка открытия файла

                      * Singning x86_64 *
                      Reading passphrase from file descriptor 0

                      Необходим пароль для доступа к секретному ключу пользователя: «User (My Repo) <gmail@gmail.com>»
                      2048-бит RSA ключ, ID E6A29EE1, создан 2013-02-10

                      gpg: не могу открыть `Release': Нет такого файла или каталога
                      gpg: signing failed: ошибка открытия файла
                        +1
                        Упустил из вида при приведении к виду «для публикации», sorry.
                        Обновил скрипт, проверил — работает.
                        0
                        Но по адресу repo.loc/repo/dists/nobody/Release
                        Release имеет вид
                        Origin: nobody
                        Label: nobody repo
                        Suite: nobody
                        Codename: nobody
                        Version: 1.0
                        Architectures: i386
                        Components: soft
                        Description: nobody 1.0 repo
                        MD5Sum:
                        9046a2f783922bf56734bc29087732aa 451 soft/binary-i386/Packages
                        14366b0a3388229c0267f192e3b3fc01 366 soft/binary-i386/Packages.bz2
                        9f64d264c2e1da0098f66378ca417f29 344 soft/binary-i386/Packages.gz
                        0 soft/binary-i386/Release
                        9046a2f783922bf56734bc29087732aa 451 soft/binary-x86_64/Packages
                        14366b0a3388229c0267f192e3b3fc01 366 soft/binary-x86_64/Packages.bz2
                        9f64d264c2e1da0098f66378ca417f29 344 soft/binary-x86_64/Packages.gz
                        0 soft/binary-x86_64/Release
                          0
                          откуда во всех скриптах и путях взялось «x86_64 », когда в дебиане используется «amd64»?
                          и что за «nobody», хотя бы «stable» что ли был бы
                            0
                            Согласен. Но это шаблон и любые модификации — на Ваше усмотрение. Скрипт изначально был написан для создания на RHEL 6.3 репозитория для Ubuntu 10.04, а для Ubuntu свойственно x86_64 (причём ЕМНИП это alias для amd64).

                          Only users with full accounts can post comments. Log in, please.