Портежи-3. Программа emerge

Алексей Федорчук
[email protected]

Наступило время поговорить о практическом использовании системы портежей. А это, в первую очередь - программа emerge, универсальное средство для установки, обновления и удаления всякого и всяческого софта.

Содержание

Введение

Программа emerge, как уже было сказано, определяется как универсальный интерфейс к системе портежей. Универсальность ее выражена в том, что она позволяет выполнить все действия, перечисленные во вводной части первой заметки из этой серии.

В элементарном виде использование emerge просто до безобразия. Так, чтобы установить некий пакет, достаточно дать команду

$ emerge категория/имя_пакета

При этом обычно не обязательно указывать имя ebuild-файла, номер версии и прочие уточняющие моменты - программа сама решит, что ей ставить. Однако в не-элементарном виде использование emerge может быть весьма сложным, что обусловлено именно ее универсальностью, и потребует изучения документации - man (1) emerge.

Настоящая заметка на роль исчерпывающего руководства не претендует. Я попробую только прокомментировать формат вызова программы, описать наиболее употребимые функции и дать примеры практического применения, в том числе - и в сочетании с переменной USE, определяемой в командной строке.

Синтаксис команды для вызова программы emerge в общем виде может показаться непривычным, так как включает три различных компонента (кроме имени программы, разумеется). В обобщенном виде он выглядит так:

$ emerge [options] [action] [argument1] ... [argument#]

Options - это обычные опции, такие же по смыслу, как в любой Unix-команде. Action - переведем это как действие, ибо именно действия в отношении портежа этим компонентом и описываются (например, search - поиск по ключевому слову); обращаю внимание, что слово action дано здесь (как и в оригинальной man-странице) в единственном числе - такое действие с emerge в отношении данного портежа может быть выполнено за раз только одно. И, наконец, аргументы - это объекты, к которым применяются опции команды emerge или выполняются ее действия.

Аргументы

Аргументы команды для вызова программы emerge можно задать одно из четырех способов - в виде ebuild, tbz2file, class и dependency. Начнем с первого из них, ebuild.

Аргумент ebuild

В общем случае аргумент ebuild - это имя пакета, который требуется установить. Оно может быть задано в различных формах. Например, просто как имя пакета, без номера версии или указания категории:

$ emerge joe

Хотя и уточнение в виде категории - не возбраняется:

$ emerge app-editors/joe

В обоих случаях по такой команде emerge отыщет в каталоге /usr/portage/app-editors/joe ebuild-файл, соответствующий либо наиболее свежей, либо последней стабильной версии, и выполнит над ним некие заданные действия или применит к нему указанные опции (в данном примере, по умолчанию, просто соберет и установит пакет).

Какая именно версия поименованного пакета будет установлена - определяется, видимо, майнтайнером конкретного портежа. В указанном выше примере с редактором joe ею (в текущем варианте Gentoo - 1.4-rc1) окажется именно последняя стабильная версия - 2.9.5 (хотя в дереве портежей имеется и ebuild-файл для разрабатываемой ветки - 2.9.8_pre1. А вот в случае, например, с Midnight Commander указание соответствующего направления без уточнения версии

$ emerge mc

или

$ emerge gnome-extra/mc

приведет (в момент, когда пишутся эти строки) к установке пререлизной - mc-4.6.0_pre1, а не стабильной версии - mc-4.5.55. Такая ситуация может не устраивать пользователя - ведь вполне вероятно, что в одном случае ему потребуется гарантированная стабильность финального релиза, в другом же - дополнительные возможности development-варианта. Однако проблема эта легко решаема - достаточно дать полную спецификацию ebuild-файла (теперь уже - с обязательным указанием его категории). Так, возвращаясь к примеру с редактором joe, для установки разрабатываемой его версии программу emerge следует дать в такой форме:

$ emerge app-editors/joe/joe-2.9.8.ebuild

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

Аргумент tbz2file

Так, с аргументами, заданными как ebuild - разобрались, переходим к заданию аргументов в виде tbz2file. Это - имя автономного бинарного пакета, собираемого из исходников и имеющего форму *.tbz2. Каковой представляет собой tar-архив, компрессированный утилитой bzip2 и содержащий в конце некоторую дополнительную информацию (вследствие чего содержимое такого архива нельзя просмотреть, например, через F3 в Midnight Commander, при просмотре его через tar tjvf окончание файла будет проигнорировано.

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

Аргумент class

Аргумент class - это условное сокращение для крупных групп пакетов. Таковых в текущей версии системы портежей существует два - system и world.

Класс system

Класс system включает в себя пакеты (общим числом чуть больше двадцати), необходимые для запуска системы. Список их можно просмотреть при установке Gentoo - сразу после развертывания тарбалла stage3, - с помощью команды

$ emerge -p system

Класс world

Класс world включает в себя все пакеты класса system, а также пакеты, установленные дополнительно через систему портежей; список последних содержится в файле /var/cache/edb/world.

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

Аргумент dependency

И, наконец, аргументы команды для вызова программы emerge можно задать в форме dependency (зависимостей). Эта форма (которую не следует путать с отношениями зависимости пакетов) определяет верхнюю или нижнюю границу диапазона версий устанавливаемого пакета. Для указания граничной версии используются стандартные символы >имя_пакета-номер_версии (выше указанной версии), >=имя_пакета-номер_версии (начиная с указанной версии и выше), <имя_пакета-номер_версии (ниже указанной версии), <=имя_пакета-номер_версии (начиная с указанной версии и ниже). Например, командой

$ emerge ">app-shell/tcsh/tcsh-6.11"

будет установлена последняя из доступных (в текущем дереве портежей) версий командной оболочки, выше версии 6.11, и так далее.

Обратим внимание на двойные кавычки, в которые заключен dependency-аргумент данного примера. Они появились здесь от того, что большинство командных оболочек интерпретируют символы типа < или > (да, впрочем, и = тоже) как специальные, тогда как нам нужно их "буквальное" понимание. Поэтому для таких символов следует тем или иным образом экранировать их специальное значение, а предварением ли символом обратного слэша , заключением в одинарные или двойные кавычки - это определяется правилами конкретной командной оболочки, используемой как login shell.

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

Действия (actions)

Собственно говоря, важнейшим из всех действий, пожалуй, является отсутствие указания действий (No action). В этом случае в силу вступают умолчания программы emerge, различные, как уже было сказано, для аргументов разных форм. Так, при указании аргумента типа ebuild -

$ emerge имя_пакета

будет выполнена сборка и инкорпорация пакета в файловую систему. Если в качестве аргумента задать тип tbz2file

$ emerge /path/пакет.tbz2

то указанный автономный бинарник будет развернут в соответствующих каталогах файловой системы (примерно также, как это происходит при установке из бинарных rpm- или deb-пакетов).

А указание аргумента в форме class'а, как то

$ emerge system

или

$ emerge world

приведет к обновлению, пересборке и переустановке базовой системы или системы целиком, соответственно. Однако возможности программы к этому не сводятся, позволяя выполнять и другие операции. Для чего и предназначаются дополнительные действия (action). Значение каждой action задается в командной строке в виде соответствующего ключевого слова, после которого следует аргумент команды вызова emerge или критерий действия, например:

$ emerge clean ebuild_аргумент

или

$ emerge search ключевое_слово

Кроме этого, некоторые (но не все) действия могут вызываться и в краткой, односимвольной, форме, предваряемой символом дефиса, например, -c вместо clean или -s вместо search. Что делает их внешне похожими на опции (для которых тоже допустима односимвольная форма), но путать эти компоненты интерфейса emerge не следует.

Доступные для emerge действия можно разделить на три группы:

  • действия информационного характера;
  • действия по синхронизации;
  • действия по удалению.

Рассмотрим эти группы действий последовательно

Информация

Действия информационного характера - это help (-h), info (краткой формы не имеет) и searce (-s).

Действие help

Действие help, как легко догадаться, предназначено для получения подсказки по программе emerge. Впрочем, догадаться с первого раза, как этой подсказки допроситься, - нелегко. Начать с того, что это действие срабатывает либо в краткой форме

$ emerge -h

либо предваряемое удвоенным символом дефиса

$ emerge --help

что, впрочем, указано в самом начале man-страницы. Зато в ответ на это она выводит аналог последней, но - более подробный и более часто (согласно документации) обновляемый. Кроме того, добавление к этому действию одного из двух возможных аргументов (config или system) позволяет получить весьма подробные сведения о переменной CONFIG_PROTECT (судя по тому, что это помечено как preliminary, в грядущем можно ожидать здесь информации и о других аспектах конфигурирования), и о использовании emerge с классом system, соответственно.

Действие info

Не менее полезным видится действие info, аргументов не требующее (как и предваряющих дефисов). В ответ на команду

$ emerge info

последует вывод всех сведений о настройке системы портежей, как то:

  • действующих в текущий момент значений переменной USE, аккумулирующих умолчальные установки, настройки в файле /etc/make.conf и заданные в командной строке;
  • указания на архитектуру, целевую машину и версию компилятора;
  • флаги оптимизации для компилятора;
  • список защищенных от изменения конфигурационных каталогов (значения переменной CONFIG_PROTECT) и подкаталогов в них, для изменения разрешенных (CONFIG_PROTECT_MASK);
  • URL источника синхронизации (значение переменной SYNC) и базового сервера проекта (переменная GENTOO_MIRRORS).

Иными словами, с помощью emerge info всегда можно определить, каковы нынче условия работы системы портежей.

Действие search

Цель действия search - поиск пакетов, вернее, просмотр дерева портежей на предмет совпадения имен файлов с указанным в качестве аргумента шаблоном. Поэтому, хотя в качестве такого шаблона поиска можно ввести любую последовательность символов, целесообразно ограничиться лишь именем пакета. Зато после нахождения оного будут выведены интересные о нем сведения. Например, в ответ на

$ emerge search joe

последует что-нибудь вроде:

Searching...
[ Results for search key : Joe ]
[ Applications found : 1 ]

*  app-editors/joe
      Latest version available: 2.9.5
      Latest version installed: 2.9.8_pre1
      Size of downloaded files: 204 kB
      Homepage:    http://sourceforge.net/projects/joe-editor/
      Description: A free ASCII-Text Screen Editor for UNIX

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

$ emerge search "^gnome"

отыщет все пакеты, начальный компонент имени которых показывает их принадлежность к семейству GNOME (app-editors/gnome-chord, app-text/gnome-spell и т.д.). А с помощью команды

$ emerge search "gnome$"

напротив, будут отысканы пакеты с именами, на gnome заканчивающиеся (app-doc/ebook-libgnome, dev-java/java-gnome, etc.). Обратим внимание на двойные кавычки в приведенных примерах: спецсимволы из регулярных выражений нуждаются в экранировании (каковым опять же может выступать предварение обратным слэшем или заключением во всякого рода кавычки всего шаблона). Заодно заметим, что в шаблоне не различаются регистры символов: командой

$ emerge search "^W"

будут найдены как пакет app-admin/watchdog, так и пакет x11-wm/WindowMaker.

Синхронизация

Действий по синхронизации в программе emerge предусмотрено два - rsync и sync. Оба они предназначены для обновления дерева портежей с сервера, определенного в качестве значения переменной SYNC - того самого, которое мы установили посредством команды emerge info.

Удаление

А вот действий по удалению - изрядное количество, clean (-c) и depclean, prune (-P) и unmerge (-C).

Действие clean

Назначение действия clean (-c) - удаление пакетов (старых их версий или версий, явным образом указанных) без влияния на функциональность системы. В качестве аргумента при этом действии могут выступать типы ebuild, class или dependencie.

Действие depclean

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

Действие prune

Действие prune (-P), в аргументах которого могут фигурировать типы ebuild, class или dependence, потенциально опасно. Оно заключается в удалении старых версий всех указанных в аргументах пакетов. Зависимости при этом не проверяются, и в результате могут быть удалены компоненты, важные для запуска других программ.

Действие unmerge

Аналогично и с действием unmerge (-C)- это просто удаление указанных в аргументах (в форме ebuild, class или dependence) пакетов, также без проверки зависимостей от них других пакетов.

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

Опции

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

Подготовительные действия

Комплекс действий по предварительной подготовке к установке пакета обеспечивается опциями --searchdesc (-S), --pretend (-p), --fetchonly (-f) и --onlydeps (-o).

--searchdesc (-S)

Первое, что обычно требуется - это разыскать нужный пакет в дереве портежей. Помнится, это можно было сделать посредством акции search - однако только по имени. Опция же --searchdesc (-S) выполняет поиск заданной последовательности символов также и в описании пакета - строке Description, которую мы уже видели в выводе команды emerge search.

--pretend (-p)

Следующая по очередности применения - и очень важная, - опция --pretend (-p), которая может сопровождаться аргументами любого типа. Она выводи список пакетов, необходимых для установки заданного пакета, класса или dependency, причем - именно в том порядке, в каком они должны устанавливаться. Каждый из выводимых пакетов маркируется следующим образом: N - новый (то есть отсутствующий в системе, U - нуждающийся в обновлении до указанной версии, R - заменяющий ранее установленный пакет, B - блокирующий ранее установленный пакет.

Опция --pretend определяет не только отношения зависимости, но и отношения использования, а следовательно - очень зависит от текущих кумулятивных значений переменной USE (которые мы получаем командой emerge info, не так ли?). Так что если нам покажется, что устанавливаемый пакет предъявляет аппетиты не по чину - самое время перед собственно установкой подкорректировать эту переменную, хотя бы в командной строке:

$ USE="-то -это -и_вот_это" emerge --pretend ebuild-аргумент

для приведения его аппетитов в соответствие с реальностью.

--fetchonly (-f)

Опция --fetchonly (-f) с указанием ebuild-аргумента предназначена для скачивания пакета, указанного в командной строке, и всех тех, с которыми он связан отношениями зависимости и использования. Ее использование может быть полезно, если скачивание производится не с целевой машины для сборки, при модемном подключении (иначе придется устанавливать соединение в самый неподходящий момент), или просто при желании ознакомиться с исходными текстами перед установкой.

--onlydeps (-o)

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

Управление сборкой

Для контроля над процессом сборки и установки пакетов предназначены опции --nodeps, --noreplace (-n), --oneshot, --update (-u).

--nodeps

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

--noreplace (-n)

Как говорилось ранее, в командной строке вызова emerge можно указать более одного аргумента (например, ebuild-файла). А поскольку от склероза никто не гарантирован, нельзя исключить возможности того, что какой-то из заказанных пакетов был установлен ранее. По умолчанию произойдет пересборка и переустановка такого пакета (что в случае Иксов или KDE займет многие часы). Во избежание такой ситуации и предусмотрена опция --noreplace - указание ее предотвратит пересборку уже установленных пакетов.

--oneshot

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

--update (-u)

Смысл опции --update (-u) более чем понятен из ее названия: это обновление пакета до последней доступной в текущем дереве портежей версии. Правда, пакетов, с которыми заказанный связан отношениями зависимости или использования, она не обновляет - и в этом ее отличие от автоматического обновления через emerge system или emerge world.

Работа с автономными пакетами

Сборка программ из исходников - основной способ их установки в дистрибутиве Gentoo. Однако в нем предусмотрена и возможность создания и установки автономных бинарных пакетов (в формате *.tbz2, или, как он именуется в документации, улучшенном *.tar.bz2). По сути своей они ничем не отличаются от компонентов любого пакетного дистрибутива (rpm, deb, tgz). И включают в себя расписанные по каталога (bin, lib, etc и т.д.) откомпилированные программные компоненты и некоторую метаинформацию для их корректной установки в текущей файловой системе. Так вот, именно для работы с такими пакетами в emerge предусмотрено две специальные опции - --buildpkg (-b) и --usepkg (-k).

--buildpkg (-b)

Опция --buildpkg (-b), и это ясно из ее названия, предназначена для создания таких автономных бинарных пакетов. Она требует исключительно ebuild-аргумента (аргументов) - построить пакета для класса system или world, к сожалению, на текущий момент нельзя. Не создаются ею и автономные бинарники для пакетов, с которыми заказанный связан отношениями зависимости и использования. Однако все остальное - получение исходников, их распаковку, компиляцию, установку во временный каталог и итоговую сборку файла *.tbz2), - она производит вполне исправно.

Собранные бинарные пакеты по умолчанию располагаются в каталоге /usr/portage/packages/All; кроме того, в каталогах /usr/portage/packages/имя_категории на них создаются символические ссылки.

--usepkg (-k)

После того, как автономный бинарный пакет создан, его следует установить. И именно для этого предназначена опция --usepkg (-k), в качестве аргумента которой указывается tbz2file. Ее указание приводит к тому, что бинарный архив разворачивается, и его компоненты встраиваются в соответствующие ветви файловой системы (в /usr/bin - исполнимые файлы, в /usr/lib - разделяемые библиотеки, в /usr/share/man - страницы документации, и т.д.).

С помощью команды emerge --usepkg устанавливаются прекомпилированные бинарные пакеты, распространяемые с текущим пре-релизом Gentoo - 1.4-rc2. Поскольку они уже оптимизированы для основных типов архитектур, их использование способствует как быстродействию системы, так и экономии времени при ее развертывании.

Опции --buildpkg (-b) и --usepkg (-k) могут использоваться совместно. В этом случае заказанные пакеты сначала будут собраны в виде автономных архивов *.tbz2, а затем инкорпорированы в файловую систему. Именно это рекомендуется *.сделать при построении собственной системы, оптимизированной, с одной стороны, под данную архитектуру, с другой - способную к распространению:

$ emerge -bk xfree kde gnome openoffice-bin mozilla

как это описано в руководстве Gerk'а.