19.5. Создание RPM-пакетов
19.5. Создание RPM-пакетов
Программа RPM предназначена для произведения всех видов операций с программным обеспечением, в том числе и для создания пакетов для установки (RPM-пакетов).
Прежде, чем описать много сухих фактов, взятых из документации, рассмотрим простой пример создания небольшого RPM-пакета. Я создал этот пакет для своей программки, которая контролирует состояние указанного последовательного порта.
Будем считать, что программа уже откомпилирована и все файлы, необходимые для ее работы, уже подготовлены. При этом понадобятся следующие файлы:
port — откомпилированный бинарный файл.
README — файл, который будет помещен в каталог /usr/doc/port-1.0-99.
port.1 — файл для справочной системы man.
Все эти файлы я поместил в каталог /root/port. Конечно, это не совсем корректно, но об этом будет сказано немного позже.
Для создания пакета нужно создать файл спецификаций. В файле спецификаций указывается вся информация о создаваемом пакете: название, версия, файлы программ, файлы документации, действия, выполняемые при установке пакета и при его удалении. Мой файл спецификаций для программы port представлен в листинге 19.1
Листинг 19.1. Файл спецификации для программы port
Summary: Program to control your serial device
Name: port
Version: 1.0
Release: 101
Group: Monitoring
License:GPL
Packager: Denis Kolisnichenko [dhsilabs@mail.ru]
URL: http://dkws.narod.ru
%description
Программа port предназначена для мониторинга состояния последовательного
порта. При получении сигнала (1) на какой-нибудь контакт указанного порта,
port отправляет сообщение запустившему ее пользователю на указанный email
%files
%doc /root/port/README
/root/port/port
/root/port/port.1
Для построения пакета нужно ввести команду:
# rpm –bb /root/port/port.spec
Если вы не допустили никаких ошибок при создании файла спецификаций, на экране вы увидите примерно такое сообщение:
Executing(%install): /bin/sh –e /var/tmp/rpm-tmp.33439
Processing files: port-1.0-99
Finding Provides: (using /usr/lib/rpm/find-provides)…
Finding Requires: (using /usr/lib/rpm/find-requires)…
Requires: ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0)
Записан: /usr/src/RPM/RPMS/i686/port-1.0-99.i686.rpm
При этом будет создан пакет port-1.0-99.i686.rpm. Этот пакет будет помещен в каталог /usr/src/RPM/RPMS/i686.
При удалении такого пакета он будет удален из базы RPM, но удаления самих файлов не произойдет. Действия, которые нужно выполнить до и после удаления пакета из базы RPM, вы можете определить в макрокомандах %preun и %postun соответственно. Например
%preun
rm –f /usr/bin/port
rm –f /usr/man/man1/port.1
Такой подход — самый простой выход из положения, однако он является не очень корректным. Решение этой проблемы оставляю вам в качестве домашнего задания.
А сейчас проведем небольшой эксперимент. Запустите Midnight Commander (mc), перейдите в каталог /usr/src/RPM/RPMS/i686/ и «войдите» в пакет port-1.0-99.i686.rpm как в обычный каталог. В нем будет «подкаталог» INFO, в котором и содержится вся информация о пакете.
Что ж, вы успешно разобрались с построением простого пакета, но для создания реальных пакетов установки ваших знаний все еще не хватает. Теперь настала очередь той сухой теории, о которой я упомянул в начале этого пункта. Традиционно, процедура создания RPM-пакетов состоит из следующих этапов:
1. Извлечения исходных текстов программы из архива.
2. Компилирование программы из исходных текстов.
3. Создание RPM-пакета.
Первые два этапа можно пропустить, что мы и сделали при создании пакета. Такое можно сделать только в случае, если программа уже откомпилирована из исходных текстов.
Программа RPM использует файл конфигурации rpmrc. Поиск этого файла производится в каталогах /usr/lib/rpm, /etc, $HOME. Просмотреть этот файл можно с помощью команды:
# rpm --showrc
Запись topdir файла конфигурации rpmrc содержит название каталога, в котором находится дерево подкаталогов, которое используется менеджером RPM для построения пакетов. Введите команду:
# rpm –-showrc | grep topdir
-14 _builddir %{_topdir}/BUILD
-14 _rpmdir %{_topdir}/RPMS
-14 _sourcedir %{_topdir}/SOURCES
–14 _specdir %{_topdir}/SPECS
–14 _srcrpmdir %{_topdir}/SRPMS
–14 _topdir %{usrsrc}/RPM
У меня эти подкаталоги находятся в каталоге /usr/src/RPM. Как вы видите, в этом каталоге находятся подкаталоги BUILD, RPMS, SOURCES, SPECS, SRPMS.
В каталоге BUILD создается RPM-пакет. В каталоге SOURCES находятся сжатые исходные тексты программы. В каталог RPMS помещаются созданные пакеты. Точнее, они помещаются в один из его подкаталогов, в какой именно — это зависит от архитектуры. В каталог SRPMS помещаются пакеты, содержащие исходные тексты программы. В каталоге SPECS находятся файлы спецификаций. Обычно файл спецификации называется назва-ние_программы-версия-релиз.8рес.
Например, если у вас есть исходный текст программы в архиве, из которого вы хотите создать пакет RPM, скопируйте его в каталог SOURCES:
# ср source_code-1.0.tar.gz /usr/src/RPM/SOURCES.
По умолчанию менеджер RPM работает с пакетами, расположенными в каталоге с именем, совпадающим с названием пакета и его версией. Для нашего пакета port это будет каталог port-1.0-99. Менеджер пакетов будет компилировать наш пакет в каталог /usr/src/RPM/port-1.0-99.
Думаю, уже достаточно информации о каталогах RPM. Теперь перейдем к файлу спецификаций. Файл спецификаций состоит из четырех сегментов: заголовка, подготовительного, файлового, установочного. В заголовке указывается общая информация о пакете. В листинге 19.1 к сегменту заголовка относятся тэги Summary, Name, Version, Release, Group и License. На них мы останавливаться не будем, так как их назначение понятно из листинга 19.1.
Есть еще очень полезный тэг: BuildRoot. Он изменяет расположение дерева BUILD. Значением по умолчанию является /usr/src/RPM или другой каталог, задаваемый переменной окружения $RPM_BUILD_ROOT. В целях экономии дискового пространства полезно после установки удалить дерево %RPM_BUILD_ROOT. Но это дерево по умолчанию может содержать другие файлы, относящиеся к другим пакетам. Поэтому сначала с помощью тэга BuildRoot нужно задать какой-нибудь временный каталог, а после установки удалить его.
В каждом сегменте находятся макрокоманды. С некоторыми мы уже знакомы — это %description, %files, %doc, %install. В табл. 19.34 приведено полное описание макрокоманд.
Макрокоманды Таблица 19.34
Макрокоманда Описание %description Полное описание пакета %prep Подготовка архива. Здесь задаются команды для извлечения исходного текста программы и его распаковки, дополнительная подготовка исходного текста. После макрокоманды %prep задаются обычные команды shell %setup Макрокоманда извлечения файлов из архивов. Опция –n позволяет указать каталог, в котором будет создаваться новый пакет. Обычно распаковывается архив, расположенный в каталоге SOURCES, в каталог BUILD %build Макрокоманда компилирования. Обычно здесь запускается программа make с необходимыми параметрами %files Задает список файлов, входящих в состав пакета. При указании имен файлов должен быть указан полный, а не относительный путь. Для указания полного пути можно использовать переменную окружения $RPM_BUILD_ROOT. Необходимые файлы уже должны быть помещены в каталог BUILD. Этого можно достичь с помощью макрокоманды %setup или с помощью макрокоманды %pre (см. ниже) %config список Задает список файлов, которые будут помещены в каталог /etc %doc список Задает список файлов, которые будут помещены в каталог /usr/doc/[package]–[ver]–[release] %install Этап установки программного обеспечения. Здесь нужно записать команды, которые будут устанавливать файлы, входящие в состав пакета. Удобнее использовать команду install которую я использовал в листинге 19.1 %pre Действия, которые будут выполнены до инсталляции пакета %post Действия, которые будут выполнены после инсталляции пакета %preun Действия, которые будут выполнены перед удалением пакета %postun Действия, которые будут выполнены после удаления пакета %clean Удаление дерева BUILD. Используется вместо опции — clean программы rpm. Обычно содержит одну команду: rm –rf $RPM_BUILD_ROOTНужно сделать небольшое замечание относительно макрокоманд %config и %doc. В этом случае список задается не так, как в макрокоманде %files. Если после макрокоманды %files можно было просто указать по одному файлу в каждой строке, то в макрокоманде %doc каждому файлу (или каждому списку) должна предшествовать команда %doc. Например:
%doc README TODO Changes
%doc Install
а не
%doc
README TODO
Changes Install
Еще раз отмечу, что наличие всех макрокоманд в файле спецификаций не является обязательным.
При создании пакета мы использовали опцию –bb программы rpm. При указании этой опции создается только двоичный RPM-пакет, если вы хотите создать также пакет, содержащий исходный текст программы, используйте опцию –ba. Созданный пакет помещается в каталог SRPMS и будет иметь имя port-1.0-99.src.rpm. To есть вместо названия архитектуры будет указано, что данный пакет содержит исходный текст программы. Для создания такого пакета в каталоге SOURCES должны находиться исходные тексты программы.
Для полноты картины осталось рассмотреть опции менеджера rpm, которые используются для создания пакетов (см. табл. 19.35).
Опции менеджера пакетов rpm Таблица 19.35
Опция Описание -ba Создаются два пакета: двоичный и содержащий исходный текст. При этом не пропускается ни один этап установки, указанный в файле спецификаций -bb Создается только двоичный пакет. Не пропускается ни один этап установки, указанный в файле спецификаций -be Выполняются этапы %pre и %build. При этом пакет распаковывается и компилируется -bi Выполняются этапы %pre, %build, %install -bl Выполняется проверка списка файлов, указанных в макрокоманде -bp Выполняется только этап %pre, то есть распаковывается архив --recompile package.src.rpm Указанный пакет, содержащий исходные тексты, сначала устанавливается, а потом компилируется --rebuild package.src.rpm Устанавливается и компилируется пакет исходных текстов, а затем создается новый двоичный пакет --test Проверка файла спецификаций --clean Удаление дерева каталогов BUILD после создания пакета --showrc Выводит файл конфигурацииДанный текст является ознакомительным фрагментом.