О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

24.07.2008

Debian и другие: инструментарий apt

Citkit, 23 марта 2006 г

Набор apt (Advanced Packaging Tools), как следует из его названия - это программный комплекс, охватывающий все стороны управления пакетами, вплоть даже до их построения из исходных текстов. Он включает в себя почти десяток команд, из которых нынче нас заинтересуют только три - apt-cache, средство работы с кэшем пакетов, apt-get - инструмент для их получения и установки, и apt-build - программа сборки пакета из исходных текстов формата deb-src. Они тесно переплетаются друг с другом, поэтому рассматривать их придется попеременно - примерно в том порядке, как они используются в реальной работе.

Но сначала - несколько слов об общем синтаксисе команд семейства apt. Каждая из этих команд, кроме более или менее многочисленных опций, имеет еще так называемые операторы, предписывающие, что же именно она должна делать, тогда как смысл опций - в уточнении выполняемого действия. Аргументами же команд служат имена пакетов (их значимой части); некоторые операторы аргументов не требуют вообще. Звучит, может быть, не очень понятно, но при рассмотрении примеров все станет ясным.

Назначение команды apt-cache - в получении информации о пакетах, причем не только установленных на локальной машине, но и находящихся в сетевых репозиториях, причем даже при запуске на локальной машине, не обязательно подключенной к сети (хотя в целом без сети использование ее ограничено). Откуда apt-cache берет эту информацию? Из локальной базы данных, создаваемой во время инсталляции системы, и в дальнейшем обновляемой с помощью apt-get, чему служит специальный опертор update.

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

$ sudo apt-get update

Программа устанавливает соединение со всеми репозиториями, перечисленными в файле /etc/apt/sources.list, и приведет локальный кэш пакетов в соответствие с их актуальным состоянием. Что, разумеется, уже предполагает сетевое подключение - иначе базу данных можно было бы обновлять только с установочного компакт-диска или иного локального носителя. Что, впрочем, тоже не возбраняется - при отсутствии сети именно так проще всего обновить систему с дистрибутива более свежей версии на CD или DVD. Только предварительно нужно, во-первых, позаботиться, чтобы CD был правильно описан в файле /etc/fstab, например, вот так:

/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0

Что, впрочем, обычно корректно выполняется на стадии первичной установки. А во-вторых, выполнить такую команду:

$ apt-cdrom add

Ее посредством правильное описание репозитория на новом диске будет добавлено в файл /etc/apt/sources.list lines.

Теперь можно либо заняться установкой отдельных недостающих пакетов, либо произвести тотальное обновление системы. Опять-таки, начать лучше со второго, чему служит цель upgrade. Так что команда:

$ sudo apt-get upgrade

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

Пакеты, скачиваемые при исполнении apt-get upgrade (это относится и к описываемым ниже операторам dist-upgrade и install), помещаются в каталог /var/cache/apt/archives/ - в дальнейшем их можно использовать для создания собственного локального репозитория или репозитория на CD/DVD. Недокачанные же части пакетов обретаются в каталоге /var/cache/apt/archives/partial/ - в случае обрыва соединения (или просто прерывания процесса apt-get upgrade по любой причине, в том числе и клавишной комбинацией Control+C) по восстановлении связи процедура скачивания и установки продолжается, как ни в чем не бывало.

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

$ sudo rm -Rf /var/cache/apt/archives/*

либо тем же apt-get с оператором clean или autoclean

Надо заметить, что в некоторых случаях apt-get с оператором upgrade не сможет выполнить обновление каких-то пакетов, о чем честно и сообщит перед запросом на подтверждение операции. Причины этому могут быть разные - например, конфликт новых зависимостей пакетов с каким-либо наличным софтом. На сей случай мы располагаем более радикальным средством - оператором dist-upgrade. Именно к нему следует прибегнуть, если мы обновляем старую версию дистрибутива до нового релиза:

$ sudo apt-get dist-upgrade

Эта команда просто тотально перепишет все наличные пакеты их обновленными версиями, одновременно разрешая и новые их зависимости (вплоть до удаления старых конфликтующих пакетов). Правда, и тут возможны коллизии типа описанной выше, но в большинстве случаев их можно проигнорировать - они, скорее всего, рассосутся при следующем апдейте и апгрейде. Если нет - эти коллизии придется разрешать вручную, на чем здесь останавливаться неуместно (возможные способы можно посмотреть в apt-howto из официальной документации проекта Debian, в том числе и на русском языке.

Вот теперь можно взяться и за отдельные пакеты. Весь вопрос в том - за какие именно? Ведь дистрибутивные deb-пакеты вовсе не совпадают с пакетами авторскими - они намного более дробные. Например, каждый из авторских пакетов KDE, типа kdenetworks или kdegraphics, делится на множество мелких монофункциональных deb-пакетов. Хорошо, если пользователь наизусть знает те компоненты, которые ему необходимы - и именно в варианте пакетирования Ubuntu/Kubuntu (совпадающем с пакетированием Debian). А если нет? Тут на помощь ему и придет команда apt-cache, в первую голову - с оператором search, которая в качестве аргумента воспринимает любое ключевое слово. И в ответ на команду вида

$ apt-cache search ftp

последует список всех пакетов, в описании которых фигурирует ключевое слово ftp. Конечно, это доставит немного радости ввиду их изобилия, но со временем мы на примере аудио- и видеокодеков посмотрим, как использовать apt-cache search практически.

А пока - более примитивный пример. Пользователь, имеющий опыт работы с KDE, после установки Kubuntu с удивлением обнаружит отсутствие менеджера закачек kget - программы, очень облегчающей жизнь при интеграции ее с konqueror'ом. Однако, выполнив команду

$ apt-cache search kget

он с радостью увидит, что она представляет собой отдельный самостоятельный пакет, не тянущий за собой всего немалого авторского пакета kdenetworks:

kget - download manager for KDE

который только и остается, что установить. Для чего следует вернуться к команде apt-get, имеющей специально предназначенную для этого цель install. Так что директива

$ apt-get install kget

благополучно скачает этот пакет и установит его в системе, при необходимости - со всеми обязательными (depends) зависимостями. Перед этим будет опять-таки выведен список подлежащих установке пакетов, объем скачиваемого материала и изменения в занятом дисковом пространстве. А также будет дан список пакетов, связанных с данным разными типами "мягких" зависимостей - пользователю останется только решить, нужны ли они ему.

Действие оператора install распространяется только на бинарные deb-пакеты. Если же возникнет необходимость получить их исходники (не зря же мы включили строки deb-src в файле /etc/apt/sources.list), то следует прибегнуть к оператору source, отвечающему за получение пакетов исходных текстов, и, возможно, опции -b, обеспечивающей их сборку. Хотя есть и другой способ сборки пакетов, о котором я расскажу в конце этого раздела.

Инструмент apt-get выполняет и удаление пакетов - для этого предназначен оператор remove. Примение его в "чистом виде" -

$ apt-get remove packagname

сохраняет настроечные файлы пакета. Однако добавление опции --purge производит полную очистку системы от всех его компонентов.

Очень ценна опция -i, обеспечивающая инверсию действия операторов. То есть команда

$ sudo apt-get remove packagname -i

установит пакет packagename, а команда

$ sudo apt-get install packagname -i

напротив, удалит его. Трудно переоценить значение этой опции при экспериментировании с большим количеством пакетов (а стадию выбора оптимального для себя инструментария проходит практически любой начинающий пользователь Linux): ведь для удаления кучи ненужных пакетов достаточно извлечь соответствующие команды из буфера истории и добавить в конец командной строки опцию -i. И аналогично поступить при случайном удалении нужного пакета.

Выше я упоминал об операторе source, предназначенном для работы с пакетами исходников. И он вполне оправдывает себя, если речь идет о сборке единичных пакетов. Если же нужно собрать много пакетов, пересобрать систему целиком или требуется компиляция с какими-либо особыми условиями, лучше прибегнуть к специализированному инструменту - apt-build.

Это - отдельный пакет, который нужно установить обычными образом:

$ sudo apt-get install apt-build

И в ходе установки - настроить его в диалоговом режиме. Первый вопрос при настроке - выбор степени оптимизации: облегченная (соответствующая флагу gcc -O1), средняя (флаг -O2, представляет выбор по умолчанию) и усиленная (-O3). Далее можно ввести дополнительные флаги gcc, если в них есть необходимость, указать опции для команды make. И последний вопрос - выбор процессора, для архитектуры x86 в списке доступных фигурируют "камни" от Pentium до Pentium-4.

Таким образом, при настройке apt-build можно очень точно задать условия компиляции. Если же для каких-либо программ их нужно изменить (например, повысить уровень оптимизации, добавить мультимедийные флаги, и так далее) - apt-build можно переконфигурировать обычным образом:

$ sudo dpkg-reconfigure apt-build

Синтаксически команда apt-build аналогична apt-get, включая операторы, требующие или не требующие аргументов, и, возможно, опции. Основные операторы - следующие:

  1. update - обновление списка доступных пакетов;
  2. upgrade - сборка обновленных пакетов;
  3. world - полная пересборка всей системы;
  4. update-source - апдейт пакетов исходников и их пересборка;
  5. build-repository построение репозитория пакетов (очевидно, что операторы пунктов 1-5 в аргументах не нуждаются);
  6. install - сборка и установка пакета (пакетов);
  7. source - скачивание и развертывание архивов исходников;
  8. info - получение информации о пакете, который будет собираться;
  9. build-source - сборка пакета без его инсталляции;
  10. remove удаление пакета (пакетов); операторы пунктов 6-9 требуют аргумента - имени пакета, над которым производится действие; аргументов таких может быть сколько угодно;
  11. clean-build и clean-sources - очистка каталогов, в которых выполняласть сборка, от ее пролуктов.

Таким образом, можно видеть, что инструмент apt-build, не смотря на сугубо пакетную природу использующих его дистрибутивов, имеет ничуть не меньшие возможности по индивидуалированной компиляции как отдельных программ, так и всей системы в целом, чем механизм make world и средства управления портами FreeBSD, или аналогичные интсрументы таких Source Based дистрибутивов Linux, как Gentoo (portage) или Archlinux (ABS). То есть при желании или необходимости, Kubuntu, как и любой клон Debian, может быть превращен в дистрибутив Source Based.

Я не ставил себе целью описать все возможности инструментария apt. За недостающими сведениями всегда можно обратиться к соответствующим man-страницам, упомянутому выше apt-howto и к apt-faq проекта POSIX.ru.