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

Материал из My WiKi
Перейти к навигации Перейти к поиску

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

С помощью утилиты apt-mirror

Подготовка и установка apt-mirror

Это основной способ зеркалирования, помимо официального https://www.debian.org/mirror/ftpmirror, т.к. он гораздо надёжней debmirror. Устанавливаем пакет:

apt-get install apt-mirror

Создаём каталог /mnt/repo/debian и дополнительные mirror,var,skel. В нём будет создаваться локальный репозиторий пакетов. Желательно чтобы это был примонтированный логический раздел жёсткого диска, чтобы в случае переустановки дистрибутива с нуля, при форматировании корневого раздела (/), не лишиться репозитория совсем.

mkdir -p /mnt/repo/debian/{mirror,var,skel}

Настройка apt-mirror

Заранее предположим что нам нужны:

  • Зеркало с готовыми к установке (бинарными) пакетами для amd64 jessie (stable)+ исходные тексты
  • Зеркало с готовыми к установке (бинарными) обновлениями безопасности amd64 jessie (stable)+ исходные тексты
  • Зеркало с готовыми к установке (бинарными) прочими обновлениями amd64 jessie (stable)+ исходные тексты
  • Зеркало Backports, с готовыми к установке (бинарными) пакетами для amd64 jessie (stable)+ исходные тексты
  • Зеркало необходимое для сетевой установки (udebs).

Примечание: Раскомментирование строк лишь заменяет настройки по умолчанию. Редактируем конфигурационный файл /etc/apt/mirror.list:

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

# Пути к файлам зеркала, временным файлам и журналy выполнения apt-mirror
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh

# Архитектура, для которой создаётся зеркало. По умолчанию - это архитектура
# системы, на которой работает apt-mirror (amd64,i386 или др.). Менять не ненужно,
# т.к. ниже мы явно укажем и зеркало и архитектуру.
# set defaultarch  <running host architecture>

# Пусть к скрипту постобработки, по-умолчанию отсутствует, пока нам не нужен.
# set postmirror_script $var_path/postmirror.sh

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

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

# Зеркало с пакетами для amd64 jessie (stable)+ исходные тексты
deb-amd64 http://httpredir.debian.org/debian jessie main contrib non-free
deb-src http://httpredir.debian.org/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

# Зеркало с прочими обновлениями amd64 jessie (stable)+ исходные тексты
deb-amd64 http://httpredir.debian.org/debian/ jessie-updates main contrib non-free 
deb-src http://httpredir.debian.org/debian/ jessie-updates main contrib non-free 

# Зеркало необходимое для сетевой установки (udebs)
deb-amd64 http://httpredir.debian.org/debian jessie main/debian-installer

# Backports
deb-amd64 http://httpredir.debian.org/debian/ jessie-backports main contrib non-free 
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free 

# Удаляем файлы не индексированные в Release
clean http://httpredir.debian.org/debian
clean http://security.debian.org

# Запрещаем очистку выбранной папки
skip-clean http://httpredir.debian.org/debian/dists/jessie/main/installer-amd64/

Если необходимо хранить несколько зеркал для разных выпусков и архитектур, то добавляем новые строки аналогично для jessie amd64 Далее нужно убедиться что все указанные в файле mirror.list каталоги существуют.

Запуск и автоматизация apt-mirror

Для ручного запуска создания/обновления зеркала выполняем команду:

apt-mirror

После загрузки индексных файлов apt-mirror сообщит, какой объём пакетов нужно получить:

Downloading 176 index files using 20 threads...
Begin time: Wed Jul 13 10:08:21 2016
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... 
[0]... 
End time: Wed Jul 13 10:08:34 2016

Processing tranlation indexes: [TTTTT]

Downloading 47 translation files using 20 threads...
Begin time: Wed Jul 13 10:08:34 2016
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... 
End time: Wed Jul 13 10:08:40 2016

Processing indexes: [SSSSPPPPP]

130.7 GiB will be downloaded into archive.
Downloading 116807 archive files using 20 threads...
Begin time: Wed Jul 13 10:08:46 2016
[20]...

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

crontab -e

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

Настройка доступа к зеркалу

После завершения работы локальные копии всех указанных репозиториев окажутся в каталогах /mnt/repo/debian/mirror/имя_репозитория. Таким образом копия репозитория, которая была определена в файле mirror.list как:

deb-amd64 http://httpredir.debian.org/debian jessie main contrib non-free

окажется в каталоге /mnt/repo/debian/mirror/httpredir.debian.org/debian. Доступ именно к этому каталогу можно открывать любым удобным для Вас способом - Web или FTP сервером. Для корректной работы обязательно необходимо добавить символические ссылки "stable","testing", "unstable" на те выпуски, которые вы зеркалируете (если они у вас есть).

Пример:

ln -s /media/repo/debian/mirror/httpredir.debian.org/debian/dists/jessie /media/repo/debian/mirror/httpredir.debian.org/debian/dists/jessie/stable

Далее очень желательно подписать вновь созданный репозиторий.

C помощью утилиты debmirror

Установка пакета:

apt-get install debmirror

Создание каталога /mnt/repo/debian, в нём будет создаваться локальный репозиторий пакетов. Желательно чтобы это был примонтированный логический раздел жёсткого диска, чтобы в случае переустановки дистрибутива с нуля, при форматировании корневого раздела (/), не лишиться репозитория совсем.

mkdir /mnt/repo/debian

Опции

  • -a тип архитектуры (i386, amd64 и т.п.)
  • -d ветка дистрибутива (stable, testing, unstable)
  • --nosource не закачивать пакеты с исходным кодом
  • --i18n закачивать файлы переводов описаний пакетов
  • -h адрес сетевого репозитория
  • --method тип протокола передачи файлов (ftp, http, rsync)
  • --progress показывать подробности загрузки
  • /mnt/repo/ каталог, в котором будет создан ваш локальный репозиторий
  • -v показывать, что сейчас происходит
  • --nosource не скачивать исходные коды
  • -s main,contrib,non-free секции, которые нужно скачать
  • --ignore-release-gpg игнорировать проверку gpg-ключа
  • --ignore-missing-release не прерывается, если нету файла Release

По умолчанию debmirror создаёт зеркало из секций main, contrib, non-free, main/debian-installer. Можно исключать секции ненужных вам пакетов:

--exclude-deb-section="games" - не будет зеркалировать все игры.

Имя секции обязательно в кавычках, иначе опция проигнорируется, это будет видно по общему объёму необходимых для скачивания пакетов выводимых программой в самом начале своей работы. Принадлежность к определенной секции вашего пакета можно узнать по команде:

apt-cache show имя_пакета

Пример получения бинарного зеркала (без пакетов с исходным кодом) Debian Stable для amd64:

debmirror --host=ftp.fi.debian.org/debian --dist=stable --arch=amd64 --method=ftp --ignore-release-gpg --nosource /mnt/repo/debian

C помощью утилиты reprepro

Установка пакета:

apt-get install reprepro

Создание каталога /mnt/repo/debian, в нём будет создаваться локальный репозиторий пакетов. Желательно чтобы это был примонтированный логический раздел жёсткого диска, чтобы в случае переустановки дистрибутива с нуля, при форматировании корневого раздела (/), не лишиться репозитория совсем.

mkdir /mnt/repo/debian

Cоздание каталога /mnt/repo/debian/conf и пустого конфигурационного файла distributions:

mkdir /mnt/repo/debian/conf
touch /mnt/repo/debian/conf/distributions

В файл /mnt/repo/debian/conf/distributions указываем следующие параметры (пример для testing, архитектура i386):

Codename:  squeeze
Suite:  stable
Version: 6.x
Origin: Debian
Label: Debian 6.x
Description: Debian Stable Repository
Architectures: amd64 source
Components: main contrib non-free
SignWith: default
DebIndices: Packages Release . .gz .bz2
DscIndices: Sources Release . .gz .bz2
Contents: . .gz .bz2

Описание параметров

  • Codename: squeeze кодовое имя дистрибутива: sarge, etch, lenny, squeeze и т.д.
  • Suite: stable вертка дистрибутива: stable, testing ,unstable ,experimental
  • Version: 6.x номер версии: squeeze - 6.x
  • Origin: Debian возможно у вас не Debian, а его производная, например, Ubuntu, Kubuntu, если оригинал, то Debian
  • Label: Debian 6.x смесь двух секций Origin и Version
  • Description: Debian testing repository расшифровка, какой репозиторий
  • Architectures: amd64 архитектура дистрибутива: i386, amd64 и т.д.
  • Components: main contrib non-free компоненты дистрибутива: main - СПО, contrib - СПО с зависимостями от несвободного, non-free - несвободное ПО
  • SignWith: default можно не указывать, если не планируете подписывать репозиторий ключём gnupg
  • DebIndices: Packages Release . .gz .bz2 индексные файлы Packages для двоичных пакетов и файлы Release с контрольными суммами; 3 типа: несжатые, сжатые gzip, сжатые bzip
  • DscIndices: Sources Release . .gz .bz2 тоже самое только для пакетов с исходным кодом
  • Contents: . .gz .bz2 файлы со списком содержимого каждого пакета, пригодиться при поиске файлов в установленных и ещё неустановленных пакетах
  • AlsoAcceptFor: unstable experimental другие ветки
  • UDebComponents: main contrib non-free Udeb-пакеты

Инициализация репозитория

Создаём каталоги, файлы, ссылки:

cd /mnt/repo/debian
reprepro export
reprepro createsymlinks

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

reprepro -b /mnt/repo/debian  --ask-passphrase includedeb squeeze /var/cache/apt/archives/*.deb

Параметр -b задаёт базовый каталог репозитория, в нашем случае это /mnt/repo, если вы находитесь уже в нём, то его можно не задавать, т.к. reprepro ищет файл conf/distributions в текущем каталоге. Добавление Дебиановских исходников в репозиторий. Они состоят обычно из 2-3 файлов, главным (управляющим) из которых является dsc-файл. Чтобы все файлы исходников добавились в репозиторий, нужно использовать includedsc, остальное аналогично. Добавление дебиановских исходников вместе с собранным из них пакетом (пакетами). После сборки пакета (пакетов) из дебиановских исходников, кроме самих пакетов и исходников появляется файл *.changes там же, где и пакеты. В этом файле перечислены как сами собранные пакеты, так и исходники. Поэтому для добавления всех этих файлов можно воспользоваться такой командой (в общем виде):

reprepro -C РАЗДЕЛ include ВЕТКА /путь/до/файла/имя_файла.changes

Параметр --ask-passphrase подпишет ваш репозиторий с помощью вашего ключа GnuPG. Его можно не указывать, если не планируете подписывать репозиторий ключём gnupg. На не подписанные репозитории, aptitude будет выдавать предупреждение, что он ненадежный. Для использования подписанного репозитория, надо сделать выгрузку вашего ключа, а на машине использующей репозиторий:

apt-key add /tmp/имя_вашего_ключа.asc

Добавление пакетов расположенных на CD/DVD Debian

Они уже лежат в иерархии каталога pool на дисках, но reprepro не поддерживает рекурсивный поиск по подкаталогам, но это достаточно легко обойти шаблоном (pool/*/*/*/*.deb). Пример:

reprepro -b /mnt/repo/debian  --ask-passphrase includedeb squeeze /media/cdrom/pool/*/*/*/*.deb

Она найдёт и добавит всё пакеты.

Удаление deb-пакета из репозитория

reprepro remove ветка имя_пакета

Удаление пакетов вместе с исходниками либо всех пакетов, относящихся к одному собранному приложению (это означает, что данные пакеты в репозитории лежат в одной папке, причем имя папки и будет указывать на имя приложения):

reprepro removesrc ветка имя_приложения

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

Для использования репозитория нужно добавить его в файл /etc/apt/sources.list в виде следующей строки (в общем виде):

deb file:///путь_к_папке_репозитория/ ветка разделы

например:

deb file:///home/repository/ squeeze main contrib non-free

Подпись локального репозитория своим ключом

Генерирование ключа

Чтобы не было проблем с тем, что ключи созданы не там, рекомендуется все делать от учётной записи «root». Для генерирования ключа нужно выполнить команду:

gpg --full-generate-key

Ответ на вопрос о типе ключа (обычно - 1):

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?

Ответ на вопрос о длине ключа (тоже по умолчанию - 3072):

RSA keys my by betweet 1024 and 4096 bits long.
What keysize do you want? (3072)

Ответ на вопрос о сроке истечения ключа (0 - никогда не истекает):

Please specify how long the key should be valid.
   0 = key does not expire
<n>  = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

После этого может потребоваться подтвердить выбор:

Key does not expire at all
Is this correct? (y/N) y

Далее ввести информацию о себе и подтвердить (буква O (не ноль)). Потом задать пароль и подтвердить его. После этого начинается генерация ключа, в течение которой просят попечатать чего-нить, подвигать мышкой или еще чего поделать. Это нужно для генерации уникального ключа. По завершении генерации будет выведена информация о сгенерированном ключе, такая как:

public and secret key created and signed.

pub   rsa4096 2019-02-19 [SC]
      2B9595A7153AA37D1F533DFE113DD734614210A4
uid                      My_key_4096 <________@_____.___>
sub   rsa4096 2019-02-19 [E]

Самой важной информацией является ID ключа и отпечаток.

Экспорт ключа

Выполнить:

gpg --armor --export > mylocalkey.asc

Где mylocalkey.asc это имя файла, в который внесен данный экспорт (новый файл, он создатся в процессе).

Добавление ключа в apt

Команда выполняется из того же каталога, что и предыдущая (из того, где находится mylocalkey.asc):

apt-key add mylocalkey.asc

После этого можно проверить наличие ключа в списке apt:

apt-key list

Выведет все ключи, в том числе и созданный. Если нужно удалить ключ из apt, то это выполняется командой:

apt-key del ID_ключа

В этом случае ID_ключа будет 5A81CBE3 (см.выше).

Подписывание локального репозитория созданным ключом

Сначала нужно убедиться в том, что в локальном репозитории имеется файл Release (находится в каталоге /mnt/repo/debian/dists/ветка_дистрибутива). В этом файле хранится информация о репозитории. Перейти в каталог, где находится файл Release и выполнить команду:

gpg --armor -o Release.gpg -sb Release

Файл Release.gpg создан, он является подписью к созданному локальному репозиторию.