Управление пакетами с помощью RPM в Linux

Red Hat Enterprise LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы управления пакетами программного обеспечения в дистрибутивах Linux на базе RPM с помощью мощной утилиты командной строки rpm. Вы получите практический опыт выполнения ключевых задач по управлению пакетами, включая получение подробной информации о пакетах, проверку целостности установленных пакетов и изучение содержимого RPM-файлов.

На протяжении всех этапов вы будете использовать специфические команды rpm, чтобы выяснить, какому пакету принадлежит файл, просмотреть зависимости пакета и его конфигурационные файлы, а также проверить обратные зависимости. Вы также узнаете, как безопасно имитировать удаление пакета, чтобы понять последствия этого действия, и как изучить содержимое RPM-файла перед установкой с помощью инструментов rpm2cpio и cpio.

Запрос базовой информации о пакете с помощью rpm -qi и rpm -qf

На этом этапе вы узнаете, как запрашивать информацию об установленных пакетах с помощью менеджера пакетов Red Hat (rpm). rpm — это мощная утилита командной строки для управления программным обеспечением в дистрибутивах Linux, таких как CentOS, Fedora и RHEL. Мы сосредоточимся на двух основных опциях запроса: -qi для получения подробной информации о пакете и -qf для определения того, какому пакету принадлежит конкретный файл.

Сначала давайте изучим детали пакета, который уже установлен в вашей системе. Оболочка bash является основным компонентом системы, поэтому она отлично подходит в качестве примера. Флаг -q означает «query» (запрос), а флаг i — «information» (информация).

Начните с перехода в рабочую директорию лабораторной работы, чтобы создаваемые вами файлы вывода сохранялись в одном месте:

cd /home/labex/project

Выполните следующую команду в терминале, чтобы запросить информацию о пакете bash и сохранить вывод в файл bash-package-info.txt:

rpm -qi bash | tee bash-package-info.txt

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

Name        : bash
Version     : 4.4.20
Release     : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group       : System Environment/Shells
Size        : 4989189
License     : GPLv3+
Signature   : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM  : bash-4.4.20-5.el8.src.rpm
Build Date  : <some_date>
Build Host  : <some_build_host>
Relocations : (not relocatable)
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh).  Most sh scripts can be run by bash without
modification.

Этот вывод предоставляет массу информации, включая версию пакета, краткое описание его назначения и более подробное описание.

Теперь представьте, что у вас есть файл в системе, например исполняемый файл bash, расположенный по адресу /usr/bin/bash, и вы хотите узнать, какой пакет его установил. Это распространенная задача при аудите системы или поиске неисправностей. Для этого можно использовать флаги -qf, где f означает «file» (файл).

Выполните следующую команду, чтобы узнать, какой пакет владеет файлом /usr/bin/bash, и сохраните результат в bash-owner.txt:

rpm -qf /usr/bin/bash | tee bash-owner.txt

Команда вернет полное имя пакета, который предоставляет этот файл:

bash-5.1.8-9.el9.x86_64

Как видите, система правильно определяет, что /usr/bin/bash поступает из пакета bash, что соответствует информации, которую мы нашли ранее. Вы даже можете комбинировать эти флаги, чтобы напрямую получить информацию о пакете, владеющем файлом, выполнив rpm -qif /usr/bin/bash.

Просмотр зависимостей пакета и конфигурационных файлов с помощью rpm -qR и rpm -qc

На этом этапе вы продолжите изучать rpm, научившись выводить список зависимостей пакета и связанных с ним конфигурационных файлов. Понимание зависимостей имеет решающее значение, поскольку большинство программ полагаются на другие пакеты для корректной работы. Знание того, где находятся конфигурационные файлы, необходимо для администрирования и настройки системы.

Продолжайте работу в /home/labex/project. Давайте начнем с того, что выясним, какие другие пакеты или возможности требуются пакету bash. Для этого мы используем флаг -qR (или --requires). Буква R означает «requires» (требует).

Выполните следующую команду, чтобы увидеть зависимости для bash и сохранить вывод в bash-requires.txt:

rpm -qR bash | tee bash-requires.txt

Выводом будет список пакетов и системных возможностей, от которых зависит bash. Этот список может быть довольно длинным.

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
libc.so.6()(64bit)
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)

Этот вывод показывает, что bash зависит от основных системных возможностей, таких как libc.so.6, пакета filesystem и других компонентов среды выполнения.

Далее давайте найдем конфигурационные файлы, которые были установлены как часть пакета bash. Это полезно, когда вам нужно изменить поведение оболочки по умолчанию для новых пользователей. Для этого используется флаг -qc, где c означает «configfiles» (конфигурационные файлы).

Выполните эту команду, чтобы вывести список конфигурационных файлов для bash и сохранить вывод в bash-config-files.txt:

rpm -qc bash | tee bash-config-files.txt

Вывод покажет полные пути к конфигурационным файлам:

/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

Эти файлы в /etc/skel являются шаблонными файлами, которые копируются в домашний каталог нового пользователя при создании учетной записи.

Вы также можете комбинировать флаги, чтобы найти конфигурационные файлы, относящиеся к конкретной команде. Например, чтобы увидеть конфигурационные файлы, используемые командой passwd, можно использовать -qcf. Это говорит rpm сначала найти пакет для файла (-f /usr/bin/passwd), а затем вывести список его конфигурационных файлов (-c).

rpm -qcf /usr/bin/passwd | tee passwd-config-files.txt

Эта команда показывает конфигурационные файлы, связанные с утилитой passwd:

/etc/pam.d/passwd

Это эффективный способ быстро определить, какие файлы вам может потребоваться отредактировать, чтобы изменить поведение команды.

Проверка целостности пакета и изменений файлов с помощью rpm -V

На этом этапе вы узнаете, как проверить целостность установленного пакета с помощью rpm -V (или rpm --verify). Эта команда является важнейшим инструментом безопасности и диагностики. Она сверяет файлы, установленные пакетом, с информацией, хранящейся в базе данных RPM, такой как размер файлов, права доступа и контрольные суммы. Это позволяет обнаруживать любые несанкционированные или случайные изменения системных файлов.

Сначала убедимся, что в системе установлены пара служебных пакетов: lsscsi и at. Мы будем использовать их для наших тестов проверки.

sudo dnf install -y lsscsi at

Продолжайте работу в /home/labex/project. Теперь давайте проверим пакет lsscsi. Поскольку мы только что установили его и не вносили никаких изменений, он должен пройти тест проверки. Успешная проверка не дает никакого вывода.

rpm -V lsscsi | tee lsscsi-verify.txt

Как и ожидалось, командная строка возвращается без каких-либо сообщений, что означает, что все файлы в пакете lsscsi находятся в своем исходном состоянии.

Далее давайте намеренно изменим конфигурационный файл и посмотрим, как rpm -V сообщит об изменении. Мы добавим строку в файл /etc/at.deny, который принадлежит пакету at. Этот файл определяет, каким пользователям запрещено использовать команду at.

echo "labex" | sudo tee -a /etc/at.deny

Теперь, когда мы изменили файл, давайте снова проверим пакет at.

sudo rpm -V at | tee at-verify.txt

На этот раз команда выдает результат, указывающий на то, что изменение было обнаружено:

S.5....T.  c /etc/at.deny

Давайте разберем этот вывод:

  • S: Изменился Size (размер) файла.
  • 5: Изменилась контрольная сумма MD5.
  • T: Изменилось Time (время) модификации.
  • c: Это означает configuration file (конфигурационный файл).
  • /etc/at.deny: Путь к измененному файлу.

Каждая позиция символа в 8-символьной строке S.5....T. представляет собой отдельный тест. Точка . означает, что тест пройден. Этот вывод ясно показывает, что конфигурационный файл /etc/at.deny был изменен с момента его установки.

Вы также можете проверить пакет, владеющий конкретным файлом, напрямую, используя флаги -qVf.

sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt

Эта команда выдаст тот же результат, так как она сначала находит пакет, владеющий /etc/at.deny (at), а затем проверяет его.

Проверка обратных зависимостей и имитация удаления пакета с помощью rpm -e --test

На этом этапе вы узнаете, как проверять обратные зависимости и безопасно имитировать удаление пакета. В то время как команда rpm -qR показывает, что нужно пакету (его зависимости), rpm -q --whatrequires показывает, что нужно другим пакетам (его обратные зависимости). Это крайне важно знать перед удалением пакета, так как вы можете нарушить работу других частей системы.

Продолжайте работу в /home/labex/project. Чтобы безопасно проверить последствия удаления пакета, можно использовать команду rpm -e --test. Флаг -e означает «erase» (удалить), а флаг --test указывает RPM выполнить пробный запуск без фактического удаления каких-либо файлов.

Давайте начнем с изучения основного системного пакета, от которого зависят многие другие пакеты. Пакет glibc предоставляет библиотеку GNU C, которая является фундаментальной почти для всех программ в системе Linux. Давайте проверим, какие пакеты требуют glibc.

rpm -q --whatrequires glibc | tee glibc-whatrequires.txt

Вывод покажет несколько пакетов, которые зависят от glibc:

glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64

Как видите, многие критически важные системные пакеты зависят от glibc. Теперь давайте посмотрим, что произойдет, если мы попытаемся удалить glibc. Мы будем использовать флаг --test, чтобы убедиться, что мы не удалим его на самом деле, что привело бы к поломке всей системы.

sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt

Поскольку так много пакетов нуждаются в glibc, RPM сообщит об ошибках зависимостей и предотвратит удаление. Вывод покажет длинный список невыполненных зависимостей:

error: Failed dependencies:
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
 glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
 ... (additional dependency errors)

Теперь давайте посмотрим на пакет с меньшим количеством зависимостей. Пакет lsscsi, который мы установили ранее, является служебным пакетом с меньшим количеством обратных зависимостей. Давайте проверим, что требует его:

rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt

Вы должны увидеть вывод, указывающий на то, что ни один пакет не требует lsscsi:

no package requires lsscsi

Поскольку никакие пакеты не зависят от lsscsi, мы можем безопасно имитировать его удаление:

sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt

Эта команда должна завершиться без ошибок, что означает, что удаление lsscsi не нарушит работу других пакетов в системе.

Это демонстрирует, как можно предсказать последствия удаления пакета и избежать поломки системы, предварительно проверив обратные зависимости.

Изучение содержимого RPM-пакета с помощью rpm2cpio и cpio

На этом этапе вы изучите мощный метод изучения содержимого RPM-файла без его установки. Это полезно для проверки файлов, содержащихся в пакете, перед установкой или для извлечения одного файла из пакета, чтобы восстановить поврежденный или удаленный файл. Этот процесс включает две команды: rpm2cpio, которая преобразует RPM-файл в архив cpio, и cpio, которая затем может вывести список файлов или извлечь их из этого архива.

Продолжайте работу в /home/labex/project. Сначала вам нужен реальный .rpm файл для изучения. Давайте загрузим файл пакета bash в ваш текущий каталог (/home/labex/project) с помощью менеджера пакетов dnf. Подкоманда download загружает файл пакета без его установки.

sudo dnf download bash

Вы увидите вывод, указывающий на то, что файл был успешно загружен. Имя файла будет включать версию и архитектуру.

Last metadata expiration check: ...
bash-<version>.<arch>.rpm

Теперь используйте команду ls, чтобы убедиться, что .rpm файл находится в вашем каталоге /home/labex/project:

ls bash-*.rpm

Когда RPM-файл готов, вы можете использовать команды rpm2cpio и cpio вместе, чтобы вывести список его содержимого. Команда rpm2cpio считывает RPM-файл и выводит архив cpio в стандартный вывод. Затем мы передаем (|) этот вывод команде cpio, которая считывает архив из своего стандартного ввода. Флаг -t для cpio указывает ему вывести оглавление.

rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt

Это создаст длинный список всех файлов и каталогов, содержащихся в пакете bash. Вывод будет выглядеть примерно так:

.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...

Этот метод дает вам полное представление о содержимом пакета, позволяя точно увидеть, что будет помещено в вашу систему, если вы решите его установить.

Резюме

В этой лабораторной работе вы узнали, как управлять пакетами программного обеспечения и запрашивать информацию о них с помощью утилиты RPM в среде Linux. Вы начали с получения подробной информации об установленных пакетах с помощью rpm -qi и определения того, какому пакету принадлежит конкретный файл, с помощью rpm -qf. Вы также попрактиковались в выводе списка зависимостей пакета с помощью rpm -qR и поиске его конфигурационных файлов с помощью rpm -qc, что дает полное представление о том, как пакет интегрируется в систему.

Опираясь на эти навыки запросов, вы научились проверять целостность файлов установленного пакета с помощью rpm -V для обнаружения изменений. Вы также изучили, как безопасно проверять обратные зависимости и имитировать удаление пакета с помощью rpm -e --test, чтобы понять потенциальные последствия без внесения изменений. Наконец, вы получили возможность изучать содержимое RPM-файла перед установкой, используя rpm2cpio и cpio для извлечения и просмотра списка его содержимого.