В начало → Настольная книга Gentoo Linux x86 → Работа с Gentoo |
Система Portage — вероятно, самое известное нововведение Gentoo в управлении программным обеспечением. Благодаря высокой гибкости и чрезвычайно богатым возможностям, она зачастую считается лучшим средством управления программным обеспечением из существующих в Linux.
Portage полностью написана на Python и Bash, и в результате полностью прозрачна для пользователей, поскольку оба — языки сценариев.
Большинство пользователей взаимодействует с Portage с помощью команды emerge. Эта глава не призвана заменить страницу справки emerge. Для просмотра всех возможных параметров команды emerge, обращайтесь к странице справки:
Говоря о пакетах, мы часто имеем в виду программы, доступные пользователям Gentoo через дерево портежей. Дерево портежей —
это набор сборочных файлов ebuild, содержащих всю информацию, необходимую Portage для управления программным обеспечением
(установки, поиска, извлечения и т.п.) По умолчанию сборочные файлы находятся в /usr/portage
.
Когда Portage по вашему поручению выполняет любые действия над пакетами программ, эти действия опираются на сборочные файлы, имеющиеся в системе. Поэтому необходимо регулярно обновлять сборочные файлы, чтобы Portage знала о новых программах, обновлениях, связанных с безопасностью и т.д.
Дерево портежей обычно обновляется с помощью rsync (англ.), средства быстрой разностной передачи файлов. Обновление выполнить довольно просто, так как запуск rsync обеспечивается командой emerge :
Если rsync выполнить невозможно из-за ограничений межсетевого экрана, дерево портежей все-таки можно обновить из ежедневных «снимков», создаваемых нами. Для автоматического извлечения и установки в системе новейшего снимка служит утилита emerge-webrsync:
Для поиска программ в дереве портежей по названию можно использовать встроенные возможности команды emerge. По умолчанию команда emerge --search выдает названия пакетов, соответствующих (как полностью, так и частично) заданному условию поиска.
Например, чтобы найти все пакеты, содержащие «pdf» в названии:
Для поиска пакетов еще и по тексту описания можно использовать параметр --searchdesc
(или -S
):
Посмотрев на сообщения команды, вы отметите, что вам дается множество информации. Поля четко обозначены, поэтому мы не будем вдаваться в подробности их значения:
Листинг 157. Пример вывода emerge --search
* net-print/cups-pdf
Latest version available: 1.5.2
Latest version installed: [ Not Installed ]
Size of downloaded files: 15 kB
Homepage: http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
Description: Provides a virtual printer for CUPS to produce PDF files.
License: GPL-2
(
* net-print/cups-pdf
Последняя доступная версия: 1.5.2
Последняя установленная версия: [ не установлен ]
Размер загружаемых файлов: 15 kB
Веб-страница: http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
Описание: Снабжает CUPS виртуальным принтером для печати PDF-файлов.
Лицензия: GPL-2 )
(JohnBat26): Для более быстрого поиска программ используйте утилиту: eix (установка emerge eix). Она работает быстрее благодаря индексированию. Не забывайте запускать update-eix после emerge —sync ;)
После того, как вы нашли нужное программное обеспечение, его можно легко установить с помощью команды emerge. Вот пример установки пакета gnumeric:
Так как множество приложений зависит друг от друга, любая попытка установить какой-либо пакет программ может повлечь за собой
также установку дополнительных пакетов. Не беспокойтесь, Portage справится и с этим. Если вы захотите выяснить, что именно
Portage собирается установить вместе с нужным вам пакетом, добавьте параметр --pretend
. Например:
После команды на установку пакета, Portage загружает из интернета необходимый исходный код (при необходимости), и по умолчанию
сохраняет его в каталоге /usr/portage/distfiles
. После этого пакет распаковывается, компилируется и устанавливается. Если вы хотите, чтобы Portage только загрузила исходный
код без его установки, добавьте к команде emerge параметр --fetchonly
:
Многие пакеты содержат собственную документацию. Иногда USE-флаг doc определяет, следует ли устанавливать документацию к пакету.
Проверить наличие USE-флага doc можно командой emerge -vp <название пакета>
.
Листинг 161. Проверка наличия USE-флага doc
(alsa-lib - это всего лишь пример)#
emerge -vp alsa-lib
[ebuild N ] media-libs/alsa-lib-1.0.9_rc3 +doc -jack 674 kB
USE-флаг doc можно включить или отключить как глобально в файле /etc/make.conf
, так и для отдельных пакетов в файле /etc/portage/package.use
. Также можно, создав каталог с названием /etc/portage/package.use
, указать флаг в файле внутри этого каталога. В главе USE-флаги этот вопрос описывается более подробно.
Документация от вновь установленного пакета обычно находится в подкаталоге каталога /usr/share/doc
, соответствующем названию пакета. Кроме того, можно вывести список всех установленных файлов утилитой equery, которая входит
в пакет gentoolkit (англ.) — app-portage/gentoolkit.
Листинг 162. Обнаружение документации пакета
#
ls -l /usr/share/doc/alsa-lib-1.0.9_rc3
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 (или используйте для поиска интересных файлов команду equery :)#
equery files alsa-lib | less
media-libs/alsa-lib-1.0.9_rc3 * Contents of media-libs/alsa-lib-1.0.9_rc3: /usr /usr/bin /usr/bin/alsalisp (выдача обрезана)
Когда вы захотите удалить пакет из системы, используйте команду emerge --unmerge. Это приведет к удалению из системы всех файлов, установленных пакетом, кроме конфигурационных файлов приложения, изменявшихся после установки. Сохранение конфигурационных файлов позволяет вернуться к работе с пакетом, если вы когда-нибудь решите снова его установить.
Portage не проверяет, зависят ли другие пакеты от удаляемого! Однако вы получите предупреждение, если удаление пакета приведет к неработоспособности системы.
После удаления пакета из системы, пакеты, установленные автоматически, потому что от них зависел удаленный пакет, остаются. Чтобы Portage выявила все когда-то нужные пакеты, которые теперь можно удалить, используйте команду emerge --depclean. Мы вернемся к этому ниже.
Чтобы система сохранялась в отличной форме (не говоря уже об установке свежайших обновлений, связанных с безопасностью), ее
нужно регулярно обновлять. Так как Portage просматривает сборочные файлы только в локальном дереве портежей, сперва потребуется
обновить его. Обновив дерево портежей, вы сможете обновить систему командой emerge --update world. В следующем примере мы также пользуемся параметром --ask
, который поручает Portage вывести список пакетов, которые она собирается обновить, и спросить вас, можно ли продолжать:
Portage будет искать более новые версии установленных приложений. Однако проверяется только версии приложений, явно установленных
вами, а не тех, от которых они зависят. Если вы хотите обновить каждый пакет в системе, добавьте аргумент --deep
:
Поскольку обновления, относящиеся к безопасности, случаются и в пакетах, явным образом не устанавливались (но были «подтянуты» из-за того, что он них зависят другие программы), рекомендуется изредка запускать эту команду.
Если вы меняли какие-либо из USE-флагов, возможно, потом вы также захотите добавить параметр --newuse
. Тогда Portage проверит, требует ли изменение установки новых пакетов или перекомпиляции существующих:
У некоторых пакетов в дереве портежей нет содержимого как такового, и они используются для установки набора других пакетов. Например, пакет kde полностью устанавливает среду KDE в вашей системе, привлекая различные KDE-пакетов в качестве зависимостей.
Если вы когда-либо захотите удалить из системы такой пакет, запуск emerge --unmerge не возымеет должного эффекта, так как пакеты, от которых он зависит, останутся в системе.
В Portage существует возможность удаления остаточных зависимостей, но так как зависимости программ меняются со временем, доступность программного обеспечения, прежде всего требуется полностью обновить всю систему, включая реализацию изменений, произведенных путем модификации USE-флагов. После этого можно запустить emerge --depclean, чтобы удалить остаточные зависимости. Когда это сделано, вам потребуется пересобрать приложения, ранее динамически связанные с удаленными пакетами, в которых они теперь не нуждаются.
Со всем этим управляются следующие три команды:
Листинг 167. Удаление ненужных зависимостей
#
emerge --update --deep --newuse world
#
emerge --depclean
#
revdep-rebuild
revdep-rebuild входит в пакет gentoolkit; не забудьте сначала его установить:
Как уже сказано, 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 придерживается определенного профиля, который содержит, помимо прочего, список пакетов, необходимых для работоспособности системы.
Листинг 169. Предупреждение о заблокированных пакетах (с --pretend
)
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)
Листинг 170. Предупреждение о заблокированных пакетах (без --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.
( !!! Ошибка: пакет mail-mta/postfix конфликтует с другим пакетом.
!!! оба не могут находиться в системе одновременно. Пожалуйста,
!!! запустите 'emerge --pretend' для выявления блокирующих пакетов. )
В файлах ebuild есть специальные поля, сообщающие Portage о зависимостях. Возможны два вида зависимости: зависимость сборки,
объявленная в DEPEND
, и зависимость выполнения, объявленная в RDEPEND
. Когда одна из этих зависимостей явно указывает на несовместимость пакета или виртуального пакета, это вызывает блокировку.
Для разблокировки можно отказаться от установки пакета или предварительно удалить конфликтующего пакета. В данном примере можно отказаться от установки postfix или сначала удалить ssmtp.
Также возможно, что два пакета, подлежащие установке, блокируют друг друга. В этом редчайшем случае следует определить, зачем вам устанавливать оба пакета. В большинстве случаев можно обойтись одним. Если это окажется не так, то, пожалуйста, заведите отчет об ошибке в системе распределения запросов Gentoo.
Листинг 171. Предупреждение о замаскированных пакетах
!!! all ebuilds that could satisfy "bootsplash" have been masked.
(!!! все сборки, удовлетворяющие "bootsplash", замаскированы.)
Листинг 172. Предупреждение о замаскированных пакетах с указанием причины
!!! 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: пакет считается не предназначенным для вашего профиля. В случае установки приложение может вызвать сбой системы или просто несовместимо с используемым профилем.
Листинг 173. Предупреждение об отсутствии пакета
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, а если нет, сообщите об ошибке. Если вы не смешиваете ветви, такого не должно происходить, и это — явная ошибка.
Листинг 174. Предупреждение о повторяющихся именах 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 предложит вам возможные варианты.
Листинг 175. Предупреждение 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, и если нет, сообщить о ней.
Листинг 176. Предупреждение 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 указывает на неверное место. Сервер, где находятся исходные коды, также может почему-либо не работать.
Повторите действие через час, чтобы посмотреть, повторится ли эта ошибка.
Листинг 177. Предупреждение Portage о пакете, защищенном профилем
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.
( !!! Попытка удаления пакетов из системного профиля. 'sys-apps/portage'
!!! Это может повредить вашей системе. )
Вы попросили удалить пакет, входящий в состав базовых пакетов вашей системы. Он отмечен в вашем профиле как обязательный, и его не следует удалять из системы.
Устанавливая Gentoo (или любой другой дистрибутив, или даже операционную систему вообще), вы выбираете те или иные возможности в зависимости от среды, с которой работаете. Установка сервера отличается от установки рабочей станции, а установка игровой станции — от платформы 3D-рендеринга.
Это касается не только того, какие пакеты устанавливать, но и какие функции определенных пакетов должны поддерживаться. Если вам не нужен OpenGL, то зачем вам его ставить и встраивать поддержку OpenGL в большинство программ? Если вы не собираетесь использовать KDE, зачем собирать пакеты с его поддержкой, если они работают и без этого?
Чтобы помочь пользователям в выборе того, что устанавливать/активировать, а что — нет, мы захотели дать им простой способ описания рабочей среды. Это позволяет пользователю решить, что же ему на самом деле надо, и облегчить работу с Portage, нашей системой управления пакетами.
Рассмотрим USE-флаги. USE-флаг — это ключевое слово, включающее сведения о поддержке и зависимостях определенного понятия или функции. При определении какого-либо USE-флага, Portage узнает, что вам нужна поддержка соответствующей функции. Конечно, это также влияет на сведения о зависимостях пакета.
Давайте рассмотрим конкретный пример — ключевое слово kde. Если в вашей переменной USE нет этого слова, то все пакеты, где поддержка KDE является необязательной, собираются без нее. Все пакеты, где зависимость от KDE является необязательной, устанавливаются без установки библиотек KDE (по зависимости). Если же вы определите ключевое слово kde, то эти пакеты будут собираться с поддержкой KDE, а KDE будет установлен в качестве необходимого.
Правильно определяя ключевые слова, вы создаете систему, подогнанную специально для ваших нужд.
Есть два типа USE-флагов: глобальные и локальные.
Глобальный USE-флаг используется несколькими пакетами и является системным. Это то, что большинство видит в качестве USE-флагов.
Локальный USE-флаг используется единичным пакетом для настройки определенных параметров самого пакета.
Список доступных глобальных USE-флагов можно найти в сети или локально в /usr/portage/profiles/use.desc
.
Список локальных USE-флагов находится в вашей системе в /usr/portage/profiles/use.local.desc
.
(JohnBat26): Для удобной установки и чтения описаний USE
флагов используйте программу: Use Flag EDitor или ufed (emerge ufed)
В надежде, что вы убедились в важности USE-флагов, теперь мы расскажем, как их объявлять.
Как сказано ранее, все USE-флаги объявляются в переменной USE. Чтобы упростить пользователям поиск и выбор флагов, мы предлагаем значение USE по умолчанию, которое представляют собой список USE-флагов, как нам кажется, наиболее часто используемых пользователями Gentoo. Это значение приведено в файле make.defaults вашего профиля.
Профиль, на который ориентируется ваша система, указывается символьной ссылкой /etc/make.profile
. Каждый профиль основывается на предыдущем, более крупном, а итоговый складывается из всех профилей. Верхним является базовый
профиль (/usr/portage/profiles/base
).
Давайте взглянем на значение по умолчанию для профиля 2004.3:
Листинг 178. Итоговая переменная USE
make.defaults
для профиля 2004.3
(в этом примере объединяются значения из base, default-linux,
default-linux/x86 и default-linux/x86/2004.3)
USE="x86 oss apm arts avi berkdb bitmap-fonts crypt cups encode fortran f77
foomaticdb gdbm gif gpm gtk imlib jpeg kde gnome libg++ libwww mad
mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt
quicktime readline sdl spell ssl svga tcpd truetype X xml2 xmms xv zlib"
Как видите, эта переменная уже содержит достаточно много ключевых слов. Не меняйте файл make.defaults
для настройки переменной USE
под свои нужды: изменения в этом файле аннулируются при обновлении Portage!
Для изменения значения по умолчанию, нужно добавлять или удалять ключевые слова из переменной USE
. Это делается глобально, определением переменной USE
в /etc/make.conf
. В эту переменную можно добавить нужные вам USE-флаги, или удалить ненужные. Для удаления флага, его надо указывать со знаком
минус в виде приставки («-
»).
Например, чтобы убрать поддержку KDE и QT, но добавить поддержку ldap, можно определить в /etc/make.conf
переменную USE следующего вида:
Иногда нужно определить некоторые USE-флаги только для одного или нескольких пакетов, не трогая системных настроек. Для этого
необходимо создать каталог /etc/portage
(если его еще нет) и отредактировать файл /etc/portage/package.use
.
Например, вам не нужна глобальная поддержка berkdb, но она необходима в mysql:
Естественно, можно в явном виде отключить USE-флаги для определенного пакета. Например, если вам не нужна поддержка java в PHP:
Иногда необходимо установить какой-то USE-флаг только на один раз. Вместо того, чтобы дважды редактировать /etc/make.conf
(сначала добавить изменения USE
, а потом удалить), можно просто объявить USE как переменную среды. Помните, что при переустановке или обновлении приложения
(явном или в составе обновления системы) ваши изменения будут утеряны!
Например, уберем java из значения USE на время установки mozilla.
Конечно же, существует определенная последовательность формирования значения USE. Вы же не хотите объявить USE="-java"
только для того, чтобы узнать, что java все еще включена из-за значения с более высоким приоритетом. Последовательность установки
значения USE
в порядке приоритета (от меньшего к большему) такова:
значение USE
по умолчанию, объявленное в файлах make.defaults
в составе вашего профиля;
значение, определенное пользователем в /etc/make.conf
;
значение, указанное пользователем в /etc/portage/package.use
;
значение, определенное пользователям в переменной среды.
Чтобы узнать, какие же настройки USE
в конечном счете видит Portage, запустите emerge --info. Эта команда выводит значения всех переменных (включая USE
), используемые Portage.
Если вы изменили свои USE-флаги и хотите обновить всю систему в соответствии с новым значением USE
, запустите emerge с параметром --newuse
:
Теперь запустите функцию Portage depclean, чтобы удалить условные зависимости, присутствующие в «старой» системе, но больше не нужные при новом составе USE-флагов.
Запуск emerge --depclean является опасной операцией, которую следует использовать с осторожностью. Дважды проверьте список «ненужных» пакетов и убедитесь,
что не удалятся нужные пакеты. В следующем примере мы добавляем ключ -p
, чтобы depclean только перечислил пакеты, не удаляя их.
Когда depclean закончит свою работу, запустите revdep-rebuild, чтобы пересобрать программы, динамически связанные с библиотеками, входящими в потенциально удаленные пакеты. revdep-rebuild входит в пакет gentoolkit, так что не забудьте сначала установить его.
После выполнения всех этих действий, ваша система будет полностью использовать новые значения USE-флагов.
Возьмем, к примеру, mozilla — какие USE-флаги она может использовать? Чтобы это выяснить, запустим emerge с параметрами --pretend
и --verbose
:
Листинг 187. Просмотр используемых USE флагов
#
emerge --pretend --verbose mozilla
These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild R ] www-client/mozilla-1.7.12-r2 USE="crypt gnome java mozsvg ssl truetype xprint -debug -ipv6 -ldap -mozcalendar -mozdevelop -moznocompose -moznoirc -moznomail -moznoxft -postgres -xinerama" 0 kB
emerge — не единственное средство для решения этой задачи. Существует программа, специально предназначенная для вывода информация о пакетах. Она называется equery и находится в пакете gentoolkit. Для начала установим этот пакет:
Теперь для просмотра USE-флагов какого-нибудь пакета запустим equery с аргументом uses. Пусть это будет пакет gnumeric:
Листинг 189. Запуск equery для просмотра доступных USE-флагов
# equery uses =gnumeric-1.6.3 -a [ Searching for packages matching =gnumeric-1.6.3... ] [ Colour Code : set unset ] [ Legend : Left column (U) - USE flags from make.conf ] [ : Right column (I) - USE flags packages was installed with ] [ Found these USE variables for app-office/gnumeric-1.6.3 ] U I - - debug : Tells configure and the makefiles to build for debugging. Effects vary across packages, but generally it will at least add -g to CFLAGS. Remember to set FEATURES=nostrip too - - gnome : Adds GNOME support + + python : Adds support/bindings for the Python language - - static : !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
В Portage есть несколько дополнительных возможностей (features), которые значительно улучшат ваше впечатление от Gentoo. Многие из этих возможностей полагаются на определенные программы, повышающие производительность, надежность, безопасность и т.п.
Для включения и выключения определенных возможностей Portage нужно редактировать в файле /etc/make.conf
переменную FEATURES
, в которой перечислены ключевые слова, разделенные пробелами, обозначающие различные возможности. Иногда для использования
соответствующих возможностей потребуется установка дополнительных утилит.
Здесь перечислены не все возможности, поддерживаемые Portage. Полный перечень представлен на странице справки make.conf
:
Чтобы узнать, какие возможности включены по умолчанию, запустите emerge --info и найдите переменную FEATURES
(или отфильтруйте ее с помощью grep):
distcc — программа, распределяющая компиляцию по нескольким, не обязательно одинаковым, машинам в сети. Клиент distcc посылает всю необходимую информацию на доступные серверы distcc (на которых выполняется distccd), чтобы они могли компилировать для клиента части исходного кода. Чистый выигрыш — более быстрая компиляция.
Подробная информация о distcc (и как заставить его заработать в Gentoo) находится в нашем описании distcc в Gentoo.
Distcc поставляется с графическим монитором (средством контроля), позволяющим отслеживать задачи, которые ваш компьютер отсылает на компиляцию. Если вы используете Gnome, тогда добавьте «gnome» к переменной USE. А если вы не пользуетесь Gnome, но при этом хотите пользоваться монитором, добавьте «gtk» к переменной USE.
Добавьте distcc к переменной FEATURES
в файле /etc/make.conf
. Затем отредактируйте переменную MAKEOPTS
, как вам нравится. Известная рекомендация — указывать директиву «-j
», где X
X
— число центральных процессоров, на которых работает distccd (включая текущий компьютер) плюс один; у вас могут получиться
лучшие результаты и с другими значениями.
Теперь запустите distcc-config и введите список доступных серверов distcc. Для простоты примера, предположим, что доступные серверы DistCC — 192.168.1.102 (текущий компьютер), 192.168.1.103 и 192.168.1.104 (два «удаленных» компьютера):
Листинг 193. Настройка distcc для использования трех доступных серверов distcc
#
distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"
Не забудьте также запустить демон distccd
:
ccache — это быстрый кэш компилятора. Когда вы компилируете программу, он кэширует промежуточные результаты так, что всякий раз, когда вы перекомпилируете ту же самую программу, время компиляции значительно сокращается. В типичных случаях общее время компиляции может сокращаться в 5—10 раз.
Если вы интересуетесь подробностями ccache, пожалуйста, посетите домашнюю страницу ccache.
Для установки ccache, выполните emerge ccache:
Откройте /etc/make.conf
и добавьте ccache
к переменной FEATURES
. Затем добавьте новую переменную по имени CCACHE_SIZE
(размер кэша), и установите её равной «2G»:
Для проверки работоспособности ccache, запросите статистику ccache. Из-за того, что Portage использует другой домашний каталог
ccache, вам также потребуется установить переменную CCACHE_DIR
:
Домашний каталог ccache по умолчанию — /var/tmp/ccache
; изменить это назначение можно, определив переменную CCACHE_DIR
в /etc/make.conf
.
Однако, при запуске ccache используется каталог по умолчанию, ${HOME}/.ccache
, вот почему при запросе статистики (Portage) ccache требуется определять переменную CCACHE_DIR
.
Если вы хотите использовать ccache для компиляций не в Portage, добавьте /usr/lib/ccache/bin
в начало вашей переменной PATH
(перед /usr/bin
). Это можно сделать, отредактировав /etc/env.d/00basic
, который является первым файлом среды, где определяется переменная PATH
:
Portage поддерживает установку заранее собранных готовых пакетов. Несмотря на то, что в саму Gentoo не входят заранее собранные пакеты (за исключением снимков GRP), Portage можно настроить на полноценное управление готовыми пакетами.
Чтобы создать двоичный пакет, можно использовать quickpkg, если пакет уже установлен в вашей системе, или emerge с параметрами
--buildpkg
или --buildpkgonly
.
Если вы хотите, чтобы Portage создавал двоичные пакеты из каждого пакета, который вы будете устанавливать, добавьте buildpkg
к переменной FEATURES
.
Расширенная поддержка создания наборов готовых пакетов имеются в catalyst. Для получения подробной информации о catalyst, пожалуйста, прочитайте справочное руководство по catalyst (англ.) и распространенные вопросы о catalyst (англ.).
Хотя в Gentoo такого хранилища нет, вы можете создать централизованное хранилище для заранее скомпилированных двоичных пакетов.
Чтобы использовать такое хранилище, потребуется указать Portage путь к нему с помощью переменной PORTAGE_BINHOST
. Например, если двоичные пакеты находятся на ftp://buildhost/gentoo:
При установке двоичных пакетов, указывайте в команде emerge параметр --getbinpkg
вместе с параметром --usepkg
. Первый указывает emerge загрузить двоичный пакет c сервера, определенного раньше, а второй сообщает emerge, что до загрузки
исходных кодов и их компиляции сначала нужно попытаться установить этот двоичный пакет.
Например, чтобы установить gnumeric из двоичных пакетов:
Подробную информацию о параметрах установки двоичных пакетов можно найти на странице справки emerge:
При загрузке вашей системы по экрану пробегает много текста. Если присмотреться, заметно, что этот текст не меняется от загрузки к загрузке. Последовательность всех этих действий называется последовательностью загрузки и в той или иной степени постоянна.
Во-первых, загрузчик размещает в памяти образ ядра, который вы указали в файле его конфигурации. После этого ядро запускается. Когда ядро загружено и запущено, оно инициализирует относящиеся к ядру структуры и задания, и запускает процесс init.
Этот процесс удостоверяется, что все файловые системы (определенные в /etc/fstab
) смонтированы и готовы к использованию. Затем он выполняет несколько сценариев, находящихся в каталоге /etc/init.d
, которые запускают службы, необходимые для нормального запуска системы.
И, наконец, когда все сценарии выполнены, init подключает терминалы (чаще всего просто виртуальные консоли, которые видны при нажатии ALT+F1, ALT+F2 и т.д.), прикрепляя к каждой консоли специальный процесс под названием agetty. Этот процесс впоследствии обеспечивает возможность входа в систему с помощью login.
Сейчас процесс init запускает сценарии из каталога /etc/init.d
не просто в случайном порядке. Более того, запускаются не все сценарии из /etc/init.d
, а только те, которые предписано исполнять. Решение о запуске сценария принимается в результате просмотра каталога /etc/runlevels
.
Во-первых, init запускает все сценарии из /etc/init.d
, на которые есть символьные ссылки из /etc/runlevels/boot
. Обычно сценарии запускаются в алфавитном порядке, но в некоторых сценариях имеется информация о зависимостях от других сценариев,
указывающая системе на необходимость их предварительного запуска.
Когда все сценарии, указанные в /etc/runlevels/boot
, будут выполнены, init переходит к запуску сценариев, на которые есть символьные ссылки из /etc/runlevels/default.
И снова запуск происходит в алфавитном порядке, пока в сценарии не встретится информация о зависимостях; тогда порядок изменяется
для обеспечения правильного порядка запуска.
Конечно, init не принимает решений сам по себе. Ему необходим конфигурационный файл, где описаны необходимые действия. Этот
файл — /etc/inittab
.
Если вы запомнили последовательность загрузки, описанную чуть ранее, вы вспомните, что первое действие init — это монтирование
всех файловых систем. Это определяется в строке /etc/inittab
, приведенной ниже:
Этой строкой процессу init предписывается выполнить /sbin/rc sysinit для инициализации системы. Самой инициализацией занимается сценарий /sbin/rc, так что можно сказать, что init делает не слишком много — он просто делегирует задачу по инициализации системы другому процессу.
Во-вторых, init выполняет все сценарии, на которые есть символьные ссылки из /etc/runlevels/boot
. Это определяется следующей строкой:
И снова все необходимые действия выполняются сценарием rc. Заметьте, что параметр, переданный rc (boot), совпадает с названием
используемого подкаталога в /etc/runlevels
.
Теперь init проверяет свой конфигурационный файл, чтобы определить, какой уровень запуска использовать. Для этого из /etc/inittab
считывается строка:
В приведенном примере (который подходит для подавляющего большинства пользователей Gentoo) номер уровня запуска — 3. Пользуясь этой информацией, init проверяет, что нужно выполнить для запуска уровня запуска 3:
Листинг 205. Определение уровней запуска
l0:0:wait:/sbin/rc shutdown l1:S1:wait:/sbin/rc single l2:2:wait:/sbin/rc nonetwork l3:3:wait:/sbin/rc default l4:4:wait:/sbin/rc default l5:5:wait:/sbin/rc default l6:6:wait:/sbin/rc reboot
В строке, определяющей уровень 3, для запуска служб снова используется сценарий rc (на этот раз с аргументом default). Опять-таки,
обратите внимание, что аргумент, передаваемый сценарию rc, совпадает с названием подкаталога из /etc/runlevels
.
По окончании работы rc, init принимает решение о том, какие виртуальные консоли включить и какие команды выполнить в каждой из них:
Листинг 206. Определение виртуальных консолей
c1:12345:respawn:/sbin/agetty 38400 tty1 linux c2:12345:respawn:/sbin/agetty 38400 tty2 linux c3:12345:respawn:/sbin/agetty 38400 tty3 linux c4:12345:respawn:/sbin/agetty 38400 tty4 linux c5:12345:respawn:/sbin/agetty 38400 tty5 linux c6:12345:respawn:/sbin/agetty 38400 tty6 linux
Как вы заметили, init применяет нумерацию для определения уровня запуска, который надо использовать. Уровень запуска — это то состояние, в котором запускается ваша система, он содержит набор сценариев (сценариев уровня запуска или сценариев инициализации [initscript]), которые следует выполнять, при входе и выходе из определенного уровня запуска.
В Gentoo определено семь уровней запуска: три служебных и четыре определяемых пользователем. Служебные называются sysinit, shutdown и reboot. Действия, совершаемые ими, в точности соответствуют их названиям: инициализация системы, выключение системы и ее перезагрузка.
Определяемые пользователем уровни — это те, которым соответствуют подкаталоги в /etc/runlevels
: boot
, default
, nonetwork
и single
. Уровень boot
запускает все службы, необходимые системе и используемые всеми остальными уровнями. Остальные уровни отличаются друг от друга
запускаемыми службами: default
используется для повседневной работы, nonetwork
— для тех случаев, когда не требуется сеть, а single
— при необходимости восстановления системы.
Сценарии, запускаемые процессом rc, называются сценариями инициализации. Каждый сценарий из /etc/init.d
может запускаться с аргументами start
, stop
, restart
, pause
, zap
, status
, ineed
, iuse
, needsme
, usesme
и broken
.
Для запуска, остановки или перезапуска службы (и всех, зависящих от нее) следует использовать start
, stop
и restart
:
Останавливаются или перезапускаются только те службы, которым необходима данная служба. Остальные зависимые службы (те, которые используют службу, но не нуждаются в ней) эта операция не затрагивает.
Если вы хотите остановить службу, но оставить зависимые от нее работающими, можно использовать аргумент pause
:
Чтобы узнать текущее состояние службы (запущена, остановлена, приостановлена и т.д.), можно использовать аргумент status
:
Если указано, что служба работает, но вы знаете, что это не так, можно сбросить состояние на stopped (остановлена), используя
аргумент zap
:
Для того, чтобы выяснить зависимости службы, можно использовать аргументы iuse
или ineed
. С помощью ineed
вы увидите те службы, которые действительно необходимы для правильного функционирования интересующей вас службы. С другой
стороны, iuse
покажет те службы, которые могут использоваться нашей службой, но не обязательны для ее работы.
Листинг 211. Запрос списка всех необходимых служб, от которых зависит Postfix
#
/etc/init.d/postfix ineed
Аналогично вы можете узнать, какие службы нуждаются в данной службе (needsme) или могут ее использовать (usesme
):
Наконец, можно просмотреть список служб, требующихся для данной, но отсутствующих в системе:
Листинг 213. Запрос списка служб, необходимых Postfix, но отсутствующих
#
/etc/init.d/postfix broken
Система инициализации Gentoo использует дерево зависимостей для определения служб, которые запускаются в первую очередь. Т. к. это очень утомительное занятие, и мы не хотели, чтобы пользователь занимался этим вручную, мы разработали инструменты, упрощающие управление уровнями запуска и сценариями инициализации.
Используя rc-update, можно включать и исключать сценарии инициализации из уровней запуска. Из rc-update автоматически запускается сценарий depscan.sh
для перестроения дерева зависимостей.
В процессе установки Gentoo вы уже добавляли сценарии инициализации в уровень запуска «default». В тот момент вы, возможно,
не имели понятия, что такое «default» и зачем он нужен, но теперь вы все это знаете. Сценарию rc-update требуется второй аргумент, определяющий действие: add
(добавить), del
(удалить) или show
(показать).
Для того, чтобы добавить или удалить сценарий, просто введите rc-update с аргументом add
или del
, затем название сценария и уровня запуска. Например:
По команде rc-update show выводится список всех доступных сценариев с указанием соответствующих уровней запуска:
Сценарии инициализации могут быть весьма сложны. Поэтому нежелательно допускать непосредственное редактирование сценария пользователями, т.к. это может привнести в систему множество ошибок. Но, с другой стороны, необходимо правильно настроить службу. Например, может понадобиться передать службе дополнительные параметры.
Вторая причина, по которой настройки хранятся отдельно от самого сценария — это возможность обновления сценария без опасения, что все ваши настройки будут утеряны.
В Gentoo предусмотрен очень простой способ настройки служб: для каждого сценария, предполагающего настройку, в каталоге /etc/conf.d
есть конфигурационный файл. Например, у сценария, запускающего apache2 (под названием /etc/init.d/apache2
) есть конфигурационный файл /etc/conf.d/apache2
, где могут храниться нужные вам параметры, передаваемые серверу Apache 2 при запуске:
Такие файлы настроек содержат одни переменные (наподобие /etc/make.conf
), облегчая настройку служб. Это также позволяет нам давать больше информации о переменных (в комментариях).
Нет, написание сценариев инициализации обычно не требуется, т.к. Gentoo содержит готовые сценарии для всех поддерживаемых служб. Однако, вы можете установить какую-либо службу, не используя систему Portage; в таком случае, вероятно, вам придется создавать сценарий инициализации самостоятельно.
не используйте сценарий, идущий со службой, если он не написан специально для Gentoo: сценарии инициализации Gentoo не совместимы со сценариями, используемыми в других дистрибутивах!
Основная структура сценария инициализации показана ниже.
Листинг 217. Основная структура сценария
#!/sbin/runscript depend() { (информация о зависимостях) } start() { (команды, необходимые для запуска службы) } stop() { (команды, необходимые для остановки службы) } restart() { (команды, необходимые для перезапуска службы) }
В любом сценарии должна быть определена функция start()
. Все остальные разделы необязательны.
Можно определять два типа зависимостей: use
(использую) и need
(нуждаюсь). Как упоминалось ранее, need-зависимость более строга, чем use-зависимость. Вслед за типом зависимости указывается
название службы, от которой существует зависимость, или ссылка на виртуальную (virtual) зависимость.
Виртуальная зависимость — это зависимость от функций, предоставляемых службой, но не какой-то единственной службой. Сценарий может зависеть от службы системного журнала, но таких достаточно много (metalogd, syslog-ng, и и т.п.). Поскольку нельзя нуждаться в каждой из них (ни в одной вразумительной системе они не запущены все сразу), мы обеспечили предоставление виртуальной зависимости всеми этими службами.
Давайте взглянем на информацию о зависимостях postfix.
Как можно увидеть, postfix:
требует сеть (net): виртуальная зависимость, удовлетворяемая, например, /etc/init.d/net.eth0
;
использует журнал (logger): виртуальная зависимость, удовлетворяемая, например, /etc/init.d/syslog-ng
;
использует службу имен (dns): виртуальная зависимость, удовлетворяемая, например, /etc/init.d/named
);
предоставляет почтовый агент (mta): виртуальная зависимость, общая для всех программ — почтовых серверов.
Иногда вам нужна не сама служба, а запуск вашей службы до (или после) другой службы, если та присутствует в системе (обратите внимание на условие: это уже не зависимость) и запускается на том же уровне запуска (отметьте условие: это относится только к службам из одинакового уровня запуска). Такую очередность можно указать, используя значения before (до) или after (после).
Например, рассмотрим значения для службы Portmap:
Также можно использовать знак «*», чтобы охватить все службы данного уровня запуска, хотя это не рекомендуется.
Следом за разделом depend()
вам потребуется определить функцию start()
. В ней содержатся все команды, необходимые для запуска вашей службы. Рекомендуется применять функции ebegin
и eend
для сообщений пользователю о том, что происходит:
Листинг 221. Пример функции start()
start() { ebegin "Запуск - моя_служба" start-stop-daemon --start --quiet --exec /path/to/my_service eend $? }
Если вам нужны дополнительные примеры функции start()
, пожалуйста, прочитайте исходные коды сценариев инициализации, находящихся в каталоге /etc/init.d
. Что касается команды start-stop-daemon, то на случай, если вам нужны дополнительные сведения, есть превосходная страница справки:
Другими функциями, которые можно определить — stop()
и restart()
. От вас не требуется определение этих функций! Система инициализации, применяемая нами, достаточно развита и в состоянии
самостоятельно заполнить эти функции, если вы используете start-stop-daemon.
Синтаксис сценариев инициализации, применяемых в Gentoo, основан на оболочке Борна (Bourne Again Shell — bash), поэтому вы можете свободно использовать внутри своих сценариев bash-совместимые конструкции.
Если вы хотите ввести в сценарий дополнительные параметры, кроме упоминавшихся, нужно добавить к переменной opts название
параметра и создать функцию с названием, соответствующим параметру. Например, для поддержки параметра restartdelay
:
Листинг 223. Создание дополнительной функции restartdelay
opts="${opts} restartdelay"
restartdelay() {
stop
sleep 3 # пауза в 3 секунды перед повторным запуском
start
}
Для поддержки конфигурационного файла в каталоге /etc/conf.d
ничего дополнительно делать не нужно: при запуске вашего сценария инициализации автоматически включаются следующие файлы
(т.е., переменные из них становятся доступны):
/etc/conf.d/
<ваш сценарий инициализации>
/etc/conf.d/basic
/etc/rc.conf
Если ваш инициализационный сценарий предоставляет виртуальную зависимость (например, net), то также включается файл, соответствующий
этой зависимости (например, /etc/conf.d/net
).
Большинству пользователей ноутбуков знакома ситуация: дома вам нужен запуск net.eth0
, и наоборот, в дороге запуск net.eth0
не нужен (так как сеть недоступна). В Gentoo можно изменять поведение уровней запуска по своему усмотрению.
Например вы можете создать второй загружаемый уровень запуска «по умолчанию», в котором будут другие сценарии. Затем при загрузке вы сможете выбрать, какой из уровней по умолчанию следует использовать.
Прежде всего, создайте каталог для своего второго уровня запуска «по умолчанию». Например, создадим уровень запуска offline:
Добавьте необходимые сценарии инициализации в только что созданный уровень запуска. Например, чтобы получить точную копию уровня default, за исключением net.eth0:
Листинг 225. Добавление нужных сценариев инициализации
(копирование всех служб с уровня default в уровень offline)#
cd /etc/runlevels/default
#
for service in *; do rc-update add $service offline; done
(удаление ненужных сценариев с уровня offline)#
rc-update del net.eth0 offline
(просмотр сценариев, запускаемых на уровне offline)#
rc-update show offline
(часть выведенного списка) acpid | offline domainname | offline local | offline net.eth0 |
Теперь необходимо отредактировать конфигурацию загрузчика, добавив запись об уровне offline. Например, в файле /boot/grub/grub.conf
:
Листинг 226. Добавление записи об уровне offline
title Автономное использование Gentoo Linux
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
Вуаля, все готово. Теперь, если при загрузке вы выберете вновь созданную запись, то вместо default будет использоваться уровень offline.
Переменная среды — это именованный объект, который содержит информацию, используемую одним или несколькими приложениями.
Многие пользователи (особенно новички в Linux) находят этот подход несколько странным или неуправляемым. Но это впечатление ошибочно: используя переменные среды, можно очень легко изменить настройку разнообразных программ.
В следующей таблице описывается ряд переменных, используемых в системе Linux. Примеры их значений приведены далее.
Переменная |
Описание |
---|---|
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых система ищет исполняемые файлы. Если вы
вводите имя исполняемого файла например, ls, rc-update или emerge), который не находится ни в одной из перечисленных здесь каталогов, этот файл не запустится (если, конечно, вы не указали
полный путь, например, |
|
У этой переменной такое же значение, что и у |
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых динамический компоновщик ищет библиотеки. |
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда man ищет страницы справки. |
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда info ищет info-страницы. |
|
В этой переменной содержится путь к программе, позволяющей постранично просматривать содержимое файлов, например less или more. |
|
В этой переменной содержится путь к программе, используемой для изменения файлов, например vi или nano. |
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся ресурсы KDE. |
|
В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся классы Java. |
|
В этой переменной содержится список каталогов, защищаемых Portage при обновлении, разделенных пробелами. |
|
В этой переменной содержится список каталогов, исключаемых из защиты Portage при обновлении, разделенных пробелами |
Ниже представлен пример определения всех этих переменных:
Листинг 227. Пример определения
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin" ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3" MANPATH="/usr/share/man:/usr/local/share/man" INFODIR="/usr/share/info:/usr/local/share/info" PAGER="/usr/bin/less" EDITOR="/usr/bin/vim" KDEDIRS="/usr" CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:." CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \ /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \ /usr/share/texmf/tex/platex/config/ /usr/share/config" CONFIG_PROTECT_MASK="/etc/gconf"
Для того, чтобы определить эти переменные централизованно, в Gentoo появился каталог /etc/env.d
. В нём находится ряд файлов, например, 00basic
, 05gcc
и так далее, в которых определяются переменные, необходимые программам, указанным в названии файлов.
Например, при установке gcc ebuild создает файл 05gcc
, содержащий следующие определения переменных:
Листинг 228. /etc/env.d/05gcc
PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man" INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info" CC="gcc" CXX="g++" LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
В других дистрибутивах вам предлагается изменять или добавлять определения переменных среды в /etc/profile
или где-нибудь еще. Gentoo, с другой стороны, облегчает вам (и Portage) поддержку и управление переменными среды, избавляя
от необходимости уделять внимание многочисленным файлам, содержащим определения переменных.
Например, когда обновляется gcc, также без малейшего участия пользователя обновляется и /etc/env.d/05gcc
.
От этого выигрывает не только Portage, но и вы, пользователь. Иногда от вас может потребоваться глобальная установка какой-нибудь
переменной. Возьмем, к примеру, переменную http_proxy
. Вместо того, чтобы возиться с /etc/profile
, теперь можно просто создать файл (/etc/env.d/99local
) и добавить нужные определения туда:
Используя один и тот же файл для всех своих переменных, вы можете быстро увидеть все определенные вами переменные вместе.
Переменная PATH
определяется в нескольких файлах в /etc/env.d
. Нет, нет это не ошибка: при запуске env-update различные определения объединяются перед обновлением переменных среды, позволяя пакетам (или пользователям) добавлять собственные
значения переменных, не влияя на уже существующие.
Сценарий env-update объединяет значения переменных из файлов, находящихся в /etc/env.d
, в алфавитном порядке. Имена файлов должны начинаться с двух десятичных цифр.
Листинг 230. Порядок обновления, используемый env-update
00basic 99kde-env 99local +-------------+----------------+-------------+ PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
объединение выполняется не всегда, а только для следующих переменных: KDEDIRS
, PATH
, CLASSPATH
, LDPATH
, MANPATH
, INFODIR
, INFOPATH
, ROOTPATH
, CONFIG_PROTECT
, CONFIG_PROTECT_MASK
, PRELINK_PATH
и PRELINK_PATH_MASK
. Для всех остальных переменных используется значение, определенное в последнем из файлов (по алфавиту в каталоге /etc/env.d
).
При запуске сценария env-update создаются все переменные среды, и помещаются в /etc/profile.env (используемый файлом /etc/profile
). Кроме того, на основе значения LDPATH
создается /etc/ld.so.conf
. После этого запускается ldconfig, чтобы вновь создать файла /etc/ld.so.cache
, используемый динамическим компоновщиком.
Если вы хотите, чтобы результаты работы env-update вступили в силу немедлено, для обновления среды выполните следующую команду. Пользователи, самостоятельно устанавливавшие Gentoo, возможно, помнят ее из указаний по установке:
Эта команда обновляет переменные только в текущем терминале, в новых консолях и их потомках. То есть, если вы работаете в X11, потребуется или набирать source /etc/profile в каждом открываемом терминале, или перезапустить X, чтобы все новые терминалы обращались к новым переменным. Если вы используете диспетчер входа в систему, станьте пользователем с правами root и наберите /etc/init.d/xdm restart. Если нет, вам придется выйти и снова войти в систему, чтобы X порождала потомков, использующих новые значения переменных.
Далеко не всегда нужно определять переменные глобально. Например, вам может понадобиться добавить /home/my_user/bin
и текущий рабочий каталог (где вы находитесь) к переменной PATH
, но при этом не нужно, чтобы это добавление появилось и в переменной PATH
у всех остальных пользователей. Если вы хотите определить переменную среды локально, используйте ~/.bashrc
или ~/.bash_profile
:
Листинг 232. Расширение PATH
в ~/.bashrc
для локальных нужд
(двоеточие без последующего указания каталога означает текущий рабочий каталог)
PATH="${PATH}:/home/my_user/bin:"
Обновление вашей переменной PATH
произойдет, когда вы выйдете и снова войдете в систему.
Иногда нужны еще более жесткие ограничения. Вам может потребоваться возможность запуска исполняемых файлов из специально созданного
временного каталога без указания полного пути к ним, и без изменения файла ~/.bashrc
ради нескольких минут.
В этом случае можно просто определить переменную PATH
для текущего сеанса командой export
. Переменной будет присвоено временное значение до тех пор, пока вы не завершите сеанс.
Листинг 233. Определение сеансовой переменной среды
#
export PATH="${PATH}:/home/my_user/tmp/usr/bin"
В начало → Настольная книга Gentoo Linux x86 → Работа с Gentoo |