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
Обратите внимание, что результат содержит подробную информацию. Поля довольно информативны, поэтому вдаваться в подробности их значения не имеет смысла :
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.
После установки пакета, его документацию, как правило, можно найти в подкаталоге с именем пакета в каталоге /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
. В следующем примере, показано ее значение по умолчанию:
При этой конфигурации, пакеты, требующие EULA, не будут устанавливаться.
ACCEPT_LICENSE можно установить глобально в файле /etc/portage/make.conf
или для отдельного пакета в /etc/portage/package.license
.
Например, для того чтобы разрешить для app-crypt/truecrypt использовать лицензию truecrypt-2.7, добавьте в файл /etc/portage/package.license следующее:
В этом примере разрешается установка версий app-crypt/truecrypt требующих лицензию truecrypt-2.7, но не версий с лицензией truecrypt-2.8.
Важно: Лицензии хранятся в /usr/portage/licenses/, а группы лицензий в /usr/portage/profiles/license_groups. Первая запись каждой строки ПРОПИСНЫЕ буквы названия группы лицензий, и каждая последующая запись это индивидуальная лицензия.
Группы лицензий, определенные в 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 придерживается определенного профиля, который содержит, среди другой информации, список пакетов, необходимых для нормального функционирования системы.
Заблокированные пакеты
!!! 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.
Замаскированные пакеты
- 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 флагов
#required by app-text/happypackage-2.0, required by happypackage (argument)
>=app-text/feelings-1.0.0 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.
Недостающие зависимости
!!! Problem with ebuild sys-devel/gcc-3.4.2-r2
!!! Possibly a DEPEND/*DEPEND problem.
Приложение для установки зависит от другого пакета, который не доступен для системы. Пожалуйста, проверьте Bugzilla на наличие решения проблемы. Если решения нет, пожалуйста, сообщите об этом. Если система не настроена на смешение ветвей, этого не должно происходить, и это ошибка .
Неоднозначное имя ебилда
[ 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 будет информировать пользователя о возможных совпадениях для выбора одного из них.
Циклические зависимости
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 на решение возникшей проблемы, и если его нет, сообщить об ошибке.
Ошибка загрузки
(...)
!!! Some fetch errors were encountered. Please see above for details.
Portage не смог загрузить исходный код данного приложения и попытается продолжить установку других приложений (если возможно). Эта ошибка может быть из-за неправильно синхронизированного зеркала или потому что неверно указан источник загрузки в ебилде. Сервер, где находятся исходные коды, также может почему-то сломаться.
Повторите действие через некоторое время, возможно проблема исчезнет.
Защита профилем
!!! This could be damaging to your system.
Пользователь запросил удаление пакета, входящего в состав базовых пакетов системы. Он включен в профиле как обязательный, и, следовательно, не может быть удален из системы.
Ошибка проверки digest
!!! Digest verification failed:
digest - md5 сумма файлов, необходимых для установки пакетов.
Это признак того, что что-то не так с деревом Portage. Зачастую это происходит потому, что разработчик совершил небольшую ошибку при добавлении пакета в дерево.
Когда проверка digest не удается, не пытайтесь пересоздать его для пакета лично. Это не решит проблему, а почти наверняка сделает только хуже!
Вместо этого, подождите несколько часов пока дерево не обновится. Вполне вероятно, что ошибка была замечена сразу, но ее исправление может занять некоторое время для синхронизации дерева портежей на зеркалах. Проверьте Bugzilla и посмотрите, есть ли сообщения о возникшей проблеме или поспрашивайте на IRC канале #gentoo. Если упоминаний нет, нужно сообщить о нерабочем пакете.
После того, как ошибка будет исправлена, повторно синхронизируйте дерево портежей, чтобы обновить исправленный digest.
Важно: Это не означает повторную синхронизацию дерева несколько раз в течение короткого периода времени! Как указано в политике Rsync (а также при работе "emerge --sync"), пользователи, которые синхронизируются слишком часто будут заблокированы! На самом деле, лучше подождать до следующей плановой синхронизации, и не перегружать rsync сервера ресинхронизациями.
Добавить комментарий