В статье я постараюсь описать теорию относительно внутреннего устройства пакетов, нюансов их использования и ограничений, а также основные программы для управления пакетами в порядке уменьшения их сложности. Начнем с обзора строения пакетов.
Содержание
Теоретическая часть
Большинство информации в теоретической части взято из справочных страниц, официальной документации на русском и английском языках.
Общая информация
Все пакеты для Debian можно разделить на два типа 1:
Двоичные пакеты (binary) – содержат исполняемые файлы, файлы настроек, справочные страницы, информацию об авторских правах. Пакеты поставляются в файлах с расширением .deb (специфичен именно для Debian-систем).
Пакеты исходного кода (source) – содержат описание пакета, файл с tar-архивом немодифицированного исходного кода (расширение .orig.tar.gz) и обычно файла, содержащего особые Debian-специфичные изменения к оригинальному исходному коду (расширение .diff.gz)
Имена файлов пакетов включают в себя последовательно общее имя пакета, номер ревизии, архитектуру.
Помимо обычных пакетов существуют также виртуальные 2. Они обладают идентичной функциональностью, но имеют разные названия. Оба пакета предоставляют одно и то же дополнительное имя пакета, которое и является виртуальным. При этом для разрешения зависимостей может использоваться как первый, так и второй реальные пакеты, если вдруг какой-либо из них понадобится для другой программы.
Файл control
Вся сопроводительная информация о пакете находится в файле control. Некоторые атрибуты 3 в этом файле рассмотрены ниже, назначение остальных легко можно понять исходя из их названия. Рассмотрим для примера вывод файла control для пакета mysql-server-5.5:
Приоритет (priority) 4 – может принимать значения требуемый (required), важный (important), стандартный (standard), дополнительный (optional) и экстра (extra). Все типы указаны в порядке уменьшения их важности для операционной системы. Если без требуемых пакетов операционная система не сможет функционировать нормально, то экстра и дополнительные пакеты в принципе не нужны для работы системы, они добавляют дополнительный функционал.
В нижней части текста можно встретить атрибуты, которые содержат списки определенных пакетов. Некоторые из этих пакетов могут быть установлены по желанию, а какие-то должны присутствовать обязательно. В этом случае говорят, что пакет 5: зависит (depends), пред-зависит (pre-depends), рекомендует (reccomends), предлагает (suggests), ломает (breaks), конфликтует (conflict), предоставляет (provides), заменяет (replace), наращивает (enhances). Конечно же все эти поля содержат имена других пакетов, без которых работа основного невозможна (как в случае с пакетами в атрибуте depends), которые добавляют дополнительный функционал (reccomends, suggests), или которые могут даже заменять уже существующие в системе пакеты (replace) и так далее.
Почти в самом низу находятся данные файла conffile 6. Он необходим для определения конфигурационных файлов, которые нельзя заменять при обновлении пакета, чтобы сохранить настройки.
Сценарии установки
Помимо данных самого приложения и информации о нем, в пакетах также поставляются сценарии, которые определяют необходимые действия до/после установки/удаления пакета. Все сценарии установленного пакета хранятся в каталоге низкоуровневой утилиты управления пакетами – dpkg – /var/lib/dpkg/info с соответствующим расширением (проверим это на примере все того же mysql-server-5.5):
Вот за что отвечает каждый сценарий 7:
.preinst – выполняется перед распаковкой пакетов, обычно останавливает связанные с ними службы;
.postinst – выполняется соответственно после распаковки пакета и в большинстве случае служит для настройки только что распакованного пакета – либо самостоятельной, либо с помощью пользователя путем запроса каких-либо данных и/или вывода предупреждений. Конечно же остановленные на этапе выполнения сценария .preinst службы должны быть запущены;
.prerm – как можно догадаться из названия, этот сценарий запускается перед удалением пакета и обычно останавливает все зависящие от него службы;
.postrm – выполняется в самую последнюю очередь после удаления пакета, запускает обратно необходимые службы, подчищает все оставшиеся от пакета данные.
Вообще процессы установки/удаления/обновления пакетов содержат достаточно много действий, это не просто распаковка различных файлов в соответствующие им каталоги системы. Все эти нюансы также подробно расписаны в официальных руководствах 8.
Утилиты управления пакетами
Существует достаточно много утилит управления пакетами, например: apt, aptitude, dpkg, dselect, synaptic и другие. Все они обладают практически идентичным функционалом для “повседневного” использования, но различаются некоторыми другими функциями, интерфейсом и т.д.
В данном случае меня интересуют утилиты командной строки для администрирования прежде всего серверов, не обладающих графическим интерфейсом, а потому я собираюсь рассмотреть три наиболее часто используемые утилиты – dpkg, apt, aptitude.
Надо понимать, что высокоуровневые утилиты, такие как aptitude, основаны на apt, которая в свою очередь использует низкоуровневую dpkg 9.
Основные различия
Основные различия заключаются в следующем 10:
dpkg:
- является основным низкоуровневым инструментом для работы с пакетами, умеет работать с файлами .deb, в отличие от apt и aptitude, работает только с существующими пакетами, загружать ничего не умеет, пользуйтесь этим инструментом очень аккуратно;
- не умеет работать с зависимостями и если устанавливаемому пакету нужны какие-либо другие, dpkg выкинет ошибку и вам придется подгружать зависимости вручную;
- ведет очень подробные логи в файле /var/log/dpkg.log;
apt:
- рекомендуют использовать для обновлении системы при переходе между версиями дистрибутивов, а также просто при установке или обновлении пакетов благодаря более надежному механизму разрешения зависимостей пакетов;
- apt-get и apt-cache работают только в режиме командной строке;
- apt-cache предоставляет возможность поиска с использованием регулярных выражений только в именах и описаниях пакетов;
- умеет работать с предпочтениями 11 только через файл /etc/apt/preferences, в отличие от aptitude;
- менее требовательна к аппаратным ресурсам.
aptitude:
- крайне не рекомендуют использовать для обновления системы при переходе от одной версии дистрибутива к другой; встречаются ситуации с массовым удалением пакетов при обновлении в нестабильных сборках;
- является наиболее универсальным функциональным инструментом на основе apt;
- умеет работать как в режиме командной строки, так и в интерактивном режиме;
- наиболее полезная при выполнении повседневных задач управления пакетами – усиленные возможности поиска (поддерживаются регулярные выражения при поиске в метаданных пакета), подробный анализ существующих пакетов, управление устаревшими пакетами, удобный доступ ко всем версиям пакета;
- уступает по производительности другим утилитам.
Базовые функции
Поскольку все описанные выше утилиты выполняют собственно одну и ту же задачу, вполне логично, что у них есть ряд одинаковых основных функций 12. Многие из них будут рассмотрены ниже. Поскольку dpkg работает несколько по-иному, её обзор будет отдельно.
aptitude | apt-get/apt-cache | описание |
aptitude update | apt-get update | обновление метаданных локального архива пакетов |
aptitude install foo | apt-get install foo | установить актуальную на данный момент версию пакета foo со всеми необходимыми зависимостями |
aptitude safe-upgrade | apt-get upgrade | установить актуальные на данный момент версии имеющихся в системе пакетов без удаления существующих |
aptitude full-upgrade | apt-get dist-upgrade | установить актуальные на данный момент версии имеющихся в системе пакетов с удалением существующих, если это необходимо |
aptitude remove foo | apt-get remove foo | удаление пакета foo без удаления его конфигурационных файлов |
– | apt-get autoremove | удаление зависимостей от отсутствующих в системе пакетов |
aptitude purge foo | apt-get purge foo | удаление пакета foo вместе с его конфигурационными файлами |
aptitude clean | apt-get clean | очистка локального хранилища полученных файлов пакетов |
aptitude autoclean | apt-get autoclean | как и предыдущая команда, но удаляет также пакеты, которые больше не могут быть получены |
aptitude show foo | apt-cache show foo | отобразить детальную информацию о пакете foo |
aptitude search <regex> | apt-cache search <regex> | поиск в имени и описании пакета в соответствии с заданным регулярным выражением |
aptitude why <regex> | – | объяснение почему определенный пакет должен быть установлен в системе |
aptitude why-not <regex> | – | объяснение почему определенный пакет не должен быть установлен в системе |
Расширенные функции
Наиболее часто встречающиеся расширенные функции подробно описаны в официальных руководствах, я позволю себе позаимствовать также и эту информацию, осуществив её перевод и снабдив необходимыми на мой взгляд комментариями.
Команда | Описание |
COLUMNS=120 dpkg -l <package_name_pattern> | |
dpkg -L <имя_пакета> | полный список установленных файлов для определенного пакета |
dpkg -L <имя_пакета> | egrep ‘/usr/share/man/man.*/.+’ | список справочных страниц определенного пакета |
dpkg -S <шаблон_имен_файлов> | список файлов установленных пакетов, которые имеют совпадения с шаблоном |
apt-file search <шаблон_имен_файлов> | список пакетов из локального архива, в именах которых имеется совпадение с шаблоном |
apt-file list <шаблон_имен_файлов> | список содержимого пакетов из архива, в названии которых имеется совпадение с шаблоном |
dpkg-reconfigure 13 <имя_пакета> | перенастроить определенный пакет |
dpkg-reconfigure -p=low <имя_пакета> | перенастроить определенный пакет с заданием минимального приоритета показываемых вопросов |
configure-debian 14 | централизованная перенастройка пакетов, использующих debconf |
dpkg –audit | анализ системы на предмет частично установленных пакетов |
dpkg –configure -a | перенастроить распакованный пакет. Вместе с опцией -а все распакованные, но не настроенные пакеты будут настроены |
apt-cache policy <имя_двоичного_пакета> | проверяет статус пакетов |
apt-cache madison <имя_пакета> | показывает доступную версию и информацию об архивах пакета |
apt-cache showsrc <имя_двоичного_пакета> | показывает исходную информацию о пакете |
apt-get build-dep <имя_пакета> | установка пакетов, необходимых для компиляции пакетов исходных кодов 15 |
aptitude build-dep <имя_пакета> | install required packages to build package |
apt-get source <имя_пакета> | скачивание пакета исходного кода 16 |
dget <URL for dsc file> | загрузка пакета исходных кодов (может использоваться в сценарии установки ПО из нестабильной ветки дистрибутива 17) |
dpkg-source -x <имя_пакета>_<версия>-<версия_debian>.dsc | dpkg-source входит в пакет dpkg-dev 18. команда означает сборку 19 пакета из трех файлов (“*.orig.tar.gz”, “*.debian.tar.gz”/”*.diff.gz”) |
debuild binary 20 | сборка пакета |
make-kpkg kernel_image | сборка ядра |
make-kpkg –initrd kernel_image | сборка ядра с ключом initrd |
dpkg -i <имя_пакета>_<версия>-<версия_debian>_<arch>.deb | установка пакета |
debi <имя_пакета>_<версия>-<версия_debian>_<arch>.dsc | установка .dsc-пакета в систему |
dpkg –get-selections ‘*’ >selection.txt | сохранить список пакетов и их статусов в файл |
dpkg –set-selections <selection.txt | задать список состояний выбора пакетов |
echo <имя_пакета> hold | dpkg –set-selections | установить состояние определенного пакета в hold |
На этом я закончу обзор управления пакетами, несмотря на то, что огромная часть информации так и не была затронута. Тематика менеджеров пакетов на удивление исчерпывающе описана в достаточно большом количестве официальных источников. Ниже представлены лишь некоторые из них, которые я использовал при написании статьи:
APT HOWTO (Obsolete Documentation)
Часто задаваемые вопросы о Debian GNU/Linux (главы 6, 7)
Debian Reference (глава 2)
Руководство пользователя aptitude
Также могут быть полезны ресурсы смежных дистрибутивов:
В любом случае я не ставил задачу описать все нюансы работы с пакетами. Статья предназначена прежде всего для аккумулирования опыта из общедоступных источников, коллекционирования ссылок на наиболее полезные ресурсы и небольшого обзора самых фундаментальных положений и функций.
Notes:
- Часто задаваемые вопросы о Debian GNU/Linux – 7.1 Что такое пакет Debian? ↩
- Часто задаваемые вопросы о Debian GNU/Linux – 7.8 Что такое виртуальный пакет? ↩
- Debian Policy Manual – 5.6 List of fields ↩
- Debian Policy Manual – 2.5 Priorities ↩
- Debian Policy Manual – Chapter 7 Declaring relationships between packages ↩
- Часто задаваемые вопросы о Debian GNU/Linux – 7.5 Зачем нужен файл conffile? ↩
- Часто задаваемые вопросы о Debian GNU/Linux – 7.6 Зачем нужны сценарии preinst, postinst, prerm и postrm? ↩
- Debian Reference – 2.1.7. The event flow of the package management ↩
- Часто задаваемые вопросы о Debian GNU/Linux – 8.1 Какие программы для управления пакетами имеются в Debian? ↩
- Debian Reference – 2.2.1. apt-get / apt-cache vs. aptitude ↩
- AptPreferences ↩
- Debian Reference – 2.2.2. Basic package management operations with the commandline ↩
- dpkg-reconfigure ↩
- Package: configure-debian ↩
- APT HOWTO (Obsolete Documentation) – 6.2 Пакеты, необходимые для компиляции пакетов исходных текстов ↩
- APT HOWTO (Obsolete Documentation) – 6.1 Скачивание пакетов исходных текстов ↩
- SimpleBackportCreation ↩
- Package: dpkg-dev ↩
- Руководство начинающего разработчика Debian – Глава 6. Сборка пакета ↩
- debuild ↩