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 - пакеты.

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

Copyleft Andrey Lavrentyev