FreeBSD: Порты или пакеты? Ports vs pkg

У FreeBSD три варианта установки приложений. Старый дедовский «из исподников (from source)», «из портков (ports tree)» и «из пакетов (pkg)».

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

Второй вариант — порты. Порт это фактически набор с указанием источников исходников, инструкций и зависимостей, облегчающий процесс компиляции. При установке из портов требуется много времени, так как система скачивает исходники и компилирует прямо на машине, если требуются зависимости, то прежде чем скомпилировать требуемое приложение будут предварительно скачаны и скомпилированы зависимости, зависимости зависимостей и т.д. Для примера простейший wget на «нулевой» машине будет собираться до получаса, потянув за собой массу зависимостей, а KDE или GNome компилироваться будет не меньше суток.

Третий вариант — это пакеты. Пакеты — это уже заранее скомпилированные файлы, которые ставятся аля-винда, скачал, распихал по инструкции инсталлера и готово. Быстро, просто, набрал pkg install x11/kde5 firefox openoffice и что там еще надо, перечислив через пробел, запустил и пошел кофе пить.

Пакеты — это не лоханство, иногда они очень полезны. Например для Raspberrypi я ставил всё именно с пакетов, так как компиляция на ней процесс бесконечный, обновления на домашней шкатулке не критичны, софта минимум. Там где критична безопасность, соответственно регулярные и своевременные обновления, и кастамизация, пакеты несомненно зло. Например если мне на сервере нужен функционал PSPP, то при установке из пакетов она встанет вместе с GUI, который на сервере нафиг не нужен, а на домашней машине, которой не светит IPV6 установит всё с поддержкой IPV6.

Более того, при изначально крайне долгой компиляции из портов, в будущем обновление требуемых модулей происходит быстрее и оперативнее, нежели обновление пакетов. Тот же curl требуется 90% приложений, и при его обновлении в варианте пакетов надо ждать когда все пакеты пересоберут, а потом все эти пакеты обновлять. При установке же из портов, потребуется перекомпелировать лишь сам curl, не трогая зависимые от него приложения.

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

portsnap fetch extract update

Fetch — проверить обновления и скачать если есть, extract — развернуть, update — обновить. Но обновится в данном случае лишь порт, а не приложение.

После этого находим нужный нам порт, например kde5.

whereis kde5 выдаст местонахождение порта /usr/ports/x11/kde5

Есть вариант зайти в каталог /usr/ports и запустить make search name=kde5 и будет результат со списком портов которые содержат искомую фразу, но в случае с nginx в выдаче будет всё, включая модуль certbot для nginx, поэтому если знаете что конкретно ищите, то проще where. Если же нужен именно поиск по примерно известному названию то make search у которого есть так же вариант make search key=keyword

cd /usr/ports/x11/kde5

make config запустив, выбираем что нам нужно, а что не нужно

make install запускаем сборку, в отличие от установки из пакетов, не кофе наливая, а маринуя шашлык, ко времени когда kde скомпилируется шашлык будет замаринован, зажарен, съеден и переварен, и даже похмелья из-за пива с этим шашлыком уже испарится.

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

Можно конечно в /etc/make.conf прописать строчку BATCH="YES" но в этом случае сборка будет с кучей ненужных модулей, при этом кое какие не подтянутся и их потом придется по необходимости переконфигурировать и пересобирать. Но если Вы не знаете что Вам нужно, то это неплохой вариант, приемлемый для той же первоначальной установки KDE или Gnome на нулевую систему в режиме «поставил с вечера и ушел спать».

Переконфигурить и пересобрать потом не проблема, так же cd /usr/ports/... && make config и make reinstall

После сборки желательно запустить make clean чтобы почистить множество временных файлов которые были созданы в процессе.

В будущем коллекцию портов нужно будет периодически обновлять portsnap fetch update (уже без extract), а чтобы автоматом обновлять установленные приложения я предпочитаю утилиту portupgrade с параметром -a типа all.

Удалять установленные приложения и утилиты можно либо через pkg delete ... либо зайдя в каталог порта make deinstall что необходимо не только если что-то завалялось или стало ненужно, но и при обновлении допустим php с 7.1 до 7.2, то они, как и их квазипорт с расширениями как бы являются отдельными приложениями и конфликтуют между собой, о чем сообщает make install вываливаясь в ошибку.

В будущем, если обновляться хотя бы раз в неделю, запуская portsnap fetch update && portupgrade -aR то процесс обновления из портов со всей компиляцией занимает минимум времени и не напрягает.

Контролировать устаревшие приложения и утилиты можно командой pkg version -vIL=, для серверного варианта отправляя раз в сутки на электронную почту напоминалку в случае если что-то устарело, для рабочей машины думаю прикручу, если уже нет в том же KDE, сообщения в трее.