Применение «портов»


Сборка программного обеспечения из «портов» отнимает больше времени по сравнению с применением пакетов. Кроме того, системе «портов» необходимо устойчивое соединение с Интернетом. Тем не менее система «портов» может дать лучшие результаты, чем система пакетов. Давайте рассмотрим не просто произвольный «порт», а, пожалуй, самый крупный в операционной системе FreeBSD — OpenOffice.org, который находится в каталоге /usr/ports/editors/openoffice.org-2. Этот программный продукт содержит текстовый процессор, электронную таблицу, инструмент создания презентаций и другие компоненты, что делает его серьезным конкурентом Microsoft Office. Каталог содержит:

Makefile      distinfo      files      pkg-descr      pkg-plist

Файл Makefile содержит базовые команды для сборки этого «порта». Заглянув в этот файл, мы видим всего несколько сотен строк. Немного для такого сложного программного продукта. Большую часть этого файла занимают настройки, используемые достаточно редко. Здесь почти нет информации о самом ООо и чуть больше о сборке программного обеспечения в системе FreeBSD. (Большинство Makefile «портов» FreeBSD расположены в каталоге /usr/ports/Mk; их редактирование — это высший пилотаж, и прежде чем на него решиться, надо хорошо освоить утилиту make(1).)

Файл distinfo содержит контрольные суммы для различных файлов, загружаемых в ходе установки «порта», благодаря чему можно быть уверенным, что файлы будут загружены без ошибок и никто не сможет изменить содержимое файла до того, как вы его получите.

Каталог files содержит все дополнительные файлы и исправления, необходимые для сборки этого «порта». Это очень массивный пакет офисных программ, в нем больше сотни мегабайт исходного кода и всего 18 заплаток. Большинство этих заплаток просто обеспечивают интеграцию в систему пакетов FreeBSD и фактически не требуются для сборки OpenOffice.org в операционной системе FreeBSD.

Файл pkg-descr содержит подробное описание программного продукта.

Наконец, в файле pkg-plist находится список всех файлов, устанавливаемых «портом» (опись). При установке из «порта» устанавливаются только файлы, перечисленные в этой описи.

Вместе эти файлы составляют набор инструментов и инструкций, необходимых для сборки программного продукта.

Установка «порта»

Имея представление об исходном коде, вы быстро заметите, что в «порте» нет исходного кода как такового. Конечно, есть заплатки на исходный код и сценарии для его обработки, но самого исходного кода нет! Возникает справедливый вопрос: как эта схема работает без исходного кода?

При активизации «порта» FreeBSD автоматически загружает нужный исходный код с соответствующего сайта в Интернете. После этого загруженный код проверяется на наличие ошибок целостности и извлекается в рабочий каталог. Затем на него накладываются заплатки, выполняется сборка программы, установка всего необходимого и регистрация установки в /var/db/pkg. Если у «порта» есть неустановленные зависимости, то процесс make прервется на сборку этих зависимостей, а затем возобновится. Чтобы инициировать все это, войдите в каталог «порта» и введите такую команду:

# make install

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

Такой целостный процесс установки учитывает все изменения в зависимостях. Если «порту» необходима другая программа, то он просто «закроет глаза» на минимальные изменения в этой программе. Например, если изменился API или ABI требуемой программы, «порт» лишь проверит это, а сам пакет может оказаться неработоспособным.

Однако по мере приобретения опыта в работе с исходным кодом вы убедитесь, что целостный подход вовсе не обязательно применять всегда. Беспокоиться не о чем — система «портов» предоставляет возможность организовать процесс сборки «порта» по усмотрению пользователя, поскольку make install на самом деле запускает серию подчиненных команд. Если указать одну из таких команд, make(1) запустит все предыдущие команды, а также ту команду, которую вы указали. Например, в случае команды make extract будут выполнены команды make config, make fetch, make checksum, make depends и make extract. Рассмотрим эти команды по порядку.

make config

Многие «порты» включают дополнительные параметры настройки. Команда make config позволяет указать параметры, которые должны быть учтены при установке программного обеспечения из «порта». Информация о выбранных параметрах сохраняется для использования при последующей сборке «порта». Эти параметры влияют на сборку «порта» — например, если указать, что программа должна собираться с поддержкой SNMP, скорее всего, это приведет к добавлению зависимости от программного обеспечения SNMP где-нибудь в дереве «портов».

make fetch

После настройки «порта» система отыскивает предопределенный список сайтов Интернета, откуда можно получить исходный код. Файл Makefile «порта» содержит адрес доверенного сайта, откуда можно загрузить файл. Если исходный код не найден на этом сайте, проверяются резервные сайты из списка, имеющегося в системе «портов». Первоначальный файл с исходным кодом называется distfile и сохраняется в каталоге /usr/ports/distfiles.

Если для загрузки distfile требуется какая-то специальная программа, система «портов» выполнит установку этой программы как часть этого этапа.

make checksum

На следующем этапе make checksum подтверждает, что цифровая подпись файла distfile соответствует подписи из файла distinfo «порта». Это мера безопасности — если сервер FTP был взломан злоумышленником, а исходный код поврежден или заменен на троян, это обнаружится именно здесь. Процесс сборки будет остановлен с сообщением о несоответствии контрольной суммы. Совершенно неважно, был ли исходный код поврежден в процессе загрузки или неизвестный злоумышленник добавил зловредный код в distfile до его загрузки, — в любом случае нет смысла тратить время на сборку такого «порта» и уж тем более не стоит устанавливать его!

«Как прострелить себе ногу», способ № 839: игнорировать контрольную сумму

Разработчики программного обеспечения, особенно бесплатного, любят слегка подправить свой код, не изменив при этом номер версии или имя файла исходного кода distfile. После этого «порт» FreeBSD может и не работать. Если вы уверены, что distfile не был подменен или поврежден, и хотите использовать его несмотря на предупреждение, замените эту команду на make NO_CHECKSUM=YES install.

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

make extract

Получив distfiles «порта», их следует развернуть и извлечь. Большинство файлов исходного кода объединяются с помощью tar(1) в архив tarball, который затем сжимается с помощью gzip(1) либо bzip(1). Однако некоторые дистрибутивы сжимаются другими архиваторами (например Zip, compress(1) и т. д.). Эта команда создает рабочий подкаталог и извлекает в него содержимое архива. Если для извлечения файлов из distfile требуется какая-то отдельная программа, она будет установлена.

make patch

Эта команда накладывает на исходный код в рабочем каталоге все заплатки, имеющиеся в составе «порта». Если для наложения заплаток требуется какая-то другая программа, отличная от patch(1), она будет установлена.

make depends

На этапе make depends проверяется зависимость «порта» от любых других программ. Если такие программы есть, то проверяется, установлены ли они. Так, для оконного менеджера X необходим сервер X.org. Если программы, от которых зависит «порт», не установлены, система рекурсивно обойдет все зависимости и установит их.

make configure

Далее FreeBSD проверяет необходимость запуска сценария configure. Это отдельный этап, отличный от make config. Если в составе программного продукта поставляется собственный сценарий configure, он выполняется. Некоторые «порты» приостанавливают процедуру сборки на этом этапе, чтобы запросить дополнительную информацию, но в большинстве случаев сборка продолжается без остановки.

make build

На этом этапе происходит компиляция проверенного, извлеченного и исправленного программного кода.

make install

Наконец, на этапе make install устанавливается программа, а ее наличие регистрируется в /var/db/pkg.

Интегрированные настройки «портов»

Многие программные пакеты обладают широчайшими возможностями настройки параметров сборки. Настроить эти параметры для каждого программного пакета в отдельности не так сложно, но универсального метода, определяющего их сразу для всех пакетов, нет. В одном случае может потребоваться редактировать Makefile, в другом эти параметры могут настраиваться с помощью ключей сценария configure. Изучение принципов внесения таких изменений требует времени и может оказаться скучным занятием. Система «портов» FreeBSD предлагает два способа настройки этих параметров в системе.

Самый новый и более предпочтительный метод основан на команде make config. Она выводит на экран диалоговое окно, похожее на то, что вы уже видели в процессе установки FreeBSD. Например, популярный программный продукт Snort, позволяющий обнаружить несанкционированное вторжение в систему, включает поддержку ведения протоколов в различных базах данных, интеграцию с динамическими правилами сетевой защиты и т. д. Если перейти в каталог /usr/port/security/snort и ввести команду make config, на экране появится меню, (рис. 11.1).


Рис. 11.1. Настройка параметров «порта»

Для выбора параметра служит клавиша пробела, для перемещения — стрелки и клавиша табуляции. Чтобы завершить работу с диалогом, нажмите клавишу Enter, предварительно выбрав кнопку OK или Cancel (отмена). Выбранные значения будут записаны в файл /var/db/ports/<имя_порта>/options, чтобы можно было использовать их при обновлении или повторной сборке программы. Snort — отличный пример применения этого способа настройки, потому что у этой программы много часто используемых параметров. Многие администраторы протоколируют события Snort с помощью различных баз данных.

Однако этот удобный графический интерфейс выбора параметров появился в системе FreeBSD совсем недавно и работает не во всех «портах». Многие «порты» по-прежнему объявляют о дополнительных возможностях при первом запуске команды make install. Например, при запуске процедуры сборки OpenOffice.org на экран выводится следующее сообщение:

OPTIONS:

You can compile OOo with debug symbols with WITH_DEBUG=1
(Перевод: При компиляции ООо с параметром WITH_DEBUG=1 будет добавлена отладочная информация)

If you set WITH_DEBUG=2, you add internal
OOo debug support.
(Перевод: При установке параметра WITH_DEBUG=2 будет добавлена поддержка встроенного отладчика ООо.)

You can compile OOo without Mozilla connectivity with
make -DWITHOUT_MOZILLA
(Перевод: ООо можно скомпилировать без поддержки Mozilla, собрав пакет с параметром -DWITHOUT_MOZILLA)
...

На самом деле список доступных параметров гораздо длиннее, но идею вы поняли. Если, увидев это объявление, вы желаете воспользоваться одной из предоставляемых особенностей, нажмите CtrL-C, чтобы прервать сборку. После этого можно установить выбранные параметры в командной строке:

# make WITH_DEBUG=1 install

Данная команда изменяет ход сборки «порта», включая поддержку отладочной информации, что повысит качество отчетов об ошибках, которые вы сможете отправлять группе разработчиков проекта ООо. Это одно из больших преимуществ «портов» перед пакетами. Выполнить подобную настройку в пакетах невозможно.

Однако не все «порты» сами предлагают все доступные параметры настройки. Если вам действительно любопытно узнать о них, загляните в файл Makefile «порта». Давайте вместе посмотрим, что находится внутри Makefile.

Файлы Makefile «портов»

В начале файла Makefile можно найти множество строк, описывающих «порт»:

Это «порт» с именем apache (1), соответствующий версии 2.2.4 (2) этой программы. Это вторая версия (3) «порта» для данной версии программы, поэтому в /var/db/pkg он называется apache-2.2.4_2. В системе FreeBSD этот порт хранится в категории /var/ports/www (4). Переменная MASTER_SITES обычно содержит список интернет-сайтов, откуда можно загрузить программу. Дистрибутив веб-сервера Apache хранится на множестве зеркал, и во многих «портах» указывается их список. Чтобы не обновлять десятки и сотни «портов» всякий раз, когда появляется или исчезает какое-либо зеркало, система «портов» определяет внутреннюю переменную (5), которая содержит список зеркал, чтобы обновлять его в одном месте. DISTNAME содержит базовую часть имени файла дистрибутива, распространяемого разработчиком, a DISTFILES — полное имя. Например, все файлы с исходным кодом Apache именуются в соответствии со схемой: httpd-<что-то_еще> (6), а httpd-<вepсия>.tar.bz2 (7) — фактический файл с конкретным номером версии.

Далее в файле Makefile можно найти переменные с адресом электронной почты производителя, кратким описанием «порта» и т. д. За ними следуют такие строки:

Операторы .if defined — это настройки сборки «порта». Первая строка в данном примере — это переменная, которую надо установить, чтобы получить соответствующую функциональность. Я не знаю, что такое exception hook (ловушка исключений) (1), и, честно говоря, меня это совершенно не волнует. Но если вы ближе знакомы с Apache, для вас этот параметр может иметь значение. FreeBSD позволяет вам легко включить эту функцию при сборке. Подобным образом, если требуется включить поддержку LDAP — при сборке Apache задайте в командной строке параметр WITH_LDAP=YES (2), но тогда при сборке «порта» он потребует установить OpenLDAP как одну из зависимостей.

Утомительно? Да, но в результате вы узнаете, какие дополнительные параметры предлагает автор программного обеспечения, и научитесь их настраивать. Опытные системные администраторы, правда, могут настраивать свои любимые программы с закрытыми глазами. Но даже им не запомнить, как это делается для всех пакетов в коллекции «портов», которых больше 17 000.

Если для сборки «порта» вы используете команды, предшествующие команде make install (например, make patch и затем make install), вам придется включать дополнительные параметры на каждом таком этапе. В противном случае «порт» может быть собран неправильно. Например, если требуется собрать Apache с поддержкой LDAP, предварительно наложив собственную заплатку, выполните команду:

# make patch WITH_LDAP=YES

И затем команду:

# make install WITH_LDAP=YES

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

Самая сложная часть в сборке программы — решить, какие параметры применять. К сожалению, для этого вопроса нет простого ответа, поэтому для принятия решения лучше всего изучить руководство по этой программе или зайти на соответствующий веб-сайт. Мне самому не раз случалось установить какое-то программное обеспечение, а затем, прочтя документацию, удалить его и переустановить — уже с корректными параметрами.

Комментарии запрещены.