Handbook:X86/Portage/Advanced
Введение в расширенные возможности Portage
Для большинства пользователей полученной до сих пор информации достаточно для их повседневных задач в Linux. Но Portage способен на много другое; множество его возможностей предназначены для целей расширенной подгонки системы под личные нужды или применимы только в особых случаях.
Конечно, из-за большой гибкости может появиться большое количество потенциальных случаев. Невозможно описать их все здесь. Вместо этого, целью является сосредоточение внимания на некоторых основных вопросах, основываясь на которых, можно настроить систему определённым образом. Другие ухищрения и советы по настройке можно найти на страницах Gentoo Wiki.
Большинство, если не все эти дополнительные возможности можно легко найти, почитав man-страницы, которые идут вместе с Portage:
user $
man portage
user $
man make.conf
И, наконец, знайте, что эти дополнительные возможности, в случае, если что-то работает не корректно, могут сделать отладку и поиск проблем очень затруднительными. Убедитесь, что сообщили об использовании таких возможностей, когда будете создавать отчет об ошибке.
Переменные окружения для конкретного пакета
Использование /etc/portage/env
По умолчанию, при сборки пакета, будут использоваться переменные окружения, которые определены в /etc/portage/make.conf, такие как CFLAGS, MAKEOPTS и другие. В некоторых случаях, было бы полезно определить другие переменные для некоторых пакетов. Для таких случаев Portage поддерживает использование каталога /etc/portage/env и файла /etc/portage/package.env.
Файл /etc/portage/package.env содержит список пакетов для которых необходимы отклонения в переменном окружении, а также определенный идентификатор, который сообщит Portage, какие изменения необходимо сделать. Имя идентификатора определяется в свободном формате, Portage будет искать переменные в файле /etc/portage/env/<идентификатор>.
Пример: включение отладки для конкретных пакетов
В качестве примера, включим отладку (debugging) для пакета media-video/mplayer.
Сперва установим переменные для отладки в файле, который называется /etc/portage/env/debug-cflags. Имя выбирается произвольно, но, конечно, видна причина такого именования; чтобы сделать более очевидным позже, почему такое именование было сделано.
root #
mkdir /etc/portage/env
# Добавим -ggdb к CFLAGS для отладки
CFLAGS="-O2 -ggdb -pipe"
FEATURES="${FEATURES} nostrip"
Далее, «отметим» пакет media-video/mplayer для использования нового идентификатора debug в файле package.env:
media-video/mplayer debug-cflags
Вмешиваемся в процесс emerge
Использование /etc/portage/bashrc и связанных файлов
Когда Portage работает с разными ebuild, он использует окружение bash в котором он вызывает различные функции сборки (такие как src_prepare
, src_configure
, pkg_postinst
и так далее). Portage позволяет системным администраторам определять некоторые части окружения bash.
Преимущество использования заранее определенных частей окружения bash в том, что это позволяет вмешиваться в процесс emerge на каждом шаге его выполнения. Этого можно добиться для всех команд emerge (через /etc/portage/bashrc) или используя окружение для конкретного пакета (через /etc/portage/env, как это было описано ранее).
Portage calls so-called phase hook functions if they are defined in /etc/portage/bashrc. These functions follow the naming convention pre_phase_name
and post_phase_name
. For example, Portage will call the post_pkg_postinst
hook just after calling the pkg_postinst
phase function.
Чтобы вмешаться в процесс, окружение bash может слушать переменные EBUILD_PHASE, CATEGORY, а так же как переменные, которые всегда доступны в процессе работы ebuild (такие как P, PF, ...). На основе значений этих переменных могут быть выполнены дополнительные шаги и функции.
Пример: обновление базы данных файлов
В этом примере будет использоваться /etc/portage/bashrc для вызова некоторых приложений с базами данных файлов, чтобы синхронизировать состояние их баз данных с системой. Приложения, используемые в этом примере, aide (утилита обнаружения вторжений) и updatedb (для использования с mlocate) это просто примеры. Не воспринимайте это как руководство для программы AIDE.
Чтобы данном случае воспользоваться /etc/portage/bashrc, мы должны вмешаться в функции postrm
(после удаления файлов) и postinst
(после установки файлов), потому что именно в этих случаях изменяются файлы в системе.
if [ "${EBUILD_PHASE}" == "postinst" ] || [ "${EBUILD_PHASE}" == "postrm" ];
then
echo ":: Calling aide --update to update its database"
aide --update
echo ":: Calling updatedb to update its database"
updatedb
fi
post_pkg_postinst() { my_database_update; } post_pkg_postrm() { my_database_update; } }}
Выполнения задач после операции синхронизации репозитория
Использование /etc/portage/postsync.d
До этого момента мы говорили только о вмешательстве в процессы ebuild. Однако у Portage также есть и другие важные функции: обновление Gentoo репозитория. Чтобы запустить задачу после обновления Gentoo репозитория, поместите скрипт в каталог /etc/portage/postsync.d и убедитесь, что он отмечен как исполняемый.
Пример: запуск eix-update
Если eix-sync не используется для синхронизации репозитория, то все еще можно обновить его базу данных после выполнения emerge --sync (или emerge-webrsync) добавив в каталоге /etc/portage/postsync.d символьную ссылку на /usr/bin/eix, назвав ее eix-update.
root #
ln -s /usr/bin/eix /etc/portage/postsync.d/eix-update
Если необходимо использовать другое имя, то необходим скрипт, который вызовет /usr/bin/eix-update. Бинарный файл eix смотрит под каким именем его вызвали, чтобы узнать, какую функцию он должен выполнить. Если символьная ссылка указывает на eix, но ссылка называется не eix-update, то это будет работать не корректно.
Переопределение настроек профиля
Использование /etc/portage/profile
По умолчанию Gentoo использует настройки, содержащиеся в профиле, на который указывает /etc/portage/make.profile (символьная ссылка на каталог профиля). Эти профили определяют как специфичные для профиля настройки, так и наследуют настройки из других профилей (через их родительские файлы).
Используя /etc/portage/profile, системные администраторы могут переопределить настройки профиля, такие как пакеты (какие пакеты считаются частью системного набора (@system)), обязательные USE-флаги и другое.
Пример: добавление nfs-utils в набор system
В случае использования критически важных файловых систем на основе NFS, может потребоваться отметить пакет net-fs/nfs-utils в качестве системного, из-за чего Portage будет строго предупреждать системных администраторов в случае, если они попытаются этот пакет удалить.
Чтобы достичь этой цели, необходимо указать в файле /etc/portage/profile/packages пакет, добавив *
перед его именем:
*net-fs/nfs-utils
Применение нестандартных патчей
Patching source code using user patches in /etc/portage/patches/
User patches provide a way to apply patches to package source code when sources are extracted before installation. This can be useful for applying upstream patches to unresolved bugs, or simply for local customizations.
Patches need to be dropped into /etc/portage/patches/. They will automatically be applied during package installation.
Patches can be dropped into any of the following directories:
- /etc/portage/patches/${CATEGORY}/${P}/ e.g. /etc/portage/patches/dev-lang/python-3.3.5-r1/
- /etc/portage/patches/${CATEGORY}/${PN}/ e.g. /etc/portage/patches/dev-lang/python-3.4.2/
- /etc/portage/patches/${CATEGORY}/${P}-${PR}/ e.g. /etc/portage/patches/dev-lang/python-3.3.5-r0/
Пример: применение патчей к Firefox
Пакет www-client/firefox один из множества пакетов, который вызывает функцию eapply_user
(возможно, не напрямую) из ebuild, так что нет необходимости что-либо менять.
В некоторых случаях (например, разработчик предоставил патч и попросил проверить исправляет ли он ошибку), когда необходимо пропатчить Firefox, просто нужно поместить патч в /etc/portage/patches/www-client/firefox (лучше использовать полное имя и версию, так чтобы патч не мешал более ранним версиям) и пересобрать Firefox.