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