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


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

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

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

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

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

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

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

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

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

Последние две команды обычно выполняются одна за другой, в результате чего переустанавливаются все пакеты, для которых в репозитории доступны новые версии. Если же необходимо обновить только указанный пакет, то после «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 без аргументов, позволяет выполнить все те же действия, используя псевдографический интерфейс, построенный на базе библиотеки 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

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

Репозиторий - место хранения 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

INFO

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

APT был разработан для дистрибутива Debian и использования совместно с системой управления deb-пакетами. Сегодня используется в Debian-клонах Ubuntu Mepis, Xandros и некоторых дистрибутивах на базе системы управления пакетами RPM (ALT Linux).


Источник xakep.ru