---
description: 'FreeBSD предоставляет две взаимодополняющие технологии для установки стороннего программного обеспечения: коллекцию портов FreeBSD для установки из исходного кода и пакеты для установки из предварительно собранных бинарных файлов'
next: books/handbook/x11
params:
  path: /books/handbook/ports/
part: 'В начале'
prev: books/handbook/basics
showBookMenu: 'true'
tags: ["ports", "collection", "pkg", "poudriere", "management"]
title: 'Глава 4. Установка приложений: Пакеты и Порты'
weight: 6
---

[[ports]]
= Установка приложений: пакеты и порты
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 4
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/ports/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[ports-synopsis]]
== Обзор

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

Прочтите эту главу, чтобы узнать:

* Разница между бинарными пакетами и портами.
* Как найти стороннее программное обеспечение, портированное на FreeBSD.
* Как управлять бинарными пакетами с помощью pkg.
* Как собрать стороннее программное обеспечение из исходных кодов с использованием Коллекции портов.
* Как найти файлы, установленные с приложением, для пост-установочной настройки.
* Что делать, если установка программного обеспечения не удалась.

[[ports-overview]]
== Обзор установки программного обеспечения

Порт FreeBSD — это набор файлов, предназначенных для автоматизации процесса компиляции приложения из исходного кода. Файлы, из которых состоит порт, содержат всю необходимую информацию для автоматической загрузки, распаковки, наложения исправлений, компиляции и установки приложения.

Если программное обеспечение ещё не адаптировано и не протестировано на FreeBSD, может потребоваться редактирование исходного кода для его правильной установки и работы.

Однако более link:https://ports.FreeBSD.org[{numports}] сторонних приложений уже портированы на FreeBSD. По возможности эти приложения доступны для загрузки в виде предварительно скомпилированных _пакетов_.

Пакетами можно управлять с помощью команд управления пакетами FreeBSD.

Как пакеты, так и порты учитывают зависимости. Если приложение устанавливается с помощью пакета или порта, а необходимая библиотека ещё не установлена, эта библиотека будет автоматически установлена первой.

Пакет FreeBSD содержит предварительно скомпилированные версии всех команд приложения, а также любые конфигурационные файлы и документацию. Пакетом можно управлять с помощью команд man:pkg[8], таких как `pkg install`.

Хотя эти две технологии схожи, пакеты и порты имеют свои сильные стороны. Выберите технологию, которая соответствует вашим потребностям, для установки конкретного приложения.

.Преимущества пакетов
* Сжатый tar-архив пакета обычно меньше, чем сжатый tar-архив с исходным кодом приложения.
* Пакеты не требуют времени на компиляцию. Для больших приложений, таких как Firefox, KDE Plasma или GNOME, это может быть важно на медленной системе.
* Пакеты не требуют понимания процесса компиляции программного обеспечения в FreeBSD.

.Преимущества портов
* Пакеты обычно компилируются с консервативными параметрами, так как они должны работать на максимальном количестве систем. При компиляции из портов можно изменить параметры компиляции.
* Некоторые приложения имеют параметры на этапе компиляции, определяющие, какие функции будут установлены. Например, NGINX(R) можно настроить с широким набором различных встроенных опций.
+
В некоторых случаях для одного приложения могут существовать несколько пакетов с разными настройками. Например, NGINX(R) доступен в виде пакетов `nginx` и `nginx-lite`. Первый имеет гораздо больше включенных опций, но это, в свою очередь, требует установки множества зависимостей для его работы, что увеличивает занимаемое место и поверхность для атак.
+
Транзитивные зависимости могут стать довольно большими, например, полный пакет `nginx` потянет за собой несколько X-библиотек, что может оказаться неожиданным. Сборка из портов позволяет выбрать только нужные опции, избегая подхода «всё включено». В некоторых случаях для одного приложения могут существовать несколько пакетов с разными настройками.
* Условия лицензирования некоторых программных продуктов запрещают распространение в бинарном виде. Такое программное обеспечение должно распространяться в виде исходного кода, который конечный пользователь должен самостоятельно скомпилировать.
* Некоторые люди не доверяют бинарным дистрибутивам или предпочитают изучать исходный код, чтобы выявить потенциальные проблемы.
* Исходный код необходим для применения пользовательских исправлений.

Для отслеживания обновлений портов подпишитесь на рассылки {freebsd-ports} и {freebsd-ports-bugs}.

[WARNING]
====
Перед установкой приложения проверьте https://vuxml.freebsd.org/[] на наличие связанных проблем с безопасностью.

Для проверки установленных пакетов на наличие известных уязвимостей выполните команду `pkg audit -F`.
====

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

[[ports-finding-applications]]
== Поиск программного обеспечения

Список доступных приложений для FreeBSD постоянно растет. Существует несколько способов найти программное обеспечение для установки:

* Веб-сайт FreeBSD содержит актуальный поисковый список всех доступных приложений на странице link:https://ports.FreeBSD.org[Портала портов]. Порты можно искать по названию приложения или по категории программного обеспечения.
* Дэн Лангилл поддерживает https://www.freshports.org/[FreshPorts], который предоставляет удобный поиск и отслеживает изменения в приложениях из коллекции портов. Зарегистрированные пользователи могут создать индивидуальный список наблюдения, чтобы получать автоматические уведомления по электронной почте при обновлении отслеживаемых портов.
* Если найти конкретное приложение становится сложно, попробуйте поискать на таких сайтах, как https://sourceforge.net/[SourceForge] или https://github.com/[GitHub], а затем проверьте ссылку link:https://ports.FreeBSD.org[Ports Portal], чтобы узнать, было ли это приложение портировано.
* Поиск репозитория бинарных пакетов для приложения с помощью команды man:pkg[8]

[[pkgng-intro]]
== Использование pkg для управления бинарными пакетами

man:pkg[8] предоставляет интерфейс для управления пакетами: регистрации, добавления, удаления и обновления пакетов.

Для сайтов, которые хотят использовать только предварительно собранные бинарные пакеты из зеркал FreeBSD, управления пакетами с помощью man:pkg[8] может быть достаточно.

Однако для сайтов, собирающих из исходного кода, потребуется отдельный crossref:ports[ports-upgrading-tools,инструмент управления портами].

Поскольку man:pkg[8] работает только с бинарными пакетами, он не является заменой таким инструментам. Эти инструменты можно использовать для установки программного обеспечения как из бинарных пакетов, так и из коллекции портов, тогда как man:pkg[8] устанавливает только бинарные пакеты.

[[pkgng-initial-setup]]
=== Начало работы с pkg

Все поддерживаемые версии FreeBSD теперь содержат `/usr/sbin/pkg`, также известный как man:pkg[7]. Это небольшая заглушка, которая обладает лишь минимальной функциональностью, необходимой для установки настоящего man:pkg[8].

[NOTE]
====
Для успешного завершения процесса начальной загрузки требуется рабочее подключение к Интернету.
====

Выполните команду man:pkg[8] из командной строки:

[source, shell]
....
# pkg
....

Вывод должен быть похож на следующий:

[.programlisting]
....
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]
....

man:pkg[7] перехватит команду, и если вы подтвердите своё намерение, загрузит tarball man:pkg[8], установит man:pkg[8] из него, инициализирует локальную базу данных пакетов, а затем выполнит изначально запрошенную команду.

Более новые версии man:pkg[7] поддерживают `pkg -N` для проверки, установлен ли man:pkg[8], без запуска процесса установки, и, наоборот, `pkg bootstrap[-f]` для установки man:pkg[8] (или принудительной переустановки) без выполнения других действий.

Информация по использованию pkg доступна на man:pkg[8] или при запуске `pkg` без дополнительных аргументов. Дополнительные параметры настройки pkg описаны в man:pkg.conf[5].

Каждый аргумент команды pkg документирован в соответствующем руководстве, специфичном для команды.

Чтобы прочитать справочную страницу для `pkg install`, например, выполните следующую команду:

[source, shell]
....
# pkg help install
....

Оставшаяся часть этого раздела демонстрирует распространённые задачи управления бинарными пакетами, которые можно выполнять с помощью man:pkg[8]. Каждая из представленных команд предоставляет множество ключей для настройки их использования. Подробности и дополнительные примеры смотрите в справке (help) или man-странице соответствующей команды.

[[quarterly-latest-branch]]
=== Квартальные и последние ветви портов

Ветка `Quarterly` предоставляет пользователям более предсказуемую и стабильную среду для установки и обновления портов и пакетов. Это достигается за счёт того, что в неё вносятся только обновления, не связанные с добавлением новых функций. Ветки Quarterly получают исправления безопасности (которые могут включать обновления версий или обратные порты коммитов), исправления ошибок, а также изменения, связанные с соответствием портов или изменения в их инфраструктуре. Ветка Quarterly создаётся из HEAD в начале каждого квартала (года) в январе, апреле, июле и октябре. Ветки именуются в соответствии с годом (YYYY) и кварталом (Q1-4), в котором они созданы. Например, ветка quarterly, созданная в январе 2023 года, называется 2023Q1. А ветка `Latest` предоставляет пользователям самые последние версии пакетов.

Чтобы переключить man:pkg[8] с Quarterly на Latest, выполните следующие команды:

[source, shell]
....
# mkdir -p /usr/local/etc/pkg/repos
# echo 'FreeBSD-ports: { url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest" }' > /usr/local/etc/pkg/repos/FreeBSD.conf
....

Затем выполните эту команду, чтобы обновить каталоги локальных репозиториев пакетов для ветки Latest:

[source, shell]
....
# pkg update -f
....

[[kmod-repository]]
=== Репозитории модулей ядра

Репозитории модулей ядра позволяют пользователям устанавливать готовые к использованию модули, такие как драйверы графики и поддержка специфичного оборудования. Начиная с FreeBSD 14.3, проект FreeBSD предоставляет собранные модули ядра для каждой поддерживаемой версии. Чтобы создать конфигурацию такого репозитория (если она отсутствует), добавьте следующее в [.filename]#/usr/local/etc/pkg/repos/kmods.conf#:
[source, shell]
....
FreeBSD-kmods: {
        url: "pkg+https://pkg.FreeBSD.org/${ABI}/KMODSFLAVOR",
        mirror_type: "srv",
        signature_type: "fingerprints",
        fingerprints: "/usr/share/keys/pkg",
        enabled: yes
}
....

Переменная `KMODSFLAVOR` использует следующий шаблон именования: `kmods_PORTBRANCH_MINORRELEASE`.

Например:

.Kmodsflavor

[options="header", cols="1,1,1"]
|===
| Релиз FreeBSD | главные порты | квартальные порты

| FreeBSD 14.2-RELEASE
| kmods_latest_2
| kmods_quarterly_2

| FreeBSD 14.3-RELEASE
| kmods_latest_3
| kmods_quarterly_3

| FreeBSD 14.3-STABLE
| kmods_latest
| kmods_quarterly

| FreeBSD 15.0-CURRENT
| kmods_latest
| 
|===

[[pkg-configuration]]
=== Настройка pkg

man:pkg.conf[5] — это общесистемный конфигурационный файл, используемый утилитами man:pkg[8]. Стандартное расположение этого файла — `/usr/local/etc/pkg.conf`.

[NOTE]
====
FreeBSD не требует наличия файла `pkg.conf`. Многие установки будут работать без `pkg.conf` вообще или с пустым `pkg.conf` (за исключением строк с комментариями).
====

Строки в файле, начинающиеся с символа "#", являются комментариями и игнорируются.

Файл имеет формат UCL. Для получения дополнительной информации о синтаксисе man:libucl[3] посетите link:https://github.com/vstakhov/libucl[официальный сайт UCL].

Распознаются следующие типы опций - логические, строковые и списковые.

Логическая опция считается включённой, если в файле конфигурации указано одно из следующих значений: YES, TRUE или ON.

[[pkg-search]]
=== Поиск пакетов

Для поиска пакета можно использовать man:pkg-search[8]:

[source, shell]
....
# pkg search nginx
....

Вывод должен быть похож на следующий:

[.programlisting]
....
modsecurity3-nginx-1.0.3       Instruction detection and prevention engine / nginx Wrapper
nginx-1.22.1_2,3               Robust and small WWW server
nginx-devel-1.23.2_4           Robust and small WWW server
nginx-full-1.22.1_1,3          Robust and small WWW server (full package)
nginx-lite-1.22.1,3            Robust and small WWW server (lite package)
nginx-naxsi-1.22.1,3           Robust and small WWW server (plus NAXSI)
nginx-prometheus-exporter-0.10.0_7 Prometheus exporter for NGINX and NGINX Plus stats
nginx-ultimate-bad-bot-blocker-4.2020.03.2005_1 Nginx bad bot and other things blocker
nginx-vts-exporter-0.10.7_7    Server that scraps NGINX vts stats and export them via HTTP
p5-Nginx-ReadBody-0.07_1       Nginx embeded perl module to read and evaluate a request body
p5-Nginx-Simple-0.07_1         Perl 5 module for easy to use interface for Nginx Perl Module
p5-Test-Nginx-0.30             Testing modules for Nginx C module development
py39-certbot-nginx-2.0.0       NGINX plugin for Certbot
rubygem-passenger-nginx-6.0.15 Modules for running Ruby on Rails and Rack applications
....

[[pkg-installing-fetching]]
=== Установка и загрузка пакетов

Для установки бинарного пакета можно использовать man:pkg-install[8]. Эта команда использует данные репозитория для определения версии программного обеспечения, которую нужно установить, а также наличия неустановленных зависимостей. Например, для установки curl:

[source, shell]
....
# pkg install curl
....

Вывод должен быть похож на следующий:

[.programlisting]
....
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 9 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        ca_root_nss: 3.83
        curl: 7.86.0
        gettext-runtime: 0.21
        indexinfo: 0.3.1
        libidn2: 2.3.3
        libnghttp2: 1.48.0
        libpsl: 0.21.1_4
        libssh2: 1.10.0.3
        libunistring: 1.0

Number of packages to be installed: 9

The process will require 11 MiB more space.
3 MiB to be downloaded

Proceed with this action? [y/N]
....

Новый пакет и любые дополнительные пакеты, установленные в качестве зависимостей, можно увидеть в списке установленных пакетов:

[source, shell]
....
# pkg info
....

Вывод должен быть похож на следующий:

[.programlisting]
....
ca_root_nss-3.83               Root certificate bundle from the Mozilla Project
curl-7.86.0                    Command line tool and library for transferring data with URLs
gettext-runtime-0.21.1         GNU gettext runtime libraries and programs
indexinfo-0.3.1                Utility to regenerate the GNU info page index
libidn2-2.3.3                  Implementation of IDNA2008 internationalized domain names
libnghttp2-1.48.0              HTTP/2.0 C Library
libpsl-0.21.1_6                C library to handle the Public Suffix List
libssh2-1.10.0.3               Library implementing the SSH2 protocol
libunistring-1.0               Unicode string library
pkg-1.18.4                     Package manager
....

Для загрузки пакета с последующей установкой позже или в другом месте используйте man:pkg-fetch[8]. Например, чтобы скачать `nginx-lite`:

[source, shell]
....
# pkg fetch -d -o /usr/home/user/packages/ nginx-lite
....

* `-d`: используется для получения всех зависимостей
* `-o`: используется для указания каталога загрузки

Вывод должен быть похож на следующий:

[.programlisting]
....
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following packages will be fetched:

New packages to be FETCHED:
        nginx-lite: 1.22.1,3 (342 KiB: 22.20% of the 2 MiB to download)
        pcre: 8.45_3 (1 MiB: 77.80% of the 2 MiB to download)

Number of packages to be fetched: 2

The process will require 2 MiB more space.
2 MiB to be downloaded.

Proceed with fetching packages? [y/N]:
....

Для установки загруженных пакетов можно использовать man:pkg-install[8] следующим образом:

[source, shell]
....
# cd /usr/home/user/packages/
....

[source, shell]
....
# pkg install nginx-lite-1.22.1,3.pkg
....

[[pkgng-pkg-info]]
=== Получение информации об установленных пакетах

Информацию об установленных в системе пакетах можно просмотреть с помощью команды man:pkg-info[8], которая при запуске без каких-либо параметров выводит версию пакета для всех установленных пакетов или указанного пакета.

Например, чтобы узнать, какая версия pkg установлена, выполните:

[source, shell]
....
# pkg info pkg
....

Вывод должен быть похож на следующий:

[.programlisting]
....
pkg-1.19.0
Name           : pkg
Version        : 1.19.0
Installed on   : Sat Dec 17 11:05:28 2022 CET
Origin         : ports-mgmt/pkg
Architecture   : FreeBSD:13:amd64
Prefix         : /usr/local
Categories     : ports-mgmt
Licenses       : BSD2CLAUSE
Maintainer     : pkg@FreeBSD.org
WWW            : https://github.com/freebsd/pkg
Comment        : Package manager
Options        :
        DOCS           : on
Shared Libs provided:
        libpkg.so.4
Annotations    :
        FreeBSD_version: 1301000
        repo_type      : binary
        repository     : FreeBSD
Flat size      : 33.2MiB
Description    :
Package management tool

WWW: https://github.com/freebsd/pkg
....

[[pkgng-upgrading]]
=== Обновление установленных пакетов

Установленные пакеты можно обновить до их последних версий с помощью man:pkg-upgrade[8]:

[source, shell]
....
# pkg upgrade
....

Эта команда сравнит установленные версии с доступными в каталоге репозитория и обновит их из репозитория.

[[pkgng-auditing]]
=== Проверка установленных пакетов

Уязвимости в программном обеспечении регулярно обнаруживаются в сторонних приложениях. Для решения этой проблемы pkg включает встроенный механизм аудита. Чтобы определить, есть ли известные уязвимости для программного обеспечения, установленного в системе, используйте man:pkg-audit[8]:

[source, shell]
....
# pkg audit -F
....

Вывод должен быть похож на следующий:

[.programlisting]
....
Fetching vuln.xml.xz: 100%  976 KiB 499.5kB/s    00:02
chromium-108.0.5359.98 is vulnerable:
  chromium -- multiple vulnerabilities
  CVE: CVE-2022-4440
  CVE: CVE-2022-4439
  CVE: CVE-2022-4438
  CVE: CVE-2022-4437
  CVE: CVE-2022-4436
  WWW: https://vuxml.FreeBSD.org/freebsd/83eb9374-7b97-11ed-be8f-3065ec8fd3ec.html
....

[[pkg-delete]]
=== Удаление пакетов

Пакеты, которые больше не нужны, можно удалить с помощью man:pkg-delete[8].

Например:

[source, shell]
....
# pkg delete curl
....

Вывод должен быть похож на следующий:

[.programlisting]
....
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        curl :7.86.0

Number of packages to be removed: 1

The operation will free 4 MiB.

Proceed with deinstallation packages? [y/N]: y
[1/1] Deinstalling curl-7.86.0...
[1/1] Deleting files for curl-7.86.0: 100%
....

[[pkgng-autoremove]]
=== Автоматическое удаление неиспользуемых пакетов

Удаление пакета может оставить зависимости, которые больше не требуются. Ненужные пакеты, установленные как зависимости (листовые пакеты), могут быть автоматически обнаружены и удалены с помощью man:pkg-autoremove[8]:

[source, shell]
....
# pkg autoremove
....

Вывод должен быть похож на следующий:

[.programlisting]
....
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages:

Installed packages to be REMOVED:
        ca_root_nss-3.83

Number of packages to be removed: 1

The operation will free 723 KiB.

Proceed with deinstalling packages? [y/N]:
....

Установленные в качестве зависимостей пакеты называются _автоматическими_ пакетами. Неавтоматические пакеты, то есть пакеты, которые были явно установлены не в качестве зависимости для другого пакета, можно вывести с помощью:

[source, shell]
....
# pkg prime-list
....

Вывод должен быть похож на следующий:

[.programlisting]
....
nginx
openvpn
sudo
....

`pkg prime-list` — это псевдоним команды, объявленный в `/usr/local/etc/pkg.conf`. Существует множество других команд, которые можно использовать для запросов к базе данных пакетов системы. Например, команда `pkg prime-origins` позволяет получить каталог портов происхождения для упомянутого выше списка:

[source, shell]
....
# pkg prime-origins
....

Вывод должен быть похож на следующий:

[.programlisting]
....
www/nginx
security/openvpn
security/sudo
....

Этот список можно использовать для пересборки всех пакетов, установленных в системе, с помощью инструментов сборки, таких как package:ports-mgmt/poudriere[] или package:ports-mgmt/synth[].

Пометить установленный пакет как автоматический можно с помощью:

[source, shell]
....
# pkg set -A 1 devel/cmake
....

Как только пакет становится листовым и помечается как автоматический, он выбирается командой `pkg autoremove`.

Пометить установленный пакет как _не_ автоматический можно с помощью:

[source, shell]
....
# pkg set -A 0 devel/cmake
....

[[pkgng-clean]]
=== Удаление устаревших пакетов

По умолчанию pkg хранит бинарные пакеты в кэш-каталоге, определённом параметром `PKG_CACHEDIR` в man:pkg.conf[5]. Сохраняются только копии последних установленных пакетов. В более старых версиях pkg сохранялись все предыдущие пакеты. Чтобы удалить устаревшие бинарные пакеты, выполните:

[source, shell]
....
# pkg clean
....

Весь кэш может быть очищен выполнением команды:

[source, shell]
....
# pkg clean -a
....

[[pkg-locking-unlocking]]
=== Блокировка и разблокировка пакетов

man:pkg-lock[8] используется для блокировки пакетов от переустановки, изменения или удаления. man:pkg-unlock[8] разблокирует указанные пакеты. Оба варианта влияют только на уже установленные пакеты. Следовательно, невозможно предотвратить установку нового пакета с помощью этого механизма, за исключением случаев, когда такая установка подразумевает обновление заблокированного пакета.

Например, чтобы заблокировать `nginx-lite`:

[source, shell]
....
# pkg lock nginx-lite
....

И чтобы разблокировать `nginx-lite`:

[source, shell]
....
# pkg unlock nginx-lite
....

[[pkgng-set]]
=== Изменение метаданных пакета

Программное обеспечение в коллекции портов FreeBSD может подвергаться изменениям основных номеров версий. Для решения этой проблемы в pkg есть встроенная команда для обновления происхождения пакетов. Это может быть полезно, например, если package:lang/python3[] переименован в package:lang/python311[], чтобы package:lang/python3[] теперь мог представлять версию `3.11`.

Чтобы изменить источник пакета для приведённого выше примера, выполните:

[source, shell]
....
# pkg set -o lang/python3:lang/python311
....

В качестве другого примера, чтобы обновить package:lang/ruby31[] до package:lang/ruby32[], выполните:

[source, shell]
....
# pkg set -o lang/ruby31:lang/ruby32
....

[NOTE]
====
При изменении происхождения пакетов важно переустановить пакеты, зависящие от пакета с изменённым происхождением. Для принудительной переустановки зависимых пакетов выполните:

[source, shell]
....
# pkg install -Rf lang/ruby32
....
====

[[ports-using]]
== Использование коллекции портов

Коллекция портов — это набор `Makefile`-файлов, патчей и описаний. Каждый такой набор файлов используется для сборки и установки отдельного приложения в FreeBSD и называется _портом_.

По умолчанию Коллекция портов хранится в подкаталоге `/usr/ports`.

[WARNING]
====
Прежде чем устанавливать и использовать Коллекцию портов, учтите, что обычно не рекомендуется использовать Коллекцию портов вместе с бинарными пакетами, предоставляемыми через pkg, для установки программного обеспечения. По умолчанию pkg отслеживает квартальные ветки-релизы дерева портов, а не HEAD. Зависимости для порта в HEAD могут отличаться от его аналога в квартальном релизе ветки, что может привести к конфликтам между зависимостями, установленными pkg, и теми, что из Коллекции портов. Если необходимо использовать Коллекцию портов и pkg вместе, убедитесь, что ваша Коллекция портов и pkg находятся на одной ветке релиза дерева портов.
====

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

* *Makefile*: содержит инструкции, определяющие порядок компиляции приложения и расположение его компонентов при установке.
* *distinfo*: содержит имена и контрольные суммы файлов, которые необходимо загрузить для сборки порта.
* *files/*: в этом каталоге содержатся все необходимые патчи для компиляции и установки программы в FreeBSD. Также в этом каталоге могут находиться другие файлы, используемые для сборки порта.
* *pkg-descr*: содержит более подробное описание программы.
* *pkg-plist*: список всех файлов, которые будут установлены портом. Также он указывает системе портов, какие файлы следует удалить при деинсталляции.

Некоторые порты включают файлы `pkg-message` или другие для обработки особых ситуаций. Для получения более подробной информации об этих файлах и о портах в целом обратитесь к extref:{porters-handbook}[Руководству по созданию портов FreeBSD].

Порт не включает в себя исходный код, также известный как `distfile`. Этап извлечения при сборке порта автоматически сохраняет загруженные исходные файлы в `/usr/ports/distfiles`.

[[ports-using-installation-methods]]
=== Установка коллекции портов

Прежде чем приложение можно будет скомпилировать с использованием порта, необходимо установить Коллекцию портов. Если она не была установлена во время установки FreeBSD, используйте следующий метод для её установки:

[[ports-using-git-method]]
[.procedure]
****
*Процедура: Метод Git*

Если требуется больше контроля над деревом портов или необходимо поддерживать локальные изменения, либо если используется FreeBSD-CURRENT, для получения коллекции портов можно использовать Git. Подробное описание Git см. в extref:{committers-guide}[руководстве по Git, git-primer].

Добавляем `--depth 1` в командную строку `git`, чтобы клонировать дерево без получения истории коммитов, что экономит время и приемлемо для большинства пользователей. Если у вас есть собственные изменения в дереве портов или вам нужна история по какой-либо причине, опустите аргумент `--depth 1` ниже.

. Git должен быть установлен перед тем, как его можно будет использовать для получения дерева портов. Если копия дерева портов уже существует, установите Git следующим образом:
+
[source, shell]
....
# cd /usr/ports/devel/git
# make install clean
....
+
Если дерево портов недоступно или для управления пакетами используется pkg, Git можно установить как пакет:
+
[source, shell]
....
# pkg install git
....
+
. Извлеките копию ветки HEAD дерева портов:
+
[source, shell]
....
# git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
....
+
. Или склонируйте копию квартальной ветки:
+
[source, shell]
....
# git clone --depth 1 https://git.FreeBSD.org/ports.git -b 2023Q1 /usr/ports
....
+
. По мере необходимости обновите `/usr/ports` после первоначального получения из Git:
+
[source, shell]
....
# git -C /usr/ports pull
....
+
. По мере необходимости переключите `/usr/ports` на другую квартальную ветку:
+
[source, shell]
....
# git -C /usr/ports fetch --depth 1 origin 2023Q2:2023Q2
# git -C /usr/ports switch 2023Q2
....
****

=== Установка портов

Этот раздел содержит основные инструкции по использованию коллекции портов для установки или удаления программного обеспечения. Подробное описание доступных целей `make` и переменных окружения доступно в man:ports[7].

[WARNING]
====

Прежде чем компилировать любой порт, обязательно обновите коллекцию портов, как описано в предыдущем разделе. Поскольку установка любого стороннего программного обеспечения может привести к уязвимостям в безопасности, рекомендуется сначала проверить https://vuxml.freebsd.org/[] на наличие известных проблем безопасности, связанных с портом. Или выполните `pkg audit -F` перед установкой нового порта. Эта команда может быть настроена для автоматической проверки безопасности и обновления базы данных уязвимостей в ходе ежедневной проверки безопасности системы. Для получения дополнительной информации обратитесь к man:pkg-audit[8] и man:periodic[8].
====

Использование коллекции портов предполагает наличие работающего подключения к Интернету. Также требуются права суперпользователя.

Для компиляции и установки порта перейдите в каталог порта, который нужно установить, затем введите `make install` в командной строке. Сообщения будут отображать прогресс:

[source, shell]
....
# cd /usr/ports/sysutils/lsof
# make install
>> lsof_4.88D.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.88
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
===>  Patching for lsof-4.88.d,8
===>  Applying FreeBSD patches for lsof-4.88.d,8
===>  Configuring for lsof-4.88.d,8
...
[configure output snipped]
...
===>  Building for lsof-4.88.d,8
...
[compilation output snipped]
...

===>  Installing for lsof-4.88.d,8
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.88.d,8
===>   Registering installation for lsof-4.88.d,8
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/sbin/lsof
#
....

Поскольку `lsof` — это программа, работающая с повышенными привилегиями, при её установке отображается предупреждение системы безопасности. После завершения установки будет возвращена командная строка.

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

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

[source, shell]
....
# make clean
===>  Cleaning for lsof-88.d,8
#
....

[NOTE]
====
Чтобы избежать этого дополнительного шага, используйте `make install clean` при компиляции порта.
====

==== Настройка установки портов

Некоторые порты предоставляют опции сборки, которые можно использовать для включения или отключения компонентов приложения, обеспечения параметров безопасности или других настроек. Примеры включают package:www/firefox[] и package:security/gpgme[]. Если порт зависит от других портов с настраиваемыми опциями, процесс может несколько раз приостанавливаться для взаимодействия с пользователем, так как по умолчанию предлагается выбрать опции из меню. Чтобы избежать этого и выполнить всю настройку одной командой, выполните `make config-recursive` в каталоге порта. Затем выполните `make install [clean]` для компиляции и установки порта.

[TIP]
====
При использовании `config-recursive` список портов для настройки собирается с помощью цели `all-depends-list`. Рекомендуется выполнять `make config-recursive` до тех пор, пока не будут определены все параметры зависимых портов и экраны выбора опций портов больше не появляются, чтобы убедиться, что все параметры зависимостей настроены.
====

Существует несколько способов вернуться к меню настроек сборки порта, чтобы добавить, удалить или изменить параметры после того, как порт уже был собран. Один из методов — перейти в каталог с портом с помощью `cd` и ввести `make config`. Другой вариант — использовать `make showconfig`. Также можно выполнить `make rmconfig`, что удалит все выбранные параметры и позволит начать заново. Все эти и другие варианты подробно описаны в man:ports[7].

Система портов использует man:fetch[1] для загрузки исходных файлов, которая поддерживает различные переменные окружения. Переменные `FTP_PASSIVE_MODE`, `FTP_PROXY` и `FTP_PASSWORD` может потребоваться установить, если система FreeBSD находится за межсетевым экраном или FTP/HTTP прокси. Полный список поддерживаемых переменных смотрите в man:fetch[3].

Для пользователей, которые не могут быть постоянно подключены к интернету, команда `make fetch` может быть выполнена в `/usr/ports`, чтобы загрузить все distfiles, или в категории, например `/usr/ports/net`, или в конкретном скелете порта. Обратите внимание, что если порт имеет зависимости, выполнение этой команды в категории или скелете порта _не_ загрузит distfiles портов из другой категории. Вместо этого используйте `make fetch-recursive`, чтобы также загрузить distfiles для всех зависимостей порта.

В редких случаях, например, когда у организации есть локальный репозиторий distfiles, переменная `MASTER_SITES` может быть использована для переопределения мест загрузки, указанных в `Makefile`. При использовании укажите альтернативное расположение:

[source, shell]
....
# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch
....

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

[source, shell]
....
# make WRKDIRPREFIX=/usr/home/example/ports install
....

соберет порт в `/usr/home/example/ports` и установит все в `/usr/local`.

[source, shell]
....
# make PREFIX=/usr/home/example/local install
....

скомпилирует порт в `/usr/ports` и установит его в `/usr/home/example/local`. И:

[source, shell]
....
# make WRKDIRPREFIX=../ports PREFIX=../local install
....

объединит эти два.

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

[[ports-removing]]
=== Удаление установленных портов

Установленные порты можно удалить с помощью `pkg delete`. Примеры использования этой команды приведены на man:pkg-delete[8].

Или в каталоге порта можно выполнить `make deinstall`:

[source, shell]
....
# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for sysutils/lsof
===>   Deinstalling
Deinstallation has been requested for the following 1 packages:

	lsof-4.88.d,8

The deinstallation will free 229 kB
[1/1] Deleting lsof-4.88.d,8... done
....

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

[[ports-upgrading]]
=== Обновление портов

Со временем в Коллекции портов становятся доступны новые версии программного обеспечения. В этом разделе описано, как определить, какие программы можно обновить, и как выполнить обновление.

Чтобы определить, доступны ли более новые версии установленных портов, убедитесь, что у вас установлена последняя версия дерева портов, используя команду обновления, описанную в crossref:ports[ports-using-git-method, "Git Method"]. Следующая команда выведет список устаревших установленных портов:

[source, shell]
....
# pkg version -l "<"
....

[IMPORTANT]
====
Перед попыткой обновления прочитайте файл `/usr/ports/UPDATING` с начала до даты, наиболее близкой к последнему обновлению портов или установке системы. Этот файл описывает различные проблемы и дополнительные шаги, с которыми могут столкнуться пользователи при обновлении портов, включая такие вещи, как изменения форматов файлов, перемещение конфигурационных файлов или несовместимость с предыдущими версиями. Отметьте все инструкции, относящиеся к портам, которые требуют обновления, и следуйте этим инструкциям при выполнении обновления.
====

[[ports-upgrading-tools]]
==== Инструменты для обновления и управления портами

Коллекция портов содержит несколько утилит для выполнения обновления. У каждой есть свои сильные и слабые стороны.

Исторически большинство установок использовали либо Portmaster, либо Portupgrade. Synth — это более современная альтернатива.

[NOTE]
====
Выбор наилучшего инструмента для конкретной системы остаётся за системным администратором. Рекомендуется создать резервную копию данных перед использованием любого из этих инструментов.
====

[[portmaster]]
==== Обновление портов с помощью Portmaster

package:ports-mgmt/portmaster[] — это очень небольшая утилита для обновления установленных портов. Она предназначена для использования инструментов, установленных в базовой системе FreeBSD, без зависимости от других портов или баз данных. Чтобы установить эту утилиту как порт:

[source, shell]
....
# cd /usr/ports/ports-mgmt/portmaster
# make install clean
....

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

* Корневой порт (root port): не имеет зависимостей и сам не является зависимостью для других портов.
* Ствольный порт (trunk port): не имеет зависимостей, но другие порты зависят от него.
* Веточный порт (branch port): имеет зависимости и другие порты зависят от него.
* Листовой порт (leaf port): имеет зависимости, но другие порты от него не зависят.

Чтобы перечислить эти категории и найти обновления:

[source, shell]
....
# 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)
===>>> apache22-2.2.3
        ===>>> New version available: apache22-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
....

Эта команда используется для обновления всех устаревших портов:

[source, shell]
....
# portmaster -a
....

[NOTE]
====
По умолчанию Portmaster создаёт резервную копию пакета перед удалением существующего порта. Если установка новой версии проходит успешно, Portmaster удаляет резервную копию. Использование опции `-b` указывает Portmaster не удалять резервную копию автоматически. Добавление опции `-i` запускает Portmaster в интерактивном режиме, запрашивая подтверждение перед обновлением каждого порта. Доступно множество других опций. Подробности об их использовании можно узнать на man-странице man:portmaster[8].
====

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

[source, shell]
....
# portmaster -af
....

Portmaster также может использоваться для установки новых портов в системе, обновляя все зависимости перед сборкой и установкой нового порта. Чтобы использовать эту функцию, укажите расположение порта в коллекции портов:

[source, shell]
....
# portmaster shells/bash
....

Дополнительную информацию о package:ports-mgmt/portmaster[] можно найти в его `pkg-descr`.

[[portupgrade]]
==== Обновление портов с помощью Portupgrade

[WARNING]
====
Portupgrade устарел и будет удален в ближайшем будущем.
====


package:ports-mgmt/portupgrade[] — это ещё одна утилита, которую можно использовать для обновления портов. Она устанавливает набор приложений для управления портами. Однако она зависит от Ruby. Для установки порта выполните:

[source, shell]
....
# cd /usr/ports/ports-mgmt/portupgrade
# make install clean
....

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

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

[source, shell]
....
# portupgrade -ai
....

Для обновления только указанного приложения вместо всех доступных портов используйте `portupgrade _pkgname_`. Очень важно включить опцию `-R`, чтобы сначала обновить все порты, необходимые для данного приложения:

[source, shell]
....
# portupgrade -R firefox
....

Если указан `-P`, Portupgrade ищет доступные пакеты в локальных каталогах, перечисленных в `PKG_PATH`. Если локально пакеты не найдены, он загружает их с удалённого сайта. Если пакеты не могут быть найдены локально или загружены удалённо, Portupgrade использует порты. Чтобы полностью избежать использования портов, укажите `-PP`. Последний набор опций предписывает Portupgrade прервать работу, если пакеты недоступны:

[source, shell]
....
# portupgrade -PP gnome3
....

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

Дополнительную информацию о package:ports-mgmt/portupgrade[] можно найти в его `pkg-descr`.

[[ports-disk-space]]
=== Порты и дисковое пространство

Использование коллекции портов со временем приводит к расходу дискового пространства. После сборки и установки порта выполнение команды `make clean` в скелете порта очистит временный каталог `work`. При использовании Portmaster для установки порта этот каталог будет удалён автоматически, если не указан параметр `-K`. Если установлен Portupgrade, следующая команда удалит все каталоги `work` в локальной копии коллекции портов:

[source, shell]
....
# portsclean -C
....

Кроме того, устаревшие файлы исходных дистрибутивов со временем накапливаются в `/usr/ports/distfiles`. Чтобы использовать Portupgrade для удаления всех distfiles, на которые больше нет ссылок из портов:

[source, shell]
....
# portsclean -D
....

Portupgrade может удалить все distfiles, на которые нет ссылок из портов, установленных в системе:

[source, shell]
....
# portsclean -DD
....

Если установлен Portmaster, используйте:

[source, shell]
....
# portmaster --clean-distfiles
....

По умолчанию эта команда интерактивна и запрашивает подтверждение пользователя на удаление distfile.

В дополнение к этим командам, package:ports-mgmt/pkg_cutleaves[] автоматизирует задачу удаления установленных портов, которые больше не нужны.

[[ports-poudriere]]
== Сборка пакетов с poudriere

poudriere — это утилита с лицензией `BSD` для создания и тестирования пакетов FreeBSD. Она использует механизм jail в FreeBSD для настройки изолированных сред сборки. Эти jail могут использоваться для сборки пакетов для версий FreeBSD, отличных от версии системы, на которой установлена poudriere, а также для сборки пакетов под i386 на хосте с архитектурой amd64. После сборки пакеты располагаются в структуре, идентичной официальным зеркалам. Эти пакеты могут использоваться man:pkg[8] и другими инструментами управления пакетами.

poudriere устанавливается с помощью пакета package:ports-mgmt/poudriere[] или порта. Установка включает пример файла конфигурации `/usr/local/etc/poudriere.conf.sample`. Скопируйте этот файл в `/usr/local/etc/poudriere.conf`. Отредактируйте скопированный файл в соответствии с локальной конфигурацией.

Хотя `ZFS` не является обязательным для системы, на которой запущен poudriere, его использование даёт преимущества. При использовании `ZFS` необходимо указать `ZPOOL` в `/usr/local/etc/poudriere.conf`, а `FREEBSD_HOST` следует установить на ближайшее зеркало. Определение `CCACHE_DIR` позволяет использовать package:devel/ccache[] для кэширования компиляции и сокращения времени сборки часто компилируемого кода. Может быть удобно разместить наборы данных poudriere в изолированном дереве, смонтированном в `/poudriere`. Значения по умолчанию для остальных параметров конфигурации являются приемлемыми.

Количество обнаруженных ядер процессора определяет, сколько сборок будет выполняться параллельно. Обеспечьте достаточный объём виртуальной памяти, используя `RAM` или файл подкачки. Если виртуальная память закончится, компиляционные окружения остановятся и будут уничтожены, что приведёт к странным сообщениям об ошибках.

[[poudriere-initialization]]
=== Инициализация Jail и дерева портов

После настройки инициализируйте poudriere, чтобы он установил jail с требуемым деревом FreeBSD и деревом портов. Укажите имя для jail с помощью `-j`, а версию FreeBSD — с помощью `-v`. На системах под управлением FreeBSD/amd64 архитектуру можно задать с помощью `-a`, указав `i386` или `amd64`. По умолчанию используется архитектура, отображаемая командой `uname`.

[source, shell]
....
# poudriere jail -c -j 13amd64 -v 13.1-RELEASE
[00:00:00] Creating 13amd64 fs at /poudriere/jails/13amd64... done
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 13.1-RELEASE amd64
[00:00:00] Fetching base for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/base.txz              125 MB 4110 kBps    31s
[00:00:33] Extracting base... done
[00:00:54] Fetching src for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/src.txz               154 MB 4178 kBps    38s
[00:01:33] Extracting src... done
[00:02:31] Fetching lib32 for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/lib32.txz              24 MB 3969 kBps    06s
[00:02:38] Extracting lib32... done
[00:02:42] Cleaning up... done
[00:02:42] Recording filesystem state for clean... done
[00:02:42] Upgrading using ftp
/etc/resolv.conf -> /poudriere/jails/13amd64/etc/resolv.conf
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 13.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
Applying patches... done.
Fetching 6 files... done.
The following files will be added as part of updating to
13.1-RELEASE-p1:
/usr/src/contrib/unbound/.github
/usr/src/contrib/unbound/.github/FUNDING.yml
/usr/src/contrib/unbound/contrib/drop2rpz
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
/usr/src/contrib/unbound/services/rpz.c
/usr/src/contrib/unbound/services/rpz.h
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
The following files will be updated as part of updating to
13.1-RELEASE-p1:
[…]
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
 done.
13.1-RELEASE-p1
[00:04:06] Recording filesystem state for clean... done
[00:04:07] Jail 13amd64 13.1-RELEASE-p1 amd64 is ready to be used
....

[source, shell]
....
# poudriere ports -c -p local -m git+https
[00:00:00] Creating local fs at /poudriere/ports/local... done
[00:00:00] Checking out the ports tree... done
....

На одном компьютере poudriere может собирать порты с различными конфигурациями, в нескольких jail и из разных деревьев портов. Пользовательские конфигурации для таких комбинаций называются _наборами_. Подробности смотрите в разделе CUSTOMIZATION руководства man:poudriere[8] после установки package:ports-mgmt/poudriere[] или package:ports-mgmt/poudriere-devel[].

Базовая конфигурация, представленная здесь, размещает отдельные файлы `make.conf` для каждого jail, порта и набора в `/usr/local/etc/poudriere.d`. Имя файла в этом примере формируется путем объединения имени jail, имени порта и имени набора: `13amd64-local-workstation-make.conf`. Системный `make.conf` и этот новый файл объединяются во время сборки, чтобы создать `make.conf`, используемый build jail.

Пакеты для сборки указываются в файле `13amd64-local-workstation-pkglist` (для портов с extref:{porters-handbook}flavors[FLAVORS] можно указать @FLAVOR):

[.programlisting]
....
editors/emacs
devel/git
devel/php-composer2@php82
ports-mgmt/pkg
...
....

Настраиваются параметры и зависимости для указанных портов:

[source, shell]
....
# poudriere options -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
....

Наконец, пакеты собираются и создается репозиторий пакетов:

[source, shell]
....
# poudriere bulk -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
....

Во время работы нажатие kbd:[Ctrl+t] отображает текущее состояние сборки. poudriere также создает файлы в `/poudriere/logs/bulk/jailname`, которые можно использовать с веб-сервером для отображения информации о сборке.

По завершении новые пакеты становятся доступными для установки из репозитория poudriere.

Для получения дополнительной информации об использовании poudriere см. man:poudriere[8] и основной веб-сайт: https://github.com/freebsd/poudriere/wiki[].

=== Настройка клиентов pkg для использования репозитория poudriere

Хотя можно использовать как пользовательский репозиторий вместе с официальным, иногда полезно отключить официальный репозиторий. Это делается путём создания конфигурационного файла, который переопределяет и отключает официальный конфигурационный файл. Создайте `/usr/local/etc/pkg/repos/FreeBSD.conf` со следующим содержимым:

[.programlisting]
....
FreeBSD: {
	enabled: no
}
....

Обычно проще всего предоставлять доступ к репозиторию poudriere клиентским машинам через HTTP. Настройте веб-сервер для обслуживания каталога пакетов, например: `/usr/local/poudriere/data/packages/13amd64`, где `13amd64` — это название сборки.

Если URL репозитория пакетов: `https://pkg.example.com/13amd64`, то файл конфигурации репозитория в `/usr/local/etc/pkg/repos/custom.conf` будет выглядеть так:

[.programlisting]
....
custom: {
	url: "https://pkg.example.com/13amd64",
	enabled: yes,
}
....

Если нежелательно предоставлять доступ к репозиторию пакетов через интернет, можно использовать протокол `file://` для прямого указания на репозиторий:

[.programlisting]
....
custom: {
	url: "file:///usr/local/poudriere/data/packages/11amd64",
	enabled: yes,
}
....

[[ports-nextsteps]]
== Пост-установочные вопросы

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

* Большинство приложений устанавливают как минимум один конфигурационный файл по умолчанию в `/usr/local/etc`. В случаях, когда приложение имеет большое количество конфигурационных файлов, создаётся подкаталог для их хранения. Часто устанавливаются примеры конфигурационных файлов, которые имеют окончание, например, `.sample`. Конфигурационные файлы следует просмотреть и, возможно, отредактировать в соответствии с потребностями системы. Для редактирования файла-примера сначала скопируйте его без расширения `.sample`.
* Приложения, которые предоставляют документацию, устанавливают её в `/usr/local/share/doc`, а многие приложения также устанавливают страницы руководств. Перед продолжением следует ознакомиться с этой документацией.
* Некоторые приложения запускают службы, которые необходимо добавить в `/etc/rc.conf` перед запуском приложения. Обычно такие приложения устанавливают скрипт запуска в `/usr/local/etc/rc.d`. Дополнительную информацию можно найти в crossref:config[configtuning-starting-services,Запуск служб].
+
[NOTE]
====
По замыслу, приложения не запускают свои стартовые скрипты при установке, а также не выполняют скрипты остановки при удалении или обновлении. Это решение остаётся на усмотрение системного администратора.
====

* Пользователи man:csh[1] должны выполнить `rehash`, чтобы перестроить список известных двоичных файлов в `PATH` оболочки.
* Используйте `pkg info`, чтобы определить, какие файлы, man-страницы и бинарные файлы были установлены вместе с приложением.

[[ports-broken]]
== Работа с неработающими портами

Когда порт не собирается или не устанавливается, попробуйте следующее:

. Поищите, есть ли исправление для порта в базе данных link:https://www.FreeBSD.org/support/[отчётов о проблемах]. Если оно есть, применение предложенного исправления может решить проблему.
. Обратитесь к сопровождающему порта за помощью. Введите `make maintainer` в скелете портов или прочитайте `Makefile` порта, чтобы найти адрес электронной почты сопровождающего. Не забудьте включить вывод, предшествующий ошибке, в письмо сопровождающему.
+
[NOTE]
====
Некоторые порты поддерживаются не отдельными людьми, а группой сопровождающих, представленной extref:{mailing-list-faq}[рассылкой]. Многие, но не все, такие адреса выглядят как mailto:freebsd-listname@FreeBSD.org[freebsd-listname@FreeBSD.org]. Учтите это при отправке письма.

В частности, порты, поддерживаемые mailto:ports@FreeBSD.org[ports@FreeBSD.org], не курируются конкретным человеком. Вместо этого исправления и поддержка поступают от сообщества в целом, участники которого подписаны на этот список рассылки. Добровольцы всегда нужны!
====
+
Если на письмо не получен ответ, используйте Bugzilla для отправки отчёта об ошибке, следуя инструкциям в extref:{problem-reports}[Составление отчётов о проблемах в FreeBSD].

. Исправьте это! В extref:{porters-handbook}[Руководстве FreeBSD по созданию портов] содержится подробная информация об инфраструктуре портов, так что можно исправить случайно сломанный порт или даже предложить свой собственный! Установите пакет вместо порта по инструкции в разделе crossref:ports[pkgng-intro, Использование pkg для управления бинарными пакетами].
