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

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

Введение

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

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

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

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

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

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

rpm -qi bash

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

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:

rpm -qf /usr/bin/bash

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

bash-5.1.8-9.el9.x86_64

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

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

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

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

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

rpm -qR bash

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

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
glibc
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 требует пакет glibc (который предоставляет библиотеку C libc.so.6), пакет filesystem и другие компоненты системного уровня.

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

Запустите эту команду, чтобы вывести список конфигурационных файлов для bash:

rpm -qc bash

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

/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

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

/etc/pam.d/passwd

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

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

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

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

sudo dnf install -y lsscsi at

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

rpm -V lsscsi

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

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

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

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

sudo rpm -V at

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

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

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

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

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

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

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

rpm -q --whatrequires glibc

Вывод покажет несколько пакетов, зависящих от 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

Поскольку 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
 ... (дополнительные ошибки зависимостей)

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

rpm -q --whatrequires lsscsi

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

no package requires lsscsi

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

sudo rpm -e --test lsscsi

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

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

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

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

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

sudo dnf download bash

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

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

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

ls bash-*.rpm

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

rpm2cpio bash-*.rpm | cpio -t

Это создаст длинный список всех файлов и каталогов, содержащихся в пакете 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 для извлечения и вывода списка его содержимого.