5.6. Использование Коллекции Портов

В этом разделе даны базовые сведения по использованию Коллекции Портов для установки или удаления программ. Детальное описание существующих целей make и переменных окружения находится в ports(7).

Предупреждение:

В июле 2012 года проект Портов FreeBSD сменил систему контроля версий: на смену CVS пришел Subversion. Рекомендуемым способом работы с деревом портов является Portsnap. Пользователи, которым требуется локальная подгонка портов (то есть, поддержание дополнительных локальных патчей), возможно предпочтут непосредственное использование Subversion. 28 февраля 2013 года сервис CVSup был выведен из эксплуатации, и дальнейшее использование последнего не рекомендуется.

5.6.1. Получение Коллекции Портов

Коллекция Портов - это набор файлов, состоящий из Makefile, патчей и файлов описаний, хранимых в /usr/ports. Этот набор файлов предназначен для построения и установки приложений во FreeBSD. В нижеследующих разделах описано несколько способов получения Коллекции Портов на тот случай, если Коллекция не была установлена во время инсталляции FreeBSD.

Процедура 5.1. Метод Portsnap

Portsnap это быстрый и удобный инструмент для получения Коллекции Портов, и в то же время - предпочитаемый выбор большинства пользователей. За подробным описанием всех возможностей Portsnap обратитесь к Using Portsnap.

  1. Скачайте сжатый снэпшот Коллекции Портов в /var/db/portsnap.

    # portsnap fetch
  2. Если вы запускаете Portsnap впервые, извлеките снэпшот в /usr/ports:

    # portsnap extract
  3. По завершении первого запуска Portsnap, как было показано выше, /usr/ports может быть обновлен при помощи:

    # portsnap fetch
    # portsnap update
Процедура 5.2. Метод Subversion

Если необходим контроль за деревом портов (например, для поддержания локальных изменений), то для получения Коллекции Портов может быть задействован Subversion. Обратитесь к Subversion Primer за детальным описанием Subversion.

  1. Для создания рабочей копии дерева портов необходимо иметь установленный Subversion. Если порты есть в наличии, то установите Subversion выполнив следующее:

    # cd /usr/ports/devel/subversion
    # make install clean

    Если портов нет, то Subversion может быть установлен при помощи системы пакетов:

    # pkg_add -r subversion

    Если же для управления пакетами используется pkgng, то Subversion устанавливается при помощи следующей команды:

    # pkg install subversion
  2. Создайте рабочую копию дерева портов. Для ускорения процесса вместо svn0.us-east.FreeBSD.org укажите ближайшее к вам зеркало Subversion. Коммиттерам необходимо сначала прочитать Subversion Primer, чтобы удостовериться, что выбран корректный протокол.

    # svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports
  3. При наличии рабочей копии /usr/ports все последующие обновления выполняются просто:

    # svn update /usr/ports
Процедура 5.3. Метод с использованием Sysinstall

Этот метод подразумевает использование sysinstall для установки Коллекции Портов из установочного носителя. Учтите, что в итоге будет установлена старая копия Коллекции Портов, которая была актуальна на момент создания релиза. Если у вас есть подключение к Интернет, то вам необходимо пользоваться одним из вышеупомянутых методов.

  1. Работая как пользователь root, запустите sysinstall так, как это показано ниже:

    # sysinstall
  2. Опуститесь вниз и выберите Configure, нажмите Enter

  3. Опуститесь вниз и выберите Distributions, затем нажмите Enter

  4. Опуститесь вниз к пункту ports, нажмите клавишу Пробел

  5. Поднимитесь вверх к Exit, нажмите Enter

  6. Выберите желаемый носитель для установки, например, CDROM, FTP и так далее.

  7. Перейдите на пункт меню Exit и нажмите Enter.

  8. Нажмите X для выхода из sysinstall.

5.6.2. Миграция с CVSup/csup на portsnap

Предупреждение:

Начиная с 28 февраля 2013 года дерево портов более не экспортируется в CVS, поэтому CVSup и csup не будут доставлять обновления для дерева портов.

Процедура 5.4. Миграция на Portsnap

Для миграции потребуется около 1 ГБ дискового пространства в /usr, в добавок, для Portsnap необходимо около 150 МБ дискового пространства в /var.

  1. Если у вас настроено автоматическое обновление портов, например при помощи задания cron(8), запускающего CVSup или csup, то его необходимо будет отключить.

  2. Переместите существующее дерево портов во временный каталог:

    # mv /usr/ports /usr/ports.old
  3. При помощи Portsnap скачайте новое дерево портов и извлеките его в /usr/ports:

    # portsnap fetch extract
  4. Переместите дистрибутивные файлы (distfiles) и сохраненные пакеты в новое дерево портов:

    # mv /usr/ports.old/distfiles /usr/ports
    # mv /usr/ports.old/packages /usr/ports
  5. Удалите старое дерево портов:

    # rm -rf /usr/ports.old
  6. Если ранее использовался CVSup, то сейчас его можно удалить:

    # pkg_delete -r -v cvsup-without-gui-\*

    Пользователям pkgng необходимо запустить следующую команду:

    # pkg delete cvsup-without-gui

За дальнейшим описанием утилиты Portsnap и деталей работы с ней обратитесь к Using Portsnap.

5.6.3. Установка портов

Скелетом порта является набор файлов, который указывает вашей системе FreeBSD, как откомпилировать и установить программу. Скелет каждого порта включает:

  • Makefile: этот файл содержит различные директивы, которые определяют, как приложение должно быть откомпилировано и куда в вашей системе оно должно быть установлено.

  • distinfo: этот файл содержит информацию о файлах, которые должны быть загружены для сборки порта, а также их контрольные суммы (sha256(1)) для проверки того, что файлы не были повреждены в процессе загрузки.

  • files: этот каталог содержит патчи, необходимые для компиляции и установки программы в вашей системе FreeBSD. Этот каталог также может содержать другие файлы, используемые для построения порта.

  • pkg-descr: этот файл содержит более подробное описание программы.

  • pkg-plist: это список всех файлов, которые будут установлены портом. В нем также содержатся указания системе портов на удаление определенных файлов во время удаления порта.

В некоторых портах присутствуют и другие файлы, такие, как pkg-message. Система портов использует эти файлы для обработки особых ситуаций. Если вы хотите узнать более подробно об этих файлах и о портах вообще, то обратитесь к Руководству по созданию портов для FreeBSD.

Порт не содержит собственно исходного кода, также известного как <<дистрибутивный файл>> (distfile). Способ распространения исходного кода определяется предпочтениями автора программы. Ниже описаны два способа установки порта FreeBSD.

Примечание:

Для установки портов вы должны войти в систему как пользователь root.

Предупреждение:

Перед установкой любого порта необходимо убедиться в наличии свежей Коллекции Портов и заглянуть на http://vuxml.freebsd.org/, где могут освещаться вопросы безопасности, связанные с конкретным портом. Если у вас установлен ports-mgmt/portaudit, то перед установкой нового порта запустите portaudit -F для загрузки свежей базы данных уязвимостей. Проверка безопасности и обновление базы данных будут выполняться при ежедневной проверке безопасности системы. За дальнейшей информацией обратитесь к страницам справочника portaudit(1) и periodic(8).

Использование Коллекции Портов предполагает наличие работающего подключения к Интернет. В противном случае вам придется раздобыть и поместить копию дистрибутивного файла в каталог /usr/ports/distfiles вручную.

Первым делом переместитесь в каталог устанавливаемого порта:

# cd /usr/ports/sysutils/lsof

Для компиляции (или построения - <<build>>) порта наберите команду make. Вы должны увидеть вывод команды, подобный следующему:

# make
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  Extracting for lsof-4.57
...
[вывод команды при распаковке опущен]
...
>> Checksum OK for lsof_4.57D.freebsd.tar.gz.
===>  Patching for lsof-4.57
===>  Applying FreeBSD patches for lsof-4.57
===>  Configuring for lsof-4.57
...
[вывод команды при конфигурации опущен]
...
===>  Building for lsof-4.57
...
[вывод команды при компиляции опущен]
...
#

По завершении компиляции вы снова вернетесь к приглашению командного процессора. Следующим шагом является установка порта при помощи make install:

# make install
===>  Installing for lsof-4.57
...
[вывод команды при установке опущен]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.57
===>   Registering installation for lsof-4.57
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
#

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

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

# make clean
===>  Cleaning for lsof-4.57
#

Примечание:

Вы можете сэкономить два лишних шага, просто выдав команду make install clean вместо make, make install и последующей make clean в трех отдельных шагах.

Примечание:

Установка порта единственной командой make install чревата возможными частыми остановками процесса инсталляции из-за ожидания вмешательства пользователя: некоторым портам требуется ввод опций. Чтобы избежать траты времени, особенно для портов с многими зависимостями, запустите сначала make config-recursive чтобы выполнить конфигурирование всех опций за один заход. Далее, запустите make install [clean].

Подсказка:

Когда используется config-recursive, перечень подлежащих настройке портов собирается целью all-depends-list команды make(1). Часто рекомендуется повторять запуск make config-recursive до тех пор, пока не будут определены все опции зависимых портов, а меню dialog(1) выбора опций портов появляться перестанут. При этом можно быть уверенным, что все опции были настроены как и намеревалось.

Примечание:

Некоторые командные процессоры для ускорения поиска исполняемых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения PATH. Если вы используете tcsh, то вам может потребоваться набрать rehash, после чего свежеустановленную программу можно будет вызывать без указания полного пути. Для командного интерпретатора sh выполните hash -r. Дополнительную информацию можно найти в документации к вашему командному процессору.

В некоторых имеющихся в продаже комплектах DVD от третьих лиц, таких как the FreeBSD Toolkit от FreeBSD Mall, содержатся дистрибутивные файлы (distfiles). Их можно использовать с Коллекцией Портов. Смонтируйте DVD в /cdrom. Если вы используете иную точку монтирования, укажите её в переменной make(1) CD_MOUNTPTS. Если необходимые для построения порта дистрибутивные файлы находятся на диске, то они будут задействованы автоматически.

Примечание:

Лицензии некоторых портов не позволяют помещать их на DVD. Причиной тому может служить обязательность заполнения регистрационной формы перед загрузкой, или запрет на дальнейшее распространение. Если вы хотите установить порт, которого нет на DVD, вам нужно иметь подключение к Интернет.

Для загрузки файлов система портов использует утилиту fetch(1), которая проверяет значения некоторых переменных окружения, включая FTP_PASSIVE_MODE, FTP_PROXY и FTP_PASSWORD. Если вы находитесь за сетевым экраном или для работы с FTP/HTTP вам необходимо использовать прокси, то определите соответствующие переменные. Обратитесь к справочной странице по fetch(3) для получения полного списка переменных.

Пользователям, которые не могут быть постоянно подключены к сети, поможет команда make fetch. Запустите эту команду в каталоге /usr/ports, и требуемые файлы будут загружены. Эта команда также работает и с вложенными категориями, например: /usr/ports/net. Заметьте, что если порт имеет зависимости от библиотек или других портов, то команда не будет загружать дистрибутивные файлы для зависимых портов. Для загрузки всех зависимых дистрибутивных файлов задействуйте команду make fetch-recursive.

Примечание:

Вы можете построить все порты в категории за раз, запустив команду make в каталоге верхнего уровня. Однако это опасно, так как некоторые порты не могут сосуществовать. В других случаях некоторые порты могут устанавливать два различных файла с одним и тем же именем.

В некоторых редких случаях пользователям необходимо получить tar-архивы с сайтов, отличающихся от указанных по умолчанию в MASTER_SITES. Вы можете переопределить значение MASTER_SITES посредством следующей команды:

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch

В этом примере значение переменной MASTER_SITES изменено на ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.

Примечание:

Некоторые порты позволяют указывать опции, которые включают или выключают построение отдельных частей приложения, изменяют некоторые параметры безопасности, а также задают прочие настройки. Примерами таких портов могут служить: www/firefox, security/gpgme и mail/sylpheed-claws. Если для порта существуют опции компиляции, то перед началом построения будет отображено меню.

5.6.3.1. Переназначение рабочего и целевого каталогов

При помощи переменных WRKDIRPREFIX и PREFIX можно переопределить назначаемые по умолчанию рабочий и целевой каталоги. Например:

# make WRKDIRPREFIX=/usr/home/example/ports install

будет компилировать порт в каталоге /usr/home/example/ports, а установит всё в /usr/local.

# make PREFIX=/usr/home/example/local install

будет компилировать порт в каталоге /usr/ports, а установит в /usr/home/example/local.

И, конечно же,

# make WRKDIRPREFIX=../ports PREFIX=../local install

использует обе возможности.

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

5.6.3.2. Повторная настройка опций портов

Некоторые порты предоставляют ncurses-меню, содержащее опции построения. Будучи однажды успешно определены, опции сохраняются, и при повторном построении порта меню не вызывается. Для изменения сохраненных опций существует несколько способов повторного вызова меню. Один из них - зайти в каталог порта и набрать make config. Второй способ - запустить команду make showconfig. Еще один способ - выполнить команду make rmconfig, которая удалит все ранее отмеченные опции и позволит вам начать конфигурирование сначала. Эти и другие способы детально описаны на странице ports(7).

5.6.4. Удаление установленных портов

Установленные порты и пакеты удаляются при помощи команды pkg_delete(1):

# pkg_delete lsof-4.57

5.6.5. Обновление портов

Прежде всего, при помощи pkg_version(1) просмотрите, нет ли в Коллекции Портов более новых версий установленных приложений:

# pkg_version -v

5.6.5.1. Прочитайте /usr/ports/UPDATING

После обновления Коллекции Портов, и перед тем, как обновить приложение из порта, сверьтесь с файлом /usr/ports/UPDATING. В нем дана информация по различным вопросам и дополнительным шагам, которые могут быть необходимы для обновления порта, включая информацию о таких вещах как изменения форматов файлов, изменения в расположении конфигурационных файлов, или другие нестыковки с предыдущими версиями.

Если UPDATING противоречит чему-либо, написанному в этом документе, то доверьтесь информации из UPDATING.

5.6.5.2. Обновление Портов при помощи Portupgrade

Утилита portupgrade создана для простого обновления установленных портов. Она доступна из порта ports-mgmt/portupgrade. Установите её как и любой иной порт при помощи команды make install clean:

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

Проверьте перечень установленных портов командой pkgdb -F и устраните все несоответствия, о которых сообщит утилита. Хорошей идеей является выполнение этого действия регулярно, перед каждым обновлением.

Используйте portupgrade -a для обновления всех устаревших портов, установленных в вашей системе. Добавьте флаг -i если вы желаете получать запрос на каждый обновляемый порт.

# portupgrade -ai

Для обновления конкретного приложения, а не всех установленных портов, запустите portupgrade pkgname. Включите флаг -R при необходимости обновить все порты, требуемые данным приложением.

# portupgrade -R firefox

Для использования при установке пакетов, а не портов, укажите флаг -P. С этим параметром portupgrade будет искать пакеты в локальных каталогах, указанных в переменной окружения PKG_PATH, а если не найдет их, то загрузит с удаленного сайта. Если пакеты не могут быть найдены локально или загружены удаленно, portupgrade использует порты. Чтобы запретить использование портов, укажите -PP.

# portupgrade -PP gnome2

Для простой загрузки дистрибутивных файлов без построения или установки чего бы то ни было, задайте флаг -F. Дополнительную информацию можно получить на странице справки по утилите portupgrade(1).

5.6.5.3. Обновление портов при помощи portmaster

Утилита ports-mgmt/portmaster - это еще один инструмент для обновления установленных портов. Утилита portmaster опирается на возможности <<базовой>> системы и не зависит от других портов. Она использует информацию из /var/db/pkg/ для определения портов, подлежащих обновлению. Для установки утилиты выполните следующее:

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

Portmaster делит порты на четыре категории:

  • Корневые порты: не зависят от других портов и нет портов, зависимых от корневых;

  • Стволовые порты: не зависят от других портов, но есть порты, зависящие от стволовых;

  • Веточные порты: зависят от других портов и есть порты, зависящие от веточных;

  • Листьевые порты: зависят от других портов, но нет портов, зависящих от листьевых.

Чтобы проверить наличие обновлений для всех установленных портов, задайте утилите флаг -L:

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache-2.2.3
        ===>>> New version available: apache-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

Все установленные порты могут быть обновлены при помощи одной команды:

# portmaster -a

Примечание:

По умолчанию, portmaster создаст дублирующий пакет перед удалением установленного порта. Если обновление порта прошло успешно, portmaster удалит дублирующий пакет. При помощи опции -b можно проинструктировать portmaster не выполнять автоматическое удаление дублирующего пакета. Указание опции -i запустит portmaster в интерактивном режиме, запрашивающим подтверждение пользователя перед обновлением каждого порта.

Если во время процесса обновления возникнут ошибки, задействуйте опцию -f для обновления/перестройки всех портов:

# portmaster -af

Также, portmaster может быть задействован для установки новых портов в систему, автоматически обновляя другие зависимые порты перед построением и установкой нового порта:

# portmaster shells/bash

За подробной информацией обратитесь к portmaster(8).

5.6.6. Порты и дисковое пространство

Работа с Коллекцией Портов со временем приводит к увеличению занимаемого дискового пространства. После построения и установки программы из порта удалите временный каталог work при помощи команды make clean. Для очистки всей Коллекции Портов наберите:

# portsclean -C

По прошествии некоторого времени у вас соберется множество дистрибутивных файлов в каталоге distfiles. Следующая команда удалит все дистрибутивные файлы, которые более не связаны ни с какими портами:

# portsclean -D

Для удаления всех дистрибутивных файлов, не связанных ни с одним установленным в вашу систему портом, наберите:

# portsclean -DD

Примечание:

Утилита portsclean является частью порта ports-mgmt/portupgrade.

Удобная утилита для автоматизации удаления портов, в которых вы более не нуждаетесь, доступна из порта ports-mgmt/pkg_cutleaves.

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.

По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.