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
, включая операторы, требующие или не требующие аргументов, и, возможно, опции. Основные операторы - следующие:
update
- обновление списка доступных пакетов;upgrade
- сборка обновленных пакетов;world
- полная пересборка всей системы;update-source
- апдейт пакетов исходников и их пересборка;build-repository
построение репозитория пакетов (очевидно, что операторы пунктов 1-5 в аргументах не нуждаются);install
- сборка и установка пакета (пакетов);source
- скачивание и развертывание архивов исходников;info
- получение информации о пакете, который будет собираться;build-source
- сборка пакета без его инсталляции;remove
удаление пакета (пакетов); операторы пунктов 6-9 требуют аргумента - имени пакета, над которым производится действие; аргументов таких может быть сколько угодно;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.