Управление пакетами

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

Название дистрибутива: cat /etc/os-release или lsb_release -a

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

Debian и его производные (в частности Ubuntu) используют связку dpkg, apt, aptitude и пакеты в формате DEB. RedHat (CentOS, SciLinux и т.д.) используют rpm, yum и пакеты в формате RPM. ArchLinux использует менеджер pacman.

Программа Alien позволяет конвертировать пакеты RPM в DEB и обратно.

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

Борьба с зависимостями в Debian

При установке kleopatra в Antix Linux выдается ошибка

$sudo apt install kleopatra
...
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 kleopatra : Depends: libkf5kcmutils5 (>= 5.2.0+git20141003) but it is not going to be installed
             Depends: libkf5notifications5 (>= 5.12.0) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

последовательные попытки ручной установки пакетов по цепочке приводят к

$sudo apt install libpulse-mainloop-glib0
....
The following packages have unmet dependencies:
 libpulse-mainloop-glib0 : Depends: libpulse0 (= 10.0-1+deb9u1) but 10.0-1.0nosystemd1 is to be installed

опции -f, -m, --ignore-missing не помогают

Ручная установка

apt-get download  libpulse-mainloop-glib0
sudo dpkg -i --force-all libpulse-mainloop-glib0_10.0-1+deb9u1_i386.deb
sudo vim /var/lib/dpkg/status
# Находим зависимости для libpulse-mainloop-glib0
# и удаляем libpulse0
sudo apt-get install kleopatra

Управление пакетами в Debian - dpkg

Утилита управления пакетами dpkg используется в дистрибутиве Debian, а так же в Ubuntu и многих других. Файлы пакетов имеют расширение .deb

Самые важные опции

dpkg -i mc-3.14.deb - установка пакета

dpkg -r mc - удаление пакета с сохранением файлов конфигурации

dpkg --purge mc -полное удаление пакета

dpkg -V mc - проверка целостности установленного пакета

Поисковые запросы

dpkg-query -L mc- список файлов в пакете

dpkg-query -S /etc/mc.ini - поиск пакета, которому принадлежит файл или каталог

Манипуляции с файлом .deb

dpkg-deb --contents mc-3.14.deb - просмотр содержимого

dpkg-deb -x mc-3.14.deb /tmp - извлечение файлов из архива

Управление пакетами в RHEL - rpm

Для установки, удаления и обновления программ в дистрибутивах RHEL, Fedora, Mandriva, AltLinux и некоторых других используется менеджер пакетов rpm. Менеджер пакетов rpm позволяет устанавливать, удалять, верифицировать пакеты соответствующего формата, но не имеет средств для автоматического разрешения зависимостей и поиска в репозиториях. Для автоматизации установки пакетов можно воспользоваться программой yum (Yellowdog Update Manager), которая автоматически разрешает зависимости между пакетами и подгружает необходимые файлы. При необходимости собрать пакет с программой из исходных текстов можно воспользоваться rpmbuild. Для этого необходимо подготовить пакет в формате .src.rpm, включающий исходные тексты программы и .spec файл, описывающий процесс сборки.

Структура пакета

Пакеты именуются по следующей схеме: имя-версия-сборка. Распространяются пакеты в виде файлов, в название которых добавляется .архитектура.rpm. Например, squid-2.5.STABLE8–1.FC3.1.i386.rpm расшифровывается так: программа squid, версия 2.5.STABLE8, сборка 1.FC3.1, архитектура i386 (неоптимизированное приложение под i386 совместимые процессоры). Номер сборки может включать название дистрибутива (FC3 в данном случае, а может и не включать). Архитектура noarch означает скрипты, независимые от архитектуры процессора. Файлы .src.rpm содержат исходные тексты программ и устанавливаются особым образом.

Каждый пакет содержит файлы программ, библиотек, конфигурации, документации и пр., упакованные архиватором cpio. Также пакет содержит дополнительные секции:

  • PROVIDE – предоставляемая функциональность (например, “mail server”) плюс файлы пакета;
  • REQUIRENAME – необходимые для корректной работы пакеты, файлы и т.п. (то, что требуется в REQUIRENAME, должно присутствовать в PROVIDE ранее установленных пакетов);
  • OBSOLETES – список пакетов, которые могут быть удалены т.к. их функциональность и/или файлы заменяютя данным пакетом;
  • PREIN, POSTIN – скрипты, выполняемые до установки (например, остановка обновляемого демона), и скрипты, выполняемые после установки (например, правка конфигурационных файлов под конкретную машину);
  • PREUN, POSTUN – скрипты, выполняемые при удалении;
  • SUMMARY – краткое описание пакета;
  • DESCRIPTION – подробное описание.

и т.д.

Кроме того, каждый пакет принадлежит к некоторой группе Интернет, Разработка Программ, Развлечения и т.п. Просмотреть секции rpm файла можно в mc.

В дальнейших описаниях <пакет> означает имя пакета без i386.rpm (если установлена одна версия программы, то номер версии и сборки тоже можно опустить), а <файл> означает имя файла .rpm. В качестве файла можно указывать его URL, например, http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3/i386/yum-2.2.0-0.fc3.noarch.rpm

Установка, удаление, обновление программ

Вспомогательные опции: -v – подробный вывод сообщений, -h – показ индикатора прогресса установки.

rpm -ivh <файл>... – установить пакет(ы)
rpm -Uvh <файл>... – обновить пакет(ы), если не установлены – установить
rpm -Fvh <файл>... – обновить уже установленный(е) пакет(ы)
rpm -e <пакет>... – удалить пакет(ы)

Просмотр информации об установленных пакетах или файлах rpm

Вспомогательные опции: -a – все установленные пакеты, -p – информация о файле rpm (в примерах будут приведены не везде).

rpm -q <пакет>... – проверка на наличие установленного пакета и его версии
rpm -qa - список всех пакетов
rpm -qi <пакет>... – DESCRIPTION пакета
rpm -qip <файл>... – DESCRIPTION файла
rpm -qR <пакет>... – REQUIERS пакета
rpm -ql <пакет>... – список файлов пакета
rpm -qf <файл_в_файловой_системе>... – определение принадлежности произвольного файла к одному из установленных пакетов

Проверка целостности rpm пакета

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

Первая проверка очень важна при скачивании пакетов из интернета, а вторая при подозрении на взлом компьютера.

Публичные ключи для проверки подписи автоматически устанавливаются при установке из дистрибутива, а также полуавтоматически добавляются при установке rpm пакетов для подключения репозиториев yum. Файлы с ключами в CentOS устанавливаются в каталог /etc/pki/rpm-gpg/. Можно добавить ключ вручную, указав путь к локальному файлу или его url. Файл с ключем должен иметь текстовый формат 'ASCII armored'

 rpm --import PUBKEY-file

После инсталляции к ключам применимы те же команды, что и к установленным пакетам

rpm -qa gpg-pubkey* – список всех ключей
rpm -qi gpg-pubkey-db42a60e – информация (в том числе имя хозяина) о конкретном ключе
rpm -e gpg-pubkey-db42a60e – удаление ключа

Проверка файла пакета на целостность

rpm --checksig <файл>

Проверка установленного пакета на целостность

rpm --verify <пакет>

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

  • S – размер (Size)
  • M – тип файла или права доступа (Mode)
  • 5 – контрольная сумма (MD5)
  • D – мажор или минор устройства устройства (Device)
  • L – содержимое символической ссылки (Link)
  • U – владелец (User)
  • G – группа (Group)
  • T – время модификации (mTime)
  • P – капабилити (caPabilities)

Извлечение и упаковка файлов rpm пакета

Программа rpm2cpio извлекает файлы из RPM пакета в формате архива cpio. Для распаковки файлов вместе со структурой каталогов используется команда cpio с опциями -i – распаковать и -d – создать каталоги:

rpm2cpio <файл.rpm> | cpio -i -d

Если необходимо сохранить установленный пакет в файл, то можно воспользоваться программой rpmrebuild:

rpmrebuild <package>

Особые случаи

Eсли пакет уже установлен и его надо переустановить или необходимо понизить версию пакета, то можно к командам инсталяции или обновления добавить опцию --force.

Если установка или удаление пакета формально нарушает зависимости, но известно, что все будет хорошо, то используется опция --nodeps.

Менеджер пакетов Debian - apt

Менеджер пакетов Apt (Advanced Package Tool) надстроен над утилитой dpkg и предназначен для кэширования списков пакетов из локальных и сетевых репозиториев, вычисления зависимостей между пакетами и автоматизированных скачивания и установки пакетов.

Функциональность менеджера пакетов распределена между несколькими командами (apt-get, apt-cache и др.).

Информационные запросы apt-cache

apt-cache search Midnight - поиск пакета по регулярному выражению в названии или кратком описании

apt-cache show pkg - основные сведения о пакете

Обновление кэша, установка/обновление/удаление пакетов apt-get

apt-get update - обновление кэша

apt-get upgrade - обновление установленных пакетов до последней версии

apt-get install pkg - установка пакета

apt-get remove pkg - удаление пакета

Управление репозиториями

apt-cdrom add - добавить репозиторий на смонтированном CD

Менеджер пакетов RHEL - yum

Основные операции с yum

yum search <строка> – поиск текстовой строки в названиях пакетов и комментариях

yum install <пакет>... – установка пакетов и всего для них необходимого
yum install <файл.rpm> – установка из локального файла
yum upgrade <пакет>... – обновление пакетов до самой последней версии
yum downgrade <пакет-версия>... – откат обновления до определённой версии
yum remove <пакет>... – удаление пакета. Если этот пакет необходим другим, то будут удалены все

yum list z\* – список пакетов на букву z. Пакеты разбиты на установленные и доступные.
yum info <пакет> – просмотр информации о пакете
yum repolist – список всех репозиториев

yum clean – очистка кэша

Описания репозиториев для yum

Описания репозиториев находятся в каталоге /etc/yum.repos.d/ в файлах с расширением .repo.

Формат файла

#в одном файле могут быть описаны несколько репозиториев, каждый  размещается в своей секции  
[epel]  

# человекочитаемое имя. $basearch - архитектура процессора, $releasever - версия дистрибутива
name=Extra Packages for Enterprise Linux $releasever - $basearch

#местоположение репозитория; если репозиторий локальный, то url может иметь вид
#baseurl=file:///var/repos/myrepo
baseurl=http://download.fedoraproject.org/pub/epel/$releasever/$basearch

#если у проекта есть несколько зеркал, то baseurl может быть заменен на путь к списку зеркал в формате xml
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

#репозиторий можно отключить, поставив enabled=0
enabled=1

#надо ли проверять цифровую подпись пакетов и путь к файлу ключа
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

#если мы предпочитаем получать определённые пакеты из другого репозитория,
# то можем выборочно отключить их в этом
exclude=nagios*

Подготовка локального репозитория для программы yum

  1. Скопировать rpm пакеты своего репозитория в каталог <dir>
  2. Проверить, что установлен пакет createrepo, и установить, если необходимо

         rpm -q createrepo
         sudo yum install createrepo
    
  3. Создать XML данные репозитория

          createrepo <dir>