RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Коллекция портов представляет собой набор make-файлов, рассортированных по каталогам. Каждый каталог содержит правила сборки определенной программы из исходных текстов, а также другую сопутствующую информацию, вроде описания программы. Каждый такой каталог называется портом и является только скелетом, не содержащим самой программы. При переходе в каталог и запуске правил сборки при помощи команды make, исходные тексты будут загружены из сети, программа будет собрана, установлена, а информация о ней помещена в базу пакетов (/var/db/pkg).
Пакетом в BSD-системах называется программа, собранная из порта и помещенная в архив (tgz или tbz). При необходимости пакет может быть установлен командой pkg_add. Система пакетного менеджмента и коллекция портов тесно связаны, они используют общую базу пакетов (/var/db/pkg), управление ими происходит при помощи одних и тех же команд (независимо от того, каким образом была установлена программа, удалить ее можно командой pkg_delete). Поэтому в этой статье мы не будем проводить грань между этими двумя, казалось бы, независимыми способами установки ПО.
Часть вторая. Вопросительная
Факт существования в BSD-системах двух принципиально отличающихся способов работы со сторонним ПО рождает очевидный вопрос: что же использовать? Попробуем на него ответить.
Достоинство пакетов в том, что это уже собранные, готовые к работе программы, которые можно установить вместе с зависимостями прямо из cети, запустив команду pkg_add с флагом '-r'. Пакеты не требуют от пользователя мучительного ожидания момента, когда программа будет, наконец, успешно собрана.
Порты, с другой стороны, отличаются двумя весьма заманчивыми особенностями. Во-первых, это возможность собрать программу только с необходимыми зависимостями, не расходуя трафик на выкачивание из сети совершенно бесполезных библиотек. А во-вторых, обладая нужными знаниями и смекалкой, можно сделать так, чтобы при обновлении из сети тянулся только патч к предыдущей версии программы, а не весь тарбол целиком (об этом в конце статьи). Кроме того, исходные тексты программы обычно имеют меньший размер, нежели их пакетные собратья.
Команда FreeBSD решает проблему портов и пакетов просто. На официальных компакт-дисках можно найти только пакеты, все остальное пользователю предлагается установить через порты. С этим никто не спорит, потому как сборка XWindow или KDE из исходных текстов может порадовать разве что красноглазых пионеров, считающих прирост производительности в 2% высшим достижением юниксоида.
Часть третья. Практическая
Главное достоинство портов заключается в прозрачности действий, совершаемых для установки программы. Что может быть очевидней перехода в каталог /usr/ports/editors/vim и исполнения команды make install? Вопросы может вызвать разве что команда make, да и она уже давно глубоко вошла в жизнь юниксоида.
Не менее прозрачны и действия, необходимые для осуществления поиска по коллекции портов. Достаточно перейти в каталог /usr/ports и набрать «make search name=имя_программы» или же «make search key=регулярное_выражение» для поиска по описаниям программ. Не возбраняется также и другой способ поиска, основанный на использовании команды whereis. В BSD она работает с системой портов, и в случае если программа еще не установлена, пользователю будет указан путь до порта.
За сведения об установленных пакетах ответственна команда /usr/sbin/pkg_info. Будучи вызванной без аргументов, она выведет список всех установленных портов и пакетов с кратким описанием. Получить более подробную информацию о пакете можно, указав его имя в качестве аргумента (в совокупности с флагом '-V' это действие приведет к заполнению терминала огромным количеством информации, относящейся к данному пакету).
Многие порты позволяют сконфигурировать устанавливаемую программу или указать зависимости. С этой целью обычно выводится псевдографическое меню, выбрав необходимые элементы которого, следует нажать клавишу «o» для сохранения (информация будет записана в каталог /var/db/ports). Позднее меню можно будет вызвать командой make config. Некоторые порты до сих пор используют устаревший метод конфигурирования, требуя указывать нужные опции в аргументах команды make (вроде WITH_KDE=yes). Для выяснения всех возможных опций придется открывать файл Makefile в редакторе и читать комментарии. Вероятны случаи, когда сама программа позволяет избавиться от определенной зависимости, но порт такой возможности не предоставляет (так до недавнего времени было с портом stardict2, который мог быть собран без gnome, но такой опции в порте не было). Тогда придется исправлять Makefile, благо это не трудно.
Кроме install и config, порты принимают также и другие цели. Вот самые интересные из них:
Цели команды make
build - собрать приложение.
clean - удалить исходники из каталога work после сборки.
package - создать пакет.
readmes - создает описания для всех программ в формате HTML (следует запускать из каталога /usr/ports).
maintainer - получить адрес человека, сопровождающего порт.
fetch - только загрузка тарболов, без сборки и установки.
fetch-recursive - то же самое со всеми зависимостями.
deinstall - деинсталлировать приложение. Работает только в том случае, если не была выполнена зачистка исходников.
extract - разархивировать исходные тексты в каталог work.
patch - применить патчи к приложению.
reinstall - переустановить приложение после удаления.
index - создать файл /usr/ports/INDEX, используемый командой поиска, а также некоторыми другими программами для формирования списка доступных портов.
fetchindex - скачать INDEX из сети.
Для конфигурирования коллекции портов предусмотрен файл /etc/make.conf (это не единственное его назначение, но одно из многих). В него можно заносить переменные окружения, которые будут использоваться при сборке порта. Вот список наиболее интересных из них:
Переменные окружения, актуальные для портов
PORTSDIR - каталог, содержащий коллекцию портов. По умолчанию /usr/ports.
DISTDIR - каталог с дистфайлами (тарболами программ). По умолчанию $PORTSDIR/distfiles. Если есть диск с дистфайлами, можно указать что-то вроде /cdrom/distfiles.
PREFIX - префикс установки ПО. По умолчанию /usr/local и /usr/X11R6 для приложений, зависящих от системы X Window.
MASTER_SITES - список серверов, содержащих дистфайлы.
MASTER_SITE_BACKUP - второе альтернативное зеркало.
FETCH_CMD - команда, используемая для закачки дистфайлов.
Часть четвертая. Обновленная
Нельзя забывать, что работа над коллекцией портов ведется без остановки на coffee break, их количество постоянно растет, и существующие порты обновляются с завидной регулярностью. Поэтому рекомендуется поддерживать коллекцию портов в актуальном состоянии. Существует, по крайней мере, четыре способа обновления коллекции портов:
Загрузка последнего снапшота коллекции с сайта FreeBSD.
Программа portsnap, автоматизирующая этот процесс.
Обновление через CVS.
Обновление с использованием инструмента cvsup.
Мы рассмотрим только последний вариант, так как он самый простой и удобный. Для начала следует установить программу cvsup (начиная с FreeBSD6.2, официальный комплект системы включает программу csup с аналогичной функциональностью). Не рекомендую ставить эту программу через порты, так как она потянет за собой компилятор Modula-3, который для других задач вряд ли тебе понадобится.
Итак, набираем от рута «pkg_add -r cvsup-without-gui» и ждем, пока программа скачается. По завершении установки создаем в каталоге /root файл ports-supfile такого содержания:
# vi /root/ports-supfile
*default host=cvsup.ru.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
ports-all
Запускаем от рута команду cvsup ~/ports-supfile и следим за тем, как локальная коллекция портов синхронизируется со свежайшей коллекцией из CVS-репозитория FreeBSD. После обновления необходимо также выполнить команду make index или make fetchindex, чтобы поиск работал с новой коллекцией портов.
Хотя мы и обновили коллекцию портов, установленные программы все же остались тех же версий, что и до синхронизации. Чтобы обновить и их, потребуется удалить каждый устаревший пакет командой pkg_delete, найти его в коллекции портов и собрать вновь. К счастью, этот процесс можно автоматизировать, если использовать программу portupgrade (sysutils/portupgrade). Она проделает все необходимые для обновления шаги в автоматическом режиме и сделает это с минимальным риском для целостности системы.
Вместе с пакетом portupgrade поставляется программа portversion, которая покажет список установленных пакетов и их статус. Устаревшие пакеты будут отмечены знаком «<». Чтобы их обновить, следует от рута набрать команду «portupgrade имя_пакета». Рекомендуется также обновить все пакеты, зависящие от указанного, добавив флаг '-r'. В идеале, после каждого обновления коллекции портов нужно делать полное обновление всех портов (команда portupgrade \*), чтобы избежать возможных конфликтов. Но это приведет к большой трате трафика. Поэтому после каждого обновления портов необходимо вызывать команду pkgdb -F, чтобы исправить возникшие конфликты в базе пакетов. Утилита portupgrade по твоему требованию может обновлять и пакеты, для этого следует указать флаг '-P'.
Кроме описанных выше программ, в пакет portupgrade входит еще несколько полезных утилит. Программа portsclean позволит очистить коллекцию портов и систему от накопившегося мусора. Запуск команды с флагом '-C' приведет к удалению каталогов work, в которых происходит сборка порта. Хотя этот каталог и удаляется командой make clean, ты можешь просто забыть выполнить ее после установки. Еще один полезный флаг '-L' приводит к удалению из каталога /usr/local/lib всех устаревших библиотек. Они могут остаться там вследствие некорректного обновления порта. Программа pkg_which, также являющаяся частью пакета portupgrade, поможет найти, какому пакету принадлежит указанный файл.
Утилита portinstall - это интерфейс к коллекции портов, выполненный в виде одной команды. Используя ее, можно собирать и устанавливать порты без необходимости в переходе по каталогам и вызове команды make. Так, набор команд «cd /usr/ports/editors/vim; make install clean» в случае с portinstall превращается в одну простую команду: portinstall -c vim.
Часть пятая. Экономная
В этом разделе я поделюсь с тобой некоторыми хитростями, которые позволят сэкономить трафик на обновлении портов.
Одно из ключевых достоинств BSD-систем - ориентированность на установку, обновление и работу в сети - может прийтись не по вкусу людям с ограниченным сетевым подключением. Базовую систему FreeBSD и коллекцию портов легко обновить через сеть. При этом затраты на трафик будут минимальны, так как cvsup загрузит из сети ровно столько, сколько требуется, чтобы синхронизировать старую версию с новой (то есть только разницу между прошлой и нынешней версией системы). А вот как быть с портами, которые требуют, чтобы тарбол, содержащий исходники новой версии программы, был загружен заново?
Разработчики из сообщества Gentoo когда-то тоже задавались этим вопросом. В результате появился инструмент deltup, который создает из двух тарболов одной программы специальный файл, которым можно пропатчить тарбол старой версии программы, чтобы получить тарбол с ее новой версией, избежав необходимости в загрузке всего тарбола.
Чтобы использовать этот способ обновления, ты должен установить пакет deltup (sysutils/deltup) и программу wget (ftp/wget). После этого возьми с диска, прилагаемого к журналу, скрипт fetch_deltup.sh и помести его в каталоге /usr/local/bin. Открой файл /etc/make.conf и добавь в него строку «FETCH_CMD=/usr/local/bin/fetch_deltup.sh». Затем попробуй обновить какой-нибудь порт, ты увидишь, сколько трафика ты сэкономил.
Чтобы deltup работал, ему нужен сервер, который мог бы генерировать патчи. К сожалению, для FreeBSD такого сервера не существует, поэтому в скрипт вшит адрес сервера Gentoo. Но это не должно тебя беспокоить, так как набор прикладных программ во FreeBSD и Gentoo одинаков.
Хочу обратить твое внимание вот на какой момент: хотя deltup использует множество хитрых приемов для обеспечения абсолютной идентичности пропатченного тарбола оригиналу, он все же может ошибиться. Сам тарбол в этом случае останется вполне корректным, и из него можно будет собрать программу, но система портов начнет ругаться на несовпадение контрольных сумм. В этом случае можно собрать порт, отменив проверку контрольных сумм:
make NO_CHECKSUM install clean
На диске также лежит моя доработка этого скрипта (fetch_deltup_new.sh). В ней устранены некоторые ошибки и добавлен таймаут, который должен выждать скрипт, чтобы сервер успел сгенерировать патч. По окончании таймаута начнется загрузка официального тарбола.
Фронтенды
Программа porteasy (misc/porteasy) существенно облегчает работу с портами. С ее помощью ты сможешь одной командой загружать и собирать порты, получать информацию о них, смотреть список зависимостей и даже обновлять коллекцию портов.
Для системы портов FreeBSD также существует несколько графических фронтендов, включая kpackage, который придется по вкусу поклонникам среды KDE, и BPM (sysutils/bpm), написанный с использованием GTK2.
Полезные утилиты
Есть еще несколько утилит, облегчающих работу с портами, самые интересные из которых - sysutils/pkg_tree и sysutils/pkg-orphan. Программа pkg_tree показывает установленные пакеты, организуя их в древовидную структуру, отражающую взаимные зависимости. Pkg-orphan удаляет из системы все пакеты, от которых не зависит ни один другой пакет.
Как все начиналось
21 августа 1994 года Джордан Хаббард (Jordan Hubbard) поместил свои наработки в области установки стороннего программного обеспечения из исходных текстов в CVS-репозиторий FreeBSD. Набор из нескольких make-файлов, получивший имя port make macros, позднее превратился в целую систему пакетного менеджмента и стал неотъемлемой частью любой BSD-системы.
Замечания. 1. Для синхронизации локальной коллекции портов лучше использовать не cvsup (которую надо собирать из порта), а встроенную системную утилиту csup. 2. поле синхронизации локальной коллекции портов необходимо выполнить переиндексацию дерева командой: % cd /usr/ports && make index либо скачать индексный файл из сети: % cd /usr/ports && make fetchindex
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]