Как создать свой репозиторий для linux

Создание локального репозитория Ubuntu 10.04

Постепенный перевод предприятия на GNU/Linux порождает необходимость соответствующих изменений в инфраструктуре. Сегодня мы решаем проблему глобального обновления клиентских машин путем создания локального репозитория. Процесс изначально документировался как памятка на будущее, потому заранее прошу прощенья за возможные несуразности в тексте. Итак.
Для начала следует определиться, посредством чего лучше сделать это. Интернеты выделяют двух фаворитов rsync и debmirror. Выбрал последний, ввиду его большей гибкости.

1. Получение ключей

2. Подготовка пространства

Создаем папку для репозитория:
sudo mkdir /path/to/repository
Важно! Потрудитесь проследить за наличием свободного места в указанном пути. Даже две архитектуры i386 и amd64 займут приличное его количество.

3. Получение пакетов

Зеркалирование проходит в три этапа:

  1. Загрузка индекстых файлов;
  2. Удаление неизвестных файлов (отключается опцией —nocleanup ниже);
  3. Построение списка по индексным архивам и проверка на наличие в локальном репозитории.Для реализации вышеперечисленного создадим файл repo_update.sh со следующим содержанием.

#!/bin/sh
#Это конфигурация нашего репозитория. В зависимости от параметров, указанных
#здесь, мы получим нужное нам его содержимое.

#Опция cleanup. Включена по умолчанию. После закачки пакетов удаляет ранние
#версии. Для отключения опции необходим параметр —nocleanup
clean=—nocleanup
#Опция source. Закачивает исходные коды пакетов. Если вы не пользуетесь
#исходными кодами для изучения и модификации приложений ( что свойственно для
#бинарных дистрибутивов), смело ставьте опцию —no-source
src=—source

#Host. Имя сервера, откуда мы берем пакеты.
servername=mirror.yandex.ru

#Root. Корневая директория на выбранном нами сервере.
rdir=/ubuntu

#Имя релиза Ubuntu. Настройки для 10.04 версии.
release=lucid,lucid-backports,lucid-proposed,lucid-security,lucid-updates

#Протокол синхронизации. Debmirror поддерживает следующие способы: http,
#hftp, ftp, rsync
sync_protocol=rsync

#Архитектура. Если используются исключительно 32 или 64х битные системы.
#Одну из архитектур можно убрать. Также если используются иные архитектуры,
#их следует добавить.
arch=i386,amd64

#Местоположение репозитория. Указывайте локальную папку, созданную. в п 2.
path=/path/to/repository

debmirror —progress —verbose $clean $src —md5sums —host=$servername —root=$rdir \
—dist=$release -s=$section —method=$sync_protocol -a=$arch $path

Теперь поместим его в директорию /usr/local/bin и сделаем исполняемым.
chmod +x repo_update.sh
sudo cp repo_update.sh /usr/local/bin/

Далее запустим получившийся скрипт и дождемся завершения процесса. Процесс достаточно долгий. Время выполнения сильно зависит от ширины вашего интернет-канала.
sudo /usr/local/bin/repo_update.sh
Внимание! Размер скачиваемого переваливает за десятки гигабайт, а казеный интернет редко бывает безлимитным. Более того, debmirror чувствителен к стабильности соединения, 120 секунд простоя и все придется начинать сначала.

4. Настройка web-сервера

Дабы не совершать лишних плясок с бубном выберем протокол http, как традиционный метод предоставления доступа к репозиторию. Выбор web-сервера остается за Вами. Из фаворитов ngnix, apache и lighttpd, выбрал последний ввиду отсутствия опыта работы с оным (приятное с полезным, да). Итак.

sudo apt-get install lighttpd
Здесь все просто. Если Вы не планируете использовать в качестве www директории отличную от умолчания, то сервер в настройке не нуждается. Все, что сам нужно сделать, это создать символьную ссылку в директории /var/www
ln -s /path/to/repository /var/www/ubuntu

Проверим доступность репозитория из браузера: http:// /ubuntu/

Читайте также:  Windows 10 ярлыки не сохраняются

5. Настройка клиентов

Здесь мы применим маленькую хитрость. Дабы не вносить изменений в /etc/apt/sources.list (мало ли что случится). Добавим в файл /etc/hosts пару строчек.
ru.archive.ubuntu.com
security.ubuntu.com
Примечание. При наличии DNS сервера можно все это прописать в нем, а на сервере репозитория прописать истинные адреса вышеупомянутых имен.

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

А теперь самое сладкое. Заставим все это крутиться самостоятельно.

6.1 Серверная часть

В пункте #3 мы создавали скрипт, при помощи которого получали пакеты. Настроим его автозапуск средствами демона cron.
sudo crontab -e

В который добавим заветную строчку:

0 0 * * * /usr/local/bin/repo_update.sh
Теперь ежедневно в 0:00 наш скрипт будет делать за нас всю рутинную работу.

6.2 Клиентская часть

На клиентах создадим скрипт system_upd.sh в директории /usr/local/bin следующего содержания:
#!/bin/sh
apt-get -y update && apt-get -y upgrade && apt-get -y clean

Не забудем сделать его исполняемым.
sudo chmod +x /usr/local/bin/system_upd.sh

После чего открываем cron:
sudo crontab -e

И добавляем строчку:
40 17 * * * /usr/local/bin/system_upd.sh

Теперь каждый день в 17:40 система будет опрашивать наш репозиторий на предмет наличия обновлений и обновляться, если таковые будут найдены.

Источник

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

1. Создаём ключ RPM-GPG-KEY. Стандартно.

/.rpmmacros следующего содержания:

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

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

6. Запускаем скрипт и отвечаем парольной фразой ключика на запрос.

7. Закачиваем на хостинг директорию repo и описываем репозиторий в /etc/yum.repos.d/nobody.repo

8. Проверяем работу репозитория

1. Создаём ключ DEB-GPG-KEY. Стандартно.

/.rpmmacros следующего содержания:

3. Создаём директорию repo, а в ней директории dists и pool. В них уже будет система каталогов. Переносим туда ключ DEB-GPG-KEY

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

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

6. Запускаем скрипт и ждём когда он отработает.

Источник

Создаём свой репозиторий с deb-пакетами.

Мы научились собирать пакеты и подписывать их. Теперь самое время сделать свой репозиторий с пакетами.

По сути, есть 3 способа (более или менее «легальных») способа собрать свой репозиторий: dpkg-scanpackages, mini-dinstall и reprepo. dpkg-scanpackages — достаточно простая тулза, но требует много ручной работы. Я хоть и напишу про неё, но использовать её в промышленных масштабах не стоит. С reprepo я особенно не разобрался — официальная документация старовата и далека от вменяемости. Так что в основном здесь написано про mini-dinstall.

dpkg-scanpackages — утилита, которая индексирует каталог и создаёт для него файл Packages. Эту тулзу можно использовать как временную локальную замену (чтобы, например, проверить, что пакеты будут ставиться через apt-get), но не нужно использовать её там, где важна проверка подписи пакетов — dpkg-scanpackages сам по себе этого просто не умеет (хотя и можно подписывать репозиторий лапками).

Читайте также:  Подключение nfs windows 2012

Сам dpkg-scanpackages живет в пакете dpkg-dev, так что:

# apt-get install dpkg-dev

Представим, что наши пакеты в прошлых статьях мы собирали в /home/user/packages:

$ ls /home/user/packages
example-package_0.3_amd64.build example-package_0.3_amd64.changes example-package_0.3_amd64.deb

Тогда мы генерируем Packages.gz следующим образом:

$ dpkg-scanpackages -t deb /home/user/packages/ | gzip | cat > /home/user/packages/Packages.gz

А в sources.list.d добавляем строчку «deb file:/home/user/ packages/» :

# echo «deb file:/home/user/ packages/» > /etc/apt/sources.list.d/my-own-repo.list

Проверяем, что репозиторий работает:

# apt-get update; apt-cache policy example-package
.
example-package:
Installed: (none)
Candidate: 0.3
Version table:
0.3 0
500 file:/home/ inkvizitor68sl/ Packages

Так в простейшем виде работает и mini-dinstall — генерирует Packages.gz. Но он умеет проверять подписи пакетов, работать по крону/демоном и прочие плюшки.

Повеселились, хватит. Давайте ставить mini-dinstall и другой софт, который пригодится:

# apt-get install mini-dinstall debian-keyring gnupg acl

Дальше всё я буду расписывать исходя из того, что заливать пакеты в репозиторий будет несколько пользователей. Конечно, можно использовать dput и всё делать под одним пользователем, но если у вас полтора разработчика — то такой вариант вас уже не устроит и захочется предоставить возможность заливать пакеты с подписями разных разработчиков. Поэтому мы создадим отдельного пользователя и отдельный gpg-ключ, которым будем подписывать репозиторий. А подписи пакетов будем проверять перед тем, как добавить их в репозиторий.
Mini-dinstall незачем работать под рутом (если запустить его под рутом — нам не придется вводить целую дополнительную команду по выставлению вменяемых прав на каталог incoming, гы). Создадим отдельного пользователя:

# adduser repokeeper

Пойдем под этого пользователя:

# su repokeeper

Создадим папочку, куда будем складывать наш репозиторий:

$ mkdir /home/repokeeper/repo/

Напишем конфиг /home/repokeeper/.mini-dinstall.conf для нашей собиралки репозиториев:

/sign-release.sh
incoming_permissions = 0
chown_changes_files = false

Генерируем ключ уже знакомой нам командой:

$ LANG=C gpg —gen-key

Что там отвечать уже написано, стоит только заметить, что нам нужен именно новый ключ, а не ключ с теми же ответами. Ну там ник и почту измените для приличия.

Создадим каталог keys, в который для начала положим публичный ключ нашего репозитория. Там же мы будем складировать публичные ключи наших разработчиков (себя для начала).

$ mkdir /home/repokeeper/keys

Сначала экспортируем публичный ключ репозитория. Под пользователем repokeeper делаем такое:

$ gpg —export —armor repo@vlad.pro >

Где repo@vlad.pro — почта, которую мы использовали при генерации ключа для пользователя repokeeper.

Так же экспортируем ключ, которым мы подписываем пакеты и «добавим его» в валидные ключи для repokeeper (разрешив тем самым заливать пакеты, подписанные тем ключом). Под пользователем, из-под которого мы собираем пакеты, выполняем команду:

$ gpg —export —armor root@vlad.pro >

(напомню, что свою почту я использовал в прошлом примере)
Файл inkvizitor68sl.gpg нам нужно закинуть в каталог /home/repokeeper/keys на том сервере, где у вас будет работать mini-dinstall. О правах на файлы можно не сильно беспокоиться (в конце концов, это публичная подпись — обладая ей хуже вам не сделают).

Читайте также:  Командная строка администратор windows 10 выполнить

Теперь под пользователем repokeeper импортируем ключ «разработчика»:

$ gpg —no-default-keyring —ignore-time-conflict —keyring .gnupg/pubring.gpg —import

Так же нам понадобится скрипт, который будет запускаться для подписывания собранного репозитория. Подходящий скрипт есть в документации к mini-dinstall, утащим его себе:

$ cp /usr/share/doc/mini-dinstall/examples/sign-release.sh

Немного подправим для своих нужд:

$ sed -i ‘s/export GNUPGHOME=.*/export GNUPGHOME=

/.gnupg/passphrase нужно написать пароль от GPG ключа, который мы сгенерировали для репозитория.

Так как мы запускаем mini-dinstall не от рута, нам нужны корректные права на его incoming-каталог. При помощи chmod/chown надежно добиться у нас этого не получится (разработчики обязательно будут заливать с такими правами, что у mini-dinstall не будет хватать прав на удаление залитых файлов — и он будет падать с ошибкой), посему сделаем это через acl:

# setfacl -R —modify user:repokeeper:rwx /home/repokeeper/repo/

# setfacl -R —modify group:repokeeper:rwx /home/repokeeper/repo/

# setfacl -R —modify default:user:repokeeper:rwx /home/repokeeper/

# setfacl -R —modify default:group:repokeeper:rwx /home/repokeeper/

А так же создадим группу, присутствие в которой будет позволять системным пользователям заливать пакеты на сервер (от рута):

# addgroup repouploaders

И выставим права этим пользователям на каталог incoming:

# setfacl -R —modify group:repouploaders:rwx /home/repokeeper/repo/mini-dinstall/incoming/

# setfacl -R —modify default:group:repouploaders:rwx /home/repokeeper/repo/mini-dinstall/incoming/

И добавим пользователя, от которого собираем пакеты в группу аплоадеров. Точнее, добавим пользователя, которому мы хотим дать права на заливание файлов в репозиторий. Это может быть и аккаунт разработчика, который будет заливать пакеты по sftp/scp через dupload.

# usermod -a -G repouploaders user

Заодно по дороге запретим заливать файлы всем остальным:

# chmod 0700 /home/repokeeper/repo/mini-dinstall/incoming/

«Зальём» наш собранный ранее пакетик в репозиторий. Сейчас мы это делаем при помощи простого cp, в будущем я напишу о том, как использовать dupload.

$ cp /home/user/packages/example-package_0.3_amd64.deb /home/repokeeper/repo/mini-dinstall/incoming/

$ cp /home/user/packages/example-package_0.3_amd64.changes /home/repokeeper/repo/mini-dinstall/incoming/

Наконец-то запускаем сборку нашего репозитория (обратите внимание, не от рута):

$ mini-dinstall -b -v

Если ошибок не видно, то проверяем содержимое файла Packages:

/repo/unstable/Packages | grep Package
Package: example-package

Как видим, у нас в репозитории появился наш example-package. Попробуем поставить его.
Для начала подключим репозиторий локально:

# echo «deb file:/home/repokeeper/repo/ unstable/» > /etc/apt/sources.list.d/my-own-repo.list; apt-get update

Проверяем, что пакет появился в индексе apt’a:

# apt-cache policy example-package
example-package:
Installed: (none)
Candidate: 0.3
Version table:
0.3 0
500 file:/home/repokeeper/repo/ unstable/ Packages

Пробуем его поставить:

# apt-get install example-package
.
Install these packages without verification [y/N]?

Фиг нам, как говорится. apt считает пакеты недоверенным. Что ж мы, зря мучались с подписями) ? Скормим публичный ключ нашего репозитория нашему локальному apt-у:

# cat /home/repokeeper/keys/repo.key | apt-key add —
OK

Обновим индекс apt-а, как обычно:

# apt-get update

Пробуем поставить пакет:

# apt-get install example-package

Вуаля. Поставился молча и сделал нам пустой /root/.ssh/authorized_keys, ибо я ленивая жопа и собрал таки пакет с пустыми файлами)

Теперь мы можем закидывать файлы в repo/mini-dinstall/incoming когда нам нужно и перегенерировать репозиторий командой от рута

# su -c «mini-dinstall -b -v» repokeeper

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

$ mini-dinstall -b -v

Дальше нам предстоит научиться использовать upload, запускать mini-dinstall по крону и демоном. А ещё не забыть расшарить репозиторий по http и https. А потом уже перейдем ко всяким забавным полезностям в dpkg.

Источник

Оцените статью