16.4. Репозиторий и индексами
Просматривая репозиторий без индексов (в которых хранится информация о зависимостях, конфликтах, времени сборки и т. д.), APT будет регулярно строить их динамически. Если пакетов в нём достаточно, это может занимать довольно много времени. Кроме того, без индексов не будет работать доступ по сети.
Репозиторий APT типа rpm состоит из двух компонентов: индексов, где описаны все пакеты, ссылки на них и их версии, и самих .rpm-пакетов.
Каталог для репозитория создаётся по особым правилам:
в каталоге должно быть хранилище пакетов в формате
…/Раздел/RPMS.компонент:
раздел — описание архитектуры хранимых пакетов. Ограничений на его именование нет, однако обычно оно соответствует аппаратной архитектуре, под которую собран пакет — x86_64, aarch64 и т. д. для архитектурно зависимых пакетов, noarch — для архитектурно независимых;
компонент используется для классификации и организации пакетов в репозитории по функциональности или назначению. Ограничений на его именование нет;
RPMS.компонент — непосредственно каталог с пакетами.
@user
[user@VM ~]$ mkdir NewRepo
[user@VM ~]$ cd NewRepo/
[user@VM NewRepo]$ mkdir -p x86_64/RPMS.classic
[user@VM NewRepo]$ cp ~/hasher/repo/x86_64/RPMS.hasher/* x86_64/RPMS.classic/
[user@VM NewRepo]$ tree
.
└── x86_64
└── RPMS.classic
├── autoenv-pkg-1.0-alt1.x86_64.rpm
├── autoenv-pkg-1.1-alt1.x86_64.rpm
├── autoenv-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── autoenv-pkg-debuginfo-1.1-alt1.x86_64.rpm
├── double-1.0-alt1.x86_64.rpm
├── double-second-1.0-alt1.x86_64.rpm
├── gdb-check-pkg-1.0-alt1.x86_64.rpm
├── gdb-check-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── GNU_picture-1.0-alt1.x86_64.rpm
├── GNU_picture-data-1.0-alt1.noarch.rpm
├── GNU_picture-data-1.0-alt1.x86_64.rpm
├── GNU_picture-debuginfo-1.0-alt1.x86_64.rpm
├── hello-upgrade-1.0-alt1.x86_64.rpm
├── hello-upgrade-debuginfo-1.0-alt1.x86_64.rpm
├── inc-1.0-alt1.x86_64.rpm
├── inc-debuginfo-1.0-alt1.x86_64.rpm
├── Multilab-1.0-alt1.x86_64.rpm
├── Multilab-debuginfo-1.0-alt1.x86_64.rpm
├── not-null-pkg-1.0-alt1.x86_64.rpm
├── null-pkg-1.0-alt1.x86_64.rpm
├── pkg-ncurses-1.0-alt1.x86_64.rpm
├── pkg-ncurses-debuginfo-1.0-alt1.x86_64.rpm
├── regex-pkg-1.0-alt1.x86_64.rpm
├── regex-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── sheepcounter-0.0-alt1.x86_64.rpm
├── sheepcounter-1.0-alt1.x86_64.rpm
├── sheepcounter-debuginfo-0.0-alt1.x86_64.rpm
├── sheepcounter-debuginfo-1.0-alt1.x86_64.rpm
├── sheepcounter-pkg-1.0-alt1.x86_64.rpm
├── sheepcounter-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── strace-pkg-1.0-alt1.x86_64.rpm
├── strace-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── syscall-1.0-alt1.x86_64.rpm
├── syscall-1.1-alt1.x86_64.rpm
├── syscall-1.2-alt1.x86_64.rpm
├── syscall-1.3-alt1.x86_64.rpm
├── syscall-debuginfo-1.0-alt1.x86_64.rpm
├── syscall-debuginfo-1.1-alt1.x86_64.rpm
├── syscall-debuginfo-1.2-alt1.x86_64.rpm
├── syscall-debuginfo-1.3-alt1.x86_64.rpm
├── todo-pkg-1.0-alt1.x86_64.rpm
└── Weatherminal-1.0-alt1.x86_64.rpm
3 directories, 42 files
[user@VM NewRepo]$
Для создания индексов для репозитория используется пакет apt-repo-tools и утилита genbasedir, создающий индексы для пакетов одного раздела репозитория. Обратите внимание на то, что hasher не определяет архитектурную зависимость пакета: для него они все x86_64. Также стоит заметить, что репозиторий формируется «в рабочем порядке», его непротиворечивость ничем не гарантирована (например, у нас образовалось два одноимённых пакета GNU_picture-data разной архитектуры):
@user
[user@VM NewRepo]$ genbasedir --create --progress --topdir=. x86_64 classic
Creating base directory... done
Components: classic
Processing packages... RPMS.classic 42/42 42/42 done
Waiting for bzip2 and xz to finish... done
Creating component releases... classic done
Updating global release file... done
Appending MD5Sum... classic done
Appending BLAKE2b... classic done
All your base are belong to us!!!
[user@VM NewRepo]$ tree
.
└── x86_64
├── base
│ ├── pkglist.classic
│ ├── pkglist.classic.bz2
│ ├── pkglist.classic.xz
│ ├── release
│ └── release.classic
└── RPMS.classic
├── autoenv-pkg-1.0-alt1.x86_64.rpm
├── autoenv-pkg-1.1-alt1.x86_64.rpm
├── autoenv-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── autoenv-pkg-debuginfo-1.1-alt1.x86_64.rpm
├── double-1.0-alt1.x86_64.rpm
├── double-second-1.0-alt1.x86_64.rpm
├── gdb-check-pkg-1.0-alt1.x86_64.rpm
├── gdb-check-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── GNU_picture-1.0-alt1.x86_64.rpm
├── GNU_picture-data-1.0-alt1.noarch.rpm
├── GNU_picture-data-1.0-alt1.x86_64.rpm
├── GNU_picture-debuginfo-1.0-alt1.x86_64.rpm
├── hello-upgrade-1.0-alt1.x86_64.rpm
├── hello-upgrade-debuginfo-1.0-alt1.x86_64.rpm
├── inc-1.0-alt1.x86_64.rpm
├── inc-debuginfo-1.0-alt1.x86_64.rpm
├── Multilab-1.0-alt1.x86_64.rpm
├── Multilab-debuginfo-1.0-alt1.x86_64.rpm
├── not-null-pkg-1.0-alt1.x86_64.rpm
├── null-pkg-1.0-alt1.x86_64.rpm
├── pkg-ncurses-1.0-alt1.x86_64.rpm
├── pkg-ncurses-debuginfo-1.0-alt1.x86_64.rpm
├── regex-pkg-1.0-alt1.x86_64.rpm
├── regex-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── sheepcounter-0.0-alt1.x86_64.rpm
├── sheepcounter-1.0-alt1.x86_64.rpm
├── sheepcounter-debuginfo-0.0-alt1.x86_64.rpm
├── sheepcounter-debuginfo-1.0-alt1.x86_64.rpm
├── sheepcounter-pkg-1.0-alt1.x86_64.rpm
├── sheepcounter-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── strace-pkg-1.0-alt1.x86_64.rpm
├── strace-pkg-debuginfo-1.0-alt1.x86_64.rpm
├── syscall-1.0-alt1.x86_64.rpm
├── syscall-1.1-alt1.x86_64.rpm
├── syscall-1.2-alt1.x86_64.rpm
├── syscall-1.3-alt1.x86_64.rpm
├── syscall-debuginfo-1.0-alt1.x86_64.rpm
├── syscall-debuginfo-1.1-alt1.x86_64.rpm
├── syscall-debuginfo-1.2-alt1.x86_64.rpm
├── syscall-debuginfo-1.3-alt1.x86_64.rpm
├── todo-pkg-1.0-alt1.x86_64.rpm
└── Weatherminal-1.0-alt1.x86_64.rpm
4 directories, 47 files
[user@VM NewRepo]$
Добавим репозиторий к другим доступным и проверим работу индексов:
@root
[root@VM ~]# cat /etc/apt/sources.list
# Local package resource list for APT goes here.
# To inspect package defined part, see /etc/apt/sources.list.d/*.list
rpm-dir file:///home/user/NewRepo x86_64 classic
[root@VM ~]# apt-repo
rpm-dir file:///home/user/NewRepo x86_64 classic
rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64 classic
rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64-i586 classic
rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/noarch classic
[root@VM ~]# apt-cache search GNU_picture
GNU_picture-debuginfo - Print your special GNU picture (debug files)
GNU_picture-data - Your special GNU picture
GNU_picture - Print your special GNU picture
[root@VM ~]#
Соблюдая надлежащую дисциплину (например, вовремя удаляя устаревшие и неактуальные пакеты), репозиторий можно опубликовать и использовать для обновления нескольких систем.
Запись в
/etc/sources.list примет вид:
rpm http://<адрес_сервера>/<путь_до_NewRepo> x86_64 classic
Протестируем репозиторий, запустив примитивный HTTP-сервер:
@user
[user@VM NewRepo]$ python3 -m http.server -d
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Добавим информацию о репозитории в sources.list. Заметим, что URL не содержит дополнительных компонентов пути, потому что базовым каталогом HTTP-сервера является каталог с репозиторием:
@root2
[root@VM ~]# cat /etc/apt/sources.list
# Local package resource list for APT goes here.
# To inspect package defined part, see /etc/apt/sources.list.d/*.list
rpm http://192.168.0.1:8000 x86_64 classic
[root@VM ~]#
Обновим индексы с помощью apt-get update:
@root2
[root@VM ~]# apt-get update
Получено: 1 http://192.168.0.1:8000 x86_64 release [1068B]
Получено: 2 http://ftp.altlinux.org p11/branch/x86_64 release [4210B]
Получено: 3 http://ftp.altlinux.org p11/branch/x86_64-i586 release [1665B]
Получено: 4 http://ftp.altlinux.org p11/branch/noarch release [2831B]
Получено 9774B за 0s (119kB/s).
Получено: 1 http://192.168.0.1:8000 x86_64/classic pkglist [8276B]
Получено: 2 http://192.168.0.1:8000 x86_64/classic release [126B]
Найдено http://ftp.altlinux.org p11/branch/x86_64/classic pkglist
Найдено http://ftp.altlinux.org p11/branch/x86_64/classic release
Найдено http://ftp.altlinux.org p11/branch/x86_64-i586/classic pkglist
Найдено http://ftp.altlinux.org p11/branch/x86_64-i586/classic release
Найдено http://ftp.altlinux.org p11/branch/noarch/classic pkglist
Найдено http://ftp.altlinux.org p11/branch/noarch/classic release
Получено 8402B за 0s (363kB/s).
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
[root@VM ~]#
Посмотрим информацию о локально собранных пакетах:
@root2
[root@VM ~]# apt-cache search autoenv
autoenv-pkg - Test pkg with autotool
autoenv-pkg-debuginfo - Test pkg with autotool (debug files)
[root@VM ~]#