Алексей Федорчук
Впервые опубликовано: Linuxformat#195 (апрель 2015)
В данном очерке рассмотрены особенности утилиты apt
в реализации для дистрибутива Linux Mint и её отличия от семейства утилит, входящих в пакет apt
, общий для всех deb based дистрибутивов.
Введение
В процессе сочинения этой книги обнаружилось, что реализация утилиты apt
для этого дистрибутива не документирована никак — не только на языке родных осин, но даже на мове Вильяма нашего, Шекспира. В связи с чем я и решил посвятить ей отдельный очерк.
Вокруг утилит под одним и тем же названием apt
сложилась парадоксальная ситуация. Выход 1 апреля 2014 года утилиты из одноимённого пакета, приуроченный к шестнадцатилетнему юбилею этого проекта, был отмечен прогрессивной общественностью и широко освещён на тематических ресурсах. Хотя утилита эта весьма ограничена функционально и год спустя сохраняет статус экспериментальной. В то же время реализация утилиты apt
для Mint, существующая как минимум с 2009 года и доказавшая свою функциональность и устойчивость, практически не известна не только широкой публике, но даже применителям её «родного» дистрибутива. Вот уж действительно
Пророков нет в отечестве своём,
Но и в других отечествах не густо…
Необходимость в таком материале, как мне кажется, ещё и в том, что многие начинающие пользователи Mint и особенно Linux вообще, судя по сайтам, блогам и форумам соответствующей тематики, даже не подозревают о существовании реализации apt
для Mint и её отличиях от тёзки из одноимённого пакета. И потому механически применяют рецепты для чистой Ubuntu и её прямых клонов, на которые так богаты указанные ресурсы. Хотя использование apt
для Mint делает эти рецепты излишними — функционал этой утилиты позволяет добиться той же цели быстрей и проще. По крайней мере, путём меньшего количества нажатий на клавиши.
Обзор
Утилиту apt
в реализации для Mint не следует путать ни с одноимённым пакетом, входящим в состав всех deb based дистрибутивов (в том числе и в Mint), ни с одноимённой же утилитой из этого пакета.
Утилита apt
для Mint входит в состав пакета mintsystem
, что определяется с помощью её же самой:
$ apt contains /usr/local/bin/apt mintsystem: /usr/local/bin/apt
В отличие от стандартной утилиты apt
, располагающейся в каталоге /usr/bin
, apt
для Mint находится в каталоге /usr/local/bin
, что определяется такой командой:
$ which apt /usr/local/bin/apt
При вводе в командной строке apt
без указания пути вызывается именно она, что определяется значениями переменной PATH
, определёнными в общесистемном конфигурационном файле /etc/login.defs
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin...
Так что для запуска стандартной утилиты apt
из одноимённого пакета для неё следует указывать полный путь, например
$ /usr/bin/apt list --installed
для вывода списка инсталлированных пакетов — это чуть ли не единственная функция стандартного инструментария пакета apt
, отсутствующая в apt
для Mint. Ибо последняя перекрывает почти все возможности утилит apt-get
и apt-cache
, большинство возможностей командного режима aptitude
, а также выполняет некоторые функции низкоуровневой утилиты dpkg
.
Другие mint-утилиты
Утилита apt
— не единственный компонент пакета mintsystem
. Кроме неё, он включает ещё четыре утилиты (также располагающиеся в каталоге /usr/local/bin
— mint-md5sum
, search
, highlight
и pastebin
.
К управлению пакетами некоторое отношение имеет только первая из них, предназначенная для подсчёта контрольных сумм. Так, команда
$ mint-md5sum opera-stable_26.0.1656.60_amd64.deb
выведет её для пакета opera-stable
в отдельном окне графического режима (см. рис. 1).
Утилита search
из пакета mintsystem
предназначена для поиска текстовых фрагментов в заданных каталогах. Формат её вызова таков:
$ search for [искомый фрагмент] in [каталог для поиска]
Например, в форме
$ search for 'дистрибутив Mint' in /home/current/alv.me
она отыщет все абзацы с вхождением дистрибутив Mint во всех файлах указанного каталога. Команда search
не является полной заменой утилит семейства grep
, в частности, она не поддерживает регулярные выражения. Но вполне может служить более простой в использовании альтернативой во многих тривиальных случаях, столь частых в практике применителей-текстовиков.
Утилита pastebin
предназначена для быстрого размещения в Сети фрагментов текста, которые почему-либо нежелательно делать доступными каким-либо иным образом. Делается это через сервис, предоставляемый проектом Mint. Так, командная конструкция
$ echo 'Утилита pastebin предназначена для быстрого размещёния в Сети' | pastebin
даст такой вывод:
http://paste.linuxmint.com/view/u5i0
То есть введённый фрагмент будет доступен (например, через браузер) по указанному в выводе адресу. Правда, русскоязычный текст по умолчанию окажется там в кодировке ISO 8859-5
, так что надо озаботься тем, чтобы браузер поддерживал перекодирование страницы на лету.
Утилита highlight
обеспечивает подсветку произвольного текстового фрагмента, заданного как её аргумент. Например, командная конструкция
$ echo 'Утилита pastebin' | highlight code
на выходе даст подсвеченным фрагмент code
(см. рис. 2).
Теоретически рассуждая, если вывод этой конструкции передать по конвейеру команде pastebin, то и в Сети соответствующий фрагмент будет размещён в «подсвеченном» виде. Однако сервис проекта Mint такой возможности не поддерживает.
Применение
Утилита apt
для Mint запускается одноимённой командой CLI с указанием внутренней команды, определяющей цель действия и, в большинстве случаев, аргумента (аргументов), в качестве которых выступает имя пакетов (или имена — их может быть сколько угодно):
$ apt command pkgname1 ... pkgname#
Некоторые часто используемые внутренние команды apt
аргументов не требуют.
Полный список внутренних команд apt
для Mint можно получить «голой» командой
$ apt
вывод которой слишком длинен, чтобы его здесь приводить. Большинство важных для применителя внутренних команд будет рассмотрен в соответствующих разделах этой статьи. А пока для начала следует сказать о внутренней команде help
. Без аргументов она выведет список внутренних команд, идентичный приведённому выше. При указании аргумента — любой из внутренних команд, будет выведен её эквиваленты для apt-cache
, apt-get
или dpkg
. Например:
$ apt help search "apt search" is equivalent to "aptitude search" $ apt help install "apt install" is equivalent to "sudo apt-get install" $ apt help deb "apt deb" is equivalent to "sudo dpkg -i"
Внутренние команды apt
для Mint можно разделить на четыре группы, которые предназначены для:
- получения информации о пакетах;
- установки и удаления отдельных бинарных пакетов;
- общего обновления системы
- работы с пакетами исходных текстов.
Команды первой группы могут быть выполнены обычным пользователем, второй, третьей и, обычно, четвёртой — требуют прав администратора. Однако для получения их утилита apt
для Mint не нуждается в команде sudo
, данной явным образом: она автоматически вызывается при попытке исполнения соответствующих внутренних команд. Например:
$ apt install geany [sudo] password for alv:
Тем не менее, внутренние команды apt
для Mint целесообразно рассмотреть в соответствие с указанными группами.
Информация о пакетах
Пакетный менеджмент начинается с поиска нужного пакета, для чего предназначена внутренняя команда search
, требующая аргумента в виде ключевого слова. Поиск по ключевому слову осуществляется в именах пакетов и их кратких описаниях (т.н. резюме). Например, команда
$ apt search geany
отыщет одноимённый пакет для установки этого текстового редактора (называемого, однако, «Небольшой и быстрой IDE») и все его плагины.
Важное отличие от аналога — команды apt-cache search
: внутренняя команда search
утилиты apt
показывает основной и дополнительный статусы пакетов.
Отступление о статусах
В терминологии deb based дистрибутивов каждый пакет обязательно имеет основной статус и, хотя и необязательно, статус дополнительный. В число основных статусов входят:
- i — установленный пакет;
- p — пакет не установленный или деинсталлированный «вчистую» (то есть с удалением его конфигурационных файлов);
- c — пакет, деинсталлированный с сохранением конфигурационных файлов;
- v — виртуальный пакет, объединяющий группу обычных пакетов, обеспечивающих аналогичную функциональность.
Кроме того, пакеты могут иметь один из следующих дополнительных статусов, хотя это и не обязательно:
- A — установленный автоматически, как зависимость другого пакета; пакеты, не имеющие статуса A, считаются установленными вручную;
- h — пакет с фиксированной версией (то есть не подверженный апгрейду);
- u — пакет распакованный, но не установленный;
- H — «недоустановленный» пакет;
- C — пакет установленный, но не настроенный;
- B — «сломанный» пакет, то есть установленный с нарушением зависимостей.
В сущности, все действия по управлению пакетами в Mint сводятся к изменению их статуса.
Приёмы поиска
Поисковые задачи в отношении пакетов не ограничиваются отысканием их по имени или ключевому слову в описании. Так, нередко требуется отыскивать пакеты с тем или иным статусом, как основным, так и дополнительнгым. И apt
для Mint предоставляет средства для этого — правда, в комбинации с другими утилитами.
В apt
из комплекта APT есть очень полезная внутренняя команда list, которая с помощью опций —installed и —upgradable позволяет отсортировать установленные и доступные для обновления пакеты. В утилите apt
для Mint штатного аналога её не имеется, однако тех же результатов можно комбинацией её внутренней команды search с утилитой grep.
Для начала отмечу, что вывести список всех пакетов, имеющихся в подключённых репозиториях, можно таким образом:
$ apt search -
А дальше остаётся только воспользоваться тем, что вывод apt
для Mint включает основной и дополнительный статус пакетов. То есть получить список установленных пакетов можно с помощью такой конструкции:
$ apt search - | grep ^i
А поиск автоматически установленных пакетов можно выполнить таким образом:
$ apt search - grep 'i A'
Но этот же подход можно использовать для поиска пакетов с любыми другими основным и дополнительным статусами, например, удалённых без очистки от конфигов:
$ apt search | grep ^c
Можно отыскать в системе и «сломаныех» пакеты:
$ apt search | grep ^'i B'
В общем, возможности связки apt
для Mint и grep ограничиваются только задачами применителя, его фантазией и знанием опций второй из этих утилит.
Внутренняя команда held
позволяет отсортировать пакеты с фиксированной версией, то есть те, которые не будут обновляться по команде apt upgrade
, о которой скоро пойдёт речь.
Подробную информацию об отдельном пакете можно получить с помощью внутренней команды show. В её выводе будут присутствовать:
- имя пакет;
- его основной статус (установлен или не установлен);
- статус дополнительный (установлен ли автоматически);
- номер версии и сборки;
- приоритет;
- раздел репозитория (например, admin, devel и так далее);
- майнтайнер и его контакты (например, Clement Lefebvre <clem@linuxmint.com>);
- архитектура — i386 или amd64 ;
- размер в распакованном виде;
- зависимости, рекомендации, предложения и конфликты;
- краткое описание, так называемое резюме;
- URL сайта проекта.
Приоритет пакета устанавливает его важность для функционирования системы. По этому признаку выделяются пакеты обязательные (required
), без которых система не может нормально работать, важные (important
), существенно влияющие на её функционал, стандартные (standard
), обычно присутствующие в любой Linux-системе, дополнительные (optional
), теоретически не являющиеся обязательными, но практически необходимые применителю, «экстраординарные» (extra
), которые могут конфликтовать с пакетами всех остальных приоритетов.
Более подробные, нежели вывод команды show
, сведения о зависимостях пакета даёт пара внутренних команд depends
и rdepends
. Первая выводит полный список пакетов, от которых зависит заданный в качестве её аргумента — жёстких, рекомендуемых, предлагаемых и конфликтующих. Команда же rdepends решает обратную задачу — выводит список пакетов, зависящих от данного.
Все приведённые выше внутренние команды дают информацию как об установленных пакетах, так и о пакетах, доступных в подключённых репозиториях. А вот команды contains
и content
работают только для установленных пакетов. Первая позволяет определить, к какому пакету принадлежит данный файл — именно таким способом была определена выше принадлежность утилиты apt
:
$ apt contains /usr/local/bin/apt mintsystem: /usr/local/bin/apt
Внутренняя команда content
выводит список всех файлов пакета с указанием их положения в файловой иерархии.
Сведения о смене версий пакета получаются с помощью внутренней команды changelog
. А некоторые дополнительные сведения по этому вопросу даёт последняя из «информационных» команд — policy
, требующая в качестве аргумента имени пакета, установленного или неустановленного. Она выводит номер его текущей версии (разумеется, только для установленного пакета) и версии — кандидата для установки, список версий, доступных в репозиториях, а также приоритет последних.
В репозиториях дистрибутива разных версий присутствуют, очевидно, разные версии пакетов. По умолчанию пакет устанавливается или обновляется из репозитория имеющейся на дванной машине версии системы. Однако это можно изменить, задав для некого пакета приоритет репозитория более старой или более новой версии. Приоритет репозитория, в который входит пакет – это число, оно берётся из файлов каталога /etc/apt/preferences.d
. Большее число соответствует более высокому приоритету.
Работа с бинарными пакетами
Главное действие в отношении пакетов, которые были сочтены полезными — их установка. А основным инструментом установки является внутренняя команда install
. В качестве аргументов она принимает имена пакетов — те самые, которые были найдены командой apt search
и в полезности которых можно было убедиться командой apt show
. Например, для установки чрезвычайно полезного текстового редактора Geany следует дать команду
$ apt install geany [sudo] password for alv:
А затем, после считывания локального списка пакетов и построения дерева зависимостей, сообщит о необходимости таковых, объёме скачиваемых пакетов и увеличении занятого дискового пространства после установки, запросив подтверждение серьёзности намерений.
Согласие с установкой предполагается по умолчанию, так что тут достаточно нажать Enter. После чего начинается скачивание пакетов из содержащего их репозитория, распаковка и инкорпорация компонентов в файловую иерархию, а также регистрация в базе данных и включение, если требуется, исполняемого файла в главное меню (для Geany — в секцию Прграммирование, так как эта программа позиционируется её авторами как IDE — Integrated Development Environment, то есть интегрированная среда разработки). Основной статус пакета geany
изменится на «установленный»:
$ apt search geany | head -n 1 i geany - Небольшая и быстрая IDE
А пакет geany-common
, установленный как его зависимость, приобретёт ещё и статус автоматически установленного:
$ apt search geany-common i A geany-common - Небольшая и быстрая IDE — общие файлы
Если в системе уже был установлен данный пакет более старой версии — он будет обновлён. А вот переустановить пакет той же версии (например, если он был безнадёжно испорчен в ходе экспериментов) команда install
откажется, сообщив, что
Уже установлена самая новая версия geany.
Однако для таких случаев существует специальная команда reinstall
, аргументом которой указывается установленный пакет, нуждающийся в исправлении.
Локально отдельные пакеты могут быть установлены с помощью внутренней команды deb
, аргументом которой должно быть полное имя файла пакета, если нужно, с указанием пути. Например, команда
$ apt deb sublime-text_3065_amd64.deb
установит текстовый редактор Sublime — разумеется, предварительно файл этого пакета должен быть скачан.
Поскольку внутренняя команда deb
— полный эквивалент конструкции sudo dpkg -i
, она не занимается разрешением зависимостей, а только сообщает об их нарушении. И, в отличие от внутренней команды install
, команда deb
не только обновит пакет до более новой версии, но и переустановит его версию текущую.
Установленные пакеты иногда требуется и удалять. Этой цели в apt
для Mint служат две внутренние команды — remove
и purge
, аргументами которых служат, естественно, имена удаляемых пакетов. Первая удаляет файлы пакета, но сохраняет его общесистемные конфигурационные файлы, вторая — удаляет также и их. Различие между ними отражается в основном статусе удалённого пакета — в первом случае его значение будет c, во втором — p, как и у пакетов, которые никогда не устанавливались.
И remove
, и purge
автоматически удаляют все зависимые пакеты, список их выводится после ввода пользовательского пароля и перед запросом на подтверждение операции. Список этот нужно читать очень внимательно, чтобы случайно не удалить что-нибудь жизненно необходимое.
Пакеты, от которых зависит удаляемый, автоматически не удаляются ни remove, ни purge. В этом случае apt предлагает воспользоваться внутренней командой autoremove для очистки системы от «осиротелых» зависимостей:
$ apt autoremove
Она не нуждается в аргументах и выполняет свою работу молча, не задавая вопросов. Перед её выполнением не вредно выполнить другую внутреннюю команду — check
, проверяющую систему на предмет «сломанных» зависимостей. При хорошем раскладе после ввода пароля она некоторое время будет заниматься построением дерева зависимостей, а потом сообщит о завершении работы. При раскладе же плохом последует предложение воспользоваться опцией --fix-broken
(или просто -f
), о которой я скажу несколько позже.
Удаление всех автоматически установленных пакетов не всегда желательно, даже если, по мнению системы, они кажутся «осиротелыми». Обычно это относится к пакетам, установленным в составе метапакетов или задач (tasks) — они часто требуют индивидуального обращения.
Избежать тотального удаления автоматически установленных пакетов в ходе выполнения операции autoremove
можно, если предварительно снять с них дополнительный статус A
. Для чего сначала нужно получить их описанным выше способом, выявить в нём кандидатов на лишение автоматического статуса, а потом осуществить это простым повторением команды установки:
$ apt install [pkgnames]
Перед установкой пакетов из репозитория они предварительно скачиваются и помещаются в каталог /var/cache/apt/archives/
. Со временем файлов пакетов накапливается много, а нужны они бывают только в исключительных случаях. Для избавления от них существуют в apt
для Mint предусмотрены команды autoclean и clean. Первая удаляет из кеша только пакеты устаревших версий, сохраняя те, версии которых установлены в системе. Вторая же полностью очищает указанный каталог.
Обновление системы
Сказанное выше касалось единичных пакетов или их серий — любая из перечисленных субкоманд принимает любое количество аргументов. Однако в утилите apt
предусмотрены и внутренние команды для общего обновления всех установленных пакетов, а также для тотального системы. Однако, прежде чем выполнить любую из них, необходимо провести обновление локального кеша пакетов, то есть получить списки новых и обновлённых пакетов. Делается это внутренней командой update, не нуждающейся в аргументах:
$ apt update
Её же в обязательном порядке следует выполнять после каждого изменения в репозиториях — подключения новых или отключения имевшихся. Теоретически для редактирования списков репозиториев в apt
для Mint предназначена команда sources. Однако практически она бесполезна, так как вызывает текстовый редактор по умолчанию (nano) для редактирования /etc/apt/sources.list
. В нашем же дистрибутиве этот файл содержит только репозиторий локального оптического диска, а все реально подключённые репозитории описываются в файлах каталога /etc/apt/sources.list.d
.
Для обновления всех, по возможности, пакетов установленной системы в apt
для Mint существует внутренняя команда upgrade
. Она выявит все пакеты, для которых в репозиториях доступны более свежие версии, выведет их список, объём для скачивания и прирост объёма занятого дискового пространства после выполнения процедуры, а также запросит подтверждение.
В ходе выполнения upgrade обновляются по возможности все пакеты, за исключением тех, для разрешения зависимостей которых обновление потребует доустановки новых пакетов или удаления существующих. Для таких пакетов текущие версии будут сохранены.
При использовании команды upgrade
следует учитывать, что она обновляет в том числе и те компоненты, которые по умолчанию заблокированы для обновления через фирменный инструмент mintupdate
(о которой говорилось в статье про LMDE из LXF#) — ядро и всё, что с ним связано, glibc
, и так далее (пакеты уровней 4 и 5). Так что, прежде чем применять эту команду, следует либо всё взвесить и решиться на обновление указанных компонентов, либо явным образом зафиксировать их версии.
Фиксация версий пакетов может потребоваться и в ряде других случаев — например, при использовании более неподдерживаемых, но по прежнему необходимых пакетов, пакетов, пересобранных с собственными опциями, и ещё некоторых. Она выполняется внутренней командой hold
с указанием имени фиксируемого пакета (пакетов). После чего пакет приобретает основной статус h
и не затрагивается обновлениями. Обратная процедура, то есть снятие фиксации, если в ней пропала необходимость, выполняется внутренней командой unhold
.
Для тотального обновления системы предназначена внутренняя команда dist-upgrade
: она не только обновляет все пакеты, для которых обновления доступны, но может доустанавливать новые пакеты и удалять существующие, если это необходимо для разрешения зависимостей. Эта субкоманда применяется, например, при смене релиза дистрибутива — например, в статье из прошлого номера рассматривался переход с LMDE 1на LMDE 2 Betsy. Для чего было достаточно прописать соответствующие репозитории в файлах их описаний, и после этого дать команду
$ apt dist-upgrade
Есть и ещё несколько случаев, требующих применения dist-upgrade
, а не просто upgrade
— например, обновление версии рабочей среды и некоторых других базовых компонентов системы.
При тотальном обновлении через dist-upgrade
следует помнить о том, что выше было сказано про upgrade
. И если в данном случае обновление базовых компонентов системы (ядра и так далее) необходимо, то о фиксации самосборных и неподдерживаемых пакетов посредством команды hold
нужно позаботиться заблаговременно.
Выполнение команды dist-upgrade
не всегда проходит гладко — она может завершиться сообщением об ошибке, связанной с нарушением зависимостей.
Работа с пакетами исходных текстов
Всё сказанное выше относилось к бинарным пакетам. Однако в утилите apt
предусмотрены и средства для работы с пакетами исходных текстов. Так, с помощью внтуренней команды source
можно просто скачать пакет, указанный в качестве её аргумента — разумеется, для этого должен быть подключён репозиторий исходников. Внутренняя команда build
(эквивалент sudo dpkg-buildpackage
) выполнит построение бинарного пакета (что требует соответствующего инструментария в установленном виде). А внутренняя команда build-dep
ограничится конфигурированием необходимых для этого зависимостей. Например, команда
$ apt build-dep ubuntu-zfs
потребуется мне при сборке пакетов поддержки ZFS on Linux.
Итог
Можно видеть, что и по части манипулирования пакетами возможности утилиты apt
широки и многогранны. То есть это действительно универсальное средство управления пакетами, в обыденной жизни способное почти всегда заменить все прочие — от низкоуровневой dpkg
(обращение к которой потребуется только в исключительных случаях) до графического front-end’а — Synaptic’а. Ибо не уступает последнему в наглядности вывода информации о пакетах, позволяя манипулировать ими проще и быстрее. Что же касается Менеджера программ, о котором шла речь в прошлой статье, то он выигрывает у apt
только в том, что что показывает картинки (см. рис. 3-5).
Рис. 3, 4, 5. Сравнение информативности вывода утилиты apt
для Mint, графического фронт-энда Synaptic и Менеджера программ
Рядом с apt
для Mint его тёзка из одномённого пакета (общего для всех deb based дистрибутивов) Debian/Ubuntu выглядит ограниченным функционально, а традиционные apt-cache
и apt-get
— несколько усложнёнными синтаксически. Что же до aptitude
, то она в этом контексте кажется вообще излишней: apt
для Mint обеспечивает почти все функции её командного режима, а в интерактивном режиме эта программа в дистрибутивах семейства Ubuntu и её клонах уже давно работает не вполне корректно.