# Линукс без Интернета *Крафтовые продукты в наше время стоят дороже тех, что выпущены на рынок с конвейеров фабрик. И это суждение в равной мере можно отнести и к пиву, свареному в ближайшем пабе, и к собранному в ручную автомобилю премиум класса. А как эту мысль экстраполировать на программное обеспечение (ПО)?* Большинство дистрибутивов ПО распространяется, как известно, не просто в виде файлов, а в виде логически сгруппированных, пакетов. Об одном таком классе этих Linux-дистрибутивов пойдёт речь далее. [Фоновую музыку](https://archive.org/details/post-rock2018) для этого выпуска обеспечивает группа с именем собственным "Группа", физически из Новосибирска, а технически с нашего [федивёрс-узла](https://mastodon.ml/@gruppagruppa), что особенно приятно. Есть большое желание надёргать ещё их [инструменталов](https://archive.org/details/tlenobezyshodnost/), если они, конечно не возразят обратное и тем более не пригрозят :-) судебными расправами. Хотя, глядя в лицензию Creative Commons, такого не придумывается, даже если очень сильно напрячь фантазию. ## Выпуск 19. RPM. Часть 1. Аббревиатура "RPM" расшифровывается в наши дни, как рекурсивный акроним [RPM Package Managemer](https://ru.wikipedia.org/wiki/RPM). Хотя сначала это было не так. ### Предыстория RedHat и Fedora Примерно в 1993 году появился дистрибутив [Red Hat Linux](https://ru.wikipedia.org/wiki/Red_Hat_Linux), а в последствии и компания [Red Hat](https://ru.wikipedia.org/wiki/Red_Hat). С 2018 года она незаметно стала подразделением известной материнской корпорации [IBM](https://ru.wikipedia.org/wiki/IBM). Но большой коммерческий рынок нас тут не интересует, в отличае от формата пакетов RPM, которые составляют низовую базу поставки большого семейства дистрибутивов, таких как [Fedora](https://ru.wikipedia.org/wiki/Fedora_Linux) [CentOS](https://ru.wikipedia.org/wiki/CentOS) и, конечно же, [RHEL](https://ru.wikipedia.org/wiki/Red_Hat_Enterprise_Linux). Обязательно следует отметить, что это ПО служит основой для изготовления большого количества производных дистрибутивов как зарубежных, так и отечественных. Также, существуют и независимые по коду дистрибутивы, использующие формат RPM. Например, [ALT Linux](https://ru.wikipedia.org/wiki/ALT_Linux_(%D0%B4%D0%B8%D1%81%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%B8%D0%B2_Linux)). ### Формат пакетов RPM Файлы `*.rpm` внутри себя представляют такой формат согласно [англйской Википедии](https://en.wikipedia.org/wiki/RPM_Package_Manager): * Ведущая секция, идентифицирует сам RPM-файл и содержит некоторое количество устаревших заголовков. * Подпись, которая нужна для того, чтобы удостовериться в целостности и аутентичности полученного файла. * Заголовок, который содержит метаданные, включая: - имя пакета - версия формата RPM (сейчас чаще практикуется 3.0) - архитектура (популярней всего x86\_64, иногда i386, i686, arm...) * Значимая часть (тело), есть ничто иное, как [cpio](https://ru.wikipedia.org/wiki/Cpio) формат. Извлечь его можно утилитой rpm2cpio. Установить её можно даже на дистрибутиве с другой пакетной базой. На примере Debian-основанной Ubuntu: > $ sudo apt install rpm2cpio После чего можно посмотреть, допустим состав исходного пакета (SRPM - Source RPM) для udev-правил 3Д-принтера дистрибутива РОСА Линукс: ``` $ wget -q -O- https://mirror.rosa.ru/rosa/rosa13/repository/SRPMS/main/release/3dprinter-udev-rules-0.3-1.src.rpm|rpm2cpio|cpio -t 3dprinter-udev-rules.spec v0.3.tar.gz 7 блоков ``` Как видно, в файле пакета лежит в свою очередь файл спецификаци, в котором написаны правила и скрипты его сборки в двоичный, готовый к инсталляции в операционную систему (ОС). И сам архивный файл `*.tar.gz`, с набором этих udev правил. Загрузим на локальный компьютер т.н. файл **спецификации** и посмотрим из чего он состоит: ``` $ wget -q -O- https://mirror.rosa.ru/rosa/rosa13/repository/SRPMS/main/release/3dprinter-udev-rules-0.3-1.src.rpm\ |rpm2cpio|cpio -i 3dprinter-udev-rules.spec 7 блоков $ cat 3dprinter-udev-rules.spec Summary: Rules for udev to give regular users access to operate 3D printers Name: 3dprinter-udev-rules Version: 0.3 Release: 1 License: CC0 Group: System/Configuration/Printing Url: https://github.com/hroncok/%{name} Source0: %{url}/archive/v%{version}.tar.gz BuildArch: noarch %description Normally, when you connect a RepRap like 3D printer to a Linux machine by an USB cable, you need to be in dialout or similar group to be able to control it via OctoPrint, Printrun, Cura or any other control software. Not any more. Install this rule to grant all users read and write access to collected devices based on the VID and PID. Disclaimer: Such device might not be a 3D printer, it my be an Arduino, it might be a modem and it might even be a blender. But normally you would add your user to dialout and get access to all of those and more anyway. So I guess be careful when some of the users should not get access to your blenders. %files %doc LICENSE README.md %{_udevrulesdir}/66-3dprinter.rules #------------------------------------------------------------------------- %prep %setup -q %build # nothing %install install -D -p -m 644 66-3dprinter.rules %{buildroot}%{_udevrulesdir}/66-3dprinter.rules ``` Первые строки, начинающиеся лексеммами по правилам переменных, имена которых завершаются перед двоеточиями, после которых идут значения, вплоть до пустой строки, представляют собой ни что иное, как заголовок. Применяется механизм разыменования (интерпретациии), если лексемма начинается знаком процента (`%`). Для явного обозначения имени разыменованной переменной могут применяться фигурные скобки, её обрамляющие (`{}`). Весь этот механизм представляет из себя макроподстановки. После того, как в спек-файле макросы проинициализировались, после пустой строки за заголовком, идут секции, начинающиеся директивами. Директивы начинаются со знаков процента, и имеют специальное назначение. В начале директива `%description` начинает подробное описание всего RPM-пакета, там указывается назначение, функциональные возможности, но не больше, чем можно позволить в документации в отдельных файлах. Со знак процента (`%`) начинаются не только директивы, секции, но и макросы. Особенно в тех случаях когда их лексеммы стоят не в первой позиции строки. Макросы, как и в языках программирования определяются и переопределяются выше по тексту и интерпретируются в последствии. При сборки пакета запускаются скрипты: * Prep - перед ней. Готовятся файлы к сборке - распаковываются и, возможно, предварительно обрабатываются * Build - запускается сама сборка, компиляция исходных кодов в двоичные в соответствующей архитектуры * Install - это ещё не установка файлов пакета в систему, как можно бы было подумать, а копирование оных после сборки в корень архива RPM-пакета. * Clean - очистка каталога сборки. Как правило хватает его простого рекурсивного стирания. * Files - атрибуты файлов внутри RPM архива-пакета: - сами имена с полными путями в будущих системных инсталляциях - права доступа (chmod) - владельцы файла (пользователь+группа). - возможно другие: права по умолчанию Внутри уже сформированного пакета опционально пработают т.н. PRE/POST инсталляционные скрипты: * %pre - выполняется перед инсталляцией в систему (возможны проверки, например, групп внутри системы и их добавление). * %post - действия после инсталляции, например, заполнение шаблонов конфигурационных файлов * %preun - скрипты, запускаемые перед деинсталляцией всего пакета. Может быть, допустим, удаление данных их других регистрационных баз, отличных от RPM... * %postun - после того, как файлы пакета полностью стёрты из системы, запускать скрипты, например, удаления тех же, пользователей и групп, которые использовались для ассоциации с файлами. Но обычно так не делается т.к. учётные записи могут быть нужны другим пакетам, но это не проверяется. Т.к. такая логика слишком сложна. Литература: * Maximum RPM * RPM Development Guide * [Дистрибутив инструментального ПО](https://github.com/rpm-software-management) * [Delta RPM](https://russianfedora.github.io/FAQ/package-manager.html#delta-rpm) Менеджеры репозиториев пакетов: * YUM - классический * DNF - новый * OpenPKG - проект и корпорация для создания универсальных RPM пакетов для разных Unix-подобных ОС. ### Популярные репозитории RPM пакетов * EPEL - mc и другое обилие пакетов * [RPM Fusion](https://rpmfusion.org/) пакетики для просмотра мультимедия, например, ffmpeg для просмотра видео со специальными кодеками. * ElRepo. - поддерживает специфичное оборудование и ядра * PackageKit - ПО для высокоуровнего обслуживания RPM-инфраструктуры внутри уже работающей ОС. Ответственен за межпроцессные взаимодействия при инсталляциях и удалениях пакетов. Есть специальный демон, следящий за транзакциями RPM базы данных пакетов. ### Enterprise Linux * CentOS Stream - постоянно движущийся поток пакетов, перед тем, как они попадут в RHEL. * Rocky Linux - полностью открытый дистрибутив, от бывшего работника RedHat. Стремится воспроизводить полностью RHEL. - BootOnly - NetInstall - Minimal * Alma Linux - аналогичный дистрибутив, широко популярный и в корпоративной и в научно-академической среде. * Oracle Linux - дистрибутив от одноимённой корпорации с дополнительными пакетами, обеспечивающими безопасность и продвинутые системы хранения данных - ISO образы больше 8 Gb дистрибутив [доступны всем](https://yum.oracle.com/oracle-linux-isos.html) - Oracle Linux - PDF и другая отшлифованная корп документация на английском. * ROSA - рекомендуется многими свитчерами - возможна полная пересборка пакетов SRPM - хорошая документация и сеть загрузки - полезный в российских условиях набор софта для домашних и корпоративных пользователях. * RedOS - отсутствие SRPM пакетов - это минус - Хорошая Документация - большой плюс. Новости: + [Опубликован репозиторий OpenELA для создания дистрибутивов, совместимых с RHEL](https://www.opennet.ru/opennews/art.shtml?num=60040) ; 03.11.2023 10:34 * [Совет по сборке RPM системы с нуля](https://www.linuxfromscratch.org/hints/downloads/files/rpm.txt)