Portage: Первые шаги

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

Portage полностью написана на Python и Bash, и в результате полностью прозрачна для пользователей, поскольку это языки сценариев.

Большинство пользователей будут работать с Portage посредством утилиты emerge. Для просмотра всех доступных опций, обратитесь к странице руководства :

user $  man emerge

Дерево Portage

Ebuilds

Когда в документации Gentoo говорится о пакетах (packages), подразумеваются названия программного обеспечения, которое доступно для пользователей Gentoo в дереве portage. Дерево portage - это коллекция ебилдов (ebuilds), файлов, содержащих всю необходимую для поддержки программного обеспечения информацию (установка, поиск, запрос, ... ). По умолчанию, эти ебилды находятся в директории /usr/portage.

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

Обновление дерева Portage

Обычно дерево portage обновляется с помощью rsync (программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодирование данных при необходимости). Обновление выполняется довольно просто, потому как emerge умеет работать с rsync:

root #  emerge --sync

В случае, если обновить дерево с помощью rsync не удается (например, шлюз блокирует порт rsync 873/tcp), можно использовать emerge-webrsync для обновления с помощью снапшотов (snapshots). Это - ежедневно генерируемые Gentoo снимки дерева portage:

root #  emerge-webrsync

Поддержка программного обеспечения

Поиск программного обеспечения

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

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

user $  emerge --search pdf

Для поиска по описаниям, используйте --searchdesc ( или -S) :

user $  emerge --searchdesc pdf

Обратите внимание, что результат содержит подробную информацию. Поля довольно информативны, поэтому вдаваться в подробности их значения не имеет смысла :

Пример вывода команды поиска
*  net-print/cups-pdf
      Latest version available: 1.5.2
      Latest version installed: [ Not Installed ]
      Size of downloaded files: 15 kB
      Homepage:    https://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
      Description: Provides a virtual printer for CUPS to produce PDF files.
      License:     GPL-2

Установка программного обеспечения

Когда название требуемого программного обеспечения уже известно, установка его не составляет труда. Производится она всего одной командой emerge. Например, для установки gnumeric:

root #  emerge --ask app-office/gnumeric

Поскольку многие приложения зависят от других, попытка установить определенный пакет программного обеспечения так-же может привести к установке нескольких зависимостей. Не волнуйтесь, portage умеет обрабатывть зависимости. Чтобы выяснить, что portage будет устанавливать, добавьте аргумент --pretend. Например:

root #  emerge --pretend gnumeric

Во время установки пакета, Portage скачивает необходимый исходный код из интернета (если необходимо) и по умолчанию сохраняет его в каталоге /usr/portage/distfiles/. После этого пакет будет распаковываться, компилироваться и затем устанавливаться. Для загрузки исходного кода без его установки, добавьте аргумент --fetchonly к команде emerge:

root #  emerge --fetchonly gnumeric

Поиск документации для установленного пакета

Многие пакеты содержат собственную документацию. Устанавливать пакет документации или нет определяет USE флаг doc. Чтобы посмотреть, используется флаг doc для пакета или нет, используйте emerge -pv ИМЯ_ПАКЕТА:

root #  emerge -vp alsa-lib

...
[ebuild N ] media-libs/alsa-lib-1.0.14_rc1 -debug +doc 698 kB

Чтобы включить установку документации только для некоторых пакетов, внесите требуемый пакет в /etc/portage/package.use с указанием использовать флаг doc.

/etc/portage/package.use
media-libs/alsa-lib doc

После установки пакета, его документацию, как правило, можно найти в подкаталоге с именем пакета в каталоге /usr/share/doc/. Также, список всех установленных файлов можно вывести с помощью команды equery, которая является частью пакета app-portage/gentoolkit.

user $  ls -l /usr/share/doc/alsa-lib-1.0.14_rc1

total 28
-rw-r--r-- 1 root root 669 May 17 21:54 ChangeLog.gz
-rw-r--r-- 1 root root 9373 May 17 21:54 COPYING.gz
drwxr-xr-x 2 root root 8560 May 17 21:54 html
-rw-r--r-- 1 root root 196 May 17 21:54 TODO.gz
user $  equery files alsa-lib | less

media-libs/alsa-lib-1.0.14_rc1
* Contents of media-libs/alsa-lib-1.0.14_rc1:
/usr
/usr/bin
/usr/bin/alsalisp
...

Удаление программного обеспечения

Для удаления программного обеспечения из системы, используется emerge --unmerge. Эта команда удалит все файлы, установленные с указанным пакетом, из системы. Одним исключением из этого являются файлы конфигурации этого приложения, если они были изменены пользователем. Сохранение конфигурационных файлов позволяет пользователям продолжать работать с пакетом, без необходимости реконфигурации при повторной установке пакета.

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

root #  emerge --unmerge gnumeric

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

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

Для поддержания системы в актуальном состоянии (не говоря уже об установке последних обновлений безопасности), необходимо регулярно ее обновлять. Так как Portage работает на основании ебилдов в дереве portage, первым что нужно сделать - это обновить дерево портежей. Когда дерево обновлено, система может быть обновлена с помощью: emerge --update @world. В следующем примере, аргумент --ask используется для отображения списка пакетов, которые будут обновляться, и запроса подтверждения на их обновление:

root #  emerge --update --ask @world

Portage будет искать более новые версии установленных приложений. Тем не менее, он будет проверять только версии явно установленных пакетов (перечисленных в /var/lib/portage/world) - это не полная проверка их зависимостей. Чтобы обновить пакеты вместе с из зависимостями - добавьте аргумент --deep:

root #  emerge --update --deep @world

Тем не менее, это не означает "все пакеты": некоторые пакеты в системе требуются во время процесса компиляции и сборки пакетов. Но, как только пакет будет установлен, эти зависимости станут не актуальны. Portage называет их "зависимостями сборки" (build dependencies). Чтобы включить их в цикл обновления, добавьте --with-bdeps=у:

root #  emerge --update --deep --with-bdeps=y @world

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

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

root #  emerge --update --deep --with-bdeps=y --newuse @world

Метапакеты

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

Удаление такого пакет из системы с использованием emerge --unmerge не будет иметь большого эффекта, так как все зависимости останутся в системе.

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

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

root #  emerge --update --deep --newuse @world
root # emerge --depclean
root # revdep-rebuild

revdep-rebuild является частью пакета app-portage/gentoolkit. Не забудьте его установить:

root #  emerge --ask app-portage/gentoolkit

Лицензии

Начиная с версии 2.1.7 Portage, можно разрешать или запрещать установку программного обеспечения на основании требуемой лицензии. Все пакеты в дереве содержат запись, указывающую на лицензию их ебилдов. Запуск emerge --search PACKAGENAME покажет информацию о лицензии пакета.

По умолчанию, Portage разрешает все лицензии, за исключением End User License Agreements (EULAs), которая требует чтения и подписания соглашения о принятии.

Переменная, которая управляет разрешенными лицензиями, называется ACCEPT_LICENSE. Установить ее значение можно в файле /etc/portage/make.conf. В следующем примере, показано ее значение по умолчанию:

/etc/portage/make.conf
ACCEPT_LICENSE="* -@EULA"

При этой конфигурации, пакеты, требующие EULA, не будут устанавливаться.

ACCEPT_LICENSE можно установить глобально в файле /etc/portage/make.conf или для отдельного пакета в /etc/portage/package.license.

Например, для того чтобы разрешить для app-crypt/truecrypt использовать лицензию truecrypt-2.7, добавьте в файл /etc/portage/package.license следующее:

/etc/portage/package.license
app-crypt/truecrypt truecrypt-2.7

В этом примере разрешается установка версий app-crypt/truecrypt требующих лицензию truecrypt-2.7, но не версий с лицензией truecrypt-2.8.

Важно: Лицензии хранятся в /usr/portage/licenses/, а группы лицензий в /usr/portage/profiles/license_groups. Первая запись каждой строки ПРОПИСНЫЕ буквы названия группы лицензий, и каждая последующая запись это индивидуальная лицензия.

Группы лицензий, определенные в ACCEPT_LICENSE начинаются со знака @. Обычно требуется разрешать установку только свободного программного обеспечения и документации . Для этого удалите все принятые в настоящее время лицензии (с помощью - * ), а затем разрешите лицензии только из группы @FREE следующим образом:

/etc/portage/make.conf
ACCEPT_LICENSE="-* @FREE"

В этом случае, "FREE", в основном, определяется FSF и OSI. Пакеты, лицензии которых не соответствует этим требованиям, не будут установлены.

Когда Portage ругается

Терминология

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

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

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

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

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

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

Заблокированные пакеты

Предупреждение Portage о заблокированных пакетах (с --pretend)
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)
Предупреждение Portage о заблокированных пакетах (без --pretend)
!!! 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.

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

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

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

Иногда бывают также блокирующие пакеты с конкретными атомами, например <media-video/mplayer-1.0_rc1-r2. В этом случае, обновление до более новой версии блокирующего пакета снимет блокировку.

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

Замаскированные пакеты

Предупреждение о замаскированных пакетах
!!! all ebuilds that could satisfy "bootsplash" have been masked.
Предупреждение о замаскированных пакетах - причина
!!! 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)
- games-fps/unreal-tournament-451 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)
- net-im/skype-2.1.0.81 (masked by: skype-eula license(s))

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

~arch keyword
Приложение не протестировано для помещения в стабильную ветвь. Подождите несколько дней или недель и попробуйте еще раз.
-arch keyword или -* keyword
Приложение не работает на вашей архитектуре. Если вы считаете, что оно работает, сообщите об ошибке на нашем сайте Bugzilla.
missing keyword
Приложение не было проверено на вашей архитектуре. Попросите группу портирования в архитектуру проверить пакет, или протестируйте его за них и представьте свои выводы на нашем сайте Bugzilla.
package.mask
В пакете было обнаружено повреждение, нестабильность или уязвимость, и он был намеренно отмечен как do-not-use (не для использования).
profile
Пакет не подходит для текущего профиля. Установка приложения может повредить систему, или просто несовместима с профилем, используемым настоящее время .
license
Лицензия пакета не совместима с настройками ACCEPT_LICENSE. Добавьте лицензию или группу лицензий в принятые, в /etc/portage/make.conf или /etc/portage/package.license

Необходимые изменения USE флагов

Предупреждение Portage о необходимости изменения USE флагов
The following USE changes are necessary to proceed:
#required by app-text/happypackage-2.0, required by happypackage (argument)
>=app-text/feelings-1.0.0 test
Ошибка Portage при необходимости изменения USE флагов
emerge: there are no ebuilds built with USE flags to satisfy "app-text/feelings[test]".
!!! One of the following packages is required to complete your request:
- app-text/feelings-1.0.0 (Change USE: +test)
(dependency required by "app-text/happypackage-2.0" [ebuild])
(dependency required by "happypackage" [argument])

Такое предупреждение или ошибка возникает, когда пакет, требуемый для установки, зависит не только от другого пакета, но и требует, чтобы пакет был собран с особым USE флагом (или набором USE флагов). В данном примере, пакет app-text/feelings должен быть собран с USE="test", но этот USE флаг не установлен в системе.

Для решения этой проблемы, добавьте требуемый USE флаг в глобальные USE флаги в /etc/portage/make.conf, или установите его для конкретного пакета в /etc/portage/package.use.

Недостающие зависимости

Предупреждение Portage о недостающих зависимостях
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.

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

Неоднозначное имя ебилда

Предупреждение Portage о неоднозначных именах ебилдов
[ Results for search key : listen ]
[ Applications found : 2 ]

* dev-tinyos/listen [ Masked ]
Latest version available: 1.1.15
      Latest version installed: [ Not Installed ]
      Size of files: 10,032 kB
      Homepage:      https://www.tinyos.net/
      Description:   Raw listen for TinyOS
      License:       BSD

*  media-sound/listen [ Masked ]
      Latest version available: 0.6.3
      Latest version installed: [ Not Installed ]
      Size of files: 859 kB
      Homepage:      https://www.listen-project.org
      Description:   A Music player and management for GNOME
      License:       GPL-2

!!! The short ebuild name "listen" is ambiguous. Please specify
!!! one of the above fully-qualified ebuild names instead.

Приложение, которое выбрано для установки, имеет имя соответствующее более чем одному пакету. Для решения этого - укажите наименование категории. 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

Два (или более) устанавливаемых пакета зависят друг от друга и поэтому не могут быть установлены. Это, скорее всего, ошибка в одном из пакетов в дереве портежей. Пожалуйста, через некоторое время заново синхронизируйте дерево портов и попробуйте снова. Также может быть полезным проверить Bugzilla на решение возникшей проблемы, и если его нет, сообщить об ошибке.

Ошибка загрузки

Предупреждение Portage об ошибке загрузки
!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
(...)
!!! Some fetch errors were encountered. Please see above for details.

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

Повторите действие через некоторое время, возможно проблема исчезнет.

Защита профилем

Предупреждение Portage о защищенном профилем пакете
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.

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

Ошибка проверки digest

Ошибка проверки digest
>>> checking ebuild checksums
!!! Digest verification failed:

digest - md5 сумма файлов, необходимых для установки пакетов.

Это признак того, что что-то не так с деревом Portage. Зачастую это происходит потому, что разработчик совершил небольшую ошибку при добавлении пакета в дерево.

Когда проверка digest не удается, не пытайтесь пересоздать его для пакета лично. Это не решит проблему, а почти наверняка сделает только хуже!

Вместо этого, подождите несколько часов пока дерево не обновится. Вполне вероятно, что ошибка была замечена сразу, но ее исправление может занять некоторое время для синхронизации дерева портежей на зеркалах. Проверьте Bugzilla и посмотрите, есть ли сообщения о возникшей проблеме или поспрашивайте на IRC канале #gentoo. Если упоминаний нет, нужно сообщить о нерабочем пакете.

После того, как ошибка будет исправлена, повторно синхронизируйте дерево портежей, чтобы обновить исправленный digest.

Важно: Это не означает повторную синхронизацию дерева несколько раз в течение короткого периода времени! Как указано в политике Rsync (а также при работе "emerge --sync"), пользователи, которые синхронизируются слишком часто будут заблокированы! На самом деле, лучше подождать до следующей плановой синхронизации, и не перегружать rsync сервера ресинхронизациями.

Добавить комментарий