Изучаем возможности менеджера пакетов APT и сопутствующих программ.

Изображение пользователя Fierta.

В связи с тем что некоторые товарищи не понимают что такое apt и dpkg. Решил создать еще одну запись об этих утилитах.

APT и все, все, все. Изучаем возможности менеджера пакетов APT и сопутствующих программ

Debian внес в мир Linux массу положительных нововведений, многие из которых были приняты и другими дистрибутивами. Самым значительным усовершенствованием Debian стала система управления пакетами APT, после ее выпуска все остальные дистрибутивы превратились в устаревший хлам. Сегодня APT сложна, умна, гибка и скрывает от непосвященного линуксоида множество секретов.

Продвинутая система управления пакетами

Сама по себе APT (Advanced Packaging Tool) не является системой управления пакетами в прямом смысле этого слова. Все действия по распаковке, регистрации в системе и видению базы пакетов выполняют утилиты пакета dpkg, в то время как утилиты APT представляют собой обертку, с помощью которой осуществляется поиск пакетов, сверка контрольных сумм, выкачивание из репозитория, разрешение зависимостей, а также ряд других действий.

APT включает в себя следующий набор утилит:

Утилиты пакета apt

apt-cache - манипулирует кэшем доступных пакетов, обычно используется
для поиска пакета и/или получения информации о нем

apt-cdrom - позволяет добавить CD/DVD-диск в качестве источника пакетов (репозитория)

apt-config - читает значения опций, заданных в конфигурационном
файле /etc/apt/apt.conf, используется другими APT-утилитами

apt-extracttemplates - извлекает конфигурационные файлы DebConf
из пакетов, используется другими APT-утилитами

apt-ftparchive - создает индексные файлы

apt-get - устанавливает, удаляет, обновляет список пакетов
и сами пакеты, центральная APT-утилита

apt-key - управляет ключами аутентификации, используемыми для проверки
подлинности источников пакетов

apt-secure - проверяет подлинности цифровой подписи пакетов apt, входящих
в состав дистрибутива и репозиториев

apt-sortpkgs - сортирует индексные файлы

Утилиты опираются на следующие файлы конфигурации:

Конфигурационные файлы APT

/etc/apt/sources.list - список источников пакетов (репозиториев)
/etc/apt/apt.conf - основной файл конфигурации APT
/etc/apt/preferences - файл предпочтений, управляет тем, какая версия пакета будет
установлена в случае наличия в репозитории сразу нескольких версий

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

Основные команды APT

apt-cache search маска - поиск пакета
apt-cache show пакет - просмотр информации о пакете
apt-get install пакет - установка пакета
apt-get remove пакет - удаление пакета
apt-get update - обновление кэша доступных пакетов
apt-get upgrade - обновление всех пакетов

Последние две команды обычно выполняются одна за другой, в результате чего переустанавливаются все пакеты, для которых в репозитории доступны новые версии. Если же необходимо обновить только указанный пакет, то после «apt-get update» следует выполнить команду «apt-get install пакет».

Дистрибутив Ubuntu делает процесс "общения" с APT-утилитами еще более простым и сводит его к кликанью по галочкам графического интерфейса. В нем есть собственный, предельно простой, менеджер пакетов (так и называется "Package Manager"), запускающийся по cron'у менеджер обновлений Update Manager, графический установщик вручную загруженных deb-пакетов GDebi и более мощная графическая надстройка над APT-утилитами Synaptic.

Между тем, APT гораздо сложнее и гибче, чем это может показаться на первый взгляд. Поэтому в следующих разделах мы рассмотрим несколько не совсем типичных приемов ее использования.

Сторонние источники пакетов

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

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

1. Добавить ссылку на репозиторий в файл /etc/apt/sources.list в следующем формате:

deb uri дистрибутив [компонент1] [компонент2] [...]

Поле uri - это адрес репозитория, который в большинстве случаев является HTTP-адресом, но может быть и ссылкой на локальный репозиторий (file:/root/repository), адресом репозитория на FTP или SSH-сервере. В поле "дистрибутив" указывается имя дистрибутива, для которого собраны пакеты. Для Debian имя может быть одним из stable, oldstable, unstable, testing, в то время как в случае Ubuntu следует указывать только конкретное наименование дистрибутива (например, jaunty), а также различные обозначения на его основе (например, jaunty-updates, jaunty-backports, jaunty-security). Надо сказать, что APT совсем не против того, чтобы смешивать пакеты различных дистрибутивов на одной системе, но за последствия в этом случае будешь отвечать только ты. Компонент обычно носит имя main, contrib или non-free для Debian и main, universe, multiverse, partner и restricted для Ubuntu. Все это имена различных репозиториев пакетов, которые обособлены только для того, чтобы разделить пакеты на основе каких-либо критериев. Например main - это пакеты, собираемые группой разработчиков Ubuntu/Debian, на качество ПО, содержащегося в них, есть определенные гарантии, включая своевременные обновления и багфиксы, в то время как contrib и universe - это стороннее ПО, которое ты устанавливаешь на свой страх и риск.

2. Добавить в apt keyring публичный ключ репозитория, используемый для удостоверения его подлинности и надежности. Ключ можно получить любыми способами и добавить, выполнив команду «apt-key add ключ», но такой способ редко практикуется из-за неудобства. В подавляющем большинстве случаев ты будешь иметь дело с командой

sudo apt-key adv --keyserver сервер-сертификации --recv-keys ID-ключа
которая запрашивает ключ напрямую у сервера сертификации (для Ubuntu это keyserver.ubuntu.com). Именно так большинство сторонних разработчиков распространяют свое ПО для дистрибутивов Debian/Ubuntu (при этом остальные просто выкладывают пакеты и их контрольные суммы). Например, зайдя на страничку интересующего тебя проекта на хостинге launchpad.net и нажав на ссылку "Technical details about this PPA", ты увидишь строку, которую необходимо добавить в /etc/apt/sources.list, в "Signing key:" будет указан ID ключа.

3. Обновить кэш доступных пакетов:

sudo apt-get update
4. Установить пакет, используя команду «apt-get install пакет».

Многие девелоперы помещают ссылку на репозиторий и ID его ключа прямо в deb-пакет, поэтому после скачивания пакета, установки и выполнения команды «apt-get update && apt-get upgrade» пакеты будут обновлены вместе с их собратьями, перечисленными в sources.list. В частности, так распространяются браузеры opera и альфа-релиз google chrome.

Репозиторий, располагающийся на компакт-диске, добавить в sources.list намного проще. Для этого есть специальная команда apt-cdrom. Ты просто вставляешь CD в привод и выполняешь команду:

sudo apt-cdrom add

Хитрости и нестандартные ситуации

APT есть APT, она удобна и проста, но иногда не обойтись без ухищрений, о самых полезных из которых ты узнаешь из этого раздела.

1. По умолчанию команда «apt-get remove» удаляет пакет полностью только в том случае, если ни один из его файлов не был изменен после установки, иначе измененные файлы остаются нетронутыми. Естественно, конфигурационные файлы меняются почти всегда, поэтому apt-get оставляет после себя кучу мусора, которую приходится убирать руками. Команда «apt-get purge», выполненная вместо «apt-get remove», решает эту проблему.

2. Любители ковыряния в системе, а также системные администраторы, серверы которых подверглись взлому, скорее всего захотят вернуть пакеты к начальному состоянию, в котором они находились до проведения манипуляций. Поможет в этом команда:

sudo apt-get install --reinstall пакет
3. Более низкоуровневые утилиты управления deb-пакетами (такие, как dselect и dpkg) ведут специальный список состояний пакетов, который может использоваться для управления тем, какие пакеты должны быть установлены или удалены в пакетном режиме (именно так работает связка dselect + dpkg). Его же можно использовать для многих других целей, например, для переноса конфигурации системы на другую машину. Выполни следующую команду:

dpkg --get-selections > file
Перенеси файл на другую машину и выполни на ней две команды:

cat file > dpkg --set-selections
apt-get dselect-upgrade

В систему будут добавлены все пакеты системы-источника. Чтобы файл состояний пакетов также содержал информацию о том, какие пакеты следует удалить из системы, добавь символ "\*" после аргумента '--get-selections'. Список состояний не содержит версии пакетов, это можно использовать после установки более новой версии дистрибутива для приведения его к требуемому состоянию.

4. Ты вручную наложил заплатку на файл одного из системных пакетов и не хочешь, чтобы этот пакет был обновлен (с уничтожением всех твоих изменений) после вызова «apt-get upgrade». В этом случае тебе на помощь вновь придет список состояний. Пакет может быть "заморожен", в результате чего apt-get откажется его обновлять и пропустит:

echo -e "coreutils hold" | dpkg --set-selections
Принудительно обновить пакет можно с помощью указания флага '-u' при вызове apt-get.

5. Как и любая система, обладающая сетевым функционалом, APT позволяет использовать прокси для доступа к репозиториям. Чтобы задействовать эту возможность, пропиши в файл /etc/apt/apt.conf следующую строку:

Acquire::http::Proxy "http://xxx.xxx.xx:yyyy"

Где xxx.xxx.xx - имя твоего прокси, yyyy - порт.

6. Обычно APT-утилиты запрашивают самую новую версию пакета из всех, что находятся в его кэше, поэтому если ты добавил в sources.list различные экспериментальные и unstable-репозитории, то после обновления получишь дистрибутив, состоящий исключительно из экспериментальных или unstable-пакетов, и кучу проблем, вызванных таким положением дел. Однако ситуация легко разруливается с помощью помещения в /etc/apt/apt.conf следующей строки:

APT::Default-Release "релиз";

Где релиз - это oldstable, stable, unstable, testing или experimental для Debian или имя релиза для Ubuntu. Теперь, в случае необходимости установить пакет из указанного дистрибутива, просто пропиши его имя после аргумента '-t' при вызове apt-get:

sudo apt-get -t unstable install пакет
7. Все полученные apt-get deb-пакеты хранятся в каталоге /var/cache/apt/archives, а это значит, что в случае переустановки системы ты можешь скопировать содержимое каталога на другой диск/раздел, а после восстановить его и сэкономить время/трафик на установке пакетов. Кроме того, это по сути снапшот твоей установленной системы (той ее части, которую ты установил сам), который можно отнести к другу (вместе с описанным в третьем пункте списком состояний) или, при ненадобности, удалить для освобождения места.

8. Удаленный снапшот системы, описанный в предыдущем пункте, легко восстанавливается с помощью приведенной ниже конструкции:

sudo dpkg --get-selections | grep -v "deinstall" | \
awk '{print $1}' | xargs dpkg-repack

9. Кроме бинарных пакетов, репозитории Debian/Ubuntu содержат и пакеты с исходными текстами приложений, которые могут быть получены и собраны с использованием следующей команды:

sudo apt-get -b source имяпакета

Сторонние утилиты

Система APT прошла очень долгий путь развития, поэтому помимо официальных утилит, включенных в пакет apt, репозитории Debian и Ubuntu изобилуют массой сторонних утилит, которые могут быть использованы для выполнения некоторых нестандартных задач.
Наиболее полезная из них называется apt-file и необходима, как нетрудно догадаться из названия, для определения принадлежности того или иного файла определенному пакету. Устанавливаем:

sudo apt-get install apt-file
Просим apt-file создать кэш всех файлов, установленных в системе пакетов (по нему будет производиться поиск):

apt-file update

Ищем:

apt-file search /usr/bin/apt-get
apt: /usr/bin/apt-get

Запрашиваем список всех файлов пакета:

apt-file list apt

Простая утилита apt-show-versions покажет, какие пакеты можно обновить, с указанием версий и других данных. Запусти ее с флагом '-u', чтобы получить список только подлежащих обновлению пакетов (вместо списка всех пакетов).

Если ты установил большое количество различных пакетов и теперь хочешь избавиться от ненужного хлама, то в этом деле поможет утилита deborphan, которая производит поиск неиспользуемых пакетов и осиротевших зависимостей. Просто запусти deborphan без аргументов, и ты увидишь список пакетов, который тут же можно передать на вход команде «apt-get remove» или же просто выполнить такую команду:

sudo apt-get remove `deborphan`

По умолчанию deborphan обрабатывает только пакеты, содержащие библиотеки, но такое поведение можно изменить, добавив флаг '-a' к вызову команды:

deborphan -a

Не стоит сразу бросаться удалять показанные утилитой пакеты, потому как даже самый мощный эвристический алгоритм не способен определить твои личные потребности. Так, мне программа показала пакеты google-chrome, inkscape и даже xorg.

Утилита apt-move позволит тебе создать локальный репозиторий. Установи программу, открой файл /etc/apt-move.conf, укажи в опции LOCALDIR путь к каталогу, в котором должен располагаться репозиторий, и запусти команду:

sudo apt-move update

В результате все выкачанные из Сети с помощью apt-get пакеты (каталог /var/cache/apt/archives) будут перемещены в указанный в конфиге каталог, для которого будет создан индексный файл. Это удобный способ создания внутрисетевого репозитория для тех случаев, когда массу одинаковых пакетов необходимо установить на множество машин.

Для создания локального репозитория также очень удобно применять сервер apt-proxy, позволяющий кэшировать скачиваемые из репозитория deb-пакеты на стороне сервера. Для этого apt-proxy устанавливается на выделенной машине (возможно шлюзе), а sources.list клиентов модифицируется так, чтобы в качестве поля uri всех репозиториев был указан адрес этой машины. Как результат, все запросы deb-пакетов перенаправляются к apt-proxy, который запрашивает пакет у головного репозитория и сохраняет его в своем кэше, а ответ на все последующие запросы этого пакета будет отдан из кэша.

Для начала устанавливаем apt-proxy на выделенной машине:

sudo apt-get install apt-proxy

Далее открываем файл /etc/apt-proxy/apt-proxy-v2.conf, переходим в секцию [DEFAULT] и заменяем значение опции address на IP-адрес машины, а также описываем используемые apt-proxy источники пакетов, например:

sudo vi /etc/apt-proxy/apt-proxy-v2.conf

[ubuntu]
backends = http://ru.archive.ubuntu.com/ubuntu/
min_refresh_delay = 1d

[ubuntu-security]
backends = http://security.ubuntu.com/ubuntu/
min_refresh_delay = 1d

Обычно этих двух адресов достаточно для покрытия всего спектра пакетов, предоставляемого разработчиками Ubuntu. Перезапускаем apt-proxy:

sudo invoke-rc.d apt-proxy restart

Чтобы перевести клиентов на использование apt-proxy, берем стандартный sources.list Ubuntu, заменяем все реальные поля uri на "http://IP-адрес-apt-proxy:9999/ubuntu/" и копируем этот файл на каждый клиент.

Существует и множество других, менее интересных утилит, работающих в связке с APT. Например, apt-dater позволяет производить обновление пакетов на большом количестве удаленных узлов, используя псевдографический интерфейс. Программа aptsh реализует командный интерфейс, подобный sh, поверх команд пакета apt, aptfs - виртуальная файловая система для управления APT. Утилита debdelta, позволяющая обновлять пакеты с помощью выкачивания из Сети их дельт, могла бы стать темой для отдельной статьи, если бы для нее существовал хотя бы один своевременно обновляемый репозиторий.

Aptitude

Утилита apt-get и ее родственники - не единственная из доступных реализация APT. Еще более мощная, удобная и универсальная альтернатива им зовется aptitude и представляет собой концентрированный в одном месте функционал apt-get, apt-cache и dselect.
Aptitude позволяет устанавливать/удалять, искать, обновлять и производить массу других действий с пакетами, используя два типа интерфейса: командный режим, сходный с apt-get и apt-cache, и режим с псевдографическим интерфейсом, внешне напоминающий интерфейс dselect, но гораздо более удобный и функциональный.

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

aptitude install - установка пакета

aptitude remove - удаление пакета и осиротевших зависимостей

aptitude purge - удаление пакета, осиротевших зависимостей
и оставшихся после них конфигурационных файлов

aptitude search - поиск пакета в кэше (списке доступных пакетов)

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

aptitude safe-upgrade - обновление пакетов

aptitude clean - удаление ранее скачанных пакетов

aptitude full-upgrade - обновление пакетов,
даже если это действие требует удаления каких-либо пакетов

aptitude show - информация о пакете

aptitude autoclean - удаление устаревших пакетов

aptitude hold - установка запрета на обновление пакета

Интерактивный режим, доступный при запуске aptitude без аргументов, позволяет выполнить все те же действия, используя псевдографический интерфейс, построенный на базе библиотеки ncurses. Он работает в пакетном режиме (выбрал пакеты - запустил процесс установки), поэтому будет удобен в тех случаях, когда требуется установить большое количество пакетов.

Пасхальные яйца

Разработчики утилит APT оказались ребятами с несколько извращенным чувством юмора. Чего только стоит результат следующей команды:

sudo apt-get moo
Еще более дико выглядит то, что встроили в свою программу создатели aptitude. Попробуй:

sudo aptitude moo
Этакое пасхальное яйцо без пасхального яйца. Ну ладно:

sudo aptitude -v moo
sudo aptitude -vv moo
sudo aptitude -vvv moo
sudo aptitude -vvvv moo
sudo aptitude -vvvvv moo

И финальный аккорд:

sudo aptitude -vvvvvv moo

Полезные команды apt-cache

apt-cache show пакет - детальная информация о пакете
apt-cache showpkg пакет - общая информация о пакете
apt-cache depends пакет - список зависимостей пакета
apt-cache rdepends пакет - список обратных зависимостей (кому нужен указанный пакет)

Словарь APT

Пакет - программа, библиотека, исходники или любые другие файлы, а также их метаданные, упакованные в особым образом сформированный архив.

Репозиторий - место хранения deb-пакетов.

Кэш доступных пакетов (или просто кэш) - файл, в котором кэшируется информация обо всех пакетах, доступных из источников, перечисленных в /etc/apt/sources.list. Кэш обновляется во время каждого вызова команды «apt-get update».

Индексный файл - головной файл репозитория, содержащий название, версию, размер, краткое и полное описание и зависимости для каждого пакета. Носит имя Packages.gz в случае бинарного репозитория и Sources.gz для репозитория исходных текстов. Создается с помощью утилит pkg-scanpackages и dpkg-scansources.

Apt keyring (дословно: связка ключей apt) - хранилище ключей, удостоверяющих подлинность источников пакетов (репозиториев).

Что внутри?

Отличительной чертой пакетов формата Deb является их простота. Любой Deb-пакет - это три файла: data.tar.gz, control.tar.gz и debian-binary, запакованные архиватором ar. Файл data.tar.gz - это содержимое пакета (бинарники, man'ы, документация и т.д.), control.tar.gz - метаданные, в простейшем варианте два файла: control, содержащий описание пакета, зависимости, размер и т.д., и md5sums - контрольные суммы всех файлов пакета. Файл debian-binary содержит версию формата Deb-пакета (например, 2.0). Для распаковки пакета можно использовать команду:

ar -xv пакет.deb && tar -xzf data.tar.gz

Advanced Packaging Tool - высокоуровневый инструмент для работы с пакетами.

Работа с пакетами при помощи dpkg.

dpkg представляет собой основную программу в системе для работы с пакетами Debian. При наличии пакетов .deb именно dpkg позволяет их установить или проанализировать их содержимое. Однако эта программа имеет только частичное представление о мире Debian: она знает, что установлено в системе, а также всё, что передано ей в командной строке, но она ничего не знает о других доступных пакетах. Поэтому она завершится с ошибкой, если обнаружит неудовлетворённую зависимость. Такие инструменты как apt, напротив, автоматически создадут список зависимостей, чтобы установить всё по возможности автоматически.

dpkg или apt?

dpkg стоит рассматривать как низкоуровневый инструмент (движок), а apt — как инструмент, более близкий к пользователю, обходящий ограничения первого. Эти инструменты работают совместно, каждый со своей спецификой, заточенный под определённый круг задач.

Установка пакетов

dpkg — это, прежде всего, инструмент для установки уже доступных пакетов Debian (поскольку он ничего не загружает). Чтобы установить пакет, используется опция -i или --install.

Установка пакета при помощи dpkg

Мы можем видеть каждый этап, выполняемый dpkg, поэтому мы знаем, в каком месте могла произойти какая-либо ошибка. Установку также можно выполнить в два этапа: сперва распаковка, затем конфигурация. Благодаря этому apt-get делает меньше обращений к dpkg (каждый такой запрос является дорогостоящей операцией из-за необходимости загрузки в память базы данных, включая весь список уже установленных файлов).

Раздельная распаковка и настройка

Иногда dpkg по той или иной причине не может установить пакет и возвращает ошибку; если пользователь даёт указание проигнорировать эту ошибку, будет выдано лишь предупреждение; для этого существуют различные опции --force-*. Команда dpkg --force-help, или документация этой команды, выдаст полный список таких опций. Самой частой ошибкой, с которой вам придётся рано или поздно столкнуться, является конфликт файлов. Когда пакет содержит файл, который уже установлен другим пакетом, dpkg откажется устанавливать его, и мы получим такое сообщение:

Распаковывается пакет libgdm (из файла .../libgdm_3.8.3-2_amd64.deb) …
dpkg: ошибка при обработке параметра /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
попытка перезаписать «/usr/bin/gdmflexiserver», который уже имеется в пакете gdm3 3.4.1-9

В этом случае, если вы считаете, что замена этого файла не представляет существенной опасности для стабильности вашей системы (зачастую это именно так), вы можете использовать опцию --force-overwrite, которая сообщит dpkg о необходимости проигнорировать эту ошибку и перезаписать файл.
Хотя есть много опций --force-*, только --force-overwrite рекомендуется для регулярного использования. Остальные предназначены только для исключительных случаев, и лучше не трогать их, пока это возможно, чтобы соблюдать правила, заложенные при создании пакета. Не забывайте, что эти правила являются гарантией целостности и стабильности системы.

ВНИМАНИЕ! Эффективное использование --force-*

Если вы не будете осторожны, использование опции --force-* может привести к тому, что команды APT перестанут работать. Некоторые из этих опций позволяют установить пакет с неудовлетворёнными зависимостями или при наличии конфликта. В результате согласованность системы с точки зрения зависимостей нарушается, и команды APT откажутся выполнять какие-либо действия кроме тех, которые вернут систему в согласованное состояние (это обычно сводится к установке отсутствующей зависимости или удалению проблемного пакета). Вот пример сообщения, сигнализирующего о такой ошибке, которое получено после установки новой версии rdesktop с игнорированием зависимости от более новой версии libc6:

apt full-upgrade

Возможно, для исправления этих ошибок вы захотите воспользоваться «apt-get -f install».
Пакеты, имеющие неудовлетворённые зависимости:
  rdesktop: Зависит от: libc6 (>= 2.5) но 2.3.6.ds1-13etch7 уже установлен
E: Неудовлетворённые зависимости.

Попытайтесь использовать -f.
Бесстрашные администраторы, уверенные в правильности своего анализа ситуации, могут проигнорировать предупреждение о проблеме зависимостями или конфликте, используя соответствующую опцию --force-*. В этом случае, если необходимо продолжать использовать apt или aptitude, нужно отредактировать /var/lib/dpkg/status и удалить/изменить зависимость или конфликт.
Редакрирование данного файла — это грязный хак, и не стоит прибегать к нему, кроме как в самых крайних случаях. Зачастую лучшим решением является пересборка пакета, вызывающего проблему, «Пересборка пакета из его исходного кода») или использование его новой версии (вероятно исправленной) из такого репозитория как stable-backports (см. Раздел 6.1.2.4, «Стабильное ПО с обратной совместимостью»).

Удаление пакета

Запуск dpkg с опцией -r или --remove, за которой следует имя пакета, приведет к удалению этого пакета. Это удаление, однако, не полное: все конфигурационные файлы, сценарии сопровождающего, файлы журналов (системные журналы) и другие пользовательские данные, используемые этим пакетом, останутся. Таким путём легко избавиться от программы, деинсталлировав её, но при этом сохраняется возможность установить её ещё раз с той же конфигурацией. Для полного удаления всего, связанного с пакетом, используется опция -P или --purge, сопровождающаяся именем пакета.

Полное удаление пакета debian-cd

Запросы к базе данных dpkg и анализ файлов .deb

Для большинста опций существуют «длинные» (одно или несколько слов, перед которыми ставится двойной дефис) и «короткие» варианты (одна буква, часто первая буква «длинного» варианта, после одного дефиса). Это соглашение так распространено, что уже является стандартом POSIX.
Прежде чем завершить этот раздел, рассмотрим опции dpkg для запросов к внутренней базе данных для получения различной информации. При этом сперва будут указываться длинные, а затем соответствующие короткие опции (которые, разумеется, принимают те же самые аргументы). Так, --listfiles пакет (или -L) выводит список файлов, установленых пакетом; --search файл (или -S) ищет пакет, к которому относится этот файл; --status пакет (or -s) выводит информацию о том или ином установленном пакете; --list (или -l) показывает список пакетов, известных системе, и их статус; --contents file.deb (или -c) показывает список файлов в этом пакете; --info file.deb (или -I) показывает информацию о пакете Debian.

Получение информации с помощью dpkg

УГЛУБЛЯЕМСЯ: Сравнение версий

Так как dpkg является программой для работы с пакетами Debian, она, помимо всего прочего, содержит эталонную реализацию логики сравнения номеров версий. Поэтому у неё есть опция --compare-versions, используемая внешними программами (главным образом — сценариями настройки, запускаемыми самой dpkg). Для этой опции требуются три параметра: номер версии, оператор сравнения и второй номер версии. Допустимые операторы сравнения — lt (строго меньше), le (меньше или равна), eq (равна), ne (не равна), ge (больше или равна), и gt (строго больше). Если сравнение верно, dpkg возвращает 0 (успех), если нет, то ненулевое значение (признак ошибки).

$ dpkg --compare-versions 1.2-3 gt 1.1-4
$ echo $?
0

$ dpkg --compare-versions 1.2-3 lt 1.1-4
$ echo $?
1

$ dpkg --compare-versions 2.6.0pre3-1 lt 2.6.0-1
$ echo $?
1

Обратите внимание на неожиданный сбой последнего сравнения: для dpkg буквы pre, обозначающие, как правило, предварительный выпуск, не имеет никакого особого значения, и буквенные символы сравниваются таким же образом, как и числа (a < b < c ...), в алфавитном порядке. Именно поэтому dpkg считает, что «0pre3» больше, чем «0». При необходимости указать в номере версии, что она относится к предварительному выпуску, используется символ тильды «~»:

$ dpkg --compare-versions 2.6.0~pre3-1 lt 2.6.0-1
$ echo $?
0

Файл журнала dpkg

dpkg сохраняет журнал всех своих действий в /var/log/dpkg.log. Этот журнал чрезвычайно подробный: в нём задокументированы все этапы обработки пакетов dpkg. Этот журнал помогает не только отследить поведение dpkg, но и сохранить историю изменений в системе: можно найти точный момент, когда каждый пакет был установлен или обновлён, и эта информация может быть чрезвычайно полезной при выяснении причин изменения поведения системы в целом. Кроме того, ведётся запись информации обо всех версиях, и её легко сверить с changelog.Debian.gz из соответствующего пакета или с отчётами об ошибках онлайн.

Поддержка мультиархитектуры

Все пакеты Debian имеют поле Architecture в своих метаданных. Это поле может содержать либо значение «all» (для пакетов, которые не зависят от архитектуры), либо название конкретной архитектуры, для которой пакет предназначен (например «amd64», «armhf», …). В последнем случае dpkg по умолчанию допустит установку пакета только в том случае, если его архитектура соответствует архитектуре системы, возвращаемой dpkg --print-architecture.
Это ограничение гарантирует, что в системе не окажется двоичных файлов, скомпилированных для неправильной архитектуры. Всё было бы прекрасно, но на (некоторых) компьютерах можно запускать двоичные файлы для разных архитектур, нативно (к примеру, на системах «amd64» работают двоичные файлы для «i386») или через эмуляторы.

Включение мультиархитектуры

Поддержка мультиархитектуры dpkg позволяет определять «чужеродные архитектуры», которые могут быть установлены в данной системе. Это легко сделать с помощью dpkg --add-architecture, как показано в примере ниже. Существует и соответствующая команда dpkg --remove-architecture для отключения поддержки чужеродной архитектуры, но её можно использовать только в том случае, когда в системе не осталось ни одного пакета этой архитектуры.

dpkg --print-architecture
amd64

dpkg --print-foreign-architectures

dpkg --add-architecture armhf
dpkg --add-architecture armel
dpkg --print-foreign-architectures
armhf
armel

dpkg --remove-architecture armel
dpkg --print-foreign-architectures
Поддержка мультиархитектуры в APT

APT автоматически определит, если dpkg будет настроен на поддержку чужеродных архитектур, и начнёт загрузку соответствующих файлов Packages в процессе обновления.
Чужеродные пакеты можно установить при помощи команды apt install пакет:архитектура.

Использование собственнических двоичных файлов i386 в системах amd64

Есть несколько случаев, когда может пригодиться мультиархитектура, но самым распространённымным из них является обеспечение возможности запуска 32-битных файллов (i386) на 64-битных системах (amd64), в частности потому что некоторые популярные собственнические приложения (вроде Skype) доступны только в виде 32-разрядных версий.

Изменения, связанные с мультиархитектурой

Чтобы сделать мультиархитектурную поддержку по-настоящему полезной, библиотеки требовалось перепаковать, переместив их в каталог, соответствующий архитектуре, чтобы можно было установить несколько копий (для разных архитектур) одновременно. Такие обновлённые пакеты содержат заголовок "Multi-Arch: same", указывающий системе управления пакетами, что разные архитектуры пакетов можно устанавливать совместно (и что эти пакеты могут удовлетворять зависимости только пакетов той же архитектуры). Так как поддержка мультиархитектуры была добавлена только в Debian Wheezy, ещё не все библиотеки преобразованы.

Используйте параметр --help для вывода справки по запросам пакетов.

Стоит отметить, что для пакетов с полем Multi-Arch: same следует указывать имена с названием архитектуры, чтобы их можно было однозначно идентифицировать. Они также могут иметь общие файлы с другими экземплярами того же пакета; dpkg в этом случае гарантирует, что все пакеты имеют бит-в-бит идентичные общие файлы. Все экземпляры пакета должны быть одной и той же версии, так что и обновляться они должны вместе.
Поддержка мультиархитектуры также привносит некоторые интересные особенности в механизм обработки зависимосей. Для удовлетворения зависимости требуется либо пакет, помеченный «Multi-Arch: foreign», или пакет с такой же архитектурой (при разрешении зависимости архитектуро-независимые пакеты считаются имеющими ту же архитектуру, что и система). Зависимость может также быть ослаблена, чтобы позволить пакету любой архитектуры удовлетворять её, с помощью синтаксиса пакет:any, но но чужеродные пакеты могут удовлетворять такую зависимость, только если они помечены «Multi-Arch: allowed».

Использованные материалы:
Изучаем возможности менеджера пакетов APT и сопутствующих программ
Настольная книга администратора Debian

Комментарии (17)

+1
lord_i - 17 Январь, 2017 - 20:38
Изображение пользователя lord_i.

Очень полезно. Спасибо.

0
Fierta - 17 Январь, 2017 - 20:42
Изображение пользователя Fierta.

Пож-ста :)

0
Kubuntuser - 18 Январь, 2017 - 10:40

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

+4
dyug - 18 Январь, 2017 - 17:17

Не читал(прокручивал до плюса) , но очень и очень одобряю. :-)

+3
Yuris73 - 19 Январь, 2017 - 11:20
Изображение пользователя Yuris73.

Спасибо за труды, полезная информация.
А вот в 16.10 я заметил, что работает и просто команда apt:
apt 1.3.3 (amd64)
Использование: apt [параметры] команда

apt — менеджер пакетов с интерфейсом командной строки, предоставляет команды
для поиска и управления, а также запросов информации о пакетах.
Он выполняет те же задачи, что и специализированные инструменты APT,
например apt-get и apt-cache, но содержит параметры, которые больше
подходят для интерактивного использования по умолчанию.

Основные команды:
  list - показать список пакетов из указанных имён пакетов
  search - искать в описаниях пакетов
  show - показать дополнительные данные о пакете
  install - установить пакеты
  remove - удалить пакеты
  autoremove - автоматически удалить все неиспользуемые пакеты
  update - обновить список доступных пакетов
  upgrade - обновить систему, устанавливая/обновляя пакеты
  full-upgrade - обновить систему, удаляя/устанавливая/обновляя пакеты
  edit-sources - редактировать файл с источниками пакетов

Дополнительную информацию о доступных командах смотрите в apt(8).
Параметры настройки и синтаксис описаны в apt.conf(5).
Информацию о том, как настроить источники, можно найти в sources.list(5).
Выбор пакетов и версий описывается через apt_preferences(5).
Информация о безопасности доступна в apt-secure(8).
                    В APT есть коровья СУПЕРСИЛА.

0
Templar - 6 Март, 2017 - 13:36

Кстати, да. Где-то читал, что "apt" пришел на смену "apt-*". Посему хотелось бы подобной статьи об "apt"

0
Templar - 12 Март, 2017 - 12:09

Спасибо, но там в самом начале сразу предупреждается:
Утилиту apt в реализации для Mint не следует путать ни с одноимённым пакетом, входящим в состав всех deb based дистрибутивов (в том числе и в Mint), ни с одноимённой же утилитой из этого пакета.
Так что статья, к сожалению, не о "нашем" apt.

+1
Walter oDim - 21 Январь, 2017 - 10:01
Изображение пользователя Walter oDim.

aptitude в настоящее время не рекомендован к использованию. Им можно наломать дров, мягко говоря.

Кроме того apt install/remove/purge работает быстрее apt-get и отображает прогресс задачи.

+1
dyug - 21 Январь, 2017 - 10:13

aptitude в настоящее время не рекомендован к использованию.
КЕМ?
Им можно наломать дров, мягко говоря.
подробности и факты, а не "данные разведывательного общества США" (с) не мое

-1
Walter oDim - 26 Январь, 2017 - 13:38
Изображение пользователя Walter oDim.

В Debian Handbook указано, что apt - единственный рекомендованный интерфейс. В дебиановскую рассылку постоянно пишут люди, поимевшие проблем с разрешением зависимостей в aptitude, в ответ на что им рекомендуют использовать apt. Мне тоже приходилось сталкиваться с неразрешёнными зависимостями, в результате пришлось полностью удалить aptitude от греха подальше. Большинство разработчиков пакетов не проверяют как будут вести себя их зависимости в aptitude. Более того, никто из разработчиков и добровольных тестеров Kubuntu не тестирует установку и обновление в aptitude. Aptitude уже много лет удалён из дефолтной поставки в Ubuntu. Почему? Угадайте с трёх раз. Вдобавок aptitude медленне apt и не имеет функциональности эквивалентной apt source. Выбор за вами.

+2
DarkneSS - 26 Январь, 2017 - 21:52
Изображение пользователя DarkneSS.

Большинство разработчиков пакетов не проверяют как будут вести себя их зависимости в aptitude.
99 % разработчиков пакетов не проверяют, как будут вести себя их зависимости в каком бы то ни было пакетном менеджере. Зависимости или разрешаются алгоритмически, или нет.
Более того, никто из разработчиков и добровольных тестеров Kubuntu не тестирует установку и обновление в aptitude.
ЛПП
Aptitude уже много лет удалён из дефолтной поставки в Ubuntu. Почему?
Апт удалить затруднительно, а в дефолтной поставке не должно быть дублирующихся инструментов.
Вдобавок aptitude медленне apt
И функциональнее.
и не имеет функциональности эквивалентной apt source.
Поднимите руки, кто пользовался. А поиском в aptitude?

0
Walter oDim - 27 Январь, 2017 - 18:08
Изображение пользователя Walter oDim.

Поднимите руки, кто пользовался.
Я пользуюсь. Уже более 7 лет занимаюсь опакечиванием программ своих и чужих.
А поиском в aptitude?
Если вам так нравится поиск в aptitude, то должна понравится и команда apt list. Намного удобнее, на мой взляд, а главное быстрее.

0
DarkneSS - 27 Январь, 2017 - 19:15
Изображение пользователя DarkneSS.

Я всего лишь 5 лет.

-1
dyug - 27 Январь, 2017 - 11:16

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

0
Walter oDim - 27 Январь, 2017 - 18:16
Изображение пользователя Walter oDim.

И то и другое является надстройкой над dpkg. Схема разрешения зависимостей у них различается. Цитата:

The first is an algorithm that is also used by programs such as apt-get and synaptic; I will call it “immediate resolution”. It is invoked whenever you select a package for installation interactively, and immediately after one or more packages are marked for installation at the command-line. Immediate resolution is fast and will solve most dependency problems, but it is sometimes unable to find any solution.
The second algorithm, which I will call “interactive resolution”, is invoked when packages have broken dependencies even after immediate resolution. It can resolve more dependencies, it allows you to review a solution before applying it, and it allows you to provide feedback to the resolver, guiding it towards a better solution.

Работает всё это вовсе не так хорошо и складно, как описывается. У aptitude всегда были проблемы с разрешением циклических зависимостей, отсюда и интерактивный костыль, зачастую предлагающий абсурдные варианты.

Кроме того, мне приходилось видеть исходный код и того и другого. Поэтому могу вас заверить: никакого apt в aptitude и рядом не лежало.

0
dyug - 27 Январь, 2017 - 18:32

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

Будем соревноваться в минусовании? :-(

Интересно, с чем был связан перерыв в 4 года?:-)

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры