Метаданные репозитория

Чтобы установить пакеты из репозитория, необходимо знать список пакетов, которые там есть, кроме того желательно иметь описание для каждого пакета и некоторую техническую информацию.

Стандартный формат метаданных

Метаданные на DVD ROM и в официальном репозитории в интернете по своему формату одинаковые. Сам по себе формат допускает некоторые небольшие вольности, подозреваю, что это связано с тем, что разбор этих данных происходит стандартными утилитами командной строки, которые позволяют в некоторых местах использовать относительно "свободный" формат.

Метаданные размещены в нескольких текстовых файлах, для простоты их генерации и разбора.

Список файлов метаданных основного репозитория

CHECKSUMS.md5, CHECKSUMS.md5.asc, ChangeLog.txt, FILELIST.TXT, GPG-KEY, PACKAGES.TXT

Список файлов метаданных суб-репозиториев

Суб-репозитории - это подкаталоги с тематической подборкой пакетов. Их бывает 3: patches, pasture, extra.

Patches - это обновления.

Pasture - это пакеты, которые были в прошлых выпусках дистрибутива, но не вошли в текущий по тем или иным причинам.

Extra - это новые пакеты, которые были предложены к использованию в текущем выпуске, но по тем или иным причинам не были включены в основной список пакетов.

Суб-репозиторий patches присутствует только в репозитории с релизным вариантом дистрибутива, то есть его нет, например, в репозитории -current.

Метаданные субрепозиториев немного отличаются.
CHECKSUMS.md5, CHECKSUMS.md5.asc, FILE_LIST, MANIFEST.bz2, PACKAGES.TXT.

Описание метаданных

CHECKSUMS.md5

Это файл с checksum-ами в формате md5, в заголовке файла есть описание, как его сгенерировать:

These are the MD5 message digests for the files in this directory.
If you want to test your files, use 'md5sum' and compare the values to
the ones listed here.

To test all these files, use this command:

tail +13 CHECKSUMS.md5 | md5sum -c --quiet - | less

'md5sum' can be found in the GNU coreutils package on ftp.gnu.org in
/pub/gnu, or at any GNU mirror site.

MD5 message digest                Filename

После заголовка идёт 1 перенос строки, то есть между последней строкой заголовка и первой строкой тела этого файла пустых строк нет.

Само тело это действительно вывод указанной команды:

2c4180b57c277ad3cd38865a466a4c15  ./ANNOUNCE.14_2
85891676a985eb6c87170083e1df75de  ./CHANGES_AND_HINTS.TXT

и так далее для всех файлов в репозитории. Значимыми здесь являются файлы пакетов и сопровождающие их asc и txt файлы. Остальные - за компанию, для них вычислять md5 необязательно.

Замечания к формату тела файла:

  • во-первых не должно быть пустых строк
  • во вторых, файл чётко должен заканчиваться на один снос строки, после последней записи
  • в третьих имя файла относительно и всегда начинается на "./" (без кавычек).

CHECKSUMS.md5.asc

В этом файле хранится gpg-подпись для CHECKSUMS.md5.

GPG-подпись желательна, но не обязательна. Она удостоверяет, что пакет был положен в репозиторий владельцем закрытого gpg-ключа, соответственно, он подлинный.

ChangeLog.txt

Здесь записываются все изменения. Этот файл встречается в основном репозитории и в него входят изменения, в том числе внесённые в суб-репозитории.

Изменения записываются "пачками":

Sat Nov  2 18:52:12 UTC 2019
a/aaa_terminfo-6.1_20191026-x86_64-1.txz:  Upgraded.
a/cryptsetup-2.2.2-x86_64-1.txz:  Upgraded.
a/lvm2-2.03.06-x86_64-1.txz:  Upgraded.
d/Cython-0.29.14-x86_64-1.txz:  Upgraded.
l/ncurses-6.1_20191026-x86_64-1.txz:  Upgraded.
  Restore the --without-normal option to skip static libraries as used in 14.2.
  Thanks to Richard Narron.
x/xterm-349-x86_64-2.txz:  Rebuilt.
  In /etc/app-defaults/XTerm, use terminus-medium instead of terminus-bold.
  Thanks to igadoter.
+--------------------------+

Файл опционален, он входит в состав не только официальных репозиториев, но и встречается, например, у AlienBob-а. Кстати, у последнего этот файл начинается с разделителя и после каждой "пачки" вставляется дополнительная пустая строка.

FILELIST.TXT

Список всех файлов в репозитории. Имеются в виду, конечно, значимые файлы, но, как правило, генерят просто список всех файлов, начиная с корня репозитория.

Файл содержит следующий заголовок:

Sat Nov  2 19:03:12 UTC 2019

Here is the file list for this directory.  If you are using a
mirror site and find missing or extra files in the disk
subdirectories, please have the archive administrator refresh
the mirror.

После заголовка и перед телом файла присутствует пустая строка.

Тело файла выглядит примерно так:

drwxr-xr-x 12 root root      4096 2019-11-02 18:52 .
-rw-r--r--  1 root root     10064 2016-06-30 18:39 ./ANNOUNCE.14_2
-rw-r--r--  1 root root     14642 2019-10-18 21:18 ./CHANGES_AND_HINTS.TXT

похожий список можно получить в выводе команды:

ls -lAn --time-style=long-iso "$dir"

однако в выводе не будет каталога "." и все файлы не будут начинаться "./".

Файл заканчивается на снос строки.

GPG-KEY

Это публичная часть ключа, с помощью которой можно проверять целостность файлов, подписанных gpg (при которых присутствует файл-сателлит с расширением .asc).

А воспользоваться этим инструментом можно примерно так:

Проверяем, что ключ правильный:

gpg --keyid-format long --show-key GPG-KEY

Импортируем его к себе в keyring:

gpg --import GPG-KEY

Собственно, проверяем:

gpg --verify CHECKSUMS.md5.asc CHECKSUMS.md5

PACKAGES.TXT

Список пакетов в репозитории. Классический заголовок файла выглядит так:


PACKAGES.TXT;  Sat Nov  2 19:01:20 UTC 2019

This file provides details on the Slackware packages found
in the ./slackware64/ directory.

Total size of all packages (compressed):  2612 MB
Total size of all packages (uncompressed):  11323 MB

Заголовок файла начинается с пустой строки, а заканчивается 2 (двумя!) пустыми строками.

Технически это всё свободно (без потери работоспособности) может ужиматься до такой записи:

PACKAGES.TXT;  Sun Nov  3 12:47:53 UTC 2019

В этом случае заголовок не начинается с пустой строки и заканчивается на одну пустую строку. Так делает AlienBob.

Само тело состоит из записей (набор строк), разделённых пустой строкой. Пример записи из основного репозитория:

PACKAGE NAME:  ConsoleKit2-1.0.0-x86_64-4.txz
PACKAGE LOCATION:  ./slackware64/l
PACKAGE SIZE (compressed):  148 K
PACKAGE SIZE (uncompressed):  780 K
PACKAGE DESCRIPTION:
ConsoleKit2: ConsoleKit2 (user, login, and seat tracking framework)
ConsoleKit2:
ConsoleKit2: ConsoleKit2 is a framework for defining and tracking users, login
ConsoleKit2: sessions, and seats.
ConsoleKit2:
ConsoleKit2: Homepage: https://github.com/ConsoleKit2/ConsoleKit2
ConsoleKit2:

Пример записи из стороннего репозитория:

PACKAGE NAME:  SDL2-2.0.10-x86_64-1.txz
PACKAGE LOCATION:  .
PACKAGE SIZE (compressed):  609 K
PACKAGE SIZE (uncompressed):  3260 K
PACKAGE REQUIRED:  
PACKAGE CONFLICTS:  
PACKAGE SUGGESTS:  
PACKAGE DESCRIPTION:
SDL2:
SDL2: Simple DirectMedia Layer is a cross-platform development library
SDL2: designed to provide low-level access to audio, keyboard, mouse,
SDL2: joystick, and graphics hardware ia via OpenGL. It is used by
SDL2: video playback software, emulators, and games.
SDL2:
SDL2: Homepage: http://www.libsdl.org
SDL2:
SDL2:
SDL2:

как видим, всё, что идёт после "PACKAGE DESCRIPTION:" - это фрагмент файла slack-desc с описанием пакета.

Соответственно, сторонний репозиторий содержит расширенную информацию: зависимости, конфликты, рекомендованные пакеты

В случае официального репозитория, файл заканчивается на 2 пустые строки. AlienBob в своём стороннем репозитории довольствуется одной пустой строкой и это работает.

MANIFEST.bz2

Для официального репозитория он лежит только в суб-репозиториях, для сторонних репозиториев его кладут в основной репозиторий. Содержит список файлов в пакете.

Не содержит заголовка. Записи разделяются двумя пустыми строками.

++========================================
||
||   Package:  ./aspell-word-lists/aspell-am-0.03_1-x86_64-5.txz
||
++========================================
drwxr-xr-x root/root         0 2016-06-06 15:13 ./
drwxr-xr-x root/root         0 2016-06-06 15:13 install/
-rw-r--r-- root/root       190 2016-06-06 15:13 install/slack-desc
drwxr-xr-x root/root         0 2016-06-06 15:13 usr/
drwxr-xr-x root/root         0 2016-06-06 15:13 usr/lib64/
drwxr-xr-x root/root         0 2016-06-06 15:13 usr/lib64/aspell/
-rw-r--r-- root/root       101 2016-06-06 15:13 usr/lib64/aspell/am.dat
-rw-r--r-- root/root    282544 2016-06-06 15:13 usr/lib64/aspell/am.rws
-rw-r--r-- root/root       426 2016-06-06 15:13 usr/lib64/aspell/am_affix.dat
-rw-r--r-- root/root      1871 2016-06-06 15:13 usr/lib64/aspell/am_phonet.dat
-rw-r--r-- root/root        72 2016-06-06 15:13 usr/lib64/aspell/amharic.alias
-rw-r--r-- root/root     25615 2016-06-06 15:13 usr/lib64/aspell/s-ethi.cmap
-rw-r--r-- root/root        70 2016-06-06 15:13 usr/lib64/aspell/am.multi
-rw-r--r-- root/root     13356 2016-06-06 15:13 usr/lib64/aspell/s-ethi.cset
drwxr-xr-x root/root         0 2016-06-06 15:13 usr/doc/
drwxr-xr-x root/root         0 2016-06-06 15:13 usr/doc/aspell-am-0.03_1/
-rw-r--r-- root/root       394 2004-12-22 20:27 usr/doc/aspell-am-0.03_1/Copyright
-rw-r--r-- root/root      2434 2004-12-28 08:15 usr/doc/aspell-am-0.03_1/README

Расширения стандартного формата метаданных

В качестве расширения к официальному формату можно указать наличие сжатых версий файлов CHECKSUMS.md5.gz ChangeLog.txt.gz PACKAGES.TXT.gz. В данном случае если у несжатой версии есть подпись в asc-файле, то подписывать надо и сжатый файл тоже.

Кроме дополнительных сжатых файлов появились новые поля в PACKAGES.TXT:

PACKAGE REQUIRED:  
PACKAGE CONFLICTS:  
PACKAGE SUGGESTS:  

Их назначение вполне очевидно - более гибкое и более "умное" управление процессом установки пакетов.

Подходы к генерации метаданных

Технически есть 2 метода генерации метаданных:

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

Ленивый подход

Его применяет AlienBob в своём репозитории. В процессе сборки пакета генерируется несколько дополнительных файликов, из которых в последствии извлекается информация для создания метаданных репозитория. Возможен другой вариант - складывать метаданные о пакете в БД и в процессе генерации метаданных о репозитории извлекать информацию о каждом пакете уже из неё.

К плюсам этого подхода можно отнести прежде всего дешевизну его использования, так как по файликам с подготовленными данными пробегаться значительно проще и быстрее, чем распаковывать каждый пакет и из полученных данных строит метаданные для репозитория, это особенно заметно на больших пакетах.

К минусам этого подхода можно отнести его неуниверсальность и наличие в репозитории дополнительных артефактов, впрочем, последнее можно нивелировать, задействовав БД как хранилище промежуточной метаинформации.

Полный подход

Область применения - затрудняюсь сказать. Однако официальные репозитории не содержат дополнительных артефактов.

Этот подход вполне подходит для небольших репозиториев, так как позволяет генерировать метаданные из любой кучки пакетов.

К минусам этого подхода очевидно имеет смысл приписать его дороговизну как по iops-ам, так и по процессору: на каждую перегенерацию метаданных придётся распаковывать весь набор пакетов в репозитории.

Next Post