LXF155:RPM:
Olkol (обсуждение | вклад) м (Olkol переименовал страницу LXF154:RPM: в LXF155:RPM:: ошибка в номере) |
Olkol (обсуждение | вклад) (→Как писать spec-файл) |
||
Строка 33: | Строка 33: | ||
Рассмотрим типовую структуру простейшего spec-файла HelloWorld-1.0.spec. | Рассмотрим типовую структуру простейшего spec-файла HelloWorld-1.0.spec. | ||
− | + | <pre> | |
1. Summary: Hello World program | 1. Summary: Hello World program | ||
Строка 67: | Строка 67: | ||
17. rm -rf $RPM_BUILD_ROOT | 17. rm -rf $RPM_BUILD_ROOT | ||
− | + | </pre> | |
Секция «Заголовок» (строки 1 – 8) содержит основные поля: | Секция «Заголовок» (строки 1 – 8) содержит основные поля: | ||
Версия 03:08, 27 июня 2018
|
|
|
RPM: Сделаем пакет сами
В вашей системе найдется приложение, достойное сборки? Отлично. Потому что мы с Ольгой Хлопковой приступаем к созданию собственного RPM-пакета. Как правило, сборка новых пакетов – прерогатива разработчиков ПО либо кураторов-мейнтейнеров, отвечающих за выпуск и поддержку пакетов. Однако перекраивание существующего пакета – навык, полезный и системному администратору: например, если требуется пересобрать RPM под необходимую процессорную архитектуру или дистрибутив, добавить в пакет заплатки или изменить опции установки.
RPM-пакет: что внутри?
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Если пакет двоичный (расширение rpm), в нем хранятся скомпилированные под определенную архитектуру файлы. Правила хорошего тона и соглашения об именовании обязывают указывать архитектуру, для которой собран пакет, в его названии. Пакет содержит исполняемые файлы, конфиги, установочные и необходимые для удаления действия, а также метаданные со списками файлов, контрольными суммами и прочей служебной информацией.
Пакет с исходниками src.rpm содержит средства, необходимые для сборки двоичного пакета. В этом-то и заключается прелесть RPM – обладая src-пакетом, можно пересобирать двоичный пакет для различных целевых архитектур и дистрибутивов!
Как писать spec-файл
Spec-файл – файл спецификации RPM-пакета с расширением .spec. Играет ключевую роль в пересборке пакета и определяет директивы rpm для его установки и удаления. К нему утилита rpmbuild обращается во время построения приложения. Кстати, имена spec-файлам принято давать по имени пакета.
Инструкции внутри spec-файла разбиты на секции, разделяющиеся символом “ %”, и имеют незамысловатый синтаксис
имя поля: значение
причем имя поля регистронезависимо. Комментарии обозначаются символом “#”.
В spec-файлах могут использоваться макросы. Например:
%define Hello echo “Hello World”
%{hello}
Рассмотрим типовую структуру простейшего spec-файла HelloWorld-1.0.spec.
1. Summary: Hello World program 2. %define version 1.0 3. Name: HelloWorld 4. Version: %{version} 5. Release: 1 6. Copyright: GPL 7. Source: HelloWorld-1.0.tar.gz 8. Buildroot: /tmp/HelloWorldrpm 9. %prep 10. %setup 11. %build 12. ./configure 13. make 14. %install 15. make install 16. %clean 17. rm -rf $RPM_BUILD_ROOT
Секция «Заголовок» (строки 1 – 8) содержит основные поля:
- Summary – однострочное описание приложения.
- Name, Version и Release – критичны для работы приложения и должны совпадать с информацией в названии RPM-пакета.
- Source – расположение архива с исходниками.
- BuildRoot – путь, по которому будет собираться пакет.
Секция “prep” (строки 9, 10) необходима для подготовки исходников к построению: в ней происходит распаковка и наложение заплат. В простых случаях достаточно макроса %setup.
После подготовки следует процесс сборки. За него отвечает секция с говорящим названием “build” (строки 11 – 13).
И вот, стадия сборки пройдена, и можно приступить непосредственно к установке, за которую отвечают команды секции “install” (строки 14, 15).
Наконец, в секции “clean” (строки 16, 17) очищаются каталоги сборки и установки.
Конечно, это далеко не все секции, которые могут присутствовать в spec-файле, но для начала вполне достаточно.
Отличаются ли spec-файлы разных дистрибутивов?
Да, и порой существенно. Собственные макроопределения, различия в названии полей, правила заполнения секций... Все это приводит к несовместимости spec-файлов между дистрибутивами и необходимости их преобразования. В Fedora, например, отсутствует поле buildRoot: место сборки приложения задается по умолчанию. Но чаще всего разница между spec-файлами не критична, а исправление не отнимает много времени.
Техника безопасности
В секции %install spec-файла корневым каталогом может быть указан /, и тогда строка
rm -rf $RPM_BUILD_ROOT
из секции %clean снесет ваш Linux прежде, чем вы поймете, что происходит. Не так страшно, но тоже вероятно: пакет установится прямо в домашний каталог %{_prefix} (/usr) и повредит файлы пользователя.
Вывод очевиден: для манипуляций с тонкой материей RPM-пакетов не помешает завести нового непривилегированного пользователя. По крайней мере, не стоит собирать пакеты из-под root.
Что будем собирать?
Приложение стороннего разработчика? Программу с десятком новых поправок? А может, собственноручно написанный код? В любом случае нам потребуется архив tar.gz или tar.bz2 приложения, в котором должны находиться исходники и Makefile.
Инструментарий
Чтобы приступить к созданию собственного пакета, нам потребуется rpm-build – пакет, содержащий утилиты и скрипты для сборки RPM. Если вы не обнаружили его в составе дистрибутива, не отчаивайтесь: он есть в репозиториях (еще один плюс RPM-пакетов – их распространенность и доступность).
В дальнейшем для сборки RPM мы воспользуемся утилитой rpmbuild, входящей в состав этого пакета. Если вы собираете RPM под Fedora, то вам понадобятся пакеты Development Tools и rpmdevtools.
Готовим полигон для сборки
По умолчанию правами для сборки пакетов обладает только root. Но ими можно наделить и обычного пользователя (целесообразность данного мероприятия подчеркнута выше). Для этого создаем в домашней директории макрос .rpmmacros. Записываем в этот файл директиву: %_topdir /home/username/BUILD_ROOT
Путь /home/username/ в секции %_topdir – домашний каталог. В нем будет проходить сборка.
Финальный штрих в подготовке пользовательско-специфичного окружения: для сборки пакетов нам требуется следующая иерархия каталогов:
BUILD_ROOT
- BUILD rpmbuild проводит здесь сборку файлов приложения
- RPMS rpmbuild хранит собранные двоичные RPM-пакеты
- SOURCES Вы помещаете сюда тарболлы программ для сборки
- SPECS Вы создаете здесь spec-файлы проектов для сборки
- SRPMS rpmbuild хранит здесь src.rpm-пакеты
Пользователи Fedora для создания этой структуры могут воспользоваться командой
rpmdev-setuptree
Вручную же это делается так:
mkdir ~/BUILD_ROOT/{RPMS,SRPMS,SPECS,SOURCES,BUILD}
Кстати, в каталоге RPMS во время сборки, в зависимости от архитектуры целевой системы, автоматически создадутся подкаталоги (например, i386 или noarch).
Что ж, дерево необходимых каталогов у нас имеется, осталось их заполнить.
Архив с исходниками прложения, которое мы намерены собрать в RPM-пакет, помещаем в папку /SOURCES, а spec-файл – в каталог /SPECS. И у tar-архива, и у файла спецификации должны быть имена определенной структуры: название-версия-релиз.
rpmbuild: строим пакет
Базовый синтаксис rpmbuild –
rpmbuild -bSTAGE package_name.spec
Опция b используется для сборки пакета, а STAGE указывает завершающую стадию сборки. Для начала вам могут пригодиться следующие значения STAGE:
- a – Сборка двоичного пакета и пакета с исходниками.
- b – Сборка только двоичного пакета RPM.
- s – Сборка только пакета с исходниками src.rpm.
- l – Проверка списка файлов для пакета с выводом ошибок.
Узнать остальные параметры, как обычно, поможет опция -help.
Попробуем собрать пакет из нашего tar-архива HelloWorld-1.0.tar.gz и одноименного spec-файла HelloWorld-1.0.spec:
rpmbuild -ba HelloWorld-1.0.spec
Cобрать пакет для другой архитектуры можно таким образом:
rpmbuild -ba --target i686 HelloWorld-1.0.spec
А вот как выглядит распространенная ошикбка, выдаваемая rpmbuild:
error: Installed (but unpackaged) file(s) found
Таким образом rpmbuild сообщает о найденных, но не упакованных файлах. Если вы не хотите включать их в архив, добавьте в начало spec-файла строку
%define _unpackaged_files_terminate_build 0
В противном случае перечислите файлы в секции %files.
После создания пакета очистим директории сборки и установки приложения:
rpmbuild --clean HelloWorld-1.0.spec
Загляните в директории RPMS и SRPMS: если сборка прошла гладко, там появятся соответственно двоичный пакет и пакет исходников.
Пакет готов. Что дальше?
Наш RPM собран – осталось его протестировать. Устанавливается пакет командой rpm:
rpm -i HelloWorld-1.0.rpm
Если в системе присутствует более старая версия пакета, воспользуйтесь опцией -U для обновления. Появилось желание сделать процесс инсталляции более информативным? В сочетании с этими опциями используйте -hv и наслаждайтесь консольным прогресс-индикатором:
rpm -ihv HelloWorld-1.0.rpm
Preparing... ############################# [100%]
1: HelloWorld ############################# [100%]
Для удаления пакета предназначена опция -e. В арсенале программы rpm масса полезных средств, среди которых – проверка версии установленного пакета, электронной подписи и целостности.
Теперь, когда вы освоили азы и готовы постигать тонкости пакетостроения, перед вами открываются многочисленные возможности: настройка базы данных RPM, скриптинг пакетов или даже создание собственных репозиториев RPM.
Именование RPM-файлов
Традиционно имена RPM-пакетов имеют следующий формат: название-версия- релиз.[архитектура|noarch|src].[rpm|rpms]
Например: clamav-0.95.2-4.rh7.rf.i386.rpm.
Как нетрудно догадаться, если вместо конкретной платформы указывается “noarch”, то содержимое пакета платформонезависимо. Как правило, такие пакеты содержат интерпретируемые скрипты, документацию, GUI-надстройки для других приложений. Постфикс .src.rpm указывается для пакета с исходным кодом.
Шаг за шагом: Это легче, чем может показаться
1 Новый пользователь
Заходим в консоль от имени root, чтобы зарегистрировать нового пользователя. Для этого предназначена команда useradd (в некоторых дистрибутивах – adduser). Аналогично, для удаления используется deluser (или userdel).
2 Макрос
В домашнем каталоге пользователя изменяем макрос .rpmmacros, записав в него пути к каталогам, в которых будет происходить сборка. Заходим как новый пользователь.
3
Иерархия каталогов
Утилитой mkdir создадим в домашнем каталоге иерархию директорий, необходимую для сборки RPM-пакетов.
4 Файлы — по местам
После подготовки структуры каталогов копируем tar-архив программы, которую мы планируем поместить в RPM-пакет, в папку SOURCES. Spec-файл помещаем в папку SPECS.
5 Сборка пакета
Соберем пакет утилитой rpmbuild. По ходу работы она выводит в консоль этапы выполнения. В итоге успешной сборки в каталоге RPMS окажется двоичный пакет, а в SRPMS – пакет с исходниками! И вправду легко.
Терминология пакетостроения
- RPM (акроним от RPM Package Manager) – менеджер пакетов RPM, используемый во многих дистрибутивах (Red Hat, Suse, Fedora, ASP, Alt Linux, CentOs и др.). Также под RPM подразумевают сами RPM-пакеты. Принято считать пакет двоичным, если не уточнено, что в нем содержатся исходники и не указан постфикс src.rpm.
- Spec-файл (файл спецификации) – текстовый файл с расширением .spec, необходимый утилите rpmbuild и определяющий действия при построении приложения.
- rpmbuild – утилита для сборки пакетов, как двоичных, так и с исходным кодом. Входит в состав пакета rpm-build.
- NVR (name-version-release) – поля имени, версии и релиза в файле спецификации. Центральная часть секции описания. На основе данных этих полей выполняется контроль версий и зависимостей пакета.
- База данных RPM – БД дистрибутива, содержащая информацию обо всех пакетах, установленных в системе. Находится в папке /var/lib/rpm.