ПРОДВИНУТАЯ СИСТЕМА УПРАВЛЕНИЯ ПАКЕТАМИ
Debian внес в мир Linux массу положительных нововведений, многие из которых были приняты и другими дистрибутивами. Самым значительным усовершенствованием Debian стала система управления пакетами APT. После ее выпуска все остальные дистрибутивы превратились в устаревший хлам. Сегодня APT сложна, умна, гибка и скрывает от непосвященного линуксоида множество секретов.
Сама по себе APT (Advanced Packaging Tool) не является системой управления пакетами в прямом смысле этого слова. Все действия по распаковке, регистрации в системе и ведению базы пакетов выполняют утилиты пакета dpkg, в то время как утилиты 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 — сортирует индексные файлы.
Утилиты опираются на следующие файлы конфигурации:- /etc/apt/sources.list — список источников пакетов (репозиториев);
- /etc/apt/apt.conf — основной файл конфигурации APT;
- /etc/apt/preferences — файл предпочтений, управляет тем, какая версия пакета будет установлена в случае наличия в репозитории сразу нескольких версий;
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 сводит процесс «общения» с АРТ-утилитами к кликанью по галочкам графического интерфейса. В нем есть собственный, предельно простой менеджер пакетов (так и называется — Package Manager), запускающийся по cron'у менеджер обновлений Update Manager, графический установщик вручную загруженных deb-пакетов GDebi и более мощная графическая надстройка над АРТ-утилитами Synaptic. Между тем, 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 ключ», но такой способ редко практикуется из-за неудобства. В подавляющем большинстве случаев ты будешь иметь дело с командой
# 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. Обновить кэш доступных пакетов:
# 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 в привод и выполняешь команду:
# apt-cdrom add
Хитрости и нестандартные ситуации APT есть APT, удобна и проста, но иногда не обойтись без ухищрений, о самых полезных из которых ты узнаешь из этого раздела.
1. По умолчанию команда «apt-get remove» удаляет пакет полностью только в том случае, если ни один из его файлов не был изменен после установки, иначе измененные файлы остаются нетронутыми. Естественно, конфигурационные файлы меняются почти всегда, поэтому apt-get оставляет после себя кучу мусора, которую приходится убирать руками. Команда «apt-get purge», выполненная вместо «apt-get remove», решает эту проблему.
2. Любители ковыряния в системе, а также системные администраторы, серверы которых подверглись взлому, скорее всего, захотят вернуть пакеты к начальному состоянию, в котором они находились до проведения манипуляций. Поможет в этом команда:
# 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.ххх.ххх— адрес прокси, уууу — порт.
6. Обычно АРТ-утилиты запрашивают самую новую версию пакета из всех, что находятся в его кэше, поэтому если ты добавил в sources. list различные экспериментальные и unstable-репозитории, то после обновления получишь дистрибутив, состоящий исключительно из экспериментальных или unstable-пакетов, и кучу проблем, вызванных таким положением дел. Однако ситуация легко разруливается с помощью помещения в /etc/apt/apt.conf строки:
APT::Default-Release "релиз";
Где релиз — это oldstable, stable, unstable, testing или experimental для Debian или имя релиза для Ubuntu. Теперь, в случае необходимости установить пакет из указанного дистрибутива, нужно просто прописать его имя после аргумента '-t' при вызове apt-get:
# apt-get -t unstable install пакет
7. Все полученные apt-get deb-пакеты хранятся в каталоге /var/cache/apt/archives, а это значит, что в случае переустановки системы ты можешь скопировать содержимое каталога на другой диск/раздел, а после восстановить его и сэкономить время/трафик на установке пакетов. Кроме того, это по сути снапшот твоей установленной системы (той ее части, которую ты установил сам), который можно отнести к другу (вместе с описанным в третьем пункте списком состояний) или, при ненадобности, удалить для освобождения места.
8. Удалённый снапшот системы, описанный в предыдущем пункте, легко восстанавливается с помощью конструкции:
# dpkg --get-selections | grep -v "deinstall" | awk '{print $1}' | xargs dpkg-repack
9. Кроме бинарных пакетов, репозитории Debian/Ubuntu содержат и пакеты с исходными текстами приложений, которые могут быть получены и собраны с использованием команды:
# apt-get -b source имя пакета
Сторонние утилиты Система APT прошла очень долгий путь развития, поэтому помимо официальных утилит, включенных в пакет apt, репозитории Debian и Ubuntu изобилуют массой сторонних утилит, которые могут быть использованы для выполнения некоторых нестандартных задач. Наиболее полезная из них называется apt-file и необходима, как нетрудно догадаться из названия, для определения принадлежности того или иного файла определенному пакету. Устанавливаем:
# 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” или же просто выполнить команду:
# apt-get remove 'deborphan'
По умолчанию deborphan обрабатывает только пакеты, содержащие библиотеки, но такое поведение можно изменить, добавив флаг '-а' к вызову команды:
$ deborphan -a
Не стоит сразу бросаться удалять показанные утилитой пакеты, потому как даже самый мощный эвристический алгоритм не способен определить твои личные потребности. Так, мне программа показала пакеты google-chrome, inkscape и даже xorg.
Утилита apt-move позволит тебе создать локальный репозиторий. Установи программу, открой файл /etc/apt-move.conf, укажи в опции LOCALDIR путь к каталогу, в котором должен располагаться репозиторий, и запусти команду:
# apt-move update
В результате все выкачанные из сети с помощью apt-get пакеты (каталог /var/cache/apt/archives) будут перемещены в указанный в конфиге каталог, для которого будет создан индексный файл. Это удобный способ создания внутрисетевого репозитория для тех случаев, когда массу одинаковых пакетов необходимо установить на множество машин. Для создания локального репозитория также очень удобно применять сервер apt-proxy, позволяющий кэшировать скачиваемые из репозитория deb-пакеты на стороне сервера. Для этого apt-proxy устанавливается на выделенной машине (возможно, шлюзе), а sources.list клиентов модифицируется так, чтобы в качестве поля и uri всех репозиториев был указан адрес этой машины. Как результат, все запросы deb-пакетов перенаправляются к apt-proxy, который запрашивает пакету головного репозитория и сохраняет его в своем кэше, а ответ на все последующие запросы этого пакета будет отдан из кэша. Для начала устанавливаем apt-proxy на выделенной машине:
# apt-get install apt-proxy
Далее открываем файл /etc/apt-proxy/apt-proxy-v2.conf, переходим в секцию [DEFAULT] и заменяем значение опции address на IP-адрес машины, а также описываем используемые apt-proxy источники пакетов, например:
[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:
# invoke-rc.d apt-proxy restart
Чтобы перевести клиентов на использование apt-proxy, берем стандартный sources.list Ubuntu, заменяем все реальные поля uri на
http://IP-aдpec-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 оказались ребятами с несколько извращенным чувством юмора. Чего только стоит результат следующей команды:
# apt-get moo
Ещё более дико выглядит то, что встроили в свою программу создатели aptitude:
# aptitude moo
Этакое пасхальное яйцо без пасхального яйца. Ну, ладно:
# aptitude -v moo
# aptitude -vv moo
# aptitude -vvv moo
# aptitude -vvvv moo
# aptitude -vvvvv moo
# aptitude -vvvvvv moo
Полезные команды apt-cache- apt-cache show пакет —детальная информация о пакете;
- apt-cache showpkg пакет — общая информация о пакете;
- apt-cache depends пакет— список зависимостей пакета;
- apt-cache rdepends пакет — список обратных зависимостей (кому нужен указанный пакет)
Словарь APT- Apt keyring (дословно: связка ключей apt) — хранилище ключей, удостоверяющих подлинность источников пакетов (репозиториев).
- Индексный файл — головной файл репозитория, содержащий название, версию, размер, краткое и полное описание и зависимости для каждого пакета. Носит имя Packages.gz в случае бинарного репозитория и Sources.gz — для репозитория исходных текстов. Создается с помощью утилит pkg-scanpackages и dpkg-scansources.
- Кэш доступных пакетов (или просто кэш) — файл, в котором кэшируется информация обо всех пакетах, доступных из источников, перечисленных в /etc/apt/sources.list. Кэш обновляется во время каждого вызова команды «apt-get update».
- Пакет — программа, библиотека, исходники или любые другие файлы, а также их метаданные, упакованные в особым образом сформированный архив.
- Репозиторий — место хранения deb-пакетов.
Что внутри? Отличительной чертой пакетов формата Deb является их простота. Любой Deb-пакет — это три файла: data.tar.gz, control.tar.gz и debian-binary, запакованные архиватором аг. Файл data.tar.gz — это содержимое пакета (бинарники, man'ы, документация и т.д.), control.tar.gz — метаданные, в простейшем варианте два файла: control, содержащий описание пакета, зависимости, размер и т.д., и md5sums — контрольные суммы всех файлов пакета. Файл debian-binary содержит версию формата Deb-пакета (например, 2.0). Для распаковки пакета можно использовать команду:
$ аг -xv пакет, deb && tar -xzf data.tar.gz
Источник: журнал Хакер №1-2 2010 год