Как сделать локальный репозиторий debian

Блог начинающего линуксоида.

советы, руководства, инструкции.

Страницы

воскресенье, 10 января 2016 г.

Как создать локальный репозиторий в Debian/Ubuntu

Как сделать локальный репозиторий debian

sudo apt install apt-mirror apache2

Создаём каталог для репозитория:

sudo mkdir /media/repo/debian

и служебные каталоги:

Настраиваем. Открываем конфигурационный файл:

sudo nano /etc/apt/mirror.list

############# config ##################
# Базовый каталог, в нём будет создано локальное зеркало репозитория Debian
set base_path /media/repo/debian

# Не запускать скрипт постобработки
set run_postmirror 0

# Служебные параметры, не
set nthreads 20
set _tilde 0
#
############# end config ##############

# Зеркало с пакетами для amd64 jessie (stable)+ исходные тексты
deb-amd64 http://mirror.yandex.ru/debian jessie main contrib non-free
deb-src http://mirror.yandex.ru/debian jessie main contrib non-free
# Зеркало с обновлениями безопасности amd64 jessie (stable)+ исходные тексты
deb-amd64 http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free
# Зеркало необходимое для сетевой установки (udebs)
deb-amd64 http://mirror.yandex.ru/debian jessie main/debian-installer
# Удаляем файлы не индексированные в Release
clean http://mirror.yandex.ru/debian
clean http://security.debian.org
# Запрещаем очистку выбранной папки
skip-clean http://mirror.yandex.ru/debian/dists/jessie/main/installer-amd64/

# Зеркало с пакетами для i386 jessie (stable)+ исходные тексты
deb-i386 http://mirror.yandex.ru/debian jessie main contrib non-free
deb-src http://mirror.yandex.ru/debian jessie main contrib non-free
# Зеркало с обновлениями безопасности i386 jessie (stable)+ исходные тексты
deb-i386 http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free
# Зеркало необходимое для сетевой установки (udebs)
deb-i386 http://mirror.yandex.ru/debian jessie main/debian-installer
# Удаляем файлы не индексированные в Release
clean http://mirror.yandex.ru/debian
clean http://security.debian.org
# Запрещаем очистку выбранной папки
skip-clean http://mirror.yandex.ru/debian/dists/jessie/main/installer-i386/

Сохраняем. Запускаем закачку репозитория:

После того как загрузятся индексные файлы, Apt-Mirror сообщит вам какой объём пакетов нужно скачать (объём будет весьма и весьма не маленький). Вам остаётся только ждать. Всё остальное система сделает сама. Для автоматической синхронизации и очистки зеркал нужно добавить строку в настройки cron и выставить подходящее время. Обновление официальных зеркал происходит каждые 6 часов: 3:00,9:00,15:00,21:00. Например так:

05 01 * * * apt-mirror >> /var/log/apt-mirror.log
05 03 * * * /media/repo/debian/var/clean.sh >> /var/log/apt-mirror.log

Для корректной работы обязательно необходимо добавить символические ссылки «stable»,«testing», «unstable» на jessie, stretch, sid соответственно (если они у вас есть). Пример для jessie:

Мы установили веб-сервер Apache неспроста. Он нам нужен чтобы раздавать пакеты из нашего локального репозитория по сети (локальной). Для начала, нужно настроить доступ к репозиторию. Для этого нужно создать одну символьную ссылку:

Теперь на клиентской машине (которой нужен доступ к локальному репозиторию), укажите адрес репозитория. Если у компьютера с репозиторием есть сетевое имя (к примеру server), то указывайте его. В противном случае, адресом указывайте его IP-адрес:

sudo nano /etc/apt/sources.list

deb http://server/debian jessie main contrib non-free
deb-src http://server/debian jessie main contrib non-free
deb http://server/debian jessie/updates main contrib non-free

Если вы указывали в конфиге загрузку 32-х битных пакетов (i386), то не забудьте добавить эту архитектуру в систему:

и обновите список пакетов:

sudo apt-get update

Дальше уже всё как обычно. Для Ubuntu всё то же самое, за исключением названий репозиториев и добавления 32-х битной архитектуры в 64-х битную систему (не нужно). Конфиг mirror.list для Ubuntu 14.04:

############# config ##################
# Базовый каталог, в нём будет создано локальное зеркало репозитория Debian
set base_path /media/repo/ubuntu

# Не запускать скрипт постобработки
set run_postmirror 0

# Служебные параметры, не
set nthreads 20
set _tilde 0
#
############# end config ##############

deb-amd64 http://archive.ubuntu.com/ubuntu trusty main restricted
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-updates main restricted
deb-amd64 http://archive.ubuntu.com/ubuntu trusty universe
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-updates universe
deb-amd64 http://archive.ubuntu.com/ubuntu trusty multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-updates multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-security main restricted
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-security universe
deb-amd64 http://archive.ubuntu.com/ubuntu trusty-security multiverse

deb-i386 http://archive.ubuntu.com/ubuntu trusty main restricted
deb-i386 http://archive.ubuntu.com/ubuntu trusty-updates main restricted
deb-i386 http://archive.ubuntu.com/ubuntu trusty universe
deb-i386 http://archive.ubuntu.com/ubuntu trusty-updates universe
deb-i386 http://archive.ubuntu.com/ubuntu trusty multiverse
deb-i386 http://archive.ubuntu.com/ubuntu trusty-updates multiverse
deb-i386 http://archive.ubuntu.com/ubuntu trusty-security main restricted
deb-i386 http://archive.ubuntu.com/ubuntu trusty-security universe
deb-i386 http://archive.ubuntu.com/ubuntu trusty-security multiverse

Ну и соответственно, нужно изменить символьную ссылку:

Источник

Про Debian

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

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

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

Сам 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 следующим образом:

А в 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

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

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

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

$ mkdir /home/repokeeper/keys

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

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

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

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

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

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

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

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

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

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

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

# addgroup repouploaders

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

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

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

# 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/

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

Если ошибок не видно, то проверяем содержимое файла 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-get update

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

# apt-get install example-package

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

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *