@ Карта сайта News Автора!

Bog BOS: RPM. Управление пакетами программ в Linux от Red Hat

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение файла: 2019.03.06
Скопировано с www.bog.pp.ru: 2024.04.24

Bog BOS: RPM. Управление пакетами программ в Linux от Red Hat

Назначение и возможности

RPM (Red Hat Package Manager) представляет собой средство поиска, загрузки и установки пакетов программ, а также получения информации об установленных пакетах и их удаления. Информация об установленных пакетах хранится в БД RPM. Портирован под AIX, IRIX, и другие виды Unix. Распространяется под лицензией GNU GPL.

Альтернативным способом установки является загрузка исходных текстов программы (обычно в виде архива tar) и самостоятельная конфигурация (automake, configure), компиляция и сборка (make), установка (make install) и настройка. Сервера я предпочитаю устанавливать именно так. Но при этом приходится помнить какой файл куда установился, иначе будут проблемы при обновлении или удалении программы. А теперь представьте установку сотни программ при обновлении операционной системы или приобретении нового компьютера!

Дистрибутив Red Hat Linux (и многие другие: SuSE, Mandriva, ASPLinux, Fedora, CentOS) поставляется в виде набора из нескольких сотен программных пакетов в формате rpm, часть из которых может быть включена при установке. Дополнительные пакеты могут быть загружены и установлены в дальнейшем из дистрибутива или других источников. Сам RPM состоит в Red Hat 7.1 из пакетов:

rpm контролирует зависимость одного пакета от другого при установке и удалении пакетов. Обеспечивается за счет того, что разработчик пакета определяет "возможность" (capability), которую реализует пакет, и список возможностей, требуемых для его работоспособности от других пакетов. В принципе, возможность представляет собой произвольно назначаемую текстовую строку и требует согласованной работы разработчиков различных пакетов. Довольно часто в качестве строки выбирается базовое имя разделяемой библиотеки (.so) или имя пакета. Пакет может включать триггеры - процедуры, выполняемые при установке или удалении других пакетов.

Существуют и другие системы управления пакетами - например, debian dpkg или SunOS pkgadd.

RPM определяет формат оформления пакета и формат базы данных установленных пакетов. Текущая версия - 4 (версии несовместимы по формату, форматы БД иногда даже несовместимы вниз). Правила работы rpm определяются конфигурационными файлами rpmrc.

Формат пакета

Пакет состоит из архива файлов и метаданных, включающих описательную информацию о пакете и его зависимостях, атрибуты файлов и вспомогательные скрипты (увидим ли мы вирусы для .rpm? :0). Пакеты делятся на исполняемые (binary), содержащие программы для установки на пользовательский компьютер, и исходные (source), содержащие исходный текст и рецепт изготовления из него бинарного пакета.

Исполняемый пакет представляет собой один файл (общепринятый суффикс - .rpm), включающий архив программ, документации и конфигурационных файлов в формате cpio (формат SVR4 с CRC, архивированный gzip или bzip2), описательные тэги и контрольные суммы/подписи. Для чтения архива и тэгов пакета подходит mc (не надо смущаться нулевой длиной тэгов в директории INFO; при нажатии на файлы INSTALL и UPGRADE происходит именно то, о чем вы подумали). Извлечь архив из пакета можно командой rpm2cpio (или тем же mc).

Исходный пакет служит для автоматического построения исполняемых пакетов (возможно для различных платформ и операционных систем) и также представляет собой один файл (общепринятый суффикс - .src.rpm), включающий архив в формате cpio (формат SVR4 с CRC, архивированный gzip или bzip2), описательные тэги и контрольные суммы/подписи. Архив cpio содержит архив материалов от автора программы (обычно в виде .tar.gz), набор заплаток от сборщика пакета и спецификацию (spec) для автоматического процесса создания исполнямого пакета (распаковка архива, наложение заплаток, компиляция, сборка, уборка мусора и т.д.). Материалы от автора программы могут быть как исходными текстами, так и объектными модулями или готовыми программами, а также включают вспомогательные файлы для построения программы (configure, Makefile и др. в зависимости от предпочтений автора программы).

Имя файла, содержащего пакет имеет следующую структуру:
   метка_пакета.архитектура.rpm
где метка_пакета это
   имя_программы-версия_программы-версия_пакета

Архитектура выбирается из (полный список в /usr/lib/rpm/rpmrc):

Имя программы может представлять собой как оригинальное имя, данное автором программы, так и имя для нескольких программ, собранных вместе, или имя для части программы. В последнем случае обычно содержит тире, например: glibc, glibc-devel, glibc-profile. На самом деле никто не мешает назвать файл по-другому, но метка пакета хранится внутри него.

Тэги пакета

Для пакета целиком может храниться информация (в скобках приведены имена тэгов, см. /usr/include/rpm/rpmlib.h):

Для каждого файла в пакете описаны (в скобках приведены имена тэгов):

Формат базы данных

База данных пакетов обычно хранится в директории /var/lib/rpm (несколько файлов в формате Berkley DB3, в предыдущей версии был формат db1 и суффикс .rpm, так что открыть старую БД в новой системе не получается (hint: попробуйте rpm --define '_dbapi 1'). Имя директории может быть изменено ключом --dbpath путь или командой dbpath в конфигурационном файле /usr/lib/rpm/rpmrc (его имя может быть изменено ключом --rcfile путь).

Если БД слегка испортилась, то ее можно попытаться восстановить командой:
   rpm --rebuilddb

При установке Red Hat Linux (Fedora Core до FC5, RHEL, CentOS до 5) имеется возможность установить пакет rpmdb-*, который представляет собой базу данных всех пакетов, входящих в дистрибутив RH 7.1 и ставится (30MB!) в /usr/lib/rpmdb/i386-redhat-linux/redhat. В новых дистрибутивах можно использовать repoquery из пакета yum-utils.

Поиск пакетов

Для начала надо посмотреть на дистрибутивных дисках - нет ли там чего полезного. Затем сходить на сайт изготовителя дистрибутива - не выпустил ли он обновление нужного пакета. Например, на сайте Red Hat есть поиск пакетов по name, summary, description, именам файлов.

Если вы знаете название пакета, обеспечиваемого ресурса, имя разделяемой библиотеки или полное имя файла, то можно воспользоваться поиском пакета на rpmfind.net (бывший rufus.w3.org). Имеются также индексы rpm2html (категории, дистрибутивы, поставщики, дата создания, имя). Там же можно взять и сам пакет. Пакеты появляются в хранилище раньше, чем информация о них на сайте. И похоже, что некоторые дистрибутивы не включаются в БД вовсе (например, sourceforge), но их всегда можно просмотреть вручную по адресу http://rpmfind.net/linux/. Базу данных в формате RDF можно скопировать к себе для локального поиска (190 MB ;). Или взять с помощью wget хотя бы fullIndex.rdf.gz и положить его в ~/.rpmfinddir для rpmfind (сделать это самостоятельно у rpmfind не хватает терпения). В этом файле можно делать поиск по полям name и summary. Да мало ли что можно найти среди нескольких сотен гигабайт! К сожалению, это число надо делиь на 10, так как один и тот же пакет встречается во множестве вариантов. ISO-образы отдает только, если вы можете обеспечить скорость загрузки не менее 100 KB/sec. Файлы отдаются по FTP, HTTP и rsync.

Основные зеркала: fr.rpmfind.net, fr2.rpmfind.net, speakeasy.rpmfind.net. Полный список зеркал (точнее сайтов, использующих технологию rpm2html, так как состав БД на зеркалах может отличаться) приведен здесь. Особенно хочется отметить http://rpmfind.userfriendly.net, содержащий более 200 ГБ rpm, в том числе sourceforge.

Пакеты, собранные специально под Red Hat можно найти на freshrpms или rhcontrib или GNOME hide или falsehope (каково название ;).

Каталог программ (17 тысяч проектов) для Unix можно найти на freshmeat.net (OSDN - VA Software).

Полезно заглянуть на "пристанище" открытых проектов SourceForge (также OSDN - VA Software).

Утилита rpm2html

Если у вас есть опыт установки пакетов, то вы должно быть уже знакомы с сообщением:
   error: failed dependencies:
      libsuperpuper.so.10 is needed by super-1.5-4
Иногда (и очень даже часто) из такого сообщения трудно понять как называется пакет, который предоставляет эту libsuperpuper.so.10? А когда его найдешь, то оказывается, что он тоже требует какой-то библиотеки и так далее (как-то раз я дошел до 5-го "уровня вложенности" после чего решил, что мне эта программа нужна не так уж сильно ;0).

rpm2html позволяет строить набор HTML-страниц и RDF-базу с описанием пакетов и их взаимозависимостей из набора пакетов. Это облегчает поиск пакетов, которые необходимо установить перед установкой требуемого вам пакета, если они входят в один набор (например, один и тот же дистрибутив). Результат работы rpm2html используется как командой rpmfind, так и сайтом rpmfind.net (http://rpmfind.net/linux/RPM/). Строится список пакетов, отиндексированный по категориям, дистрибутивам, поставщикам, дате создания, именам пакетов. Для каждого пакета создается отдельная страница, содержащая информацию из основных тэгов, список ресурсов которые пакет предоставляет и которые он требует. Упоминание каждого ресурса является ссылкой на посвященную ему страницу, на которой указано какой пакет(ы) его предоставляет. К сожалению, нет обратных ссылок (какие пакеты данный ресурс требуют) и индекса ресурсов.

Входящий в состав Red Hat 7.1 пакет rpm2html-1.5 требует наличия mysqlclient (знакомая песня!), поэтому я предпочел собрать его из исходных текстов. Загружаем (версии 1.6 и 1.7 не собираются в RH7.1, хотят xml2), распаковываем архив, autoconf, ./configure, make, make install (в /usr/local), редактирование /usr/local/etc/rpm2html.config, создание директории для результатов, запуск:
   rpm2html конфигурационный_файл

Конфигурационный файл состоит из

Например, секция для локально установленных пакетов выглядит так (метка localbase зарезервирована для этого случая):

[localbase]
name=Installed RPMs in default base
color=#e0ffe0
subdir=local
ftp=ftp://ftp.redhat.com/pub/redhat/redhat-7.1/i386/RedHat/RPMS
ftpsrc=ftp://ftp.redhat.com/pub/redhat/redhat-7.1/SRPMS

Проверка пакетов из командной строки

Перед установкой загруженного из интернет файла полезно его проверить. Команда
   rpm --checksig [-vv]имя_файла[ имя_файла...]
проверяет контрольную сумму MD5 (отключается ключом --nomd5), подпись PGP (отключается ключом --nopgp) и подпись GnuPG (отключается ключом --nogpg). Прежде чем проверять подписи PGP и GnuPG необходимо установить соответствующие системы и импортировать (gpg --import имя-файла, rpm --import имя-файла, имена файлов поискать по locate RPM-GPG-KEY; (для CentOS: rpm --import http://mirror.centos.org/centos-3/RPM-GPG-KEY-CentOS-3; для Fedora Legacy: rpm --import http://www.fedoralegacy.org/FEDORA-LEGACY-GPG-KEY) и заверить публичные ключи поставщика пакета. Как минимум, команда должна ответить:
   имя_файла: md5 OK
а лучше
   имя_файла: md5 gpg OK
иначе вам попался "битый" или - хуже того - подделанный пакет.

Информация о ключе Red Hat приведена на их сайте (Red Hat, Inc <security@redhat.com>).

Установка пакетов из командной строки

В простейшем случае установка пакета производится командой
   rpm -i имя_файла[ имя_файла...]

Вместо имени файла можно указывать URL (в этом случае используются также ключи: --ftpproxy host, --ftpport proxy-port, --httpproxy host, --httpport proxy-port). Если указано имя пользователя, но опущен пароль, то он запрашивается интерактивно(это позволяет не светить пароль в командной строке и на экране). FTP используется в пассивном режиме (PASV).

Перед установкой пакета проверяется наличие места в файловой системе (какой?) (обходится ключом --ignoresize). Пакеты упорядочиваются так, чтобы зависимый пакет устанавливался после того, от которого он зависит (отменяется ключом --noorder). При установке проверяются зависимость устанавливаемого пакета от наличия других пакетов (обходится ключем --nodeps), отсутствие конфликтов с ранее установленными пакетами (пакет уже был установлен - обходится ключем --replacepkgs; ранее была установлена более свежая версия пакета; один из файлов с требуемым именем уже существует - обходится ключем --replacefiles, предыдущая версия конфигурационного файла сохраняется с суффиксом .rpmsave, будут проблемы при удалении конфликтующего пакета), выполняются предустановочные скрипты (отменяются ключами --noscripts, --nopre), пытается обновить конфигурационные файлы (предыдущая версия файла может сохраняться с суффиксом .rpmorig; интересно, что происходит, если и эти имена заняты?), распаковываются файлы и распихиваются по нужным местам с установкой владельца и прав доступа, запускаются постустановочные скрипты (отменяются ключами --noscripts, --nopost), запускаются триггеры, определенные в других пакетах (отменяются ключами --notriggers, --notriggerin), обновляется база данных установленных пакетов.

Ключ --test (--nobuild) позволяет проверить возможность установки пакета без реальной установки. Ключ -vv позволяет вывести множество информации в процессе установки.

Ключ --force позволяет обойти все проверки при установке пакета, кроме проверки зависимости от других пакетов.

Ключ --prefix путь позволяет установить пакет в нужную директорию, если пакет переместим (relocatible). Стандартная директория переместимого пакета определяется по команде
   rpm -qp --queryformat "%{prefixes}\n" имя_файла
Ключ --relocate старый_путь=новый_путь заменяет старый_путь на новый_путь в именах файлов переместимого пакета. Ключ --badreloc в сочетании с --relocate делает то же самое для непереместимого пакета (надеюсь, что вы уверенно держите в руках напильник для последующей рихтовки, т.е. расстановки символьных ссылок ;).

При загрузке со спасательной дискеты полезен ключ --root путь, который определяет корень файловой системы для устанавливаемых пакетов (в т.ч. выполняется chroot() при запуске пред- и постустановочных скриптов) и базы данных пакетов.

Ключ --excludepath путь позволяет исключить из установки файлы, имена которых начинаются с путь. Ключ --excludedocs позволяет исключить из установки файлы документации.

Удаление пакетов из командной строки

В простейшем случае удаление пакета производится командой
   rpm -e имя_пакета[ имя_пакета...]

При удалении пакета проверяется, что нет пакетов, зависящих от удаляемого (обходится ключем --nodeps); что имеется только одна версия указанного пакета (обходится ключем --allmatches); выполняется подготовительный скрипт (отменяются ключами --noscripts, --nopreun); если конфигурационный файл был изменен, то создается его копия (с суффиксом .rpmsave); удаляются все принадлежащие пакету файлы, если они не принадлежат другому пакету; выполняется завершающий удаление скрипт (отменяются ключами --noscripts, --nopostun); выполняются триггер-скрипты, активируемые удалением пакета (отменяются ключами --notriggers, --notriggerun, --notriggerpostun); обновляется база данных установленных пакетов.

Ключ --test позволяет проверить возможность удаления пакета без реального удаления. Ключ -vv позволяет вывести множество информации в процессе удаления.

Ключ --repacked позволяет собрать удаляемые файлы в пакет (/var/tmp).

При загрузке со спасательной дискеты полезен ключ --root путь, который определяет корень файловой системы для удаляемых пакетов (в т.ч. выполняется chroot() при запуске пред- и пост- скриптов) и базы данных пакетов.

Обновление пакетов из командной строки

В простейшем случае обновление пакета производится командой
   rpm -[U|F] имя_файла[ имя_файла...]

Вместо имени файла можно указывать URL (в этом случае используются также ключи: --ftpproxy, --ftpport, --httpproxy, --httpport). Если указано имя пользователя, но опущен пароль, то он запрашивается интерактивно(это позволяет не светить пароль в командной строке и на экране).

Фактически сначала устанавливается новая версия пакета, затем удаляется старая версия. Оба процесса описаны выше. Только конфигурационные файлы обрабатываются в зависимости от совпадения старого, текущего и нового содержимого (текущий файл может быть переименован с суффиксом .rpmsave, если файл принадлежал старой версии пакета, или с суффиксом .rpmorig, если файл был "самодельным"). Ключи --force, --replacepkgs, --prefix путь, --relocate, --badreloc, --ignoresize, --notriggers, --excludepath путь, --excludedocs, --noorder, --replacefiles, --noscripts (действует только на установку!), --test, -vv, --nodeps, --root путь также работают как описано выше.

Если предыдущая версия пакета не была установлена, то происходит обычная установка пакета при использовании ключа -U или пропуск пакета при использовании ключа -F. Ключ -F позволяет восстановить отсутствовавшие файлы, если файл повреждён, то надо использовать "rpm -Uv --force имя-пакета".

Ключ --oldpackage позволяет вернуться к предыдущей версии пакета.

Получение информации о пакетах из командной строки

Синтаксис команды:
   rpm -q выбор_пакета выбор_информации

Ключи выбора пакета:

Ключи выбора выводимой информации:

Ключи -vv, --root путь, --dbpath путь работают как описано выше.

Строка форматирования

Строка форматирования (рекомендуется заключать в апострофы) может содержать литеральный текст (в т.ч. escape-последовательности \a, \b, \f, \n, \r, \t, \v, \\), тэги и итераторы.

Тэг определяет какая информация о пакете или файле будет выведена. Список тэгов (114 для rpm 4.0.2) можно получить командой (префикс RPMTAG_ можно опускать):
   rpm --querytags
Список наиболее употребимых тэгов приведен в разделе Формат пакета. Смотри также /usr/include/rpm/rpmlib.h (RPMTAG_...). Формат использования тега в строке форматирования:
   %[[-]мин_ширина_поля]{имя_тэга[:модификатор]}
где тире перед минимальной шириной поля вызывает выравнивание поля влево (по умолчанию - вправо).

Модификатор позволяет выводить некоторые данные в более читаемом виде:

Если для пакета отсутствует определенный тэг, то вместо него будет выведена строка (none) или (unknown).

Некоторые тэги (например, FILENAMES) могут определять множество данных. Такие многозначные тэги д.б. заключены внутри итераторов. Итератор обозначается квадратными скобками. Чтобы поместить однозначный тэг внутри итератора, его имя предваряется знаком равенства. Число элементов в множестве можно вывести с помощью:
   %{#имя_тэга}

Примеры извлечения информации из БД установленных пакетов

Сортировка пакетов по занимаемому размеру
   rpm -qa --queryformat '%{NAME}: %{SIZE}\n'|sort -rn +1

Сортировка файлов по размеру
   rpm -qa --queryformat '[%{FILENAMES}: %{FILESIZES}\n]'|sort -rn +1

Скрипт make-pkg-list.sh для получения списков пакетов (необходимо предварительно установить пакет rpmdb-redhat):

Немного ;) более сложный скрипт make-file-list.sh, который позволяет отсортировать файлы установленных пакетов по типам (dir, file, link, pipe, rdev (не обрабатываются в новых ядрах с udev)) и "нетронутости" (normal, nonexist, неправильный mtime, несовпадающая md5, неверные права доступа). Создается дополнительный список директорий, не упомянутых явно в БД пакетов. Используется дополнительная программа fileinfo.c. Если в системе поработал prelink, то многие исполняемые файлы будут отличаться от исходных :( (или prelink -uav).

Скрипт whowhat.sh для получения списка зависимостей между установленными пакетами.

Скрипт unrequired.sh для получения списка установленных пакетов, от которых не зависит ни один другой пакет (особенно умиляет наличие в этом списке пакета bdflush, и ведь удалится без предупреждения!). Используется whowhat.sh и /usr/local/bin/count.awk.

Верификация установленного пакета из командной строки

Верификация (ключ -V) включает проверку зависимости пакета от возможностей, предоставляемых другими пакетами (отключается ключом --nodeps); выполнение верификационных скриптов, предоставляемых разработчиком пакета (отключается ключом --noscripts); проверку наличия всех файлов и их корректное состояние (отключается ключом --nofiles). Неинсталлированные (например, по ключу --excludedocs) файлы не проверяются. Требуется неповрежденная БД установленных пакетов.

В зависимости от типа файла проверяется (разработчик пакета может ограничивать проверки для конкретных файлов):

При несовпадении атрибутов файла с записью в БД выдается строка вида (для совпадающего атрибута вместо буквы выводится точка; если невозможно произвести проверку, то выводится вопросительный знак)
   SM5DLUGT c имя_файла, где

Ключом --nomd5 отключается проверка MD5.

Ключи выбора пакета:

Восстановление прав доступа файлов по БД пакетов:
   rpm --setperms ключи_выбора_пакета

Восстановление владельца и группы файлов по БД пакетов:
   rpm --setugids ключи_выбора_пакета

Ключи -vv, --root путь, --dbpath путь работают как обычно.

Создание пакета: исходные материалы

Для создания исходного пакета требуется архив материалов от автора программы (желательно в формате .tar.gz), модифицирующие авторский материал заплатки (например, адаптация к целевой платформе, операционной системе, расположению файлов) и инструкции по процессу построения (spec file).

В состав пакета rpm входит скрипт gendiff, облегчающий создание заплаток. Достаточно перед модификацией файлов сохранить их исходные версии с определенным суффиксом (например .original), после чего выполнить команду:
   gendiff директория .original > имя-заплатки

По обычаю, при работе используются поддиректории /usr/src/redhat (/root/rpmbuild):

Создание пакета: формат spec-файла

Структура spec-файла (точный формат легко извлекается из исходников rpm, а вы как думали ;):

Скрипты %prep, %build, %install и %clean могут использовать следующие переменные окружения (их значения можно изменить в rpmrc):

Макрос %setup удаляет старое содержимое директории пакета в BUILD, распаковывает .tar.gz, устанавливает права доступа к файлам. Параметры (обычно используется при наличии нескольких исходных архивов):

Макрос %patch накладывает заплатку (возможно, разхимая ее) на предварительно распакованные исходные тексты. Состоит из одной строки. Параметры:

Директивы %files:

Условные операторы (могут быть вложены):

В spec-файле можно использовать значения тэгов и пользовательских макросов в виде: %{имя}, а также значения директив rpmrc в виде %{_имя}. Значения макросам присваиваются командой:
   %define имя значение

Не надо вставлять вызов rpm в скрипты spec-файла.

Создание пакета

Последовательность действий при создании пакета:

  1. выполнение команд и макросов в секции %prep
  2. проверка содержимого списка файлов
  3. выполнение команд и макросов в секции %build
  4. выполнение команд и макросов в секции %install и макросов в списке файлов (при этом программа устанавливается на компьютер, используемый для сборки пакета)
  5. создание бинарного пакета в /usr/src/redhat/RPMS/архитектура (зависимости пакета от других программ частично находятся автоматически исполнением ldd над каждой программой из пакета, что позволяет определить, какие разделяемые библиотеки используются в данном пакете (скрипт /usr/lib/rpm/find-requires))
  6. выполнение команд и макросов в секции %clean
  7. создание исходного пакета в /usr/src/redhat/SRPMS

Не надо проверять работоспособность пакета на том же компьютере, на котором вы его собирали: программа была установлена на него в процессе сборки.

Синтаксис команды (не забудьте перейти в /usr/src/redhat/SPECS):
   rpm -bфаза доп.ключи имя_spec-файла

Фаза позволяет выполнить не все шаги построения пакетов:

Дополнительные ключи:

Использование вместо ключа -b ключа -t заставляет rpm извлекать spec-файл из tar-архива (возможно сжатого).

Сборка бинарного пакета из исходного (следы удаляются):
   rpm --rebuild исходный-пакет

Пример наложения заплатки на .src.rpm и создание обновленного бинарного пакета см. в статье о SASL.

Новые средства: mock, rpmdev-setuptree, bodhi, koji, revisor, pungi, livecd-tools.

Подпись пакета

Предварительно необходимо установить GnuPG и сгенерировать ключ (gpg --gen-key). В rpmrc/.rpmrc внести информацию о том, кто будет подписывать пакеты:

Подписать пакет можно:

Конфигурационные файлы (rpmrc)

Везде где в данном тексте упоминался файл rpmrc, надо смотреть (или править) файлы ~/.rpmrc (наибольший приоритет), /etc/rpmrc или /usr/lib/rpm/rpmrc (наименьший приоритет). Каждый из этих файлов содержит директивы управления программами из пакета rpm.

Переназначить конфигурационный файл при вызове rpm можно ключом --rcfile путь.

Посмотреть значения директив конфигурации можно командой
   rpm --showrc

Некоторые директивы:

Макросы определяются в файлах /usr/lib/rpm/macros, /etc/rpm/macros и ~/.rpmmacros. Также могут определяться "на ходу" ключом --define "имя значение" (имя без процента). Посмотреть значение макроса можно ключом --eval '%{имя'}. Есть рекурсия подстановки, условная подстановка.

Библиотека работы с rpm

Пакет rpm-devel включает библиотеку для работы с пакетами и БД пакетов, include-файлы и документацию (8MB, сгенеренных неестественным интеллектом, так что не ожидайте от нее слишком много).

Ссылки

@ Карта сайта News Автора!

Bog BOS: RPM. Управление пакетами программ в Linux от Red Hat

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru