Для того чтобы понять принцип работы системы портов FreeBSD нужно иметь представление об исходных кодах. Исходный код (или исходник) - это всего навсего текстовый файл содержащий в себе программу написанную на каком либо языке программирования. Для того чтобы программа запустилась и заработала, она должна быть переведена из исходного кода в набор байт содержащий машинные коды - т.е. инструкции для непосредственного выполнения процессором. Процесс перевода из исходного кода в машинный называется - компиляция. В процессе компиляции программа компилятор так же добавляет к файлу функционал необходимый для запуска, работы и взаимодействия в конкретной операционной системе. Тоесть если мы скомпилируем программу в FreeBSD то допустим запустить ее скажем в Windows будет невозможно. Так же точно нельзя будет запустить скомпилированную в FreeBSD amd64 в FreeBSD i386, так как исполняемый файл программы будет содержать инструкции с учетом 64 битной ОС и 64 процессора.
Система портов - это универсальный инструмент для автоматической сборки программ из исходных кодов. Система портов располагается в файловой системе в каталоге /usr/ports и содержит дерево портов, каталог для исходников, скрипты и т.д. Дерево портов представляет собой набор каталогов разделенных по тематикам, содержащим файлы с инструкциями для сборки программ, патчи. Для того чтобы начать работу с портами следует получить дерево портов тем или иным способом.
Получение дерева портов
Для того чтобы эфективно и быстро получить как свежее дерево портов так и последующие обновления, можно воспользоваться утилитой portsnap входящей в состав FreeBSD. Для этого логинимся в качестве root и набираем команду:
В результате в систему скачается архив содержащий каталог /usr/ports без исходников (фактически дерево портов). portsnap fetch extract следует выполнять только один раз (первый запуск portsnap) затем для последующих обновлений достаточно выполнять:
В результате в дерево портов будут вноситься только изменения. Если же вместо update делать постоянно extract то каждый раз дерево портов будет полностью распаковываться что бессмысленно и занимает время. Тоесть при первом запуске portsnap делаем portsnap fetch extract , при последующих - portsnap fetch update. При первом запуске portsnap скачает архив размером примерно 60 мегабайт (на момент написания статьи), при последующих будет загружать только небольшие архивы с изменениями.
Если же интернета нет, но требуется дерево портов, то можно установить порты с инсталяционного диска с FreeBSD либо просто скопировать содержимое /usr/ports с другого компьютера. Итак, дерево портов получено, теперь можно приступать к установке программ из портов.
Установка ПО из портов
Рассмотрим установку утилиты trafshow (утилита для просмотра информации о пакетах проходящих через сетевой инетрфейс) из портов. Для начала нам нужно определить где находится порт. Очень удобно использовать для этого утилиту whereis, набираем:
Если файл или каталог обнаружен то результатом выполнения будет путь к объекту:
Нам нужно перейти в каталог содержащий инструкции для сборки trafshow (те в каталог с портом) и выполнить сборку:
Результатом выполнения этой команды будет длинный отладочный вывод данных на экран. Для начала обратим внимание на первые строки сообщения:
Система обращается к серверу где находится архив с исходными кодами для программы trafshow - trafshow-5.2.3.tgz. Файл скачивается в каталог /usr/ports/distfiles. И при последующей сборке из этого порта обращение к интернету более не понадобится. Т.к. перед началом сборки проверяется наличие архива с исходными кодами в /usr/ports/distfiles. Фактически это означает что можно скачать архив с исходными кодами на машине с интернетом, отнести на машину без интернета, поместить в /usr/ports/distfiles и собрать.
Далее следует обратить внимание на последние строки:
Рассмотрим сообщения:
Команда make install clean фактически означает - скомпилировать, инсталировать, стереть. Где make - компиляция программы, install - установка программы, clean - очистка временного каталога созданного в процессе сборки. Если не делать допустим clean, то каталоги с временными файлами будут оставаться в системе. Временные файлы располагаются внутри каталога порта в каталоге work. Т.е. временный каталог для trafshow будет /usr/ports/net/trafshow/work. В принципе каталог work можно просто удалить вручную.
Если сборка порта потребует каких либо зависимостей, то они будут так же собраны из соответствующих портов автоматически.
После сборки и установки порта, ПО регистрируется в системе и к нему применимы все команды какие применимы к ПО установленному из пакетов. Т.е. pkg_delete, pkg_info и т.д.
Конфигурационное меню
Если порт собирается первый раз и для его сборки требуется указать какие либо параметры конфигурирования, то после выполнения команды make install clean на экране появится конфигурационное меню.
Клавишами курсора мы выбираем нужную опцию, клавишей пробел или enter вкл/выкл. нужную опцию. Клавиша Tab служит для перехода в область управления кнопками OK и Cancel и обратно. После установки нужных опций и нажатия на OK (или Cancel - в случае с Cancel все изменения отменяются) начинается сборка. При последующих сборках этого порта конфигурационное меню больше не появится, а выбраные опции будут занесены в базу данных и будут применяться к каждой последующей сборке этого порта. Если же требуется поменять опции, можно принудительно вызвать меню конфигурации набрав команду make config. Если требуется установить состояние конфигуратора порта "по умолчанию", то следует вызвать команду make rmconfig. Если требуется задать конфигурацию не только для текущего порта а для всех его зависимостей, следует выполнить make config-recursive. Что приведет к последовательному выводу на экран конфигураторов для порта и для всех его зависимостей, что особенно удобно допусим при сборке порта с большим к-вом зависимостей. Без этого при каждой сборке зависимости будет выскакивать окошко конфигуратора (что неудобно т.к. требует контроля со стороны пользователя), а после make config-recursive для всех зависимостей будут готовы параметры и окно конфигуратора более не появится в процессе сборки порта и зависимостей. Чтобы было понятно приведем пример со сборкой xorg, это метапорт содержащий компоненты X-сервера. Мы начинаем установку, появляется меню конфигуратора, мы задаем параметры, жмем ОК и начинается сборка одного из компонентов, проходит какое то время, начинается сборка следующего компонента снова появляется меню конфигуратора и сборка останавливается пока мы не зададим параметры. Удобнее же задать конфигурацию всех пакетов перед сборкой при помощи make config-recursive и спокойно без вопросов в процессе сборки собрать метапорт. Так же существует возможность сбросить кофигураторы для всех зависимостей порта в состояние "по умолчанию", т.е. make rmconfig-recursive. Для того, чтобы вывести на экран все порты, от которых зависит текущий порт, следует использовать команду make all-depends-list.
Загрузка исходников без сборки
Для того чтобы загрузить исходник, при этом не собирая программу, достаточно выполнить команду make fetch. При этом архив с исходными текстами будет загружен в каталог /usr/ports/distfiles. Если запрашиваемый архив уже есть в каталоге, то загрузка произведена не будет. Чтобы загрузить исходники сразу для всех зависимостей порта, нужно выполнять команду make fetch-recursive.
На этом основные операции с портами завершены.