Портежи-2. Установка и настройка
Алексей Федорчук
alv@linux-online.ru
Содержание
Получение портежей
В прошлой заметке говорилось, что дерево портежей можно обнаружить в
каталоге /usr/portage. Однако не факт, что оно появится там само собой -
возможно, пользователю придется озаботиться этим самому. То есть - если
дерево портежей не было установлено при инсталляции Gentoo (а в пре-релизе
текущей, 1.4-й, версии, так оно и есть), следует его
- скачать с сервера проекта Gentoo или его зеркал,
- распаковать и развернуть архив,
- настроить,
- и время от времени обновлять.
О настройке системы портежей - чуть позже, а пока - о получении, установке
и обновлении.
Архив дерева портежей (тарбалл вида portage-год_месяц_число.tar.bz2) имеет
своим местопребыванием каталог snapshots на любом из Gentoo-серверов. И такой
тарбалл там не один - обновление их происходит чуть ли не ежедневно, и
обычно доступны три последние версии (а на некоторых зеркалах хранятся
тарбаллы и за более длительный срок). Скачиваем один из тарбаллов (не
последний ли по времени?) посредством, например, ftp-клиента wget из штатного
комплекта Gentoo:
$ wget http://www.ibiblio.org/pub/Linux/distributions/gentoo/snapshots/portage-20021217.tar.bz2
Далее тарбалл разворачивается в каталоге /usr:
$ tar xjpvf portage-*.tar.bz2
в результате чего и получаем то самое дерево портежей, о котором
говорилось в прошлой заметке.
Дерево портежей - живой и развивающийся организм. Как уже говорилось,
новый снапшот появляется на сервере Gentoo чуть ли не ежедневно. Изменения в
нем заключаются во включении поддержки а) новых пакетов (на текущий момент -
более 1500), б) новых версий ранее портированных программ, в) новых реализаций
прежних версий ранее портированных программ, и, наконец, г) просто в
исправлении ошибок. Так что есть смысл время от времени дерево портежей
обновлять - если уж не ежедневно, то по крайней мере по выходе свежих
вариантов критически важного софта.
Для автоматического обновления дерева портежей в этой системе предусмотрен
механизм Rsync, выполняющий сию процедуру одной командой:
$ emerge sync
Она скачивает последний по времени снапшот дерева и разворачивает архив в
каталоге /usr/portage. Очевидно, что для этого предыдущий вариант дерева
портежей должен быть уже установлен. Если использование Rsync почему-либо
невозможно (так, судя по документации, этот механизм не работает из-за
файрвола) - обновить дерево портежей можно вручную, тем же способом, как оно
устанавливалось.
Несколько слов об исходниках
Как уже говорилось, в дереве портежей существует подкаталог distfiles,
специально предназначенный для хранения исходных текстов портированных
программ. Однако сразу же по установке древа мы его не тут не увидим. Откуда
же он берется и каким образом он заполняется?
Каталог /usr/portage/distfiles возникает автоматически при установке
первого же портежа. И столь же автоматически в нем появляется исходник
устанавливаемого пакета и всех иных пакетов, связанных с ним отношениями
зависимости и использования. При одном непременном условии - наличии
подключения к Сети в момент установки портежа. Все это понятно из концепции
портежей, но вызывает болезненный в постсоветских условиях вопрос - что
делать, если подключения к Сети на целевой машине нет.
Подчеркну еще раз - для использования портежей достаточно иметь
возможность физического выхода в Сеть вообще (не обязательно с данной
машины). То есть можно скачать исходники где угодно, переместить их на любом
носителе (CD-R/RW, Zip, съемный диск), а потом скопировать их в каталог
/usr/portage/distfiles, созданный командой mkdir, вручную. С точки зрения
системы портежей, это ничем не будет отличаться от автоматического получения
нужных файлов с помощью соответствующих опций команд emerge или ebuild.
Откуда брать исходники? Да откуда угодно, хоть с мастер-сайтов
разработчиков каждой требуемой программы. Но наиболее удобное место - каталог
distfiles на серверах проекта Gentoo (или каталог gentoo-src, содержание их
идентично). Здесь имеют место быть архивы всех версий каждой из портированных
в Gentoo программ. И отсюда их можно скачать оптом и в розницу. Подчеркну -
это именно копии авторских исходников, ничем не отличающиеся от тех, которые
можно забрать с мастер-сайта разработчика (и практически всегда если не
последние, то предпоследние их версии). Ибо все Gentoo-специфичные
дополнения, призванные обеспечить корректную установку и работу портированной
программы, оформляются в виде патчей.
В отличие от системы портов FreeBSD, Gentoo-специфичные патчи в портежах
не входят в состав конкретного портежа - их следует искать в том же каталоге
distfiles, что и оригинальные исходники. Как правило, попытка установки
портежа без патчей вызовет сообщение об ошибке. Хотя отсутствие патча и не
помешает собрать пакет вручную (с помощью стандартных ./configure, make, make
install etc.), но при этом во многом теряется смысл всей системы.
Как определить, необходимо ли скачать патчи для установки конкретного
пакета, и если да - то какие? Универсальный способ для этого будет описан в
разделе о командах работы с портежами. Пока же напомню систему именования
ebuild-файлов: имя_пакета-номер_версии-[номер_ревизии]. Очевидно, что имя
пакета и номер его версии наследуются от именования его разработчиком. И
ebuild-файл, номера ревизии не имеющий, скорее всего, дополнительных патчей
не потребует (хотя из этого правила есть немало исключений). А вот номера
ревизий - это уже дело рук разработчиков Gentoo. И различные ревизии одной и
той же версии пакета отличаются друг от друга именно Gentoo-специфичными
патчами - ведь сам исходник данной версии, как мы помним, абсолютно идентичен
авторскому. То есть установка любого ebuild-файла, имеющего в составе имени
компонент -r#, таких патчей потребует с вероятностью сто процентов.
Тем не менее, в крайнем случае можно прибегнуть и к ручной сборке
требуемого пакета: такие самосборные пакеты будут существовать в системе на
равных правах с установленными портежами. Более того, при определении
системой портежей отношений зависимости и использования они будут
благополучно опознаны. Особенность системы портежей в том, что для контроля
зависимостей она не только (и даже не столько) проверяет базу данных
установленных пакетов /var/db/pkg, сколько выполняет реальное
прединсталляционное конфигурирование. То есть делает то же самое, что и
скрипт ./configure при ручной сборке. И потому в Gentoo не придется
сталкиваться с обычной для многих пакетных дистрибутивах ситуацией, когда
самосборный пакет, от которого зависит вновь устанавливаемый, не опознается
системой управления пакетами (типа rpm сотоварищи).
Я столь подробно остановился на проблеме получения исходников и их ручной
сборки потому, что ее касается большинство вопросов, задаваемых мне в
переписке (и всплывающих на Gentoo-форуме - пользуясь случаем, приношу
извинения тем, кому на такие вопросы не ответил по техническим причинам). И
действительно, вопросы эти - весьма актуальны в условиях, когда поголовная
телефонизация страны (не говоря уж о о-Сетенении) выглядит столь же
недостижимой, как коммунизм в 1980 году; или - как отдельная квартира для
каждой семьи, не помню уж, к какой дате.
Так вот, поскольку от решения проблемы исходников зависит возможность
применения дистрибутива Gentoo вообще, подчеркну еще раз со всей
определенностью: для использования системы портежей необходимо и достаточно
иметь машину с подключением к Сети в пределах физической досягаемости.
Финансовой стороны вопроса касаться не буду - но желательно, чтобы за трафик
при этом платил кто-нибудь другой, например, госбюджет (не из наших ли
налогов он образуется?).
А уж на худой конец, как говаривала одна дама (к слову сказать -
ученый-геохимик с мировым именем, это без иронии), у нас есть вареные яйца.
То есть - исходники, прилагаемые к большинству хороших CD-изданий
всамделишних пакетных дистрибутивов. Нужно лишь вытащить его из SRPM или из
deb-пакета. Возможно, там не окажется последней версии нужной программы - не
беда, в том-то и сила системы портежей, что она поддерживает серию
сосуществующих реализаций. Быть может, не хватит какого-либо
Gentoo-специфичного патча - но его можно выкачать и по модему (благо патчи
такие обычно тянут на килобайты или первые их десятки). И нельзя исключить,
что такой пакет что-то потеряет в функциональности - это сполна перекроется
тем, что собран он будет с вашими настройками и под вашу конкретную машину. А
уж то, что каждое приложение и каждая утилита в системе будет установлена
осознанно и целенаправленно - не измеримо никакими деньгами.
Принципы настройки системы портежей
Однако я отвлекся. Пора переходить к настройке системы портежей - это
первый шаг после развертывания их древа.
Настройка портежей под индивидуальные требования основана на концепции
профильных файлов (profile, что часто транскрибируется просто как профайлы -
последуем и мы этому примеру). Это - некий набор конфигурационных файлов,
описывающих (с помощью соответствующих переменных окружения) условия сборки
портированных программ, а именно:
- пути для поиска компонентов системы портежей;
- условия получения исходных текстов пакетов;
- условия их прединсталляционного конфигурирования;
- условия компиляции.
Значения переменных путей поиска указывают на каталоги, где по умолчанию
размещаются а) сама система портежей (PORTDIR=/usr/portage), исходные тексты
пакетов (DISTDIR=${PORTDIR}/distfiles), промежуточные продукты компиляции
(PORTAGE_TMPDIR=/var/tmp) и так далее.
Переменные условий получения исходников включают в себя базовый URL
сервера, адрес, используемый механизмом Rsync, ftp-клиент, вызываемый для
получения исходников и для продолжения оборванного скачивания.
Переменные условий конфигурирования представлены одной единственной
переменной - USE, довольно подробно описанной ранее.
Наконец, переменные условий компиляции - это указания на хост-машину и
флаги оптимизации, о которых также говорилось отдельно.
Подробности о том, как задаются значения переменных в Gentoo (не только
для системы портежей, но и вообще), можно прочитать в русском переводе Env.d
HOWTO, доступном благодаря усилиям Ивана Зенкова.
Предусмотрено три уровня профайлов (в порядке возрастания приоритета):
- /etc/make.globals, глобально определяющий переменные условий сборки;
- /etc/make.profile/make.defaults, определяющий умолчальные значения
переменных условий сборки;
- /etc/make.conf, в который заносятся пользовательские переменные условий
сборки.
Первые два файла генерируются автоматически, изменять их не рекомендуется.
Да в этом и нет необходимости: любые изменения, сделанные в файле
/etc/make.conf (а он именно для пользовательского редактирования и
предназначен), перекроют глобальные и умолчальные значения переменных условий
сборки.
Кроме этого, переменные условий сборки могут задаваться в командной строке
(как переменные оболочки, в виде ПЕРЕМЕННАЯ="значение", так и как переменные
окружения, в виде export ПЕРЕМЕННАЯ="значение". Заданные таким образом
значения имеют высший приоритет, перекрывая не только глобальные и
умолчальные значения, но и пользовательские настройки в файле
/etc/make.conf.
Рассмотрим вкратце содержание профайлов системы портежей, начав с наиболее
глобального (но и наименее приоритетного) - /etc/make.globals.
Во первой строке его (после комментариев, предупреждающих о
нежелательности редактирования) задается порядок просмотра значений
переменной USE:
USE_ORDER="env:conf:auto:defaults"
Значения этой переменной перечислены в порядке уменьшения приоритета.
Значение env указывает, что наиболее приоритетными выступают значения USE,
заданные как переменные (оболочки или окружения). То есть команда
$ USE="-gnome"
данная перед исполнением программы emerge или ebuild, отключит поддержку
GNOME в собираемом в данный момент пакете (и только в нем), даже если таковая
была включена в каком-либо из профильных файлов. А команда
$ export USE="-gnome"
сделает то же самое для всего текущего сеанса работы.
Значение conf предписывает, что в случае отсутствия явно определенных
значений переменной USE, таковые берутся из строки USE="..." файла
/etc/make.conf (подробности - в указанной выше заметке.
Далее легко догадаться, что если требуемых значений переменной USE не
обнаружено ни в оболочке или окружении, ни в файле /etc/make.conf, в силу
вступает значение auto. Auto-значения переменной USE перечислены в файле
/etc/make.profile/use.default. Он содержит список ключевых слов (флагов)
переменной USE, соответствующих отвечающим за них пакетам. И смысл его в том,
что если такой пакет установлен в системе, обеспечиваемая им опция
рассматривается как автоматически включенная, вне зависимости от того,
перечислена ли она в строке USE файла /etc/make.profile/make.defaults. То
есть если мы установили пакет gpm, поддержка службы консольной мыши станет
доступной для всех приложений (для которых она предусмотрена
разработчиком).
Ну а значение defaults именно из строки USE файла
/etc/make.profile/make.defaults и берется.
Далее в файле /etc/make.globals указываются базовый URL проекта и адрес
источника для синхронизации дерева портежей
GENTOO_MIRRORS="http://www.ibiblio.org/pub/Linux/distributions/gentoo"
SYNC="rsync://rsync.gentoo.org/gentoo-portage"
и тип хост машины, например,
CHOST=i686-pc-linux-gnu
В следующих строках описываются пути поиска компонентов системы портежей -
каталога для временных файлов, создаваемых при сборке пакетов
PORTAGE_TMPDIR=/var/tmp
корневого каталога дерева портежей
PORTDIR=/usr/portage
и его подкаталогов, предназначенных для хранения архивов исходников,
автономных бинарных пакетов и rpm-пакетов (буде таковые образуются):
DISTDIR=${PORTDIR}/distfiles
PKGDIR=${PORTDIR}/packages
RPMDIR=${PORTDIR}/rpm
Следующие строки перечисляют каталоги, конфигурационные файлы в которых
защищены от изменения при установке новых пакетов
CONFIG_PROTECT="/etc /var/qmail/control /usr/share/config
/usr/kde/2/share/config /usr/kde/3/share/config"
и файлы в защищенных каталогах, которые, напротив, должны изменяться в
этой ситуации
CONFIG_PROTECT_MASK="/etc/gconf"
Здесь в текущей (1.4-rc1) версии вклинивается строка
MAKEOPTS="-j2"
отвечающая за поддержку мультипроцессорности.
В следующих строках описываются переменные условий получения исходников,
то есть ftp-клиент, запускаемый по умолчанию для скачивания исходников (и
продолжения оного) вместе с необходимыми опциями, включая каталог для
размещения полученных файлов:
FETCHCOMMAND="/usr/bin/wget -t 5 --passive-ftp ${URI} -P ${DISTDIR}"
RESUMECOMMAND="/usr/bin/wget -c -t 5 --passive-ftp ${URI} -P ${DISTDIR}"
Затем - флаги оптимизации для компилятора:
CFLAGS="-O2 -mcpu=i686 -pipe"
CXXFLAGS=${CFLAGS}
и еще некоторые опции (типа очистки временного каталога по завершении
сборки, и т.д.).
Повторю еще раз - если какие-то значения переменных в файле
/etc/make.globals пользователя не устраивают, в редактировании его
необходимости нет: требуемые настройки могут быть сделаны в файле
/etc/make.conf. Так, в последнем есть закрытые комментариями примеры
изменения ftp-клиента по умолчанию, не говоря уж о значениях переменной USE и
флагах оптимизации. Нет противопоказаний и для задания в нем иных поисковых
путей - для архивов исходников, например, или каталога для временных
файлов.
Каталог, в котором расположен файл make.defaults, /etc/make.profile, на
самом деле представляет собой символическую ссылку на один из каталогов
профайлов в дереве портежей - /usr/portage/profiles, создаваемую
автоматически в соответствие с архитектурой машины и номером версии
дистрибутива. В текущем пре-релизе для PC-архитектуры исходный для ссылки
каталог - /usr/portage/profiles/default-x86-1.4. Теоретически источник ссылки
можно бы и изменить, хотя необходимости в том я не вижу.
Соответственно, когда речь идет о файле /etc/make.profile/make.defaults, в
действительности рассматривается содержимое файла
/usr/portage/profiles/default-x86-1.4/make.defaults. Каковое ограничивается
а) перечислением умолчальных значений переменной USE, указанием архитектуры
машины (x86 для PC) и версии компилятора gcc.
В каталоге /usr/portage/profiles/default-x86-1.4 (или, что равнозначно, в
каталоге /etc/make.profile есть еще несколько профайлов системы портежей. О
файле use.defaults речь уже была - это автоматически обновляемый список
разрешенных отношений использования (сиречь включенных значений переменной
USE). Профайл packages.build содержит маски пакетов базовой системы (то есть
сокращенные имена типа sys-apps/bash, которые можно использовать в качестве
аргументов команды emerge), а профайл packages, плюс к таким маскам - еще и
указание на версии (или диапазон версий), которые подпадают под
маскирование.
О файле /etc/make.conf говорилось достаточно в заметках про USE и про флаги оптимизации.
Остается лишь добавить, что здесь можно переопределить все переменные из
файла /etc/make.globals, которые чем-то не приглянулись. Иногда это может
быть целесообразно: например, при стойкой антипатии к умолчальному
ftp-клиенту (wget), необходимости брать архивы исходников с сервера локальной
сети или желании помещать отходы компиляции, ускорения процесса для, в
файловую систему в оперативной памяти - /dev/shm.
Ну а к установке переменных условий сборки портежей в командной строке мы
еще вернемся, когда речь дойдет до практического использования системы
портежей.