Основы pkgsrc


Введение
Существует много программного обеспечения, доступного для Unix-систем, в число которых входит и NetBSD. NetBSD Packages Collection (pkgsrc) представляет из себя набор средств, включающий в себя необходимые патчи, позволяющий устанавливать, обновлять и удалять программное обеспечение посредством одной команды.

После сборки программного обеспечения, управление им осуществляется с помощью команд pkg_*, что очень упрощает жизнь и работу. Pkgsrc происходит из системы портов FreeBSD и первоначально поддерживал только NetBSD, но в настоящий момент поддерживаются следущие системы:
Darwin(Mac OS X)
DragonFly BSD
FreeBSD
Microsoft Windows, через Interix
IRIX
Linux
NetBSD, как это ни странно...
Tru64 (Digital UNIX, OSF1)
OpenBSD
Solaris
Терминология
Package - Набор файлов и инструкций для сборки, используя pkgsrc. Пакеты традиционно хранятся в каталоге /usr/pkgsrc.

NetBSD package system - Это прежнее название "pkgsrc". Является частью операционной системы NetBSD, но может работать и на не-NetBSD системах. Эта система обслуживает компиляцию, установку и удаление пакетов.

Distfile - Этот термин описывает файл или файлы, которые предоставляются автором программного обеспечения. Все изменения, которые необходимо сделать для установки на NetBSD, описываются в соответствующем пакете. Обычно distfile находится в виде архива tar, хотя возможны и другие типы. Distfiles обычно хранятся в каталоге /usr/pkgsrc/distfiles.

Port - Это термин, используемый пользователями FreeBSD и OpenBSD для обозначения пакета. В терминологии NetBSD, “port” означает другую архитектуру.

Precompiled/binary package - обозначает бинарный файл, собранный из pkgsrc и представляющий собой один архив .tgz, который может быть установлен на машину данной архитектуры без компиляции. Пакеты обычно создаются в /usr/pkgsrc/packages, так же их можно скачать с ftp.NetBSD.org.

Иногда этот термин заменяют термином “package”, особенно в смысле прекомпиленного пакета.

Program - Устанавливаемая часть программного обеспечения, которая будет собрана из distfile, в соответствии с правилами, определенными в пакете.
Получение pkgsrc
Перед тем, как скачивать pkgsrc, вы должны выбрать между использованием ветви current или stable. Последняя ветвь образуется ответвлением из current и содержит только обновления безопасности, имя ее образуется из года и квартала, например 2006Q1.

Второй вопрос заключается в том, КАК скачивать pkgsrc. Это может быть файл tar, SUP или CVS.
Файл tar
Основным хранилищем файлов pkgsrc является ftp://ftp.NetBSD.org/pub/pkgsrc/. Архив ветви current называется pkgsrc.tar.gz и обновляется каждую ночь. Архив stable, 2006Q1 хранится в каталоге 2006Q1 и также называется pkgsrc.tar.gz.

После того, как вы скачаете файл, выберите каталог, в котором будет развернут архив, обычно в этой роли выступает /usr, после чего командой tar xfz pkgsrc.tar.gz распакуйте архив.
С помощью SUP
В качестве альтернативы, можно получать pkgsrc через Software Update Protocol, SUP. Для этого, вам необходимо добавить в supfile строку release=pkgsrc (пример файла конфигурации называется /usr/share/examples/supfiles) и создать каталог /usr/pkgsrc. Затем, выполните команду sup -v /path/to/your/supfile.
С помощью CVS
Для того, чтобы получать pkgsrc через CVS, убедитесь, что у вас установлен cvs(1). Для инициализации загрузки pkgsrc необходимо выставить несколько переменных окружения. Для C-Shell введите:

% setenv CVSROOT anoncvs@anoncvs.NetBSD.org:/cvsroot
% setenv CVS_RSH ssh

Или для bourne shell:

$ CVSROOT="anoncvs@anoncvs.NetBSD.org:/cvsroot"
$ CVS_RSH="ssh"
$ export CVSROOT CVS_RSH

Затем, перейдите в каталог, где вы хотите развернуть pkgsrc. В большинстве случаев это /usr. Для получения pkgsrc выполните команды cvs -q checkout -P pkgsrc для получения ветви current и cvs -q checkout -rpkgsrc-2006Q1 -P pkgsrc для получения ветви stable.
Обновление pkgsrc
При обновлении pkgsrc через tar не забудьте полностью удалить старый каталог! После этого, скачайте новый архив и распакуйте его.

При обновлении через CVS, убедитесь, что выставлена переменная CVS_RSH, после чего перейдите в каталог, где развернута psgsrc и выполните команду cvs -q update -dP.
Переход между различными ветвями pkgsrc
Когда вы обновляете pkgsrc, CVS отслеживает, какую ветвь вы выбрали. Если вы хотите перключится со stable на current, то должны указать опцию “-A” после ключевого слова “update”. Для переключения из current на stable добавьте опцию “-rpkgsrc-2006Q1”.
Использование pkgsrc
Обычно, есть два пути использования pkgsrc. Певый заключается в том, чтобы использовать уже прекомпилированные пакеты. Это “pkg” часть в слове pkgsrc. Второй путь - установка из “src”.
Использование бинарных пакетов
При использовании бинарных пакетов вам необходим инструментарий, которым вы будете этими пакетами управлять. В NetBSD все необходимое уже установлено, для остальных же необходимо скачать прекомпилированные версии утилит. Например, для Solaris 9 инструментарий находится по адресу ftp://ftp0.mh.bbc.co.uk/pub/pkgsrc/packages/bootstrap-pkgsrc/, а для Solaris 10 по адресу http://public.enst.fr/pkgsrc/packages/bootstrap-pkgsrc/. Инструментарий устанавливается в каталог /usr/pkg и использует каталог /var/db/pkg для хранения базы данных установленных пакетов.
Поиск бинарных пакетов
Для того, чтобы установить пакет, его необходимо найти. Пакеты распространяются через CD-ROM, DVD или через FTP/HTTP. Для NetBSD пакеты можно найти на ftp.NetBSD.org, в каталоге /pub/NetBSD/packages/OSVERSION/ARCH/, где OSVERSION можно узнать командой uname -r, а ARCH командой uname -p. Для Solaris 9 пакеты находятся по адресу ftp://ftp0.mh.bbc.co.uk/pub/pkgsrc/packages/, а для Solaris 10 по адресу http://public.enst.fr/pkgsrc/packages/.
Установка бинарных пакетов
Если вы устанавливаете пакеты с CD-ROM или с локального диска, то достаочно воспользоваться командой (получив предварительно полномочия пользователя root с помощью su):

# pkg_add /path/to/package.tgz

Если вы решили установить пакет напрямую с FTP, то выполните команду:

# pkg_add ftp://ftp.NetBSD.org/pub/NetBSD/packages///All/package.tgz

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

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

Дополнительно к каталогу All, существует каталог vulnerable, в котором хрянятся пакеты с обнаруженными уязвимостями. Для использования этих пакетов необходимо добавить каталог vulnerable к переменной PKG_PATH. Советую вам не забывать время от времени выполнять security/audit-packages, особенно после установки новых пакетов, и проверить, приемлема ли уязвимость для вашей конфигурации.
Предупреждение
Пожалуйста, обращайте внимание на предупреждения, выдаваемые командой pkg_add(1), относительно того, как могут быть опасны пакеты собранные не вами. Хотя то же самое можно сказать и про сборку из исходных текстов, если вы не проанализировали исходный код и про сам компилятор...
Сборка пакетов из исходных текстов
Приведенные ниже инструкции описывают процесс сборки пакета, если он есть в pkgsrc. В противном случае обратитесь к Part II, “The pkgsrc developer's guide”.
Требования
Если вы хотите собирать пакеты в системе NetBSD то должны быть установлены наборы “comp” и “text”. Если необходимо собирать X11 пакеты, так же должны быть установлены наборы “xbase” и “xcomp”.
Получение distfiles
Первым шагом сборки является скачивание distfiles (немодифицированного исходника).

Вы можете определить сайты, с которых вам удобнее всего их скачивать, для этого необходимо определить в файле pkgsrc/mk/defaults/mk.conf параметры MASTER_SORT, MASTER_SORT_REGEX и INET_COUNTRY. Это позволит сберечь ваше время и полосу пропускания.

Вы можете изменить параметры настройки задав переменные окружения оболочки, или редактируя файл /etc/mk.conf.

Если у вас нет постоянного соединения с Интернет, то вы можете получить список требуемых distfiles командой make fetch-list, после чего, в соответствии с этими данными, загрузите их в /usr/pkgsrc/distfiles.
Сбока и установка
Теперь, когда distfile скачан, необходимо получить привилегии root, перейти в каталог пакета и вылолнить команду make. Обратите внимание на то, что при использовании pkgsrc на не-NetBSD системе, используйте установленный из pkgsrc bmake вместо “make”.

% cd misc/figlet
% make

После того, как оболочка закончит выводить различные строки о процессе сборки, выполните:

# make install

для установки компонентов пакета в предназначенные для них места. Pkgsrc поддерживает just-in-time-su, что позволяет воспользоваться привилегиями root только на конечном этапе установки.

По умолчанию, все пакеты устанавливаются в каталог /usr/pkg, для того, чтобы изменить этот каталог, необходимо выставить переменную окружения LOCALBASE. Например, чтобы использовать каталог /usr/local, установите LOCALBASE =/usr/local. Обратите внимание, что не стоит указывать здесь каталоги общего назначения, например /usr. Кроме того, вы не должны добавлять файлы или каталоги (типа src/, obj/ или pkgsrc/) ниже дерева LOCALBASE. Это должно предотвратить возможные конфликты между программами, установленными с помощью pkgsrc.

Некоторые пакеты просматривают файл /etc/mk.conf, что позволяеть изменить опции сборки. Взгляните на pkgsrc/mk/defaults/mk.conf, чтобы получить краткий обзор того, какие опции будут установлены по умолчанию. Переменные среды, типа LOCALBASE могут быть установлены в /etc/mk.conf, что позволит не забыть их, когда вы захотите использовать pkgsrc.

Есть несколько параметров, которые, возможно, захотят использовать те, кому интересно поняблюдать за происходящим во время сборки.

Если, при использовании команды make(1) указать параметр PKG_DEBUG_LEVEL=2, то будет выведена масса отладочной информации. Например:

make patch PKG_DEBUG_LEVEL=2

покажет все команды, вызываемые на этапе “patch”.
Если вы хотите посмотреть значения переменных, то можно воспользоваться определением VARNAME:

% make show-var VARNAME=LOCALBASE
/usr/pkg
%

Если вы хотите установить бинарный пакет, который создали самостоятельно, и помещаете его в pkgsrc/packages, или он находится на удаленном FTP-сервере, вы можете утсановку "bin-install". Это позволит установить пакет с помощью pkg_add(1), если это возможно, или, в противном случае, с помощью make package. Список удаленных FTP-серверов задается переменной BINPKG_SITES. Все флаги, которые вы хотите указать pkg_add(1) можно добавить в переменную BIN_INSTALL_FLAGS. Для получения дополнительной информации, смотрите pkgsrc/mk/defaults/mk.conf.
Выбор компилятора
По умолчанию, в качестве компилятора используется GCC. Изменить такой порядок вещей можно с помощью /etc/mk.conf:
PKGSRC_COMPILER:
distcc: distributed C/C++ (chainable)
ccache: compiler cache (chainable)
gcc: GNU C/C++ Compiler
mipspro: Silicon Graphics, Inc. MIPSpro (n32/n64)
mipspro: Silicon Graphics, Inc. MIPSpro (o32)
sunpro: Sun Microsystems, Inc. WorkShip/Forte/Sun ONE Studio
GCC_REQD:
Эта переменная определяет минимальную версию GCC,которую можно использовать для сборки пакетов. Если текущая версия GCC не соответствует этому значению, то будет собран и установлен пакет GCC более новой версии.
Конфигурирование pkgsrc
Общая конфигурация
В этом разделе вы можете найти некоторые переменные, которые применяются ко всем пакетам в pkgsrc. Основной метод задания значений этих переменных - устанавка их в /etc/mk.conf.
LOCALBASE: Место установки пакета. По умолчанию /usr/pkg. Не смешивайте бинарные пакеты с различным LOCALBASEs!
CROSSBASE: Место установки пакетов категории “cross”. По умолчанию ${LOCALBASE}/cross.
X11BASE: Местонахождение X11 в системе. По умолчанию /usr/X11R6.
DISTDIR: Место, куда скачиваются исходные тексты пакета. по умолчанию ${PKGSRCDIR}/distfiles.
MASTER_SITE_OVERRIDE: Если указано, то перезаписывает переменную MASTER_SITES
MASTER_SITE_BACKUP: Резервное местоположение для дистрибутивных файлов и патчей, на случай, если они не найдены локально или по путям, заданным ${MASTER_SITES} или ${PATCH_SITES}. По умолчанию ftp://ftp.NetBSD.org/pub/NetBSD/packages/distfiles/${DIST_SUBDIR}/ и ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/.
BINPKG_SITES: Список сайтов с бинарными пакетами.
Переменные, влияющие на процесс сборки
PACKAGES: Каталог бинарных пакетов. По умолчанию им является ${PKGSRCDIR}/packages.
WRKOBJDIR: Рабочий каталог, в котором, если определена эта переменная, происходит размещение сборочных каталогов, линкующихся с ${WRKDIR} (см. ниже). Это полезно, если вы хотите собирать пакеты на нескольких архитектурах и ${PKGSRCDIR} примонтирована по NFS, в то время как ${WRKOBJDIR} располагается локально.
LOCALPATCHES: Локальный каталог патчей, являющихся частью pkgsrc. Для получения более полной информации обратитесь к Section 9.3, “patches/*”.
PKGMAKECONF: Указывает на расположение mk.conf. Если это значение не задано, то MAKECONF устанавливает его в /dev/null, что бы избежать перекрытия с настройками, используемого для /usr/src.
Дополнительные флаги компилятора (CFLAGS)
Если вы хотите добавить дополнительные флаги CFLAGS, используйте оператор += вместо =:

CFLAGS+= -your -flags

Использование CFLAGS= может привести к проблемам с пакетами, требующими других внешних флагов.
Установки для разработчиков/расширенные установки
PKG_DEVELOPER: Выполнение некоторых проверок:
Патчи накладываются с zero fuzz
Запуск с check-shlibs, чтобы убедиться в том, что все бинарные файлы найдут необходимые библиотеки.
PKG_DEBUG_LEVEL: Задает уровень вывода отладочных сообщений при сборке пакета. Значением по умолчанию является 0, при этом не выводится никакой информации. При значении 1, будут выведены команды оболочки перед их выполнением, значение 2, вдобавок, отобразит результат их выполнения.
ALLOW_VULNERABILITIES.pkgbase: Через пробел указывается список ID уязвимостей, пречисленные в файле pkg-vulnerabilities и отображаемые audit-packages, которые могут игнорироваться при автоматической проверке безопасности.
SKIP_AUDIT_PACKAGES: Если этот параметр имеет значение “yes”, то атоматическая проверка, осуществляемая security/audit-packages будет полностью отключена. Вместо этой опции рекомендуется использовать ALLOW_VULNERABILITIES.
Выбор опций сборки
Большое число пакетов допускает указание опций сборки, что позволяет выбрать между различными зависимостями, включая поддержку большей функциональности или экспериментальных функций.

Просмотреть опции, поддерживаемые пакетом, можно воспользовавшись командой make show-options:

The following options are supported by this package:
ssl Enable SSL support.
Exactly one of the following gecko options is required:
firefox Use firefox as gecko rendering engine.
mozilla Use mozilla as gecko rendering engine.
At most one of the following database options may be selected:
mysql Enable support for MySQL database.
pgsql Enable support for PostgreSQL database.

These options are enabled by default: firefox
These options are currently enabled: mozilla ssl

В /etc/mk.conf можно определить следущие переменные:
PKG_DEFAULT_OPTIONS, может использоваться для установки опций для всех пакетов, поддерживающих эту функцию.
PKG_OPTIONS.pkgbase, которая используется для установки или удаления опций пакета pkgbase. Для удаления опции необходимо воспользоваться знаком “-”.
Например:

$ grep "PKG.*OPTION" /etc/mk.conf
PKG_DEFAULT_OPTIONS= -arts -dvdread -esound
PKG_OPTIONS.kdebase= debug -sasl
PKG_OPTIONS.apache= suexec

Подводя итоги, можно сказать, что:
Опции по умолчанию определяются мантейнером пакета
Опции можно выставить через настройку соответствующих переменных (см. ниже)
PKG_DEFAULT_OPTIONS
PKG_OPTIONS.pkgbase
Если выбраны взаимоисключающие опции, то используется последняя выбранная опция, все другие автоматически блокируются. Если выбранная опция явно заблокирована, используется предыдущая, если таковая вообще имеется. Если ни одной опции, из группы требуемых, не выбрано, то сборка пакета потерпит неудачу.
Сборка бинарных пакетов
Сборка одиночного бинарного пакета
Как только вы скомпилировали и установили пакет, вы можете создать бинарный пакет, который может быть установлен на другой системе с помощью pkg_add (1). Это позволяет не собирать пакет на каждой из систем, экономя тем самым время и мощности CPU. Также, это простой путь распространения вашего пакета среди мировой общественности.

Для сборки бинарного пакета перейдите в соответствующий каталог и выполните команду make package:

# cd misc/figlet
# make package

Эта команда соберет пакет, установит его (если это еще не сделано) и затем создаст бинарный пакет. В дальнейшем, для манипуляции им, вы можете использовать инструментарий pkg_*. По умолчанию пакет создается в каталоге /usr/pkgsrc/packages, тип файла - tar.gz. Смотрите раздел “Packaging figlet”, для более подробного ознакомления с приимером пакета misc/figlet.
Сборка большого количества пакетов
Если вы хотите скомпилировать все доступные пакеты, то ознакомьтесь с инструкциями, приведенными ниже. Будьте осторожны, так как такая сборка удалит все пакеты, установленные в системе в настоящее время.

Если вы сконфигурируете сервер FTP или NFS, то вы упростите процесс установки уже откомпилированных бинарных пакетов на другие машины.
Конфигурация
build.conf - основной файл конфигурации для большой части собираемых пакетов. Вы можете сконфигурировать, как ваша копия pkgsrc будет обновляться, какие distfiles будут загружаться, какие пакеты будут скомпилированы и какие отчеты при этом будут выданы. Примерный файл конфигурации вы можете найти в pkgsrc/mk/bulk/build.conf-example, его можно использовать при составлении собственного build.conf.

/etc/mk.conf - также подходящее место для указания параметров сборки. Обратитесь к pkgsrc/mk/defaults/mk.conf для того, чтобы узнать значения по умолчанию. Возможно, вы захотите указать параметр ACCEPTABLE_LICENSES, в данном примере установлен параметр _ACCEPTABLE=yes, что позволяет принимать все типы лицензий.

PACKAGES?= ${_PKGSRCDIR}/packages/${MACHINE_ARCH}
WRKOBJDIR?= /usr/tmp/pkgsrc # build here instead of in pkgsrc
BSDSRCDIR= /usr/src
BSDXSRCDIR= /usr/xsrc # for x11/xservers
OBJHOSTNAME?= yes # use work.`hostname`
FAILOVER_FETCH= yes # insist on the correct checksum
PKG_DEVELOPER?= yes
_ACCEPTABLE= yes

Некоторые опции, которые являются особенно полезными для массовой сборки пакетов, могут быть найдены в файле mk/bulk/bsd.bulk-pkg.mk. Кратко опишем самые важные из них:


Если сборка происходит на медленной машине, то стоит присвоить параметру USE_BULK_BROKEN_CHECK значение “no”.
Если вы делаете сборку из read-only копии pkgsrc, то в качестве значения BULKFILESDIR необходимо задать каталог, в котором будут создаваться логи. Если этот параметр не задан, логи создаются в каталоге pkgsrc.
Другой важной переменной является BULK_PREREQ, которая задает список пакетов, которые должны быть доступны, пока собираются другие пакеты.


Некоторые функции рассеяны по структуре pkgsrc:


ALLOW_VULNERABLE_PACKAGES должен быть установлен в "yes". В этом случае сборка происходит вне зависимости от того, есть ли уязвимость в пакете или нет. При передаче пакетов на общедоступный сервер, уязвимые пакеты будут помещены в собственный каталог. Если эта переменная не установлена, то сборка большей части пакетов потерпит неудачу.
CHECK_FILES (pkgsrc/mk/bsd.pkg.check.mk) может быть установлена в “yes”, чтобы проверить, что установленный набор файлов соответствует PLIST.
CHECK_INTERPRETER (pkgsrc/mk/bsd.pkg.check.mk) может устанавливаться в “yes”, чтобы убедиться, что скрипты с “#!” могут найти требуемый интерпретатор.


pre-build.local - сборку можно сконфигурировать таким образом, что в конце фазы pre-build будет выполнена какая-либо специфическая задача. Если файл pre-build.local находится в /usr/pkgsrc/mk/bulk то он выполнится (как сценарий sh(1)) в конце фазы pre-build. Например, pre-build.local может содержать строку:

echo "I do not have enough disk space to build this pig."
> misc/openoffice/$BROKENF

Что воспрепятствует системе начать собирать специфический пакет, который требует почти 3 Гбайт дискового пространства.
Разное
Поскольку /usr/pkg в своем подавляющем большинстве будет удален, убедитесь, что оболочка, под которой вы входите в систему, размещена где-то в другом месте. Просто поместите его в каталог /usr/local/bin и откорректируйте файл паролей соответствующим образом. Таким образом, вы можете войти в систему после перезагрузки (помните, что ваш текущий процесс не умрет, если пакет удален, просто нельзя будет запустить новых копий процесса). Кроме того, если вы используете NetBSD версий меньших чем 1.5, или вы все еще хотите использовать pkgsrc версию ssh по некоторым причинам, убедитесь, что установили ssh перед стартом его из rc.local:

( cd /usr/pkgsrc/security/ssh ; make bulk-install )
if [ -f /usr/pkg/etc/rc.d/sshd ]; then
/usr/pkg/etc/rc.d/sshd
fi

Если вы не сделаете этого, то не сможете войти в систему после завершения сборки пакетов, после перезагрузки или сбоя. Вы были предупреждены!:)
Сам процесс
Удостоверьтесь, что вы не нуждаетесь ни в одном из установленных пакетов. Убедитесь, что удалили все, что может воспрепятствовать сборке, например, библиотеки, установленные в /usr/local, затем получите привилегии пользователя root и выполните:

# cd /usr/pkgsrc
# sh mk/bulk/build

Если по каким-либо причинам сборка прервалась (пропало питание, системная ошибка и т.д), то вы можете продолжить сборку командой:

# sh mk/bulk/build restart

После завершения сборки вы получите уведомление по e-mail, при этом логи будут храниться в каталоге, указанном в build.conf.
Как это работает?
Сборка состоит из трех шагов:
pre-build

Сценарий обновляет ваше pkgsrc дерево через cvs, затем удаляет все некорректные distfiles и все установленные пакеты.
bulk build

Это, в основном, “make bulk-package”. При этом, в первую очередь собираются пакеты, не требущие зависимостей.
post-build

Генерирует отчет, назыаемый broken.html и помещает его в каталог, определенный в файле build.conf, короткая версия этого сообщения будет отправлена по почте администратору.
В течении процесса сборки, список пакетов, которые выдали ошибку при сборке, ведется в файле /usr/pkgsrc/.broken (или .../.broken.${MACHINE} если переменная OBJMACHINE установлена). Индивидуальный лог каждого неисправного пакета хранится в каталоге этого пакета. Эти логи могут быть использованы для исправления пакета и его последующей сборки.
Требования к дисковому пространству
Примерные требования для NetBSD 2.0/i386:
10 GB - distfiles (NFS ok)
8 GB - комплект всех бинарных файлов (NFS ok)
5 GB - временное пространство для компиляции (рекомендуется локальный диск)
Обратите внимание на то, что весь pkgs будет деинсталлирован, как только будет собран бинарный пакет, исходные тексты также будут удалены, таким образом нет чрезмерных требований к дисковому пространству. Впоследствии, если пакет будет необходим снова, то его можно добавить через pkg_add(1) вместо того, чтобы собирать его снова.
Делаем песочницу для сборки в chroot
Если вы не хотите лишиться всех установленных пакетов, то есть возможность выполнять сборку в chroot среде.

Первый шаг заключается в установке chroot песочници, например /usr/sandbox. Это может быть сделано при использовании null mounts, или вручную.

Есть сценарий, называемый pkgsrc/mk/bulk/mksandbox, который создаст песочницу, используя null mounts.

Это также создаст сценарий sandbox в корневом каталоге песочницы, который позволит активировать null mount используя команду mount песочницы и дезактивировать командой umount.

Если поднимать песочницу вручную, то необходимо выполнить следущие действия:
Ядро

# cp /netbsd /usr/sandbox

/dev/*

# cd /usr/sandbox/dev ; sh MAKEDEV all

/etc/resolv.conf (для security/smtpd и почты):

# cp /etc/resolv.conf /usr/sandbox/etc

Рабочий(!) файл конфигурации почтовой сисмтемы (hostname, sendmail.cf):

# cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail

/etc/localtime (для security/smtpd):

# ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime

/usr/src (исходные тексты, необходимы таким пакетам, как sysutils/aperture):

# ln -s ../disk1/cvs .
# ln -s cvs/src-2.0 src

Создаем /var/db/pkg:

# mkdir /usr/sandbox/var/db/pkg

Создаем /usr/pkg:

# mkdir /usr/sandbox/usr/pkg

Обновляем pkgsrc через cvs в каталог /usr/sandbox/usr/pkgsrc:

# cd /usr/sandbox/usr
# cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -d -P pkgsrc

Не монтируйте ссылку на эту копию pkgsrc из основной системы, это приведет к появлению проблем.
Создайте указатели на /usr/sandbox/usr/pkgsrc/packages и .../distfiles. В этом случае NFS- и/или nullfs-mounts могут пригодиться.
Отредактируйте /etc/mk.conf, смотрите Раздел 6.3.1.2, “/etc/mk.conf”.
Скорректируйте mk/bulk/build.conf под свои нужды.
Когда chroot установлена, вы можете запустить сборку скледующими командами:

# cd /usr/sandbox/usr/pkgsrc
# sh mk/bulk/do-sandbox-build

В конце сборки вы получите сообщение, а бинарные файлы будут находиться в каталоге /usr/sandbox/usr/pkgsrc/packages.
Сборка выборочного набора пакетов
В дополнение к тотальной сборке всего чего можно и нельзя, сценарий pkgsrc/mk/bulk/build может использоваться для сборки подмножества пакетов, содержавшихся в pkgsrc. Установкой в файле /etc/mk.conf семейства переменных SPECIFIC_PKGS
SITE_SPECIFIC_PKGS
HOST_SPECIFIC_PKGS
GROUP_SPECIFIC_PKGS
USER_SPECIFIC_PKGS
мы определим набор пакетов, которые должны быть собраны. Также будут собраны зависимости этих пакетов.

Одна сторона использования этой возможности заключается в том, что переодически производя сборку SPECIFIC_PKGS в chroot можно иметь постоянно свежий набор пакетов для своих машин, при этом не производя сборку ничего лишнего. должно сделать большая часть строит с SPECIFIC_PKGS в chroot песочнице периодически, чтобы иметь полный набор двойных пакетов, необходимых для вашего сайта, доступного без верхнего из строительства дополнительных пакетов, которые не необходимы.
Создание CD-ROM с пакетами
После того, как сборка пакетов завершится, вы можете захотеть создать CD-ROM с бинарными пакетами, для того, чтобы облегчить процесс установки их на другую машину. Пакет pkgtools/cdpack обеспечивает простой инструмент создания образов ISO 9660. cdpack позволяет также добавить на диск все зависимости помещаемых на него пакетов.
Пример с cdpack
Полное руководство по cdpack можно прочитать, обратившись к man cdpack(1). Следующий короткий пример предполагает, что бинарные пакеты находятся в каталоге /usr/pkgsrc/packages/all и что в /u2 достаточно места для создания образа ISO 9660.

# mkdir /u2/images
# pkg_add /usr/pkgsrc/packages/All/cdpack
# cdpack /usr/pkgsrc/packages/All /u2/images

Если вы хотите включить другие файлы (COPYRIGHT, README, etc.) на каждый CD, то необходимо создать каталог, содержащий эти файлы.

# mkdir /tmp/common
# echo "This is a README" > /tmp/common/README
# echo "Another file" > /tmp/common/COPYING
# mkdir /tmp/common/bin
# echo "#!/bin/sh" > /tmp/common/bin/myscript
# echo "echo Hello world" >> /tmp/common/bin/myscript
# chmod 755 /tmp/common/bin/myscript

Теперь создаем образ:

# cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images

Каждый образ будет теперь содержать README, COPYING, and bin/myscript в корневом каталоге.

Обновлено: 13.03.2015