299 lines
17 KiB
Markdown
299 lines
17 KiB
Markdown
# Метаданные репозитория
|
|
|
|
Чтобы установить пакеты из репозитория, необходимо знать список пакетов, которые там есть, кроме того желательно иметь описание для каждого пакета и некоторую техническую информацию.
|
|
|
|
## Стандартный формат метаданных
|
|
|
|
Метаданные на 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, в заголовке файла есть описание, как его сгенерировать:
|
|
|
|
```text
|
|
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 перенос строки, то есть между последней строкой заголовка и первой строкой тела этого файла пустых строк нет.
|
|
|
|
Само тело это действительно вывод указанной команды:
|
|
|
|
```text
|
|
2c4180b57c277ad3cd38865a466a4c15 ./ANNOUNCE.14_2
|
|
85891676a985eb6c87170083e1df75de ./CHANGES_AND_HINTS.TXT
|
|
```
|
|
|
|
и так далее для всех файлов в репозитории. Значимыми здесь являются файлы пакетов и сопровождающие их asc и txt файлы. Остальные - за компанию, для них вычислять md5 необязательно.
|
|
|
|
***Замечания к формату тела файла:***
|
|
|
|
* во-первых, не должно быть пустых строк
|
|
* во вторых, файл чётко должен заканчиваться на один снос строки, после последней записи
|
|
* в третьих, имя файла относительно и всегда начинается на "./" (без кавычек).
|
|
|
|
#### CHECKSUMS.md5.asc
|
|
|
|
В этом файле хранится gpg-подпись для CHECKSUMS.md5.
|
|
|
|
GPG-подпись желательна, но не обязательна. Она удостоверяет, что пакет был положен в репозиторий владельцем закрытого gpg-ключа, соответственно, он подлинный.
|
|
|
|
#### ChangeLog.txt
|
|
|
|
Здесь записываются все изменения. Этот файл встречается в основном репозитории и в него входят изменения, в том числе внесённые в суб-репозитории.
|
|
|
|
Изменения записываются "пачками":
|
|
|
|
```text
|
|
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
|
|
|
|
Список всех файлов в репозитории. Имеются в виду, конечно, значимые файлы, но, как правило, генерят просто список всех файлов, начиная с корня репозитория.
|
|
|
|
Файл содержит следующий заголовок:
|
|
|
|
```text
|
|
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.
|
|
|
|
```
|
|
|
|
После заголовка и перед телом файла присутствует пустая строка.
|
|
|
|
Тело файла выглядит примерно так:
|
|
|
|
```text
|
|
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
|
|
```
|
|
|
|
похожий список можно получить в выводе команды:
|
|
|
|
```bash
|
|
ls -lAn --time-style=long-iso "$dir"
|
|
```
|
|
|
|
однако в выводе не будет каталога "." и все файлы не будут начинаться "./".
|
|
|
|
Файл заканчивается на снос строки.
|
|
|
|
#### GPG-KEY
|
|
|
|
Это публичная часть ключа, с помощью которой можно проверять целостность файлов, подписанных gpg (при которых присутствует файл-сателлит с расширением **.asc**).
|
|
|
|
А воспользоваться этим инструментом можно примерно так:
|
|
|
|
Проверяем, что ключ правильный:
|
|
|
|
```text
|
|
gpg --keyid-format long --show-key GPG-KEY
|
|
```
|
|
|
|
Импортируем его к себе в keyring:
|
|
|
|
```text
|
|
gpg --import GPG-KEY
|
|
```
|
|
|
|
Собственно, проверяем:
|
|
|
|
```text
|
|
gpg --verify CHECKSUMS.md5.asc CHECKSUMS.md5
|
|
```
|
|
|
|
#### PACKAGES.TXT
|
|
|
|
Список пакетов в репозитории. Классический заголовок файла выглядит так:
|
|
|
|
```text
|
|
|
|
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 (*двумя!*) пустыми строками.
|
|
|
|
Технически это всё свободно (без потери работоспособности) может ужиматься до такой записи:
|
|
|
|
```text
|
|
PACKAGES.TXT; Sun Nov 3 12:47:53 UTC 2019
|
|
|
|
```
|
|
|
|
В этом случае заголовок не начинается с пустой строки и заканчивается на одну пустую строку. Так делает AlienBob.
|
|
|
|
Само тело состоит из записей (набор строк), разделённых пустой строкой. Пример записи из основного репозитория:
|
|
|
|
```text
|
|
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:
|
|
```
|
|
|
|
Пример записи из стороннего репозитория:
|
|
|
|
```text
|
|
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
|
|
|
|
Для официального репозитория он лежит только в суб-репозиториях, для сторонних репозиториев его кладут в основной репозиторий. Содержит список файлов в пакете.
|
|
|
|
Не содержит заголовка. Записи разделяются двумя пустыми строками.
|
|
|
|
```text
|
|
++========================================
|
|
||
|
|
|| 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:
|
|
|
|
```text
|
|
PACKAGE REQUIRED:
|
|
PACKAGE CONFLICTS:
|
|
PACKAGE SUGGESTS:
|
|
```
|
|
|
|
Их назначение вполне очевидно - более гибкое и более "умное" управление процессом установки пакетов.
|
|
|
|
## Подходы к генерации метаданных
|
|
|
|
Технически есть 2 метода генерации метаданных:
|
|
|
|
* Ленивый - с помощью подготовленных файликов, содержащих максимум метаинформации (либо с помощью БД) эта информация собирается в процессе подготовки пакета
|
|
* Полный - извлечение метаинформации непосредственно из готовых пакетов.
|
|
|
|
### Ленивый подход
|
|
|
|
Его применяет AlienBob в своём репозитории. В процессе сборки пакета генерируется несколько дополнительных файликов, из которых в последствии извлекается информация для создания метаданных репозитория. Возможен другой вариант - складывать метаданные о пакете в БД и в процессе генерации метаданных о репозитории извлекать информацию о каждом пакете уже из неё.
|
|
|
|
К плюсам этого подхода можно отнести прежде всего дешевизну его использования, так как по файликам с подготовленными данными пробегаться значительно проще и быстрее, чем распаковывать каждый пакет и из полученных данных строит метаданные для репозитория, это особенно заметно на больших пакетах.
|
|
|
|
К минусам этого подхода можно отнести его неуниверсальность и наличие в репозитории дополнительных артефактов, впрочем, последнее можно нивелировать, задействовав БД как хранилище промежуточной метаинформации.
|
|
|
|
### Полный подход
|
|
|
|
Область применения - затрудняюсь сказать. Однако официальные репозитории не содержат дополнительных артефактов.
|
|
|
|
Этот подход вполне подходит для небольших репозиториев, так как позволяет генерировать метаданные из любой кучки пакетов.
|
|
|
|
К минусам этого подхода очевидно имеет смысл приписать его дороговизну как по iops-ам, так и по процессору: на каждую перегенерацию метаданных придётся распаковывать весь набор пакетов в репозитории.
|