FreeBSD и третичное программное обеспечение.


Copyleft Andrey Lavrentyev
Прим: заготовка для будущего расширенного руководства, данный
вариант как быстрое пособие был написан для forum.opennet.ru.

FreeBSD и третичное программное обеспечение.

В системах FreeBSD, OpenBSD и NetBSD существует два подхода к установке
дополнительного программного обеспечения, так называемых портов и пакетов,
в данном руководстве я буду опираться лишь на подход в OS FreeBSD:

ports, packages.

Packages или пакеты, это уже собранные(binaries - исполняемый код) пакеты
для того или иного FreeBSD RELEASE из портов для этих RELEASE.

Порты постоянно обновляются, поэтому готовые пакеты собираются и проверяются
только для выпускаемого RELEASE. Термин port - сокращение от portability,
портабельность, существует много программного обеспечения Freeware или под
лицензиями GPL (http://www.gnu.org/licenses/licenses.html) и "AS IS" BSD-лицензия (http://www.bsdnewsletter.com/bsd/license.html), команда разработчиков
FreeBSD занимается адоптацией или портированием такого программного обеспечения
для OS FreeBSD.

Это касательно портов, пакеты - это собранные порты за конкретную дату,
те(то есть) порты для выпущенного FreeBSD RELEASE. Обычно собранные для RELEASE
пакеты идут на 3 и 4'ом ISO-Images и доступны:

ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/X.Y[.Z]/

где X.Y[.Z] цифры соответствующие тому или иному релизу

или

ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-X.Y[.Z]-release/

в то время как полное дерево портов для каждого релиза можно взять:

ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/X.Y[.Z]-RELEASE/ports/ports.tgz

или используя cvsup:

- установить cvsupit из портов (/usr/ports/net/cvsupit/), а лучше взять
готовый пакет: cvsup16.1e
советую брать без GUI, гораздо удобнее использовать командную строку и
скрипты, например: скрипты cvsup

Совет: всегда сохраняйте сперва предыдущую копию портов, на всякий случай

отдельные порты можно выкачивать, например bash2:

сохраняем на всякий случай старый порт
# cd /usr/ports/shells
# mv bash2 bash2.old

выкачиваем свежий порт
# wget -Y off -t 0 -c -r -nH --cut-dirs=6 ftp://ftp.ru.freebsd.org/pub/FreeBSD/branches/-current/ports/shells/bash2/

когда выкачиваете отдельные порты, имейте ввиду что они могут требовать
других свежих портов, ищите в Makefile'е интересующего вас порта
ключевые слова DEPENDS, кроме этого могут изменяться *.mk файлы для утилиты
make: /usr/ports/Mk/, из-за чего возникают ошибки при сборке портов на этапе
разбора самого Makefile'а.

прим: чтобы не загружать основные сервера ftp.freebsd.org или cvsup.freebsd.org
используйте ближайшие к вам географические зеркала:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mirrors-ftp.html

man ports - всегда поможет и ответит на многие вопросы

дерево портов: /usr/ports/категория

конкретный порт: /usr/ports/категория/название_порта

содержимое директории порта:

/usr/ports/категория/название_порта/Makefile - файл сборки проекта
/usr/ports/категория/название_порта/distinfo - md5 контрольные суммы дистрибутивов которые будут собраны
/usr/ports/категория/название_порта/files - директория в которой содержатся freebsd-related патчи для данного программного продукта
/usr/ports/категория/название_порта/scripts - директория со скриптами создания дополнительной конфигурации или зависимого Makefile.inc

файлы:

pkg-comment - краткое описание данного продукта
pkg-desc - чуть более расширенное описание данного продукта
pkg-plist - список всего что будет установлено в систему посредством make install
pkg-message - важное сообщение которое будет выдано после make install
pkg-install - обычно скрипт дополнительняющий набор необходимых действий при "make install"

терминология структуры портов:

/usr/ports - все дерево портов
/usr/ports/INDEX - список всех портов
/usr/ports/INDEX.db - база портов
/usr/ports/README - прочти меня
/usr/ports/distfiles - место куда будет затягиваться дистрибутив необходимый для сборки порта
/usr/ports/Mk - необходимые make includes файлы для сборки портов в дополнение к /usr/share/mk

обычный или mini-port - обычный порт
мета, meta-port - порт большого программного продукта, в реалии пустышка из нескольких mini-port'ов необходимых для сборки ПОЛНОГО meta-port'а.

прим.: когда то вместо meta портов, были мега порты, которые удобней
было собирать в отличие от мета портов, имейте ввиду что для сборки XFree86,
mozilla, openoffice вам понадобится очень много free-space и возможно
потребуется переопределить рабочую директорию через переменную WRKDIR.

Например:

/usr/ports/x11/XFree86-4 - это мета-порт объединяющий установку нескольких
мини-портов необходимых для установки всего XFree86-4, список мини-портов
указан в /usr/ports/x11/XFree86-4/Makefile

прим.: если у вас уже установлен предыдущий порт XFree86-4, и вы скачали
новый и хотите его установить, лучше удалить предыдущий XFree86 и все его
depends, в этом случае проблем не будет.

Сборка:

1) cd /usr/ports/категория/название_порта

2) make

по команде make, будет просматриваться содержимое /usr/ports/distfiles
на предмет наличия в нем дистрибутива[ов] cat distinfo, если таковые
отсутствуют там, будет производиться скачивание данного дистрибутива
с основного сайта: ftp.freebsd.org.

Управлять этим процессом можно определив ряд необходимых переменных
в файле /etc/make.conf (который создается на основе /etc/defaults/make.conf)

MASTER_SITE_BACKUP?=
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/

закоментарим две верхние строчки и зададим ближайший к нам сайт с зеркалом
distfiles, например:

#MASTER_SITE_BACKUP?=
# ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
#--lavr

MASTER_SITE_BACKUP?=
ftp://ftp.ru.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/

MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}

MASTER_SORT_REGEX?= ^file: ^ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/local-distfiles/ ://[^/]*.ru/ ://[^/]*.ru.

если у нас выход в Internet через PROXY, определяем следующие переменные
в том же файле, если PROXY с авторизацией, man 3 fetch:

FETCH_ENV= FTP_PROXY=ftp://10.0.0.1:21
FETCH_ENV= HTTP_PROXY=http://10.0.0.1:80

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

# less /usr/share/mk/bsd.README
# less /usr/ports/Mk/bsd.port.mk

# man ports

некоторые наиболее полезные переменные:

- PORTSDIR
- WRKDIR
- DISTDIR
- PREFIX
- BATCH

с их помощью можно изменять директории структуры портов, местонахождения
sources, рабочую директории для сборки, путь установки и тд и тп.
При сборке порта, как уже было сказано, ищется дистрибутив, проверяется
его контрольная сумма по md5:

имя дистрибутива обычно указыватся в файле distinfo, например, рассмотрим
mpg123 из портов:

[alone]~ > ls -la /usr/ports/audio/mpg123
total 24
drwxr-xr-x 3 root wheel 512 Feb 11 12:21 .
drwxr-xr-x 336 root wheel 6656 Feb 12 12:04 ..
-rw-r--r-- 1 root wheel 2662 Feb 11 12:21 Makefile
-rw-r--r-- 1 root wheel 268 Apr 10 2001 distinfo
drwxr-xr-x 2 root wheel 512 Feb 11 12:21 files
-rw-r--r-- 1 root wheel 52 Jul 10 1997 pkg-comment
-rw-r--r-- 1 root wheel 242 Aug 5 1999 pkg-descr
-rw-r--r-- 1 root wheel 11 Aug 17 1998 pkg-plist
[alone]~ >

Makefile - проект сборки
distinfo - файл содержаший md5 контрольные суммы дистрибутива, той или иной
версии, патчи и другие необходимые sources:

[alone]~ > cat /usr/ports/audio/mpg123/distinfo
MD5 (mpg123-0.59r-pl1.tar.gz) = 2648708fac9203ef58292adf5e54e4ba
MD5 (mpg123-059r-v6-20000713b.diff.gz) = b830cefc8805c8ad827f73985c03d27f
MD5 (l3.diff.gz) = b8749f4709ed1a9df8a00d51c4a02dd5
MD5 (mpg123-059r-recode-20010410.diff.gz) = 8f9e18cf27f9e048c5369cf3b78b6b11
[alone]~ >

files - если в порту есть такая директория, она обычно содержит патчи и
дополнительные файлы конфигурации данного порта

pkg-comment и pkg-descr - файлы описания данного порта-продукта, короткое
описание и более полное

pkg-plist - это список всех файлов которые будут установлены в систему
относительно пути в PREFIX и некоторые дополнительные действия которые
будут произведены при `make install`

3) make install

после успешной сборки п.2, произвести установку собранного продукта в
систему, обычно: PREFIX=/usr/local, где /usr/local - альтернативная
структура базовой системы: "/", "/etc", "/bin", "/sbin", "/usr/lib" и тд

4) make clean

удалить все что осталось после сборки, обычно директорию work в данном
продукте и всех зависимостях которые были собраны и автоматически установлены при сборке данного продукта

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

# make de-install или man pkg_delete

при сборке порта, в пункте 2)

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

make fetch
make checksum
make depends
make extract
make patch
make configure
make build

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

- скачиваем порт:
# make fetch
- проверка контрольной суммы дистрибутива:
# make checksum
- разврачиваем дистрибутив в рабочую директорию, у большинства портов это
директория /usr/ports/category/portname/work
# make extract
- если используется многоплатформенный гнушный конфигуратор configure
# make configure

теперь мы можем наложить свои патчи, затем при помощи команды diff создать
нужные нам правки: файлы patch-xy, где xy - это буквы aa/ab/ac/... и тд и тп
и положить их в директорию files - все порт с нашими правками готов, теперь
можно его очистить:
# make clean
и собрать по шагам, чтобы убедиться что нет ошибок или затратить меньше
времени на их исправления, все - наш порт, порт с нашими правками готов.

чтобы в реалии не выполнять make, а лишь посмотреть что будет сделано:

# make -n [install|или другие опции]

иногда удобно в командной строке задать все необходимые команды (см. используемый вами SHELL):

# cd /usr/ports/категория/название_порта
# make && make install && make clean

однако некоторые порты требуют интерактивного вмешательства, чтобы
этого не произошло, необходимо посмотреть Makefile, записать все
необходимые опции с которыми мы будем собирать данный порт и выполнить:

make WITH_ИМЯОПЦИИ=yes WITHOUT_ИМЯОПЦИИ=yes BATCH=yes install && make clean

BATCH=yes обеспечивает пакетную сборку порта.

Материал для изучения:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/index.html

http://www.FreeBSD.org.ua/porters-handbook/ - на русском

прим.: конечно можно и нужно удалять то что осталось после сборки портов,
глобально:

# cd /usr/ports
# make clean

можно для каждой категории:

# cd /usr/ports/category
# make clean

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

# find /usr/ports/ -name "work" -print
или
# find /usr/ports/ -name ".instal*" -print

после чего без всякий `make clean` - это ну очень долго, использовать:

# find /usr/ports/ -name "work" -exec rm -rf {} ;

все что нужно удалено, быстро и удобно.

После установки портов и пакетов, в директории /var/db ведется база
установленных пакетов и портов (для последних можно использовать переменную

FORCE_PKG_REGISTER= YES

в файле /etc/make.conf, это очень удобно.

в директории /var/db/pkg - можно найти весь список портов, это директории
с именами: /var/db/pkg/PortName-Version, внутри которых есть несколько
информативных файлов, например:

[alone]~ > ls -la /var/db/pkg/mpg123-esound-0.59r_8/
total 28
-rw-r--r-- 1 root wheel 52 Feb 11 12:05 +COMMENT
-rw-r--r-- 1 root wheel 660 Feb 11 12:05 +CONTENTS
-rw-r--r-- 1 root wheel 242 Feb 11 12:05 +DESC
-r--r--r-- 1 root wheel 7457 Feb 11 12:05 +MTREE_DIRS
-rw-r--r-- 1 root wheel 14 Feb 16 21:28 +REQUIRED_BY
drwxr-xr-x 2 root wheel 512 Feb 16 21:28 .
drwxr-xr-x 371 root wheel 9728 May 22 15:47 ..
[alone]~ >

если вспомнить описанную ранее структуру порта:

+COMMENT - комментарий (pkg-comment)
+CONTENTS - то что было установлено в систему (pkg-plist)
+DESC - описание (pkg-descr)
+MTREE_DIRS - дерево с указанием владельца и режимов файлов и директорий
+REQUIRED_BY - если есть, то для какого порта или пакета, данный програмный
продукт был зависимостью

Packages - пакеты.

<продолжение следует>

http://unix1.jinr.ru/~lavr/make-ports.html

Обновлено: 12.03.2015