Редакция апрель, 2026
Аннотация
apt-get позволяют пользователям легко обновлять свои системы и быть в курсе актуальных новинок мира свободных программ.
Предупреждение




Предупреждение


Предупреждение
Предупреждение
#где <файл-образа.iso> — образ диска ISO, аddoflag=direct if=<файл-образа.iso> of=/dev/sdX bs=1M status=progress;sync
/dev/sdX — устройство, соответствующее flash-диску.
#где <файл-образа.iso> — образ диска ISO, аpv<файл-образа.iso> | dd oflag=direct of=/dev/sdX bs=1M;sync
/dev/sdX — устройство, соответствующее flash-диску.
lsblk или (если такой команды нет) blkid.
$ lsblk | grep disk
sda 8:0 0 931,5G 0 disk
sdb 8:16 0 931,5G 0 disk
sdc 8:32 1 7,4G 0 disk
flash-диск имеет имя устройства sdc.
# dd oflag=direct if=/home/iso/alt-platform-builder-11.0-x86_64.iso of=/dev/sdc bs=1M status=progress; sync
# pv /home/iso/alt-platform-builder-11.0-x86_64.iso | dd oflag=direct of=/dev/sdc bs=1M;sync
dd: warning: partial read (524288 bytes); suggest iflag=fullblock
3GiB 0:10:28 [4,61MiB/s] [===================================> ] 72% ETA 0:04:07
Предупреждение
sudo dd if=alt-platform-builder-11.0-x86_64.isoof=/dev/rdiskX bs=10Msync
alt-platform-builder-11.0-x86_64.iso — образ диска ISO, а /dev/rdiskX — flash-диск.
diskutil list
Предупреждение
$ du -b alt-platform-builder-1f1.0-x86_64.iso | cut -f1
2228344832
$ md5sum alt-platform-builder-11.0-x86_64.iso
1044e5aa9ecf6ee5a87fb990c8123af8 alt-platform-builder-11.0-x86_64.iso
# head -c 2228344832 /dev/sdd | md5sum
1044e5aa9ecf6ee5a87fb990c8123af8
где размер после -c — вывод в п.1, а /dev/sdd — устройство DVD или USB Flash, на которое производилась запись.
Предупреждение
Примечание
Примечание




Примечание

Примечание
Примечание
Примечание
позволяет показать/скрыть панель со списком шагов установки:





Примечание

/var.

Примечание

Предупреждение

/home) или с другими операционными системами. С другой стороны, отформатировать можно любой раздел, который вы хотите «очистить» (удалить все данные).
Предупреждение
/boot/efi, в которую нужно смонтировать vfat раздел с загрузочными записями. Если такого раздела нет, то его надо создать вручную. При разбивке жёсткого диска в автоматическом режиме такой раздел создаёт сам установщик. Особенности разбиения диска в UEFI-режиме:
/boot/efi);
Примечание
Важно
Важно


Примечание

Примечание




Примечание
/boot/efi).
Важно
Важно


Примечание



Примечание



Предупреждение


/etc/fstab).

/root/.install-log, затем из неё удаляются все загрузочные записи. Это освобождает NVRAM и гарантирует, что система загрузится в новую ОС;
Примечание


Примечание


Примечание


Примечание

/home, то во время загрузки системы будет необходимо ввести пароль для этого раздела, иначе вы не сможете получить доступ в систему под своим именем пользователя.

#apt-get update#apt-get dist-upgrade#update-kernel#apt-get clean#reboot
Примечание
$ su -
или зарегистрировавшись в системе под именем root.
Важно
Важно

nomodeset — не использовать modeset-драйверы для видеокарты;
vga=normal — отключить графический экран загрузки установщика;
xdriver=vesa — явно использовать видеодрайвер vesa. Данным параметром можно явно указать нужный вариант драйвера;
acpi=off noapic — отключение ACPI (управление питанием), если система не поддерживает ACPI полностью.
apm=off acpi=off mce=off barrier=off vga=normal). В безопасном режиме отключаются все параметры ядра, которые могут вызвать проблемы при загрузке. В этом режиме установка будет произведена без поддержки APIC. Возможно, у вас какое-то новое или нестандартное оборудование, но может оказаться, что оно отлично настраивается со старыми драйверами.
[root@localhost /]#. Начиная с этого момента, система готова к вводу команд.
fixmbr без параметров. Программа попытается переустановить загрузчик в автоматическом режиме.

Важно
Примечание

/home, то для того, чтобы войти в систему под своим именем пользователя, вам потребуется ввести пароль этого раздела и затем нажать Enter.
Важно

Примечание
$ ssh user@192.168.0.160
https://ip-адрес:8080/.


Примечание

Важно

SRPMS *-debuginfo-*Шаблоны указываются по одному в строке. Символ «*» обозначает произвольную последовательность символов.
Примечание
Примечание
/srv/public/mirror. Чтобы использовать другой каталог, его необходимо примонтировать в /srv/public/mirror, добавив строку в файл /etc/fstab:
/media/disk/localrepo /srv/public/mirror none rw,bind,auto 0 0где
/media/disk/localrepo — каталог для хранения локального репозитория.

Примечание
/srv/public/mirror/<репозиторий>/branch/<архитектура>/base/ отсутствуют файлы pkglist.*, это означает, что зеркалирование ещё не завершено (не все файлы загружены на сервер обновлений).


/etc/apt/sources.list.d/*.list указан интернет-репозиторий:
$ apt-repo
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
# apt-repo rm all
# apt-repo add file:/srv/public/mirror/p11/branch
# apt-repo add file:/srv/public/mirror/additional
# apt-repo
rpm file:/srv/public mirror/additional/x86_64 classic
rpm file:/srv/public mirror/additional/noarch classic
rpm file:/srv/public/mirror p11/branch/x86_64 classic
rpm file:/srv/public/mirror p11/branch/noarch classic
Примечание
apt-repo add необходимо указать URL с обязательным указанием протокола и необязательным указанием архитектуры и одним или несколькими компонентами. Если при добавлении источника в конце строки отсутствуют архитектура и компонент, будут добавлены две строки (текущая архитектура системы и «noarch») с компонентом «classic».
/var/lib/rpm. В один момент времени к ней может обращаться только один процесс — остальные запросы блокируются.
rpm, а также файлы, каталоги и символические ссылки. Так называемые метапакеты не содержат файлов, а лишь описывают зависимости от других пакетов.
rpm:
Примечание
rpm можно получить командой:
$ rpm --help
yodl-docs-4.03.00-alt2.noarch.rpm).
-qip (Query|Install|Package):
$ rpm -qip package.rpm
где package.rpm — файл пакета.
$ rpm -qip yodl-docs-4.03.00-alt2.noarch.rpm
Name : yodl-docs
Epoch : 1
Version : 4.03.00
Release : alt2
DistTag : sisyphus+348019.100.1.1
Architecture: noarch
Install Date: (not installed)
Group : Documentation
Size : 3716344
License : GPL
Signature : RSA/SHA512, Пн 13 мая 2024 20:26:54, Key ID ff979dedda2773bb
Source RPM : yodl-4.03.00-alt2.src.rpm
Build Date : Пн 13 мая 2024 20:26:47
Build Host : iv-sisyphus.hasher.altlinux.org
Relocations : (not relocatable)
Packager : Aleksei Nikiforov <darktemplar@altlinux.org>
Vendor : ALT Linux Team
URL : https://gitlab.com/fbb-git/yodl
Summary : Documentation for Yodl
Description :
Yodl is a package that implements a pre-document language and tools to
process it. The idea of Yodl is that you write up a document in a
pre-language, then use the tools (eg. yodl2html) to convert it to some
final document language. Current converters are for HTML, ms, man, LaTeX
SGML and texinfo, plus a poor-man's text converter. Main document types
are "article", "report", "book" and "manpage". The Yodl document
language is designed to be easy to use and extensible.
This package contais documentation for Yodl.
Примечание
-p (Рackage) с файлом пакета, а не с базой данных RPM.
$ rpm -qi package
где package — установленный пакет.
$ rpm -qi bash
Name : bash
Version : 5.2.15
Release : alt1
DistTag : p11+348780.500.1.1
Architecture: noarch
Install Date: Пн 30 мар 2026 10:54:15
Group : Shells
Size : 0
License : None
Signature : RSA/SHA512, Пн 27 мая 2024 20:47:07, Key ID e1130f0e925e1ff4
Source RPM : bash-defaults-5.2.15-alt1.src.rpm
Build Date : Пн 27 мая 2024 20:47:05
Build Host : arseny-p11.hasher.altlinux.org
Relocations : (not relocatable)
Packager : Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
Vendor : ALT Linux Team
Summary : The GNU Bourne Again SHell (/bin/bash)
Description :
This package provides default setup for the GNU Bourne Again SHell (/bin/bash).
Примечание
-i (Install):
# rpm -i package.rpm
где package.rpm — файл пакета.
# rpm -i yodl-docs-4.03.00-alt2.noarch.rpm
-vh (Verbose|Hash):
-v — подробный вывод;
-h — отображение прогресса символами «#».
# rpm -ivh yodl-docs-4.03.00-alt2.noarch.rpm
Подготовка... ################################# [100%]
Обновление / установка...
1: yodl-docs-1:4.03.00-alt2 ################################# [100%]
Running /usr/lib/rpm/posttrans-filetriggers
-U (если пакет не установлен, он будет установлен):
$ rpm -Uvh yodl-docs-4.03.00-alt2.noarch.rpm
Подготовка... ############################################################ [100%]
пакет yodl-docs-1:4.03.00-alt2.noarch уже установлен
-qpl (Query|Package|List):
$ rpm -qpl package.rpm
где package.rpm — файл пакета.
$ rpm -qpl yodl-docs-4.03.00-alt2.noarch.rpm
/usr/share/doc/yodl
/usr/share/doc/yodl-doc
/usr/share/doc/yodl-doc/AUTHORS.txt
/usr/share/doc/yodl-doc/CHANGES
/usr/share/doc/yodl-doc/changelog
/usr/share/doc/yodl-doc/yodl.dvi
/usr/share/doc/yodl-doc/yodl.html
/usr/share/doc/yodl-doc/yodl.latex
/usr/share/doc/yodl-doc/yodl.pdf
/usr/share/doc/yodl-doc/yodl.ps
/usr/share/doc/yodl-doc/yodl.txt
/usr/share/doc/yodl-doc/yodl01.html
/usr/share/doc/yodl-doc/yodl02.html
/usr/share/doc/yodl-doc/yodl03.html
/usr/share/doc/yodl-doc/yodl04.html
/usr/share/doc/yodl-doc/yodl05.html
/usr/share/doc/yodl-doc/yodl06.html
/usr/share/doc/yodl/AUTHORS.txt
/usr/share/doc/yodl/CHANGES
$ rpm -ql package
Например:
$ rpm -qpl yodl-docs
$ rpm -q пакет
Например:
$ rpm -q yodl-docs
Вывод:
yodl-docs-4.03.00-alt2.noarchили:
пакет yodl-docs не установлен
$ rpm -qa
$ rpm -qa | grep yodl-docs
yodl-docs-4.03.00-alt2.noarch
$ rpm -qa -last
Пример вывода:
apt-repo-1.5.1-alt1.noarch Пн 06 апр 2026 17:46:25 altlinux-repos-additional-1.1-alt1.noarch Пн 06 апр 2026 17:46:25 alterator-users-10.31-alt1.x86_64 Пн 06 апр 2026 17:46:25 alterator-sslkey-0.2.6-alt1.noarch Пн 06 апр 2026 17:46:25 alterator-mirror-allowed-0.7.2-alt1.x86_64 Пн 06 апр 2026 17:46:25 …
less:
# rpm -qa -last | less
$ rpm -qf /путь/к/файлу
Например:
$ rpm -qf /usr/share/doc/yodl-docs
yodl-docs-4.03.00-alt2.noarch
$ rpm -q --requires пакет
Например:
$ rpm -q --requires yodl-docs
rpmlib(PayloadIsLzma)
$ rpm -q --whatrequires пакет
Пример:
$ rpm -q --whatrequires yodl-docs
ни один из пакетов не требует yodl-docs
$ rpm -q --whatprovides пакет
Пример:
$ rpm -q --whatprovides yodl-docs
yodl-docs-4.03.00-alt2.noarch
apt-get, которая автоматически определяет зависимости между пакетами и строго контролирует их соблюдение при выполнении операций установки, удаления или обновления пакетов.
/var/cache/apt/archives, а кеш индексов в — /var/lib/apt/lists. Конфигурация APT расположена в каталоге /etc/apt: основной конфигурационный файл — /etc/apt/apt.conf, а списки подключенных репозиториев — в /etc/apt/sources.list и /etc/apt/sources.list.d/*.
$ apt-config dump
Примечание
/etc/apt/sources.list, либо в любой файл с расширением *.list (например, mysources.list) в каталоге /etc/apt/sources.list.d. Формат записи:
rpm [подпись] метод: путь база название rpm-src [подпись] метод: путь база названиегде:
/etc/apt/vendor.list;
/etc/apt/sources.list.d/*.list обычно указывается интернет-репозиторий, соответствующий установленному дистрибутиву.
apt-get update.
sources.list присутствует репозиторий, содержимое которого может изменяться (как происходит с любым постоянно разрабатываемым репозиторием, в частности, обновлений по безопасности), то прежде чем работать с APT, необходимо синхронизировать локальную базу данных с удаленным сервером командой apt-get update. Локальная база данных создается заново каждый раз, когда в репозитории происходит изменение: добавление, удаление или переименование пакета.
apt-cdrom add, синхронизация выполняется однократно — в момент подключения.
/etc/apt/sources.list, указывающие на удалённые репозитории.
apt-repo:
$ apt-repo
$ apt-repo -a
# apt-repo add репозиторий
# apt-repo rm репозиторий
# apt-repo set репозиторий
# apt-repo clean
apt-get update):
# apt-repo update
$ man apt-repo
или
$ apt-repo --help
Примечание
apt-repo: удалить все источники и добавить стандартный репозиторий P11 (архитектура выбирается автоматически):
#Или то же самое одной командой:apt-repo rm all#apt-repo add p11
# apt-repo set p11
# apt-repo add "rpm http://git.altlinux.org/repo/414014/ x86_64 task"
# apt-repo add file:/srv/public/mirror/p11/branch
apt-cdrom.
Acquire::CDROM::mount в файле конфигурации APT (/etc/apt/apt.conf), по умолчанию это /media/ALTLinux:
# mkdir /media/ALTLinux
# mount /dev/sdXN /media/ALTLinux
где /dev/sdXN — соответствующее блочное устройство (например, /dev/dvd — для CD/DVD-диска).
# apt-cdrom -m add
sources.list появится запись о подключённом диске.
Примечание
mount /dev/носитель /media/ALTLinux необходимо выполнять перед каждой командой apt-get install имя_пакета.
/etc/apt/sources.list.d/.
Примечание
alt.list может содержаться такая информация:
# ftp.altlinux.org (ALT Linux, Moscow) # ALT Platform 11 #rpm [p11] ftp://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64 classic #rpm [p11] ftp://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64-i586 classic #rpm [p11] ftp://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/noarch 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 #rpm [p11] rsync://ftp.altlinux.org/ALTLinux p11/branch/x86_64 classic #rpm [p11] rsync://ftp.altlinux.org/ALTLinux p11/branch/x86_64-i586 classic #rpm [p11] rsync://ftp.altlinux.org/ALTLinux p11/branch/noarch classic
# apt-get update
или:
apt-repo update
apt-cache, которая позволяет искать не только по имени пакета, но и по его описанию.
apt-cache search позволяет найти все пакеты, в именах или описаниях которых присутствует указанная подстрока. Например:
$ apt-cache search ^stardict
stardict-wn - GCIDE - The Collaborative International Dictionary of English
stardict-mueller7 - V.K. Mueller English-Russian Dictionary, 7 Edition: stardict format
stardict-slovnyk_be-en - Dictionary: Slovnyk Belarusian-English
stardict-slovnyk_be-ru - Dictionary: Slovnyk Belarusian-Russian
stardict-slovnyk_be-uk - Dictionary: Slovnyk Belarusian-Ukrainian
stardict-slovnyk_cs-ru - Dictionary: Slovnyk Czech-Russian
stardict-slovnyk_en-be - Dictionary: Slovnyk English-Belarusian
stardict-slovnyk_en-ru - Dictionary: Slovnyk English-Russian
stardict-slovnyk_en-uk - Dictionary: Slovnyk English-Ukrainian
…
apt-cache show, которая выводит информацию о пакете из репозитория:
$ apt-cache show stardict-mueller7
Package: stardict-mueller7
Section: Text tools
Installed Size: 3094848
Maintainer: Anton V. Boyarshinov <boyarsh@altlinux.ru>
Version: 1.0-alt8@1338342590
Pre-Depends: rpmlib(PayloadIsLzma)
Depends: stardict (>= 2.4.2)
Provides: stardict-mueller7 (= 1.0-alt8)
Architecture: noarch
Size: 3134862
MD5Sum: 54f9e085c1fc67084253b3ba72a0c482
Filename: stardict-mueller7-1.0-alt8.noarch.rpm
Description: V.K. Mueller English-Russian Dictionary, 7th Edition, for stardict
Electronic version of V.K. Mueller English-Russian Dictionary,
7th Edition, in stardict format, for use with a stardict client.
apt-cache можно использовать русскую подстроку. В этом случае будут найдены пакеты, имеющие описание на русском языке.
Примечание
# apt-get install <имя_пакета>
Важно
# apt-get update
apt-get позволяет устанавливать в систему пакеты, которые требуют для работы другие, ещё не установленные пакеты. В этом случае она автоматически определяет необходимые зависимости и устанавливает их, используя все доступные репозитории.
apt-get install stardict-mueller7 приведет к следующему диалогу с APT:
# apt-get install stardict-mueller7
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Следующие дополнительные пакеты будут установлены:
icon-theme-hicolor libgtk+2 libgtk+2-locales stardict
Следующие НОВЫЕ пакеты будут установлены:
icon-theme-hicolor libgtk+2 libgtk+2-locales stardict stardict-mueller7
0 будет обновлено, 5 новых установлено, 0 пакетов будет удалено и 25 не будет обновлено.
Необходимо получить 9691kB архивов.
После распаковки потребуется дополнительно 36,2MB дискового пространства.
Продолжить? [Y/n] y
Получено: 1 https://ftp.altlinux.org p11/branch/noarch/classic icon-theme-hicolor 0.18-alt1:p11+349758.500.2.1@1717139306 [33,2kB]
Получено: 2 https://ftp.altlinux.org p11/branch/noarch/classic libgtk+2-locales 2.24.33-alt2:p11+363895.5700.2.1@1733170978 [2569kB]
Получено: 3 https://ftp.altlinux.org p11/branch/x86_64/classic libgtk+2 2.24.33-alt2:p11+363895.5700.2.1@1733170978 [1975kB]
Получено: 4 https://ftp.altlinux.org p11/branch/x86_64/classic stardict 3.0.6-alt2:p11+403210.100.1.1@1766080058 [1979kB]
Получено: 5 https://ftp.altlinux.org p11/branch/noarch/classic stardict-mueller7 1.0-alt8@1338342590 [3135kB]
Получено 9691kB за 0s (17,4MB/s).
Совершаем изменения...
Подготовка... ################################# [100%]
Обновление / установка...
1: libgtk+2-locales-2.24.33-alt2 ################################# [ 20%]
2: icon-theme-hicolor-0.18-alt1 ################################# [ 40%]
3: libgtk+2-2.24.33-alt2 ################################# [ 60%]
4: stardict-3.0.6-alt2 ################################# [ 80%]
5: stardict-mueller7-1.0-alt8 ################################# [100%]
Завершено.
apt-get install имя_пакета также используется для обновления уже установленного пакета или группы пакетов. В этом случае apt-get дополнительно проверяет, не появилась ли более новая версия пакета в репозитории.
apt-get install stardict-mueller7 будет таким:
# apt-get install stardict-mueller7
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Последняя версия stardict-mueller7 уже установлена.
0 будет обновлено, 0 новых установлено, 0 пакетов будет удалено и 25 не будет обновлено.
# apt-get install /путь/к/файлу.rpm
При этом APT выполнит стандартную проверку зависимостей и конфликтов с уже установленными пакетами.
apt-get откажется выполнять операции установки, удаления или обновления. В этом случае необходимо повторить операцию с опцией -f, которая заставляет apt-get исправить зависимости, удалить или заменить конфликтующие пакеты.
apt-get, так как любые действия требуют подтверждения пользователя.
apt-get: имя-пакета installed
Примечание
# apt-get remove <имя_пакета>
Чтобы не нарушать целостность системы, будут удалены также все пакеты, зависящие от удаляемого.
apt-get потребует дополнительного подтверждения операции, чтобы предотвратить возможную ошибку. Пример предупреждения:
# apt-get remove filesystem
Обработка файловых зависимостей... Завершено
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Следующие пакеты будут УДАЛЕНЫ:
…
ВНИМАНИЕ: Будут удалены важные для работы системы пакеты
Обычно этого делать не следует. Вы должны точно понимать возможные последствия!
…
0 будет обновлено, 0 новых установлено, 853 пакетов будет удалено и 4 не будет обновлено.
Необходимо получить 0B архивов.
После распаковки будет освобождено 2211MB дискового пространства.
Вы делаете нечто потенциально опасное!
Введите фразу 'Yes, do as I say!' чтобы продолжить..
Каждую ситуацию, в которой APT выдаёт подобное сообщение, необходимо анализировать отдельно. Вероятность того, что система станет неработоспособной, в таких случаях очень высока.
#apt-get#updateapt-getdist-upgrade
apt-get update) обновит индексы пакетов. Вторая команда (apt-get dist-upgrade) позволяет обновить только те установленные пакеты, для которых в репозиториях, перечисленных в /etc/apt/sources.list, имеются новые версии.
apt-get, которым APT предварит само обновление.
Примечание
apt-get dist-upgrade не обновляет ядро ОС.
apt.conf), поскольку обновление такого критичного компонента системы может привести к нежелательным последствиям. Вместо этого в систему могут быть поставлены пакеты нескольких ядер и модулей к разным ядрам одновременно.
# update-kernel
Примечание
# apt-get update
update-kernel обновляет также модули ядра, если они были изменены.
# remove-old-kernels
.src.rpm). Такой пакет содержит архив (один или несколько) с исходным кодом, spec-файл и, возможно, различные патчи и дополнения. Пакет src.rpm используется только для сборки двоичных пакетов, но не для установки. Сборка осуществляется командой:
$ rpmbuild --rebuild package.src.rpm
<архитектура>.rpm). Такие пакеты можно устанавливать командой:
# rpm -Uvh package.rpm
rpmbuild возникают очевидные сложности:
.src.rpm из файлов, расположенных в разных каталогах (по умолчанию это подкаталоги SOURCE, SPECS и каталоги сборки в ~/RPM);
BuildRequires в spec-файле). Если какой-либо пакет не указан в spec-файле, сборка завершится ошибкой. Это обеспечивает воспроизводимость и чистоту сборки. Обратной стороной является необходимость доступа к репозиторию, так как пакеты устанавливаются при каждой сборке;
.src.rpm. В этом случае все файлы хранятся в распакованном виде и упаковываются в .src.rpm по правилам, определённым в .gear/rules. Это позволяет напрямую работать с содержимым, быстро создавать патчи, вести историю изменений и эффективно взаимодействовать в рамках командной разработки.
rpmbuild использует для сборки RPM-пакета. Он определяет все действия, выполняемые при сборке, а также операции, необходимые при установке и удалении пакета. Каждый .src.rpm-пакет содержит spec-файл.
имя_пакета.spec.
Name: sampleprog Version: 1.0 Release: alt1 Summary: Sample program specfile Summary(ru_RU.UTF-8): Пример spec-файла для программы License: GPLv2+ Group: Development/Other Url: http://www.altlinux.org/SampleSpecs/program Packager: Sample Packager <sample@altlinux.org> Source: %name-%version.tar Patch0: %name-1.0-alt-makefile-fixes.patch %description This specfile is provided as sample specfile for packages with programs. It contains most of usual tags and constructions used in such specfiles. %description -l ru_RU.UTF-8 Этот spec-файл является примером spec-файла для пакета с программой. Он содержит основные теги и конструкции, используемые в подобных spec-файлах. %prep %setup %patch0 -p1 %build %configure %make_build %install %makeinstall_std %find_lang %name %files -f %name.lang %doc AUTHORS ChangeLog NEWS README THANKS TODO contrib/ manual/ %_bindir/* %_man1dir/* %changelog * Sat Sep 12 3001 Sample Packager <sample@altlinux.org> 1.0-alt1 - initial build
Таблица 6.1. Директивы преамбулы spec-файла
|
SPEC-директива
|
Определение
|
|---|---|
Name
|
Базовое имя пакета (должно совпадать с именем spec-файла)
|
Version
|
Версия upstream-кода
|
Release
|
Релиз пакета используется для указания номера сборки при данной версии upstream-кода.
Для пакетов Sisyphus поле Release должно иметь вид:
|
Epoch
|
Используется, если необходимо уменьшить версию или релиз пакета по сравнению с имеющимся в репозитории. В этом случае значение Epoch увеличивается на единицу относительно предыдущего (отсутствие поля эквивалентно значению 0), а версия и релиз устанавливаются в требуемые значени
Epoch не входит в имя RPM-файла, поэтому следует избегать пакетов с одинаковыми Version и Release, но разными Epoch.
|
Summary
|
Краткое однострочное описание пакета. Должно начинаться с заглавной буквы и не заканчиваться точкой
|
License
|
Лицензия программного обеспечения. Должна указываться в точности так, как сформулировано в upstream-пакете.
При указании лицензии рекомендуется пользоваться макросами из пакета rpm-build-licenses, добавив его в список
BuildRequires.
Текст лицензии включается в пакет только если он отсутствует в
/usr/share/license (пакет common-licenses). В противном случае достаточно указать название лицензии
|
Group
|
Категория пакета. Должна соответствовать списку групп RPM (файл
/usr/lib/rpm/GROUPS из пакета rpm)
|
URL
|
Полный URL-адрес для получения дополнительной информации о программе.
Рекомендуется указывать действующий URL домашней страницы проекта или другой источник исходного кода.
Для директивы URL можно использовать утилиту
rpmurl. Например, проверка доступности URL:
$
|
Source0
|
Путь или URL к архиву исходного кода (без учёта патчей). Должен указывать на надёжный внешний источник (например, upstream), а не на локальное хранилище.
Дополнительные источники задаются как
Source1, Source2 и т. д.
|
Patch0
|
Название первого патча, применяемого к исходному коду. Дополнительные патчи задаются как
Patch1, Patch2 и т. д.
|
BuildArch
|
Явное указание архитектуры, под которую собирается двоичный пакет. Если не задано, используется архитектура системы сборки (например, x86_64).
Для архитектурно-независимых пакетов указывается noarch.
|
BuildRequires, BuildPreReq, BuildRequires(pre)
|
Список пакетов, необходимых для сборки (разделяется запятыми или пробелами). Может быть несколько записей
BuildRequires, каждая в отдельной строке.
BuildRequires обычно формируется автоматически (например, с помощью buildreq). Дополнительные зависимости рекомендуется указывать в BuildPreReq
|
Requires, PreReq
|
Список пакетов, необходимых для работы программы после установки (разделяется запятыми или пробелами). Может быть несколько записей
Requires, каждая в отдельной строке.
|
ExcludeArch
|
Исключает архитектуры, на которых пакет не может быть собран или работать
|
Conflicts
|
Список пакетов, конфликтующих с данным. Используется при наличии файловых, RPC- или логических конфликтов
|
Provides
|
Указывает, какую функциональность предоставляет пакет (например, альтернативное или устаревшее имя). Следует применять только в случае реальной необходимости и, как правило, в форме
Provides: something = %version-%release
При переименовании пакета используется совместно с
Obsoletes
|
Obsoletes
|
Перечисляет устаревшие пакеты/версии. Обычно применяется при переименовании и используется вместе с
Provides
|
Name, Version и Release формируют имя RPM-пакета. Их часто называют N-V-R или NVR, поскольку имя пакета имеет формат: NAME-VERSION-RELEASE.
rpm для конкретного пакета:
$ rpm -q rpmspec
rpmspec-4.13.0.1-alt40.x86_64
Здесь:
%check, являются обязательными.
Таблица 6.2. Директивы основной части spec-файла
|
SPEC-директива
|
Определение
|
|---|---|
%description
|
Полное описание программного обеспечения, входящего в состав RPM-пакета. Описание может занимать несколько строк и разбиваться на абзацы. Длина каждой строки не должна превышать 72 символа.
Данное описание используется при поиске пакета через
apt-cache search и полностью выводится при просмотре информации о пакете с помощью apt-cache show имя_пакета
|
%prep
|
Команда или последовательность команд для подготовки исходного кода к сборке (например, распаковка архива, указанного в Source0). Может содержать сценарий оболочки (shell скрипт).
|
%build
|
Команда или последовательность команд для последовательность сборки программного обеспечения в машинный код (для компилируемых языков) или байт-код (для некоторых интерпретируемых языков)
|
%install
|
Команды установки/копирования файлов из каталога сборки в псевдокорневой каталог. Этот раздел эмулирует установку файлов в конечную систему. Здесь происходит копирование артефактов сборки из
%builddir (каталога сборки) в %buildroot (каталог, содержащий структуру файлов будущего пакета)
|
%check
|
Команда или последовательность команд для тестирования программного обеспечения. Обычно включает запуск модульных тестов
|
%files
|
Список файлов, которые будут установлены в системе конечного пользователя
|
%changelog
|
Журнал изменений пакета между версиями и релизами
|
%prep, %build и %install (разделение на разные двоичные RPM происходит в блоках %files).
$ apt-cache search rpm | grep '^rpm-[bm]' | sort -n
rpm-build-apache2 - Набор утилит для автоматической Web серверов и приложений
rpm-build-browser-plugins - Netscape Gecko Plug-in API common packaging files
rpm-build-compat - ALT Linux compatibility macros for backport purposes
rpm-build-dmd - RPM build environment to build D lang(dmd) packages
rpm-build-emacs - Helper scripts and RPM macros to build GNU Emacs extensions
rpm-build-erlang - RPM helper scripts to calculate Erlang dependencies
rpm-build-extra-targets - Build packages for other platforms
rpm-build-fedora-compat-fonts - Build-stage rpm automation for fonts packages
rpm-build-file - Утилита для определения типов файлов
rpm-build-firefox - RPM helper macros to rebuild firefox packages
rpm-build-fonts - RPM helper scripts for building font packages
…
BuildRequires(pre): имя-пакета-с-макросамиНапример:
BuildRequires(pre): rpm-build-java
/usr/lib/rpm/macros.d/.
$ rpm --showrc
$ rpm --eval <имя_макроса>
Например:
$ rpm --eval %_sysconfdir
/etc
Name и Version транслируются в соответствующие макросы), то директива задания пути к файлу может выглядеть следующим образом:
Source0: %{name}-%{version}.tar.gz
Примечание
Таблица 6.3. Макросы путей системных каталогов
|
Макрос
|
Описание
|
|---|---|
|
%homedir
|
Домашний каталог пользователя, вызывающего этот макрос
|
|
%_licensedir
|
Каталог лицензий (
/usr/share/license)
|
|
%_controldir
|
Каталог control (
/etc/control.d/facilities)
|
|
%_defaultdocdir
|
Каталог документации (
/usr/share/doc)
|
|
%_defattr
|
Атрибуты файлов и каталогов по умолчанию для каждой секции %files и для каждого файла, включаемого в таких секциях (-,root,root,755)
|
|
%_man1dir, %_man2dir, %_man3dir, %_man4dir, %_man5dir, %_man6dir, %_man7dir, %_man8dir, %_man9dir
|
Каталог man-файлов (
/usr/share/man/manX)
|
|
%java_dir, %_javadir
|
Каталог для некоторых jar-файлов (
/usr/share/java)
|
|
%_rpmmacrosdir
|
Каталог для установки сторонних макросов (
/usr/lib/rpm/macros.d)
|
%setup — используется в блоке %prep. Этот макрос распаковывает архив с исходным кодом (ключ -q подавляет подробный вывод при распаковке архива). По умолчанию распаковывается первый архив с исходным кодом (Source0); для остальных необходимо дополнительный параметр -a X, где X — номер Source.
%prep %setup -a1 -a100 -a101 -a102 -a103 -a104 -a105 %patch1 -p1
%setup использует ключ -q по умолчанию. Записи %setup и %setup -q эквивалентны. Для включения подробного вывода следует использовать ключ -v.
%patch[X] — используется в блоке %prep и применяет указанный патч (X — номер патча, такой же, как и при их описании в преамбуле, если патчей несколько). Патчи применяются относительно текущего каталога сборки. При необходимости можно обрезать часть пути с помощью ключа –p (как и у самой утилиты patch). Например:
%patch3 -p1
%autopatch позволяет применить все патчи, описанные в основной секции spec-файла, в порядке возрастания их номеров. Макрос поддерживает ключи -p и -F, аналогичные таким же опциям директивы %patch.
%configure — используется в блоке %build и используется для упрощения запуска ./configure с параметрами, соответствующими текущей платформе. В большинстве случаев достаточно вызвать %configure без параметров.
%build %configure %make_build
configure (например, при сборке из git), но есть configure.ac, перед вызовом %configure следует выполнить макрос %autoreconf.
%make_build — используется в блоке %build для запуска make с поддержкой параллельной сборки.
%makeinstall_std — применяется в блоке %install и рекомендуется вместо %make_install с ключами install и DESTDIR=%buildroot:
%make_install DESTDIR=%buildroot install
%make_install — применяется в блоке %install. Используется для упрощения установки ПО. Вызывает make install с указанием каталога для установки (DESTDIR=%buildroot) и рядом других ключей:
%make_install DESTDIR=%buildroot installили
%make_install DESTDIR=%buildroot %_make_install_target
%makeinstall — применяется в блоке %install. Это редко используемый макрос, предназначенный для случаев, когда Makefile не поддерживает DESTDIR.
%dir — используется в блоке %files и указывает, что путь является каталогом, который должен принадлежать этому RPM. Это указание важно для того, чтобы RPM точно знал, какие каталоги нужно очистить при удалении пакета.
%doc — используется в блоке %files для создания каталога документации (%_defaultdocdir/%name-%version) и копирования в него указанных файлов. Пути к файлам строятся относительно каталога сборки проекта, например:
%doc Examples
sed и git) можно было собирать пакеты из произвольно устроенного git-репозитория, по аналогии с hasher, который был задуман как средство для сборки пакетов из произвольных SRPM-пакетов.
fetch и push, если репозиториев, которые надо обработать, много. Впрочем, выполнение fetch/push в цикле решает эту проблему.
gzip, bzip2 и т.п.), рекомендуется хранить в git-репозитории в несжатом виде.
git diff;
tar, cpio, zip и т.п.), рекомендуется хранить в git-репозитории в распакованном виде.
gear-commit (обёртка к git commit, специально предназначенная для этих целей) и gear-srpmimport. Такой подход позволяет видеть изменения в очередном релизе пакета, не открывая в spec-файл.
.gear/rules) состоит из строк формата:
директива: параметрыПараметры разделяются пробелами.
-t утилиты gear), так и любой из его предков при соблюдении условий, гарантирующих однозначное вычисление полного имени коммита-предка по целевому коммиту.
tar: .Все дерево исходного кода экспортируется в один tar-архив. Если у проекта есть upstream, публикующий tar-архивы, то добавление релиза в имя tar-архива, например, с помощью следующего правила позволяет избежать коллизий:
tar: . name=@name@-@version@-@release@
tar: package_name copy: *.patchТакое устройство репозитория получается при использовании утилиты
gear-srpmimport, предназначенной для быстрой миграции от srpm-файла к gear-репозиторию.
$ rpm -qpl foobar-1.0-alt1.src.rpm
foobar-1-fix.patch
foobar-2-fix.patch
foobar.icon.png
foobar-1.0.tar.bz2
foobar-plugins.tar.gz
$mkdir foobar$cd foobar
$ git init
Initialized empty Git repository in .git/
$ ls -dlog .*
drwxr-xr-x 4 4096 Aug 12 34:56 .
drwxr-xr-x 6 4096 Aug 12 34:56 ..
drwxr-xr-x 8 4096 Aug 12 34:56 .git
gear-srpmimport:
$ gear-srpmimport foobar-1.0-alt1.src.rpm
Committing initial tree deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
gear-srpmimport: Imported foobar-1.0-alt1.src.rpm
gear-srpmimport: Created master branch
$ ls -Alog
drwxr-xr-x 1 4096 Aug 12 34:56 .gear
drwxr-xr-x 1 4096 Aug 12 34:56 .git
-rw-r--r-- 1 6637 Aug 12 34:56 foobar.spec
drwxr-xr-x 3 4096 Aug 12 34:56 foobar
drwxr-xr-x 3 4096 Aug 12 34:56 foobar-plugins
-rw-r--r-- 1 791 Aug 12 34:56 foobar-1-fix.patch
-rw-r--r-- 1 3115 Aug 12 34:56 foobar-2-fix.patch
-rw-r--r-- 1 842 Aug 12 34:56 foobar.icon.png
при необходимости в файл правил можно вносить изменения. Например, можно убрать сжатие исходников (соответствующие изменения следует вносить и в .gear/rules).
.gear/rules.
gear-hsh:
$ gear-hsh
Packager в spec-файле, следует отключить соответствующую проверку:
$ gear-hsh --no-sisyphus-check=gpg,packager
rpmbuild(8) осуществляется командой gear-rpm:
$ gear-rpm -ba
gear-commit, которая помогает сформировать список изменений на основе записи в spec-файле:
$ gear-commit -a
~/.gitconfig:
$git config --global user.name 'Your Name'$git config --global user.email '<login>@altlinux.org'
.git/config этого git-репозитория:
$git config user.name 'Your Name'$git config user.email '<login>@altlinux.org'
buildreq;
$ man hsh
# hasher-useradd <имя_пользователя>
hasher-useradd изменяет список групп, в которых состоит пользователь, пользователю перед началом работы с hasher необходимо перелогиниться.
$ mkdir ~/.hasher
~/.hasher) должен быть доступен на запись пользователю, запускающему сборку. Кроме того, его нельзя располагать на файловой системе, смонтированной с опциями noexec или nodev — в таких условиях hasher не сможет создать корректное сборочное окружение.
$ hsh --initroot-only ~/.hasher
$ hsh --apt-config=.hasher/p11-apt.conf --initroot-only ~/.hasher
p11-apt.conf) необходимо указать расположение файла с APT-источниками, например:
Dir::Etc::SourceList "/home/user/.hasher/sources_p11.list";
/etc/apt/sources.list.d/*.list:
Dir::Etc::SourceParts "/var/empty";
--apt-config) используется общесистемная конфигурация репозиториев из /etc/apt/. Чтобы не указывать каждый раз ключ --apt config, можно задать его в файле конфигурации ~/.hasher/config, например:
apt_config=/home/user/.hasher/p11-apt.conf
~/.hasher/p11-apt.conf:
Dir::Etc::SourceList "/home/user/.hasher/sources_p11.list"; Dir::Etc::SourceParts "/var/empty";Пример файла
~/.hasher/sources_p11.list с локальным репозиторием:
rpm file:/srv/public/mirror p11/branch/x86_64 classic rpm file:/srv/public/mirror p11/branch/ x86_64-i586 classic rpm file:/srv/public/mirror p11/branch/noarch classic
hasher-useradd:
$ hsh ~/.hasher path/to/package-0.0-alt0.src.rpm
~/.hasher/repo/<платформа>/RPMS.hasher/. В противном случае в стандартный вывод (stdout) будет выведена информация об ошибках сборки.
-v.
sources.list. Он также будет использоваться при последующих сборках пакетов (это поведение можно регулировать ключом --without-stuff).
~/.hasher/repo, вероятно, не переживет перезагрузку системы. Репозиторий можно переместить в постоянное место, указав в файле конфигурации hasher (~/.hasher/config) параметр:
def_repo=постоянное_хранилищеили запустив hasher с ключом
--repo.
--nodeps:
$ rpm -bs --nodeps package.spec
Примечание
/proc). Hasher поддерживает монтирование дополнительных файловых систем в сборочную среду.
/etc/hasher-priv/fstab либо является одной из предопределенных: /proc, /dev/pts, /sys;
allowed_mountpoints в конфигурации hasher-priv (/etc/hasher-priv/system);
--mountpoints либо указана в параметре known_mountpoints конфигурационного файла hasher (~/.hasher/config);
BuildReq: /proc) собираемого пакета — прямо или косвенно (через зависимости сборочных зависимостей пакета).
/proc необходимо:
/etc/hasher-priv/system добавить строку:
allowed_mountpoints=/proc
~/.hasher/config добавить строку (либо указывать опцию --mountpoints=/proc при сборке пакета):
known_mountpoints=/proc
BuildRequires: /proc
hsh, указывает на конкретное сборочное окружение, в котором необходимо выполнять сборку:
$hsh --apt-conf=.hasher-p11/apt.conf.p11 ~/.hasher-p11 package 0.0 alt0.src.rpm… $hsh --apt-conf=.hasher-test/apt.conf.test ~/.hasher-test package 1.0 alt0.src.rpm…
~/hasher.
/tmp:
$mkdir -p /tmp/.private/$USER/hasher$hsh --repo=$HOME/hasher-repo /tmp/.private/$USER/hasher package 0.0 alt0.src.rpm
/tmp/.private/$USER/hasher необходимо создавать после каждой перезагрузки (это можно автоматизировать в файле ~/.hasher/config, поскольку он является shell-скриптом).
--repo нужно указывать при каждой сборке (либо задать в .hasher/config параметр def_repo=постоянное_хранилище).
sisyphus_check с полным набором тестов. Она проверяет не только технические требования репозитория Sisyphus, но и организационные аспекты: сборочный хост, подпись PGP-ключом члена ALT Linux Team и т. д. Поэтому при сборке пакета вне репозитория Sisyphus может потребоваться отключение части проверок.
--no-sisyphus-check[=LIST] или соответствующая опция no_sisyphus_check в конфигурационном файле.
sisyphus_check:
$ hsh --no-sisyphus-check ~/.hasher package 0.0 alt0.src.rpm
С аргументом (списком тестов) отключаются только указанные проверки:
$ hsh --no-sisyphus-check=packager,gpg ~/.hasher package 0.0 alt0.src.rpm
Список доступных тестов можно посмотреть в справке:
$ sisyphus_check --help
…
Valid options are:
…
--[no-]check-buildhost
--[no-]check-buildtime
--[no-]check-changelog
…
--no-sisyphus-check-in и --no-sisyphus-check-out, описание которых приведено в man-странице hsh(1).
hsh-shell(1):
$ hsh-shell ~/.hasher
$ hsh-shell --rooter
hasher-priv.
hasher-priv.conf(5).
hsh-shell (предварительно установив текстовый редактор, shell и прочие инструменты разработчика):
$hsh-install ~/.hasher vim-console less rpm-utils patchutils zsh$mkdir -p ~/.hasher/chroot/.in/src$cp -a .vim* .zprofile .zsh_aliases .zshenv .zsh_bind .zshrc .dircolors ~/.hasher/chroot/.in/src$hsh-run -- cp -r /.in/src /usr$hsh-shell --shell=/bin/zsh
~/hasher/chroot/.in, в которой пользователь может записывать файлы.
hsh-install (выйдя из chroot).
hsh можно использовать hsh-rebuild — программу, работающую с уже сформированным сборочным окружением.
$ gear --hasher -- hsh --lazy-cleanup
$ gear --hasher -- hsh-rebuild
Примечание
buildreq и забрать spec-файл:
$hsh-install rpm-utils$echo buildreq '/usr/src/RPM/SPECS/*.spec' | hsh-shell$cp ~/hasher/chroot/usr/src/RPM/SPECS/*.spec .
.timer — юнит systemd, который при истечении заданного времени вызывает скрипт .py, выводящий уведомление о дате и времени. После срабатывания таймер снова начинает отсчет времени до запуска скрипта;
.service — содержит описание, расположение скрипта .py и интерпретатора, который будет его обрабатывать.
git clone:
$ git clone https://github.com/danila-Skachedubov/DBusTimer_example.git
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 9 (delta 1), reused 8 (delta 1), pack-reused 0
Receiving objects: 100% (9/9), done.
Resolving deltas: 100% (1/1), done
DBusTimer_Example.
DBusTimer_Example и создайте в нем каталог .gear:
$cd DBusTimer_example$mkdir .gear
.gear создайте два файла: файл правил для gear — rules и spec-файл — dbustimer.spec:
$ touch .gear/rules .gear/dbustimer.spec
$ ls -a1
.
..
.gear
.git
script_dbus.py
script_dbus.service
script_dbus.timer
.gear/rules следующим содержимым:
tar: . spec: .gear/dbustimer.specПервая строка указывает, что проект будет упакован в .tar архив. Вторая строка задаёт путь к spec-файлу.
Name, Version, Release, Summary, License, Group, BuildArch, BuildRequires, Source0.
Name: dbustimer Version: 0.4 Release: alt1 Summary: Display system time License: GPLv3+ Group: Other BuildArch: noarch BuildRequires: rpm-build-python3
Name-Version-Release, содержит имя пакета, его версию и релиз сборки. Поле Summary содержит краткое описание пакета. License — лицензия, под которой распространяется ПО (в данном случае — GPLv3+). Group — категория пакета. Так как это тестовый пакет, можно указать группу «Other». BuildRequires — пакеты, необходимые для сборки. Поскольку исходный код написан на Python 3, требуется пакет rpm-build-python3, который содержит макросы для сборки скриптов Python. Source0 — путь к архиву с исходниками (%name-%version.tar).
%description приводится краткое описание программы.
%prep отвечает за подготовку к сборке. Макрос %setup распаковывает исходный код перед компиляцией. Пример заполнения полей %description и %prep:
%description This program displays notifications about the system time with a frequency of one hour. %prep %setup -q
%install указываются пути установки файлов. Чтобы не указывать пути установки файлов вручную, можно использовать предопределенные макросы. Например, %python3_sitelibdir_noarch раскрывается в путь /usr/lib/python3/site-packages. По этому пути будет создан каталог с именем пакета, в который будет помещен файл script_dbus.py с правами доступа 755. Аналогичная операция будет проведена с файлами script_dbus.timer и script_dbus.service. Они должны быть скопированы в каталог /etc/xdg/systemd/user. Так как макроса, раскрывающегося в данный каталог нет, можно использовать макрос %_sysconfdir, который раскрывается в путь /etc. Пример заполнения секции %install:
%install
mkdir -p \
%buildroot%python3_sitelibdir_noarch/%name/
install -Dm0755 script_dbus.py \
%buildroot%python3_sitelibdir_noarch/%name/
mkdir -p \
%buildroot%_sysconfdir/xdg/systemd/user/
cp script_dbus.timer script_dbus.service \
%buildroot%_sysconfdir/xdg/systemd/user/
mkdir -p \ %buildroot%python3_sitelibdir_noarch/%name/ создает каталог dbustimer в окружении buildroot по пути /usr/lib/python3/site-packages.
script_dbus.py копируется с правами 755 в каталог /usr/lib/python3/site-packages/dbustimer/ в окружении buildroot.
%buildroot%_sysconfdir/xdg/systemd/user/, в который копируются файлы .service и .timer.
%files описывается, какие файлы и каталоги с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет, а затем будут копироваться в целевую систему при установке этого пакета. Все три файла из пакета будут распакованы по путям, описанным в секции %install. Пример заполнения секции %files:
%files %python3_sitelibdir_noarch/%name/script_dbus.py /etc/xdg/systemd/user/script_dbus.service /etc/xdg/systemd/user/script_dbus.timer
%changelog фиксируются изменения:
%changelog * Thu Apr 13 2023 Danila Skachedubov <dan@altlinux.org> 0.4-alt1 - Update system - Changed access rights
Name: dbustimer
Version: 0.4
Release: alt1
Summary: Display system time
License: GPLv3+
Group: Other
BuildArch: noarch
BuildRequires: rpm-build-python3
Source0: %name-%version.tar
%description
This program displays notifications about the system time with a frequency of one hour.
%prep
%setup
%install
mkdir -p \
%buildroot%python3_sitelibdir_noarch/%name/
install -Dm0755 script_dbus.py \
%buildroot%python3_sitelibdir_noarch/%name/
mkdir -p \
%buildroot%_sysconfdir/xdg/systemd/user/
cp script_dbus.timer script_dbus.service \
%buildroot%_sysconfdir/xdg/systemd/user/
%files
%python3_sitelibdir_noarch/%name/script_dbus.py
/etc/xdg/systemd/user/script_dbus.service
/etc/xdg/systemd/user/script_dbus.timer
%changelog
* Thu Apr 13 2023 Danila Skachedubov <dan@altlinux.org> 0.4-alt1
- Update system
- Changed access rights
$ git add .gear/rules .gear/dbustimer.spec
$ gear-hsh ~/.hasher --no-sisyphus-check --commit –v
Примечание
~/.hasher/repo/x86_64/RPMS.hasher/.
.gear — каталог с правилами gear и spec-файлом;
Makefile — набор инструкций для программы make, которая собирает данный проект;
notify.cpp — исходный код программы;
notify.service — юнит данной программы для systemd;
notify.timer — юнит systemd, запускающий вывод уведомления о дате и времени с периодичностью один час.
.gear находятся два файла:
rules — правила для упаковки архива для gear;
notify.spec — файл спецификации для сборки пакета.
rules:
tar: . spec: .gear/notify.specПервая строка — указания для gear, в каком формате упаковать файлы для последующей сборки. В данном проекте архив будет иметь вид name-version.tar. Вторая строка — путь к spec-файлу с инструкциями по сборке текущего пакета.
notify.spec:
Name: notify
Version: 0.1
Release: alt1
Summary: Display system time every hour
License: GPLv3+
Group: Other
BuildRequires: make
BuildRequires: gcc-c++
BuildRequires: libsystemd-devel
Source0: %name-%version.tar
%description
This test program displays system date and time every hour via notification
%prep
%setup -q
%build
%make_build
%install
mkdir -p \
%buildroot/bin/
install -Dm0644 %name %buildroot/bin/
mkdir -p \
%buildroot%_sysconfdir/xdg/systemd/user/
cp %name.timer %name.service \
%buildroot%_sysconfdir/xdg/systemd/user/
%files
/bin/%name
/etc/xdg/systemd/user/%name.service
/etc/xdg/systemd/user/%name.timer
%changelog
* Thu Apr 13 2023 Sergey Okunkov <sok@altlinux.org> 0.1-alt1
- Finished my task
Name, Version, Release — стандартная схема Name-Version-Release, содержащая имя пакета, его версию и релиз сборки;
Summary — краткое описание пакета;
License — лицензия, под которой распространяется данное ПО (в данном случае — GPLv3+);
Group — категория, к которой относится пакет (в примере указана группа «Other»);
BuildRequires — пакеты, необходимые для сборки. Поскольку исходный код написан на C++, требуется компилятор g++, система сборки make и библиотека для работы с systemd — libsystemd-devel;
Source0 — путь к архиву с исходниками (%name-%version.tar).
%description содержит описание программы. В данном примере — вывод системного уведомления с датой и временем;
%prep отвечает за подготовку программы к сборке. Макрос %setup с флагом –q распаковывает архив, указанный в секции Source0;
%build описывает сборку исходного кода. Поскольку в проекте используется Makefile для автоматизации процесса сборки, применяется макрос %make_build, использующий Makefile для сборки программы;
%install определяет пути установки файлов. Так как файлов три, для каждого задаётся путь:
notify — скомпилированный бинарный файл. В Unix-подобных системах такие файлы обычно располагаются в каталоге /bin. Команда mkdir -p %buildroot/bin создаёт каталог bin в окружении buildroot. Команда install -Dm0644 %name %buildroot/bin/ устанавливает файл notify в каталог %buildroot/bin/ с правами 644;
%name.timer, %name.service — пользовательские юниты systemd. Они размещаются в каталоге /etc/xdg/systemd/user/. В окружении buildroot создается каталог:
mkdir –p %buildroot%_sysconfdir/xdg/systemd/user/
Здесь используется макрос %_sysconfdir, который раскрывается в /etc. Команда:
cp %name.timer %name.service %buildroot%_sysconfdir/xdg/systemd/user/
копирует файлы в указанный каталог;
%files — описывает файлы и каталоги, которые будут скопированы в систему при установке пакета.
mkimage, которая использует для сборки «профиль», представляющим собой набор файлов Makefile. В результате из пакетов репозитория создается установочный диск CD/DVD. Целостность репозитория и его непротиворечивость позволяют с легкостью генерировать новые образы при необходимости.
Примечание
/proc к нему (см. Настройка Hasher);
/tmp или /home/USER/hasher;
/etc/hasher-priv/system;
~/.gitconfig.
conf.d/*.mk;
sub.in/;
features.in/*/config.mk;
bin/pkgdups.);
conf.d/README.
~/out/ (если возможно);
$(BUILDDIR)/out/;
profiles.mk.sample). Переменные могут быть заданы как в команде сборки (в качестве аргументов), так и в файле настроек $HOME/.mkimage/profiles.mk. Список переменных приведен в Переменные, принимаемые при сборке.
Таблица 10.1. Переменные, принимаемые при сборке
|
Переменная
|
Описание
|
Значение
|
|---|---|---|
|
APTCONF
|
Задаёт путь к apt.conf
|
Пусто (по умолчанию системный) либо строка
|
|
ARCH
|
Задаёт целевую архитектуру образов
|
Пусто (по умолчанию авто) либо строка
|
|
ARCHES
|
Задаёт набор целевых архитектур при параметрическом задании APTCONF
|
Пусто (по умолчанию авто) либо список через пробел
|
|
AUTOCLEAN
|
Включает очистку (distclean) после успешной сборки образа
|
Пусто (по умолчанию нет) либо любая строка
|
|
BELL
|
Подаёт сигнал после завершения сборки
|
Пусто (по умолчанию нет) либо любая строка
|
|
BRANCH
|
Указывает, для какой ветки производится сборка
|
|
|
BUILDDIR
|
Задаёт каталог генерируемого профиля и сборки
|
Пусто (по умолчанию авто) либо строка
|
|
BUILDDIR_PREFIX
|
Задаёт префикс каталога генерируемого профиля и сборки
|
Строка; по умолчанию выбирается алгоритмически
|
|
BUILDLOG
|
Задаёт путь к файлу журнала сборки/очистки
|
$(BUILDDIR)/build.log (по умолчанию) либо строка
|
|
CHECK
|
Включает режим проверки сборки конфигурации (без сборки образа)
|
|
|
CLEAN
|
Экономия RAM+swap при сборке в tmpfs. Очистка рабочего каталога после успешной сборки очередной стадии
|
Пусто, 0, 1, 2; по умолчанию пусто при DEBUG, иначе 1
|
|
DEBUG
|
Включает средства отладки, может отключить очистку после сборки
|
Пусто (по умолчанию), 1 или 2
|
|
DISTRO_VERSION
|
Задаёт версию дистрибутива (если применимо)
|
Пусто (по умолчанию) либо любая строка
|
|
HOMEPAGE, HOMENAME, HOMEWAIT
|
Указывают адрес, название и таймаут перехода для домашней страницы
|
Корректный URL, строка, неотрицательное целое число
|
|
IMAGEDIR
|
Указывает путь для сохранения собранного образа
|
Равно $HOME/out (если существует), иначе $(BUILDDIR)/out (по умолчанию), либо другой путь
|
|
ISOHYBRID
|
Включает создание гибридного ISO-образа
|
Пусто (по умолчанию) либо любая строка
|
|
LOGDIR
|
Указывает путь для сохранения логов сборки
|
Равно $(IMAGEDIR) (по умолчанию) либо другой путь
|
|
MKIMAGE_PREFIX
|
Указывает путь к mkimage. Если параметр не задан, используется системный mkimage
|
|
|
NICE
|
Понижает нагрузку системы от сборочной задачи
|
Пусто (по умолчанию) либо любая строка
|
|
NO_SYMLINK
|
Не создавать символические ссылки на собранный образ
|
Пусто (по умолчанию) либо любая строка
|
|
QUIET
|
Отключает поясняющие сообщения при сборке (например, при запуске через cron)
|
Пусто (по умолчанию) либо любая строка
|
|
REPORT
|
Запрашивает создание отчётов о собранном образе. Требует включения DEBUG и отключения CHECK
|
|
|
ROOTPW
|
Устанавливает пароль root по умолчанию для образов виртуальных машин
|
Пусто (по умолчанию root) либо строка
|
|
SAVE_PROFILE
|
Сохраняет архив сгенерированного профиля в .disk/
|
Пусто (по умолчанию) либо любая строка
|
|
SORTDIR
|
Дополнительно структурирует каталог собранных образов
|
Пусто (по умолчанию) либо строка (например, $(IMAGE_NAME)/$(DATE))
|
|
SQUASHFS
|
Определяет способ сжатия squashfs для stage2
|
|
|
STATUS
|
Добавляет в имя образа указанный префикс
|
Пусто (по умолчанию) либо строка (например, «alpha», «beta»)
|
|
STDOUT
|
Выводит сообщения (при включённом DEBUG) одновременно в лог и на экран
|
1 — включить вывод на экран, если включен DEBUG
|
|
USE_QEMU
|
Использовать qemu, если архитектура не совпадает
|
1 (по умолчанию), для отключения — любое другое значение
|
|
VM_SAVE_TARBALL
|
Указывает, что нужно сохранить промежуточный тарбол, из которого создается образ виртуальной машины, в заданном формате
|
tar tar.gz tar.xz
|
|
VM_SIZE
|
Задаёт размер несжатого образа виртуальной машины в байтах
|
Пусто (по умолчанию двойной размер chroot) или целое число
|
Примечание
~/.mkimage/profiles.mk:
APTCONF = ~/apt/apt.conf.$(BRANCH).$(ARCH)
$ make -C /usr/share/mkimage-profiles help
Список доступных образов:
$ make -C /usr/share/mkimage-profiles help/distro
Пример команды сборки образа:
$ make -C /usr/share/mkimage-profiles syslinux.iso
Пример команды сборки образа с указанием переменных:
$ make -C /usr/share/mkimage-profiles DEBUG=1 BRANCH=p11 APTCONF=/etc/apt/apt.conf.local alt-server.iso
apt.conf.local может выглядеть так:
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/ver/empty";
Dir::Etc::SourceParts "/var/empty";
Dir::Etc::sourcelist "/etc/apt/sources.list.d/alt-local.list";
APT::Acquire::Retries "3";
APT::Cache-Limit 201326592;
//Acquire::http::AllowRedirect "true";
RPM
{
Allow-Duplicated {
// Old-style kernels.
"^(NVIDIA_)?(kernel|alsa)[0-9]*(-adv|-linus)?($|-up|-smp|-secure|-custom|-enterprise|-BOOT|-tape|-aureal)";
// New-style kernels.
"^kernel-(image|modules)-.*";
};
Hold {
// Old-style kernels.
"^(kernel|alsa)[0-9]+-source";
};
};
Примечание
Примечание
join (в поле Продукт должен быть указан Team Accounts);
join и предполагаемый адрес почты: join user@;
normal;
all — все платформы);
Псевдоним: sova Почта: Valentin Sokolov <sova@altlinux.org> Адрес пересылки почты: mail@mail.com Имя ментора: Grigory Ustinov Почта ментора: grenka@altlinux.org Хочу научиться собирать пакеты.
gpg --export --armor <id ключа>). Файлы можно прикладывать после создания заявки. Важно убедиться, что экспортирован только один ключ (gpg %путь-до-файла%);
$ ssh-keygen [-t <тип ключа>] [-b <размер ключа (для RSA)>]
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519.
Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:7gUUwuricYRlF2mQxl4429Y5Dl2xECRSxcX67yPJrdU user@platform
The key's randomart image is:
+--[ED25519 256]--+
| .o*=**+o. |
| O.*o.oo. |
| * O o.+. |
| . = +.* |
| o . oSo |
| o o .... . |
| . + ...+. E |
| . . .+.+ |
| . .+.. |
+----[SHA256]-----+
На вопрос о файле сохранения ключа можно ничего не вводить, а принять путь по умолчанию, нажав Enter. В этом случае публичная часть ключа — файл ~/.ssh/id_ed25519.pub для ED25519-ключа или ~/.ssh/id_rsa.pub для RSA-ключа.
Примечание
~/.ssh/id_ed25519 и ~/.ssh/id_rsa — это секретные (закрытые) ключи. Никогда и никому не следует передавать секретный ключ.
$ gpg --gen-key
gpg --gen-key должны быть указаны в ASCII.
$ gpg --gen-key
Выберите тип ключа:
(1) RSA и RSA (по умолчанию)
(2) DSA и Elgamal
(3) DSA (только для подписи)
(4) RSA (только для подписи)
Ваш выбор? 1
длина ключей RSA может быть от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048) 4096
Запрошенный размер ключа - 4096 бит
Выберите срок действия ключа.
0 = без ограничения срока действия
<n> = срок действия - n дней
<n>w = срок действия - n недель
<n>m = срок действия - n месяцев
<n>y = срок действия - n лет
Срок действия ключа? (0) 0
Срок действия ключа не ограничен
Все верно? (y/N) y
Для идентификации Вашего ключа необходим ID пользователя. Программа создаст его
из Вашего имени, комментария и адреса электронной почты в виде:
"Baba Yaga (pensioner) <yaga@deepforest.ru>"
Ваше настоящее имя: Valentin Sokolov
Адрес электронной почты: sova@altlinux.org
Комментарий:
Вы выбрали следующий ID пользователя:
"Valentin Sokolov <sova@altlinux.org>"
Сменить (N)Имя, (C)Комментарий, (E)адрес или (O)Принять/(Q)Выход? O
Для защиты секретного ключа необходима фраза-пароль.
$ gpg --armor --export псевдоним@altlinux.org
Примечание
$ gpg --delete-key старый/ключ
$ gpg --armor --export псевдоним@altlinux.org > public.key
$ gpg --edit-key псевдоним@altlinux.org
gpg> adduid
Далее следует указать имя (в формате <Имя> <Фамилия>) и uid (email) вида псевдоним@altlinux.org, после чего сохранить изменения:
$ gpg --edit-key псевдоним@altlinux.org
gpg> save
# apt-get install podman
# podman --version
podman version 5.7.0
# sysctl kernel.unprivileged_userns_clone
kernel.unprivileged_userns_clone = 0
# apt-get install sysctl-conf-userns
/usr/bin/newuidmap и /usr/bin/newgidmap:
#control newgidmap public#control newuidmap public
Таблица 12.1. Основные команды
|
Действие
|
Команда
|
|---|---|
|
Список контейнеров
|
podman ps
|
|
Создание контейнера
|
podman create [опции] imageName
|
|
Запуск контейнера
|
podman start containerID
|
|
Остановка контейнера
|
podman stop containerID
|
|
Принудительное завершение
|
podman kill containerID
|
|
Перезапуск
|
podman restart containerID
|
|
Просмотр логов контейнера
|
podman logs containerID
|
|
Выполнение команды в контейнере
|
podman exec [опции] containerID command
|
|
Информация о контейнере
|
podman inspect containerID
|
|
Список образов
|
podman images
|
|
Сборка образа
|
podman build -t imageName .
|
|
Загрузка образа в репозиторий
|
podman push imageName
|
|
Загрузка образа из репозитория
|
podman pull imageName
|
|
Удаление образа
|
podman rmi imageName
|
|
Запуск из YAML
|
podman play kube file.yaml
|
$ podman run registry.altlinux.org/alt/alt:p11 uname -a
Trying to pull registry.altlinux.org/alt/alt:p11...
Getting image source signatures
Copying blob 8d382247a69f done |
Copying blob c549b474d68c done |
Copying config 97c70e35e5 done |
Writing manifest to image destination
Linux 0985c00c38ea 6.12.63-6.12-alt1 #1 SMP PREEMPT_DYNAMIC Tue Dec 30 19:10:41 UTC 2025 x86_64 GNU/Linux
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.altlinux.org/alt/alt p11 97c70e35e575 7 months ago 125 MB
$ podman network create my-network
$ podman network ls
NETWORK ID NAME DRIVER
fcb565985cc6 my-network bridge
2f259bab93aa podman bridge
$ podman network inspect my-network
$ podman run -d --name nginx --network my-network -p 8081:80 registry.altlinux.org/p11/nginx
9f65b8ed6971b34f65a586800852ce695ac61176a54f318d610dacae0e5d6ce6
где:
-d — запуск в фоновом режиме;
--name — имя контейнера;
--network — используемая сеть;
-p — сопоставление порта хоста с портом контейнера (например, 8081:80 означает: порт 8081 на хосте → порт 80 в контейнере);
registry.altlinux.org/p11/nginx — адрес образа.
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f65b8ed6971 registry.altlinux… nginx -g daemon o... 7 minutes ago Up 7 minutes 0.0.0.0:8081->80/tcp nginx
$ curl -I <ip_адрес>:<порт>
где:
-p при создании контейнера.
$ curl -I 192.168.0.102:8081
HTTP/1.1 200 OK
Server: nginx/1.28.1
Date: Tue, 17 Feb 2026 11:23:03 GMT
…
$ podman pod create --name my-pod --network my-network -p 8081:80
Список подов:
$ podman pod ls
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
394308217ce0 my-pod Created 12 seconds ago 286d0da0f2dc 1
$ podman run -d --pod my-pod --name nginx registry.altlinux.org/p11/nginx
Контейнер с приложением nginx будет добавлен в под my-pod.
$ podman pod inspect my-pod
$ podman pod ps --ctr-names
POD ID NAME STATUS CREATED INFRA ID NAMES
394308217ce0 my-pod Running About a minute ago bd7dd34e327f 394308217ce0-infra,nginx
$ podman pod stop my-pod
$ podman pod start my-pod
$ podman pod rm my-pod
docker build, Buildah:
# apt-get install buildah
from, run, copy, commit позволяют собирать образ пошагово.
Таблица 12.2. Основные команды для работы с buildah
|
Команда
|
Назначение
|
|---|---|
buildah from <image>
|
Создать рабочий контейнер из образа
|
buildah run <ctr> -- <cmd>
|
Выполнить команду внутри контейнера
|
buildah copy <ctr> src dst
|
Скопировать файлы в контейнер
|
buildah config <ctr>
|
Задать метаданные (ENTRYPOINT, CMD, PORT и др.)
|
buildah commit <ctr> <tag>
|
Сохранить контейнер как образ
|
buildah bud -f Dockerfile -t tag .
|
Собрать из Dockerfile (bud = Build Using Dockerfile)
|
buildah images
|
Список локальных образов
|
buildah containers
|
Список рабочих контейнеров
|
Dockerfile:
FROM alt:alt
LABEL maintainer="admin@test.alt"
LABEL description="Demo image for buildah examples"
ENV APP_DIR=/app
WORKDIR $APP_DIR
# Установка пакетов
RUN apt-get update && \
apt-get install -y curl bash && \
apt-get clean
# Копирование файлов в контейнер
COPY hello.sh .
# Сделать скрипт исполняемым
RUN chmod +x hello.sh
# Порт (для примера)
EXPOSE 8090
# Команда по умолчанию
CMD ["./hello.sh"]
hello.sh:
#!/bin/sh echo "Hello from Buildah demo container!" echo "Container hostname: $(hostname)"
$ buildah bud -t myapp:latest .
Ожидаемый вывод:
STEP 1/10: FROM alt:latest STEP 2/10: LABEL maintainer="admin@test.alt" STEP 3/10: LABEL description="Demo image for buildah examples" STEP 4/10: ENV APP_DIR=/app STEP 5/10: WORKDIR $APP_DIR STEP 6/10: RUN apt-get update && apt-get install -y curl bash && apt-get clean ... STEP 7/10: COPY hello.sh . STEP 8/10: RUN chmod +x hello.sh STEP 9/10: EXPOSE 8090 STEP 10/10: CMD ["./hello.sh"] COMMIT myalt Getting image source signatures Copying blob 7066ca05e439 skipped: already exists Copying blob fb9fc20ce189 skipped: already exists Copying blob 475224c3ec5c done | Copying config 5674dd2fc2 done | Writing manifest to image destination --> 5674dd2fc28a Successfully tagged localhost/myalt:latest 5674dd2fc28ac10beb78fe9ee78ffc6788f731c1560c4dd2a49edace7bacc68d
Примечание
buildah bud использует файл Dockerfile в текущем каталоге. Если используется файл с другим именем или расположением, необходимо указать его с помощью параметра -f, при этом также требуется указать контекст сборки (обычно текущий каталог .).
Примечание
/tmp, используемого для хранения временных файлов.
/tmp по умолчанию размещается в файловой системе tmpfs. Его размер определяется автоматически (если параметр size не задан) и обычно составляет до половины объёма оперативной памяти.
/etc/fstab:
tmpfs /tmp tmpfs nosuid,size=4G 0 0После внесения изменений необходимо перемонтировать файловую систему:
# mount -o remount /tmp
/var/tmp.
$ ctr=$(buildah from alt:latest)
$buildah run "$ctr" -- sh -c 'apt-get update && apt-get install -y curl bash && apt-get clean'$buildah copy "$ctr" hello.sh /app/hello.sh
$ buildah config --cmd '["/app/hello.sh"]' "$ctr"
$ buildah commit "$ctr" myalt
$ buildah rm "$ctr"
#!/bin/bash ctr=$(buildah from scratch) buildah copy $ctr ./my-binary /app buildah config --entrypoint '["/app"]' $ctr buildah commit $ctr minapp:slim buildah rm $ctrПолучается ультраминимальный образ (только бинарник), без OS-слоёв.
$ buildah inspect myalt:latest
$ podman run --rm -it myalt:latest sh

Dockerfile (с установкой пакетов через пакетный менеджер) неприменим. Такие образы собираются с использованием специализированных инструментов, например: https://github.com/alt-cloud/image-forge#distroless-images
# apt-get install zot
/etc/zot/config.json.
{
"storage":{
"rootDirectory":"/var/lib/zot"
},
"http":{
"address":"127.0.0.1",
"port":"5000"
},
"log":{
"level":"debug"
},
"extensions": {
"search": {
"enable": true,
"cve": {
"trivy": {
"dbRepository": "altlinux.space/trivy/trivy-db"
},
"updateInterval": "24h"
}
},
"ui": {
"enable": true
},
"mgmt": {
"enable": true
}
}
}
address задать значение 0.0.0.0 (слушать на всех сетевых интерфейсах).
externalUrl), например:
"externalUrl": "http://registry.test.alt"
Примечание
#systemctl start zot#systemctl status zot
Примечание
# zot serve /etc/zot/config.json
http://localhost:5000.
Примечание
/etc/containers/registries.conf:
[[registry]] location = "localhost:5000" insecure = true
$ podman push --tls-verify=false localhost:5000/alt/alt:p11
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.altlinux.org/alt/alt p11 97c70e35e575 9 months ago 125 MB
$ podman tag registry.altlinux.org/alt/alt:p11 \
localhost:5000/alt/alt:p11
$ podman push localhost:5000/alt/alt:p11
$ curl http://localhost:5000/v2/_catalog
{"repositories":["alt/alt"]}
Проверка тегов:
$ curl http://localhost:5000/v2/alt/alt/tags/list
{"name":"alt/alt","tags":["p11"]}
http://localhost:5000

/explore (доступна по ссылке View all в правом верхнем углу).
Таблица 12.3. Значки и их значения
|
Значок
|
Значение
|
|---|---|
|
|
Уязвимости не обнаружены
|
|
|
Ошибка при сканировании
|
|
|
Критическая уязвимость
|
|
|
Высокая уязвимость
|
|
|
Средняя уязвимость
|
|
|
Низкая уязвимость
|
|
|
Подпись проверена
|
|
|
Подпись отсутствует или не проверена
|
Примечание
/explore доступны следующие инструменты:

Примечание

$ podman pull 192.168.0.165:5000/alt/alt:p11
zli (Zot CLI) — утилита командной строки для работы с реестром Zot.
$zli config add local http://localhost:5000$zli config add remote http://registry.test.alt:5000
$ zli config -l
local http://localhost:5000
remote http://registry.test.alt:5000
$ zli image list --config local
Пример вывода:
REPOSITORY TAG OS/ARCH DIGEST SIGNED SIZE myalt latest linux/amd64 fdd06a93 false 258MB myalt stable linux/amd64 fdd06a93 false 258MB myalt v1.2.3 linux/amd64 fdd06a93 false 258MB myapp latest linux/amd64 fd6a158a false 6.6MB
$ zli image name myalt:latest --config local
Пример вывода:
REPOSITORY TAG OS/ARCH DIGEST SIGNED SIZE myalt latest linux/amd64 fdd06a93 false 258MB
$ zli repo list --config local
Пример вывода:
Searching... 🌍 REPOSITORY NAME alt alt/alt alt-modified busybox myalt myapp
$ zli cve affected CVE-2025-32989 --config remote
$ zli cve list alt/alt:p11 --config remote
$ zli cve list alt/alt:p11 --config remote --cve-id CVE-2025-32989
$ zli cve list alt/alt:p11 --config remote --verbose
$ zli cve list alt/alt:p11 --config remote -f json
$ zli cve affected CVE-2025-32989 --config remote --repo c3/openjdk-dev
$ zli cve diff c3/openjdk-dev:1.0.0 c3/openjdk-dev:2.0.0 --config remote
Примечание
$ zli cve fixed alt/alt CVE-2025-32989 --config remote
Примечание
$ zli cve diff myapp:v1.0 linux/amd64 myapp:v2.0 linux/arm64 --config remote
# zb -c 10 -s 127.0.10.0/24 -n 10 http://localhost:5000
Примечание
search позволяет находить репозитории и теги по частичному совпадению:
$ zli search query ng --config local
Команда найдёт nginx, mongo, golang и др.
zli search query nginx: --config local
Команда вернёт только репозиторий nginx.
$ podman pull localhost:5000/alt/alt:p11
config.json):
"http": {
…
"auth": {
"ldap": {
"insecure": true,
"address": "dc1.test.alt",
"port": 389,
"startTLS": false,
"baseDN": "OU=OU,DC=test,DC=alt",
"userAttribute": "sAMAccountName",
"userGroupAttribute": "memberOf",
"skipVerify": false,
"credentialsFile": "/etc/zot/ldap-creds.json"
}
}
}
где:
insecure — разрешает подключение к LDAP-серверу без использования TLS/SSL. Установите значение true, если сервер не поддерживает шифрование (рекомендуется только для тестовых сред);
address — IP-адрес или доменное имя LDAP-сервера;
port — порт службы LDAP (обычно 389 для незашифрованного соединения, 636 для LDAPS);
startTLS — включает шифрование соединения с помощью StartTLS. Установите true, если сервер поддерживает StartTLS поверх порта 389;
baseDN — базовое Distinguished Name (DN), с которого начинается поиск пользователей в каталоге;
userAttribute — имя атрибута, содержащего логин пользователя (для AD обычно используется sAMAccountName);
userGroupAttribute — имя атрибута, содержащего информацию о группах, в которые входит пользователь (в AD это memberOf);
skipVerify — пропускает проверку сертификата сервера при использовании TLS/StartTLS (не рекомендуется в production);
credentialsFile — путь к файлу с учётными данными для привязки (bind) к LDAP-серверу.
/etc/zot/ldap-creds.json):
{
"bindDN": "cn=administrator_zot@test.alt",
"bindPassword": "P@$$word"
}
где:
bindDN — учётная запись, используемая для поиска пользователей в каталоге;
bindPassword — пароль для учётной записи.
# htpasswd -Bbn alice mypass > /etc/zot/htpasswd
{
"http": {
…
"auth": {
"htpasswd": {
"path": "/etc/zot/htpasswd"
}
}
}
}
Примечание
accessControl по принципу:
репозиторий → пользователь/группа → разрешённые действия (read, create, update, delete)
Таблица 12.4. Политики контроля доступа
|
Тип политики
|
Атрибут
|
Описание
|
|---|---|---|
|
По умолчанию
|
defaultPolicy
|
Действия, разрешённые аутентифицированному пользователю при отсутствии явных правил
|
|
Для конкретного пользователя
|
users, actions
|
Права для конкретных пользователей
|
|
Для группы
|
groups, actions
|
Права для групп
|
|
Анонимная
|
anonymousPolicy
|
Доступ для неаутентифицированных пользователей
|
|
Метрики
|
metrics
|
Доступ к endpoint метрик
|
|
Администраторская
|
adminPolicy
|
Полный доступ ко всем репозиториям
|
{
"http": {
…
"accessControl": {
"repositories": {
"**": {
"defaultPolicy": ["read"],
"policies": [{
"users": ["alice"],
"actions": ["read", "create"]
}]
},
"secure/*": {
"policies": [{
"groups": ["admins"],
"actions": ["read", "create", "delete"]
}],
"defaultPolicy": ["read"]
}
},
"adminPolicy": {
"users": ["admin"],
"actions": ["read", "create", "update", "delete"]
}
}
}
}
{
"accessControl": {
"repositories": {
"myalt": {
"policies": [{
"groups": ["CN=DevOps,OU=OU,DC=test,DC=alt"],
"actions": ["read", "create", "update"]
}]
}
}
}
}
Важно

$zli image list --config local --user alice:mypass$zli image list --config local --user 'mun:P@$$word'
Примечание
Важно
{
"http": { "compat": true },
"extensions": { "sync": { "preserveDigest": false } }
}
В этом случае образы остаются в исходном формате, и подписи работают корректно.
Таблица 12.5. Режимы зеркалирования
|
Режим
|
Описание
|
Когда использовать
|
|---|---|---|
|
Полное зеркало (periodic sync)
|
Zot периодически опрашивает внешний реестр и заранее кеширует указанные образы
|
Для критически важных образов, когда требуется гарантированная доступность без задержек
|
|
Кеш по запросу (pull-through / on-demand)
|
Образ загружается из внешнего реестра только при первом запросе и кешируется локально. Последующие запросы обслуживаются из кеша
|
Для экономии места и при работе с большими реестрами (например, Docker Hub)
|
Примечание
sync) настраивается в секции extensions файла config.json.
{
"extensions": {
"sync": {
"credentialsFile": "/etc/zot/sync-auth.json",
"registries": [
{
"urls": ["https://registry.altlinux.org"],
"onDemand": true,
"pollInterval": "12h",
"tlsVerify": true,
"maxRetries": 3,
"retryDelay": "5m",
"onlySigned": false,
"preserveDigest": false,
"content": [
{
"prefix": "myapp/**",
"destination": "mirror/myapp",
"stripPrefix": true
}
]
}
]
}
}
}
Таблица 12.6. Описание параметров
|
Параметр
|
Описание
|
|---|---|
|
Уровень
sync
|
|
credentialsFile
|
Путь к файлу с учётными данными для внешних реестров
|
|
Уровень
registries[]
|
|
urls
|
Список URL внешних реестров (резервные адреса в порядке приоритета)
|
onDemand
|
true — включить кеширование по запросу; false — использовать только предварительно синхронизированные образы
|
pollInterval
|
Интервал полного опроса (например, "6h"). Если не задан — используется только on-demand
|
tlsVerify
|
Проверка TLS-сертификатов (true по умолчанию)
|
certDir
|
Каталог с доверенными сертификатами
|
maxRetries, retryDelay
|
Параметры повторных попыток при ошибках
|
syncTimeout
|
Таймаут операции синхронизации (по умолчанию — 3 часа)
|
onlySigned
|
Синхронизировать только подписанные образы (Cosign/Notary)
|
preserveDigest
|
true – попытка сохранить digest (не гарантирует работу подписей); false — конвертировать в OCI (рекомендуется для совместимости)
|
|
Уровень
content[]
|
|
urls
|
Список URL внешних реестров (резервные адреса в порядке приоритета)
|
prefix
|
Путь во внешнем реестре (поддерживает glob: *, **)
|
tags.regex
|
Фильтр тегов по регулярному выражению
|
tags.semver
|
Фильтр по semantic versioning
|
destination
|
Локальный путь для хранения образа
|
stripPrefix
|
Удалять префикс из prefix при сохранении (true → /repo/app → app)
|
credentialsFile, содержит учётные данные:
{
"registry.altlinux.org": {
"username": "zot-sync",
"password": "secret"
},
"gcr.io": {
"username": "_json_key",
"password": "{ ... }"
}
}
{
"onDemand": false,
"pollInterval": "24h",
"content": [{ "prefix": "infra/nginx" }]
}
Ежедневно синхронизирует только стабильные версии nginx.
{
"urls": ["https://registry.altlinux.org"],
"onDemand": true,
"content": [
{
"prefix": "p11/**",
"destination": "mirror/p11",
"stripPrefix": true
}]
}
Образы загружаются только при первом обращении, например:
$ podman pull 192.168.0.165:5000/mirror/p11/flannel:latest
{
"pollInterval": "12h",
"onDemand": true,
"content": [{ "prefix": "**" }]
}
После полной синхронизации можно перенаправить трафик на новый Zot.
# apt-get install regclient
regctl. Также доступны regbot и regsync для автоматизации.
Таблица 12.7. Основные команды для работы с regclient
|
Команда
|
Назначение
|
|---|---|
|
Работа с тегами
|
|
regctl tag ls <repo>
|
Список тегов в репозитории
|
regctl tag delete <image>
|
Удалить тег из репозитория
|
|
Инспекция образов
|
|
regctl image inspect <image>
|
Показать конфигурацию и метаданные образа
|
regctl manifest get <image>
|
Получить манифест образа (включая multi-arch index)
|
regctl image manifest <image>
|
То же, что
manifest get
|
regctl image ratelimit <image>
|
Проверить лимиты запросов к реестру (через HEAD-запрос)
|
|
Модификация образов
|
|
regctl image mod <image> [флаги]
|
Изменить образ: метки, аннотации, слои, время создания и др.
|
regctl image create <image>
|
Создать новый образ из пустого состояния (scratch)
|
|
Импорт/экспорт
|
|
regctl image export <image> file.tar
|
Экспортировать образ в tar (OCI или Docker format)
|
regctl image import <image> file.tar
|
Импортировать образ из tar (docker save или OCI Layout)
|
|
Копирование и управление
|
|
regctl image copy <src> <dst>
|
Копировать или перетегировать образ
|
regctl image delete <image>
|
Удалить ссылку на образ (аналог
crane delete)
|
|
Работа с артефактами и SBOM
|
|
regctl artifact put <image> --artifact-type …
|
Загрузить артефакт (SBOM, подпись и др.)
|
regctl artifact list <image>
|
Список привязанных артефактов (SBOM, Notary, Cosign)
|
|
Управление репозиториями
|
|
regctl repo ls <registry>
|
Список репозиториев
|
|
Аутентификация и конфигурация
|
|
regctl registry login <host>
|
Войти в реестр (сохраняет учётные данные в ~/.docker/config.json)
|
regctl registry logout <host>
|
Выйти из реестра
|
regctl registry config
|
Показать текущую конфигурацию
|
|
Служебные команды
|
|
regctl version
|
Показать версию
|
regctl blob get <image> <digest>
|
Скачать слой (blob) по дайджесту
|
regctl blob put <repo>
|
Загрузить blob в репозиторий
|
$ regctl <команда> --help
$ regctl registry set --tls disabled localhost:5000
Это позволяет regctl принимать HTTP-ответы от сервера Zot. Если на сервере Zot включена TLS-аутентификация, эту настройку выполнять не требуется.
$ regctl registry login registry.test.alt:5000 -u username -p password
$ regctl registry login registry.test.alt -u username --token
~/.regctl/config.json.
$ regctl registry config
{
"hosts": {
"localhost:5000": {
"tls": "disabled",
"hostname": "localhost:5000",
"reqConcurrent": 3
},
"registry.test.alt:5000": {
"tls": "disabled",
"hostname": "registry.test.alt:5000",
"user": "alice",
"reqConcurrent": 3
}
}
}
$ regctl repo ls registry.test.alt:5000
myapp
$ regctl tag ls registry.test.alt:5000/myapp
latest
$ regctl image inspect registry.test.alt:5000/myapp:latest
Вывод включает OCI-манифест: архитектуру, ОС, слои, размер, аннотации.
$ regctl image export registry.test.alt:5000/myapp:latest myapp.tar
$ regctl image copy \
docker.io/library/alpine:latest \
registry.test.alt:5000/alpine:latest
$ regctl manifest get registry.test.alt:5000/myapp
$ regctl manifest put registry.test.alt:5000/myapp:1.0.0 \
--format oci \
--content-type application/vnd.oci.image.manifest.v1+json
$ regctl manifest get registry.test.alt:5000/myapp:latest --platform linux/arm64
$ regctl artifact list registry.test.alt:5000/myapp:latest
$ regctl image mod registry.test.alt:5000/myapp:latest \
--replace \
--annotation "[*]org.opencontainers.image.created=2026-03-30T05:06:07Z"
$ regctl image mod registry.test.alt:5000/myapp:latest \
--create v1-bash \
--config-entrypoint '["bash"]' \
--config-cmd ""
Примечание
--replace перезаписывает существующий тег!
# apt-get install go-containerregistry-crane
Таблица 12.8. Основные команды crane
|
Команда
|
Назначение
|
|---|---|
|
Работа с образами
|
|
pull
|
Загрузить образ из реестра в локальное хранилище
|
push
|
Отправить локальный образ в удалённый реестр
|
copy
|
Эффективно скопировать образ между реестрами с сохранением дайджеста
|
tag
|
Создать новый тег для существующего образа в реестре
|
delete
|
Удалить ссылку на образ из реестра
|
export
|
Экспортировать файловую систему образа в tar-архив
|
flatten
|
Объединить все слои образа в один
|
rebase
|
Пересобрать образ на новой базовой основе
|
|
Инспекция и метаданные
|
|
config
|
Получить конфигурацию образа (в формате JSON)
|
manifest
|
Показать манифест образа
|
digest
|
Вывести дайджест (хеш) образа
|
ls
|
Список тегов в репозитории
|
catalog
|
Список всех репозиториев в реестре
|
|
Модификация
|
|
mutate
|
Изменить метки (labels) и аннотации образа
|
index
|
Редактировать манифест multi-arch образа (image index)
|
|
Работа со слоями и данными
|
|
append
|
Экспортировать образ в tar (OCI или Docker format)
|
blob
|
Прочитать необработанный blob из реестра по дайджесту
|
|
Аутентификация и служебные
|
|
auth
|
Управление учётными данными (логин/доступ к реестру)
|
validate
|
Проверить корректность структуры образа
|
version
|
Показать версию утилиты
|
completion
|
Сгенерировать скрипт автодополнения для оболочки
|
help
|
Справка по командам
|
$ crane <команда> --help
$crane copy --insecure alt:latest registry.test.alt:5000/alt:prod$crane copy alt:latest localhost:5000/alt:prod
$ crane --insecure push \
oci/images/alpine:latest \
localhost:5000/alpine:latest
$ crane --insecure pull \
--format oci \
localhost:5000/alpine:latest \
oci/images/alpine:latest
$ crane config alt:p11 | jq .
$crane catalog 192.168.0.165:5000$crane ls localhost:5000/myapp
$ crane digest localhost:5000/myapp:latest
crane mutate.
Примечание
$ crane mutate alt:latest \
--label version=1.0 \
--tag localhost:5000/alt:modified
$ crane mutate myalt:latest \
--annotation build-system=crane \
--tag localhost:5000/my-alt:annotated
$ crane mutate app:old \
--entrypoint '["/init"]' \
--workdir /app \
--tag app:new
crane export → редактирование → crane append
/usr/local/bin/hello.sh (без пересборки через Dockerfile):
$ crane export alt:latest alt-fs.tar
Создаётся архив alt-fs.tar, содержащий корневую ФС образа.
$mkdir -p modified-root$tar -xf alt-fs.tar -C modified-root
$ cat > modified-root/usr/local/bin/hello.sh <<'EOF'
> #!/bin/sh
> echo "Hello from modified ALT!"
> EOF
$ chmod +x modified-root/usr/local/bin/hello.sh
$ tar -cf modified-fs.tar -C modified-root .
$ crane append \
--base alt:latest \
--new_layer modified-fs.tar \
--new_tag localhost:5000/alt-modified:latest
$ podman run --rm localhost:5000/alt-modified:latest hello.sh
Ожидаемый вывод:
Hello from modified ALT!
crane tag создаёт или переназначает тег без передачи данных (меняется только ссылка на digest).
$ crane tag registry.test.alt:5000/myalt:latest stable
Теперь registry.test.alt/myalt:stable указывает на тот же образ, что и latest.
crane manifest выводит сырой JSON-манифест образа — полезно для отладки, анализа слоёв, проверки платформы.
$ crane manifest localhost:5000/myapp:latest | jq .
Проверить multi-arch манифест (индекс):
$ crane manifest alt:p11 | jq '.manifests[].platform'
Примечание
$ crane index filter \
alt:p11 \
--platform linux/amd64 \
--tag localhost:5000/newalt:slim-multiarch
$ crane index append ubuntu \
-m hello-world@sha256:87b9ca29151260634b95efb84d43b05335dc3ed36cc132e2b920dd1955342d20 \
-t example.com/hello-world:weird
~/.docker/config.json;
$ crane auth login -u alice -p mypass localhost:5000
Примечание
--insecure.
# apt-get install trivy
trivy <команда> [--scanners <сканер1,сканер2>] <цель>
Таблица 12.9. Команды сканирования
|
Команда
|
Краткая форма
|
Назначение
|
|---|---|---|
image
|
i
|
Сканирование OCI/Docker-образа контейнера
|
filesystem
|
fs
|
Сканирование локальной файловой системы
|
config
|
-
|
Анализ файлов конфигурации (IaC: Terraform, CloudFormation, Dockerfile и др.)
|
repository
|
repo
|
Сканирование удалённого git-репозитория
|
rootfs
|
-
|
Сканирование корневой файловой системы (например, распакованного образа)
|
sbom
|
-
|
Анализ SBOM (Software Bill of Materials) — состава пакетов и зависимостей
|
kubernetes
|
k8s
|
Сканирование манифестов Kubernetes или работающего кластера
|
vm
|
-
|
Сканирование образов виртуальной машины (QCOW2, VMDK и др.)
|
aws
|
-
|
Аудит безопасности учётной записи AWS
|
Таблица 12.10. Команды управления и утилиты
|
Команда
|
Назначение
|
|---|---|
module
|
Управление модулями Trivy
|
plugin
|
Установка и управление плагинами
|
vex
|
Работа с VEX-документами (Vulnerability Exploitability eXchange)
|
completion
|
Генерация скрипта автодополнения для указанной оболочки (bash/zsh/fish)
|
server
|
Запуск Trivy в режиме сервера (для многопользовательского использования)
|
clean
|
Очистка кеша (базы уязвимостей и метаданных)
|
convert
|
Преобразование отчёта Trivy из JSON в другие форматы (SARIF, CycloneDX и др.)
|
registry
|
Управление аутентификацией в приватных реестрах (Docker Hub, ECR, GCR и др.)
|
version
|
Вывод версии
|
Таблица 12.11. Доступные сканеры (указываются через --scanners)
|
Сканер
|
Описание
|
По умолчанию
|
|---|---|---|
|
vuln
|
Поиск известных уязвимостей (CVE, GHSA и др.)
|
Да
|
|
secret
|
Обнаружение секретов (ключи, токены, пароли)
|
Да
|
|
config
|
Проверка IaC и конфигураций на ошибки безопасности
|
Нет
|
|
license
|
Анализ лицензий
|
Нет
|
$ trivy <команда> --help
$ trivy image alt:p11
$ trivy image --severity HIGH,CRITICAL -f json -o test.json alt:p11
$ trivy image --scanners license alt:p11
$ trivy image --scanners none --image-config-scanners config alt:p11
$podman imagesREPOSITORY TAG IMAGE ID CREATED SIZE registry.altlinux.org/alt/nginx latest 862baa6fbed9 3 months ago 136 MB registry.altlinux.org/alt/alt p11 ff2762c6c8cc 6 months ago 118 MB $trivy image ff2762c6c8cc
Примечание
$ systemctl --user start podman.socket
$ trivy repo https://github.com/altlinux/admc
$ trivy repo --scanners license --branch run-sh https://github.com/altlinux/admc
--commit и --tag.
$git clone git://git.altlinux.org/gears/o/openuds-tunnel.git$trivy fs --scanners=config ./openuds-tunnel/
$ trivy config ./openuds-tunnel/
$ trivy k8s --report=summary cluster
$ trivy k8s --report=all --severity=CRITICAL cluster
Таблица 12.12. Распределение сканеров
|
Сканер
|
Клиент/Сервер
|
|---|---|
|
Vulnerability
|
Сервер
|
|
Misconfiguration
|
Клиент
|
|
Secret
|
Клиент
|
|
License
|
Сервер
|
$ trivy server --listen localhost:8081
Примечание
$ trivy image --server http://192.168.0.169:8081 alt:p11
$ trivy fs --server http://localhost:8081 --severity CRITICAL ./
# apt-get install trivy-db trivy-server
# systemctl enable --now trivy
$ trivy fs --server http://localhost:4954 ./
$ trivy image --server http://192.168.0.169:4954 alt:p11
где 192.168.0.169 — IP-адрес сервера Trivy.