Документация по ОС FreeBSD Воскресенье, 19.05.2024, 16:26
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Мои статьи [0]
Установка и настройка [281]
X Window [25]
Man pages [30]
Ports & Packages [26]
cvs [18]
Multimedia [20]
Нововсти в мире Unix [0]
RFC [4]
RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Безопасность [52]
Работа с железом [58]
Книги по FreeBSD [17]
Сеть [505]
Программирование [40]
FireWall [58]
Темы экзамена BSDA [14]
Официальные темы экзамена BSDA, включая подробноые описания и советы по обучению.

Главная » Статьи » Ports & Packages

Теория пакетного менеджмента

Часть первая. Вводная

Коллекция портов представляет собой набор make-файлов, рассортированных по каталогам. Каждый каталог содержит правила сборки определенной программы из исходных текстов, а также другую сопутствующую информацию, вроде описания программы. Каждый такой каталог называется портом и является только скелетом, не содержащим самой программы. При переходе в каталог и запуске правил сборки при помощи команды make, исходные тексты будут загружены из сети, программа будет собрана, установлена, а информация о ней помещена в базу пакетов (/var/db/pkg).

Пакетом в BSD-системах называется программа, собранная из порта и помещенная в архив (tgz или tbz). При необходимости пакет может быть установлен командой pkg_add. Система пакетного менеджмента и коллекция портов тесно связаны, они используют общую базу пакетов (/var/db/pkg), управление ими происходит при помощи одних и тех же команд (независимо от того, каким образом была установлена программа, удалить ее можно командой pkg_delete). Поэтому в этой статье мы не будем проводить грань между этими двумя, казалось бы, независимыми способами установки ПО.

Часть вторая. Вопросительная

Факт существования в BSD-системах двух принципиально отличающихся способов работы со сторонним ПО рождает очевидный вопрос: что же использовать? Попробуем на него ответить.

Достоинство пакетов в том, что это уже собранные, готовые к работе программы, которые можно установить вместе с зависимостями прямо из cети, запустив команду pkg_add с флагом '-r'. Пакеты не требуют от пользователя мучительного ожидания момента, когда программа будет, наконец, успешно собрана.

Порты, с другой стороны, отличаются двумя весьма заманчивыми особенностями. Во-первых, это возможность собрать программу только с необходимыми зависимостями, не расходуя трафик на выкачивание из сети совершенно бесполезных библиотек. А во-вторых, обладая нужными знаниями и смекалкой, можно сделать так, чтобы при обновлении из сети тянулся только патч к предыдущей версии программы, а не весь тарбол целиком (об этом в конце статьи). Кроме того, исходные тексты программы обычно имеют меньший размер, нежели их пакетные собратья.

Команда FreeBSD решает проблему портов и пакетов просто. На официальных компакт-дисках можно найти только пакеты, все остальное пользователю предлагается установить через порты. С этим никто не спорит, потому как сборка X Window или 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 - деинсталлировать приложение. Работает только в том случае, если не была выполнена зачистка исходников.
  • checksum - проверить контрольные суммы скачанных тарболов.
  • depends - перестроить зависимости.
  • 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_OVERRIDE - альтернативное зеркало дистфайлов.
  • MASTER_SITE_BACKUP - второе альтернативное зеркало.
  • FETCH_CMD - команда, используемая для закачки дистфайлов.

Часть четвертая. Обновленная

Нельзя забывать, что работа над коллекцией портов ведется без остановки на coffee break, их количество постоянно растет, и существующие порты обновляются с завидной регулярностью. Поэтому рекомендуется поддерживать коллекцию портов в актуальном состоянии. Существует, по крайней мере, четыре способа обновления коллекции портов:

  1. Загрузка последнего снапшота коллекции с сайта FreeBSD.
  2. Программа portsnap, автоматизирующая этот процесс.
  3. Обновление через CVS.
  4. Обновление с использованием инструмента cvsup.

Мы рассмотрим только последний вариант, так как он самый простой и удобный. Для начала следует установить программу cvsup (начиная с FreeBSD 6.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-системы.



Источник: http://www.xakep.ru/magazine/xa/099/108/1.asp
Категория: Ports & Packages | Добавил: oleg (16.01.2008) | Автор: Евгений «j1m» Зобнин
Просмотров: 2901 | Комментарии: 1 | Рейтинг: 0.0/0 |
Всего комментариев: 1
1 iZEN  
0
Замечания.
1. Для синхронизации локальной коллекции портов лучше использовать не cvsup (которую надо собирать из порта), а встроенную системную утилиту csup.
2. поле синхронизации локальной коллекции портов необходимо выполнить переиндексацию дерева командой:
% cd /usr/ports && make index
либо скачать индексный файл из сети:
% cd /usr/ports && make fetchindex

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024