Аннотация
В этом документе объясняется что такое репозиторий Debian и как его можно сделать самому.
Содержание
Репозиторий Debian — это набор пакетов Debian, размещённых в специальном дереве каталогов, в которых также есть несколько дополнительных файлов с индексами и контрольными суммами пакетов. Если пользователь добавит репозиторий в свой /etc/apt/sources.list файл, то он сможет легко просматривать и устанавливать пакеты из репозитория, так как будто пакеты хранятся в Debian.
Репозиторий может быть доступен постоянно, а может и нет (например компакт-диск), хотя первый случай более распространён.
Этот документ объясняет как работают репозитории Debian, как их создавать, и как их правильно добавлять в файл sources.list .
Оригинал этого документа можно найти http://www.isotton.com/debian/docs/repository-howto/.
Авторские права на этот документ, Debian Repository HOWTO, принадлежат (c) 2002-2003 Aaron Isotton. Разрешается копировать распространять и/или изменять этот документ согласно условиям GNU Free Documentation License, версия 1.1 или более поздней, опубликованной Фондом Свободного ПО (FSF); with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts.
Присылайте ваши добавления, комментарии и критику по электронной почте: <aaron@isotton.com>.
Есть три дистрибутива Debian: стабильный (stable), тестируемый (testing) и нестабильный (unstable).
Файлы Packages.gz и Sources.gz .
Репозиторий состоит как минимум из одного каталога, в котором хранятся DEB пакеты и два специальных файла: Packages.gz для бинарных пакетов и Sources.gz для пакетов с исходными текстами.
Если ваш репозиторий описан правильно в sources.list (об этом позже), то apt-get загрузит индексный файл Packages.gz для бинарных пакетов (ключевое слово deb ) и файл Sources.gz для пакетов с исходными текстами (ключевое слово deb-src ).
Packages.gz содержит название, версию, размер, краткое и полное описание и зависимости для каждого пакета, плюс некоторую дополнительную информацию, которая нам не интересна. Вся эта информация читается (и используется) менеджерами пакетов Debian, например dselect или aptitude.
Sources.gz содержит название, версию и зависимости для сборки (пакеты, которые нужны для сборке программы) каждого пакета (плюс некоторую дополнительную информацию, которая нам опять не интересна). Эта информация используется apt-get source и подобными программами.
Кроме этого может существовать необязательный файл Release , содержащий информацию о вашем репозитории, которая используется механизмом Фиксации, интересной вещи, но здесь это рассмотрено не будет. О фиксации вы можете прочитать в APT HOWTO.
Таким образом, после настройки собственного репозитория, вы сможете получать список и устанавливать собственные пакеты вместе с пакетами из репозитория Debian; если вы обновите пакет в репозитории, то он обновится в системе когда пользователь запустит apt-get upgrade; кроме этого каждый пользователь сможет легко увидеть краткое описание и другую важную информацию о ваших пакетах.
Кроме того, правильно созданные репозитории могут предложить различные пакеты для каждого поддерживаемого дистрибутива и для каждой (в данный момент одиннадцати) из поддерживаемых архитектур; apt автоматически загрузит правильный для машины пользователя пакет, пользователю не нужно обременять себя лишними знаниями обо всех этих архитектурах. Также можно сгрупировать собственные пакеты в компоненты, точно также как пакеты Debian подразделяются на main, non-free и contrib. Из-за этого, особенно если ваши программы могут работать на нескольких архитектурах, вы полюбите репозитории пакетов.
Существует два типа репозиториев: сложные, где пользователям нужно указывать не только путь к репозиторию, но и дистрибутив и нужные компоненты (если есть выбор, apt автоматически загрузит файл с нужной архитектурой), и простые, где пользователю нужно указать только полный путь (и apt не нужно выяснять подходят ли пакеты в данном случае). Первый тип, естестенно сложнее в настройке, но легче в использовании, и им нужно пользоваться всегда при сложных и/или кросплатформенных репозиториях; второй проще в настройке, но подходит только для маленьких или одноархитектурных репозиториев.
Хотя это и не совсем правильно, но я буду называть первые Автоматические репозитории , а вторые Обычные репозитории.
Структура каталогов автоматического репозитория с поддерживаемыми в Debian архитектурами и компонентами выглядит так:
Пример 1. Стандартный репозиторий Debian
(корневой каталог репозитория)
|
+-dists
|
|-stable
| |-main
| | |-binary-alpha
| | |-binary-arm
| | |-binary-...
| | +-source
| |-contrib
| | |-binary-alpha
| | |-binary-arm
| | |-binary-...
| | +-source
| +-non-free
| |-binary-alpha
| |-binary-arm
| |-binary-...
| +-source
|
|-testing
| |-main
| | |-binary-alpha
| | |-binary-arm
| | |-binary-...
| | +-source
| |-contrib
| | |-binary-alpha
| | |-binary-arm
| | |-binary-...
| | +-source
| +-non-free
| |-binary-alpha
| |-binary-arm
| |-binary-...
| +-source
|
+-unstable
|-main
| |-binary-alpha
| |-binary-arm
| |-binary-...
| +-source
|-contrib
| |-binary-alpha
| |-binary-arm
| |-binary-...
| +-source
+-non-free
|-binary-alpha
|-binary-arm
|-binary-...
+-sourceСвободные пакеты лежат в каталоге main; несвободные в non-free, и свободные, зависящие от несвободных в contrib. В настоящий момент в Debian поддерживается 11 архитектур; большинство каталогов для них здесь для краткости не показаны.
В каждом каталоге binary-* содержится файл Packages.gz и необязательный файл Release ; в каждом каталоге source содержится файл Sources.gz и необязательный файл Release . Заметьте, что сами пакеты располагаются не в том же каталоге что и индексные файлы, так как индексные файлы содержат пути к каждому пакету; фактически пакеты могут располагаться где угодно в репозитории. Это делает возможным создание пулов.
Вы можете создавать любое число дистрибутивов и компонент и называть их как угодно; то, что показано в примере просто используется в Debian. Вы можете, например, создать дистрибутивы current и beta (вместо стабильный (stable), тестируемый (testing) и нестабильный (unstable)), и компоненты foo, bar, baz и qux (вместо main, contrib и non-free).
Хотя вы и можете использовать любые названия компонент, обычно лучше придерживаться стандартных названий Debian, так как их назначение уже понятно пользователям Debian.
Обычные репозитории состоят из корневого каталога и нескольких нужных вам подкаталогов. Так как пользователям нужно указывать путь к корневому каталогу репозитория и относительный путь между корневым и каталогом с индексным файлом, вы можете создавать каталоги как угодно (даже положить всё в один корневой каталог; просто относительный путь в этом случае будет «/»).
dpkg-scanpackages создаёт файл Packages , а dpkg-scansources файл Sources .
Результат обеих программ направляется в stdout (стандартный выходной поток); таким образом, для сжатия файлов вы можете использовать цепочку команд: dpkg-scanpackages аргументы | gzip -9c > Packages.gz.
Данные программы работают схожим образом; им передаётся два аргумента (на самом деле есть и другие, но они здесь не показаны; вы можете прочитать о них в страницах руководства); первым параметром указывается каталог с пакетами, а вторым файл override. Для простых репозиториев файл override не нужен, но всё равно этот аргумент является обязательным, поэтому мы просто передаём /dev/null.
dpkg-scanpackages сканирует .deb пакеты; dpkg-scansources сканирует .dsc файлы. Необходимо располагать файлы .orig.gz, .diff.gz и .dsc вместе. Файлы .changes необязательны.
Предположим, мы имеем обычный репозиторий, описанный в Пример 2, «Обычный репозиторий с двумя подкаталогами». Чтобы создать для него два индексных файла нужно ввести:
$ cd my-repository $ dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz $ dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz
Если у вас сложный репозиторий, подобный Пример 1, «Стандартный репозиторий Debian», то вам придётся писать несколько сценариев для автоматизации процесса.
Также, вы можете воспользоваться параметром pathprefix для упрощения синтаксиса; читателю самому предлагается проделать это в качестве упражнения. (Это описано в страницах руководства).
Если вы хотите позволить пользователям вашего репозитория использовать механизм Фиксации , то нужно создать файл Release в каждом каталоге, где есть индексный файл. (Подробные сведения о фиксации изложены в APT HOWTO).
Файлы Release являются простыми маленькими текстовыми файлами следующего вида:
Archive: архив Component: компонент Origin: название вашей организации Label: Debian репозиторий моей организации Architecture: архитектура
Название дистрибутива Debian, к которому относятся пакеты в этом каталоге (или для которого предназначены), например стабильный (stable), тестируемый (testing) или нестабильный (unstable).
Компонент, к которому относятся пакеты в каталоге, например main, non-free, или contrib.
Имя автора пакетов.
Любая информация относящаяся к пакетам или к репозиторию. Дайте волю воображению.
Архитектура машин, для которых собирались пакеты этого каталога, например i386, sparc или source.
Очень важно указать правильные Archive и Architecture , так как они используются для фиксации. Остальные поля менее важны.
При использовании автоматических репозиториев раскидывание пакетов по разным каталогам быстро приводит к неприятностям. Это также влечёт за собой напрасные траты места и пропускной способности сети, так как многие пакеты (например пакеты с документацией) относятся сразу ко всем архитектурам.
В таких случаях возможным решением является пул. Пул — это дополнительный каталог внутри репозитория, содержащий все пакеты (двоичные пакеты для всех архитектур, дистрибутивов, компонент и все пакеты с исходными текстами). В совокупности с правильной комбинацией файлов override (которые не описаны в этом документе) и с помощью сценариев многих проблем удаётся избежать. Отличным примером репозитория с пулом является сам репозиторий Debian.
Пулы полезны только для больших репозиториев; я пока ни одного не сделал и не думаю, что это понадобится в ближайшем будущем, и поэтому я не объясняю как его создавать. Если вы думаете, что такой раздел должен быть добавлен, напишите его и свяжитесь со мной.
Существуют различные инструменты для автоматизации и упрощения создания архивов Debian; здесь описаны наболее важные из них.
apt-ftparchive — используется для перемещения набора файлов пакетов Debian в надлежащую архивную иерархию, соответствующую официальному архиву Debian. Данная программа является частью пакета apt-utils .
apt-move — используется для перемещения набора файлов пакетов Debian в надлежащую архивную иерархию, соответствующую официальному архиву Debian.
Использовать репозиторий очень просто, как именно зависит от типа созданного репозитория: бинарного или с исходными текстами, автоматического или обычного.
Подключение каждого репозитория занимает одну строку в sources.list; для репозитория с бинарными пакетами используется команда deb , а для репозитория с исходными текстами команда deb-src .
Каждая строка имеет следующий синтаксис:
deb|deb-src uri дистрибутив [компонент1] [компонент2] [...]
Файлы uri — это URI (унифицированный идентификатор ресурса), указывающий на корень репозитория, например, ftp://ftp.yoursite.com/debian, http://yoursite.com/debian или, для файлов на вашем жёстком диске, file::///home/joe/my-debian-repository. Последняя косая черта является необязательной.
Для автоматических репозиториев вы должны указать дистрибутив и один или более компонент; дистрибутив не должен заканчиваться символом косой черты.
Пример 3. Два автоматических репозитория из моего sources.list
deb ftp://sunsite.cnlab-switch.ch/mirror/debian/ unstable main contrib non-free deb-src ftp://sunsite.cnlab-switch.ch/mirror/debian/ unstable main contrib non-free
Две показанные строки указывают на автоматический бинарный и репозиторий с исходными текстами имеющим корень ftp://sunsite.cnlab-switch.ch/mirror/debian/, дистрибутив нестабильный (unstable) и компоненты main, contrib и non-free.
Если репозиторий не автоматический, то параметр дистрибутив содержит относительный путь к индексным файлам и этот путь должен заканчиваться символом косой черты, а компоненты указываться не должны.
Пример 4. Два обычных репозитория из моего sources.list
deb file:///home/aisotton/rep-exact binary/ deb-src file:///home/aisotton/rep-exact source/
Первая строка подключает бинарный репозиторий /home/aisotton/rep-exact/binary , хранящийся на моей локальной машине; вторая строка подключает репозиторий с исходными текстами /home/aisotton/rep-exact/source.
Файлы apt-ftparchive (документацию к пакету).
Файлы apt-get (документацию к пакету) и документацию на apt.
Файлы apt-move (документацию к пакету).
http://www.apt-get.org/ (много примеров существующих репозиториев)
Файлы APT HOWTO.
Файлы dpkg-scanpackages (документацию к пакету).
Файлы dpkg-scansources (документацию к пакету).
Файлы sources.list(5) (страницу руководства).