1. Введение в Portage

Добро пожаловать в Portage

Благодаря высокой гибкости и чрезвычайно богатым возможностям Portage можно признать одним из лучших средств управления программным обеспечением из существующих в Linux. Portage написана на Python и Bash.

Большинство пользователей взаимодействует с Portage с помощью команды emerge. Эта глава не призвана заменить страницу справки emerge. Просмотреть все возможные параметры команды emerge можно здесь.

Дерево портежей

Сборочные файлы ebuild

Говоря о пакетах, мы часто имеем в виду программы, доступные пользователям Calculate через дерево портежей. Дерево портежей - это набор сборочных файлов ebuild, содержащих всю информацию, необходимую Portage для управления программным обеспечением (установки, поиска, извлечения и т.п.) По умолчанию сборочные файлы находятся в /usr/portage и /var/lib/layman/calculate. По второму пути находится оверлей Calculate, который также содержит сборочные ebuild файлы.

Когда Portage выполняет любые действия над пакетами программ, эти действия опираются на сборочные файлы, имеющиеся в системе. Поэтому необходимо регулярно обновлять сборочные файлы, чтобы Portage знал о новых программах, обновлениях, связанных с безопасностью и т.д.

Обновление дерева портежей

Дерево портежей обычно обновляется с помощью rsync. Обновление выполнить довольно просто, так как запуск rsync обеспечивается командой emerge:

emerge --sync

Если rsync выполнить невозможно из-за ограничений межсетевого экрана, дерево портежей все-таки можно обновить из ежедневных «снимков». Для автоматического извлечения и установки в системе новейшего снимка служит утилита emerge-webrsync:

emerge-webrsync

Важно вместе с деревом портежей выполнять обновление оверлея Calculate. Оверлей хранится в Git, его обновление можно выполнить утилитой layman:

layman -s calculate

Выполнить обновление сразу дерева портежей и оверлея Calculate, а также базы данных программы eix можно одной командой:

eix-sync

Обслуживание программного обеспечения

Поиск программ

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

Например, чтобы найти все пакеты, содержащие "pdf" в названии:

emerge --search pdf

Для поиска пакетов еще и по тексту описания можно использовать параметр --searchdesc (или -S):

# emerge --searchdesc pdf
Searching...    
[ Results for search key : firefox ]
[ Applications found : 10 ]

*  www-client/firefox
      Latest version available: 3.6.13
      Latest version installed: [ Not Installed ]
      Size of files: 59,577 kB
      Homepage:      http://www.mozilla.com/firefox
      Description:   Firefox Web Browser
      License:       || ( MPL-1.1 GPL-2 LGPL-2.1 )
...

Существуют вспомогательные средства для ускорения и автоматизации стандартных задач типа поиска по дереву портежей, формирования списка установленных пакетов, принадлежащих какой-либо категории и т.д. Для выполнения быстрого поиска пакета используйте утилиту eix. Пример поиска браузера firefox:

eix firefox

Пример поиска всех пакетов, в описании которых присутствует слово "browser".

eix -S browser

Установка программ

После того, как вы нашли нужное программное обеспечение, его можно легко установить с помощью команды emerge. Вот пример установки пакета gnumeric:

emerge gnumeric

Так как множество приложений зависит друг от друга, любая попытка установить какой-либо пакет программ может повлечь за собой также установку дополнительных пакетов. Не беспокойтесь, Portage справится и с этим. Если вы захотите выяснить, что именно Portage собирается установить вместе с нужным вам пакетом, добавьте параметр -p (или --pretend). Например:

emerge -p gnumeric

После команды на установку пакета, Portage загружает из интернета необходимый исходный код (при необходимости), и по умолчанию сохраняет его в каталоге /var/calculate/remote/distfiles. После этого пакет распаковывается, компилируется и устанавливается. Если вы хотите, чтобы Portage только загрузил исходный код без его установки, добавьте к команде emerge параметр -f (или --fetchonly):

emerge -f gnumeric

Обнаружение документации к пакету

Многие пакеты содержат собственную документацию. Иногда USE-флаг doc определяет, следует ли устанавливать документацию к пакету. Проверить наличие USE-флага doc можно командой emerge -vp <название пакета>. Пример:

emerge -vp eselect
[ebuild R ] app-admin/eselect-1.2.11 USE="bash-completion -doc" 0 kB

USE-флаг doc можно включить или отключить как глобально в файле /etc/portage/make.conf/custom, так и для отдельных пакетов, создав файл в директории /etc/portage/package.use и указать в нём флаг. В главе USE-флаги этот вопрос описывается более подробно.

Документация от вновь установленного пакета обычно находится в подкаталоге каталога /usr/share/doc, соответствующем названию пакета. Кроме того, можно вывести список всех установленных файлов утилитой equery. Примеры:

# ls -l /usr/share/doc/eselect-1.2.11
total 48
-rw-r--r-- 1 root root   296 Янв 26 21:36 AUTHORS.bz2
-rw-r--r-- 1 root root 14202 Янв 26 21:36 ChangeLog.bz2
-rw-r--r-- 1 root root  5320 Янв 26 21:36 developer-guide.txt.bz2
-rw-r--r-- 1 root root  3837 Янв 26 21:36 NEWS.bz2
-rw-r--r-- 1 root root   541 Янв 26 21:36 README.bz2
-rw-r--r-- 1 root root   703 Янв 26 21:36 release-guide.txt.bz2
-rw-r--r-- 1 root root   471 Янв 26 21:36 TODO.bz2
-rw-r--r-- 1 root root  2067 Янв 26 21:36 user-guide.txt.bz2
# equery f eselect | less
/usr
/usr/bin
/usr/bin/bashcomp-config
/usr/bin/eselect
...

Удаление пакета

Когда вы захотите удалить пакет из системы, используйте команду emerge -C (или --unmerge). Это приведет к удалению из системы всех файлов, установленных пакетом, кроме конфигурационных файлов приложения, изменявшихся после установки. Сохранение конфигурационных файлов позволяет вернуться к работе с пакетом, если вы когда-нибудь решите снова его установить.

Внимание: Portage не проверяет, зависят ли другие пакеты от удаляемого! Однако вы получите предупреждение, если удаление пакета приведет к неработоспособности системы.

emerge -C gnumeric

После удаления пакета из системы, остаются пакеты, установленные по зависимостям. Чтобы Portage выявила все когда-то нужные пакеты, которые теперь можно удалить, используйте команду emerge -c (или --depclean). Мы вернемся к этому ниже.

Обновление системы

Чтобы система сохранялась в отличной форме (не говоря уже об установке свежайших обновлений, связанных с безопасностью), ее нужно регулярно обновлять. Так как Portage просматривает сборочные файлы только в локальном дереве портежей и оверлее, сперва потребуется обновить их. Обновив дерево портежей, вы сможете обновить систему командой emerge -u world. В следующем примере мы также пользуемся параметром -a (или --ask), который поручает Portage вывести список пакетов, которые она собирается обновить, и спросить вас, можно ли продолжать:

emerge -ua world

Portage будет искать более новые версии установленных приложений. Однако проверяется только версии приложений, явно установленных вами, а не тех, от которых они зависят. Если вы хотите обновить каждый пакет в системе, добавьте аргумент -D (или --deep):

emerge -uDa world

Поскольку обновления, относящиеся к безопасности, случаются и в пакетах, которые были установлены по зависимостям, рекомендуется изредка запускать эту команду.

Если вы меняли какие-либо из USE-флагов, возможно, потом вы также захотите добавить параметр -N (или --newuse). Тогда Portage проверит, требует ли изменение установки новых пакетов или перекомпиляции существующих:

emerge -uDNa world

Метапакеты

У некоторых пакетов в дереве портежей нет содержимого как такового, и они используются для установки набора других пакетов. Например, пакет kde полностью устанавливает среду KDE в вашей системе, привлекая различные KDE-пакеты в качестве зависимостей.

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

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

Со всем этим управляются следующие три команды:

emerge -uDNa world
emerge -ca
revdep-rebuild

Когда Portage жалуется...

Слоты, виртуалы, ветви, архитектуры и профили

Как уже сказано, Portage - чрезвычайно мощная система, поддерживающая множество возможностей, не хватающих другим системам управления программами. Чтобы это стало понятно, разберем несколько аспектов Portage, не вникая в подробности.

С помощью Portage разные версии отдельного пакета могут сосуществовать в одной системе. В то время, как другие системы управления стремятся называть пакеты в соответствии с версией (например freetype и freetype2), в Portage используется технология слотов (SLOT), или областей. Пакет присваивает определенный слот своей версии. Пакеты с разными слотами способны сосуществовать в одной системе. Например, у пакета freetype есть ebuild как со SLOT="1", так и со SLOT="2".

Существуют также пакеты, выполняющие одни и те же функции, но отличающиеся в реализации. Например metalogd, sysklogd и syslog-ng являются системными службами журналирования. Приложения, использующие "системный журнал", не могут зависеть от одной конкретной программы, например от metalogd, так как остальные программы ничем не хуже. В Portage предусмотрены виртуальные пакеты: каждая служба журналирования предоставляет virtual/syslog, и в результате в приложениях можно указывать зависимость от virtual/syslog.

Программное обеспечение может располагаться в различных ветвях дерева портежей. По умолчанию в системе разрешено только использование стабильных пакетов. Большинство новых программ при поступлении включаются в тестовую ветвь, что указывает на необходимость дополнительного тестирования перед тем, как включить их в стабильные. Хотя в дереве портежей и видны сборочные файлы для таких программ, Portage не станет обновлять их до тех пор, пока они не будут помещены в стабильную ветвь.

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

Каждая установка Gentoo придерживается определенного профиля, который содержит, помимо прочего, список пакетов, необходимых для работоспособности системы.

Блокировка пакетов

Пример предупреждения о заблокированных пакетах (с --pretend)

[blocks B     ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)
...
!!! Error: the mail-mta/postfix package conflicts with another package.
!!!        both can't be installed on the same system together.
!!!        Please use 'emerge --pretend' to determine blockers.

( !!! Ошибка: пакет mail-mta/postfix конфликтует с другим пакетом.
  !!! оба не могут находиться в системе одновременно. Пожалуйста,
  !!! запустите 'emerge --pretend' для выявления блокирующих пакетов. )

В файлах ebuild есть специальные поля, сообщающие Portage о зависимостях. Возможны два вида зависимости: зависимость сборки, объявленная в DEPEND, и зависимость выполнения, объявленная в RDEPEND. Когда одна из этих зависимостей явно указывает на несовместимость пакета или виртуального пакета, это вызывает блокировку.

Для разблокировки можно отказаться от установки пакета или предварительно удалить конфликтующий пакет. В данном примере можно отказаться от установки postfix или сначала удалить ssmtp.

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

Маскировка пакетов

Пример предупреждения о замаскированных пакетах:

!!! all ebuilds that could satisfy "bootsplash" have been masked.

(!!! все сборки, удовлетворяющие "bootsplash", замаскированы.)

Пример предупреждения о замаскированных пакетах с указанием причины:

!!! possible candidates are:

- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)
- dev-util/cvsd-1.0.2 (masked by: missing keyword)
- media-video/ati-gatos-4.3.0 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)

( !!! возможные кандидаты:

- gnome-base/gnome-2.8.0_pre1 (маскировка: ключ ~x86)
- lm-sensors/lm-sensors-2.8.7 (маскировка: ключ -sparc)
- sys-libs/glibc-2.3.4.20040808 (маскировка: ключ -*)
- dev-util/cvsd-1.0.2 (маскировка: ключ отсутствует)
- media-video/ati-gatos-4.3.0 (маскировка: package.mask)
- sys-libs/glibc-2.3.2-r11 (маскировка: profile) )

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

  • ключ ~arch: пакет недостаточно проверен для помещения в стабильную ветвь. Подождите несколько дней или недель и попробуйте установить его еще раз.
  • ключ -arch или ключ -*: пакет не работоспособен в вашей архитектуре. Если вы полагаете, что он работает, сообщите об этом в bugzilla.
  • ключ отсутствует: пакет еще не тестировался в вашей архитектуре. Попросите группу портирования в архитектуру проверить пакет, или протестируйте его за них и сообщите о своих изысканиях в bugzilla.
  • package.mask: обнаружено повреждение пакета, нестабильность или что-то худшее, и пакет заблокирован специально.
  • profile: пакет считается не предназначенным для вашего профиля. В случае установки приложение может вызвать сбой системы или просто несовместимо с используемым профилем.

Отсутствие нужных пакетов

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

emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".

!!! Problem with ebuild sys-devel/gcc-3.4.2-r2
!!! Possibly a DEPEND/*DEPEND problem.

( emerge: нет сборок, удовлетворяющих ">=sys-devel/gcc-3.4.2-r4".

  !!! Проблема с ebuild sys-devel/gcc-3.4.2-r2
  !!! Возможно, ошибка в DEPEND/*DEPEND. )

Приложение, которое вы пытаетесь установить, зависит от другого пакета, недоступного вашей системе. Пожалуйста, проверьте, есть ли такой запрос в bugzilla, а если нет, сообщите об ошибке. Если вы не смешиваете ветви, такого не должно происходить, и это - явная ошибка.

Неоднозначность названия пакета

Пример предупреждения о повторяющихся именах ebuild:

!!! The short ebuild name "aterm" is ambiguous.  Please specify
!!! one of the following fully-qualified ebuild names instead:

    dev-libs/aterm
    x11-terms/aterm

( !!! Короткое название ebuild "aterm" неоднозначно. Пожалуйста, 
  !!! вместо него укажите одно из полных названий ebuild:

      dev-libs/aterm
      x11-terms/aterm )

Название приложения, которое вы собираетесь установить, соответствует более чем одному пакету. Требуется также указать название категории. Portage предложит вам возможные варианты.

Циклические зависимости

Пример предупреждения Portage о циклических зависимостях:

!!! Error: circular dependencies:

ebuild / net-print/cups-1.1.15-r2 depends on ebuild /
app-text/ghostscript-7.05.3-r1
ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild /
net-print/cups-1.1.15-r2

( !!! Ошибка: циклические зависимости:

  ebuild / net-print/cups-1.1.15-r2 зависит от ebuild /
  app-text/ghostscript-7.05.3-r1
  ebuild / app-text/ghostscript-7.05.3-r1 зависит от ebuild /
  net-print/cups-1.1.15-r2   )

Два или более пакета, которые вы хотите установить, взаимно зависимы, и в результате их установка невозможна. Скорее всего, это ошибка в дереве портежей. Пожалуйста, выждав время, обновите дерево портежей, и попытайтесь снова. Вы можете также проверить, есть ли эта ошибка в bugzilla, и если нет, сообщить о ней.

Ошибка извлечения

Пример предупреждения Portage об ошибке извлечения:

!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
(...)
!!! Some fetch errors were encountered.  Please see above for details.

( !!! Ошибка при извлечении sys-libs/ncurses-5.4-r5, продолжение...
  (...)
!!! При извлечении произошли ошибки.  Подробности выше. )

Portage не смогла загрузить исходный код данного приложения и попытается продолжить установку других приложений (если запланирована). Эта ошибка может произойти из-за неправильно синхронизированного зеркала, или из-за того, что ebuild указывает на неверное место. Сервер, где находятся исходные коды, также может почему-либо не работать.

Повторите действие через час, чтобы посмотреть, повторится ли эта ошибка.

Защита системного профиля

Пример предупреждения Portage о пакете, защищенном профилем:

!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.

( !!! Попытка удаления пакетов из системного профиля. 'sys-apps/portage'
  !!! Это может повредить вашей системе. )

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

Спасибо!