Система pkgsrc

Содержание

Получение pkgsrc

Скачиваем архив с системой package sources:

# cd /usr
# ftp ftp://ftp.NetBSD.org/pub/pkgsrc/pkgsrc-2020Q3/pkgsrc.tar.xz

Распакуем скачанный архив:

# tar xJvf pkgsrc.tar.xz

Посмотреть версию коллекции пакетов pkgsrc можно заглянув в файл CVS/Tag.

Обновление pkgsrc

Обновим распакованные файлы с помощью cvs:

# cd /usr/pkgsrc
# cvs update -dP

Переключение на другую версию pkgsrc

Для переключения на другую стабильную версию коллекции пакетов pkgsrc можно воспользоваться следующими командами:

# cd /usr/pkgsrc
# cvs update -rpkgsrc-2020Q4

Для переключения на текущую версию pkgsrc можно воспользоваться следующими командами:

# cd /usr/pkgsrc
# cvs update -A

Развёртывание системы

Перед использованием системы нужно осуществить её первоначальное развёртывание. Для этого нужно перейти в каталог /usr/pkgsrc/bootstrap и выполнить скрипт bootstrap, вот так:

# cd /usr/pkgsrc/bootstrap
# ./bootstrap

В числе прочих пакетов будет установлен пакет pkg_install с инструментами pkg_add, pkg_admin, pkg_create, pkg_delete, pkg_info в каталоге /usr/pkg/sbin/.

Получение pkgsrc-wip

Кроме основного репозитория pkgsrc существует специальный репозиторий wip - work in progress. В этот репозиторий помещают ещё не готовые пакеты, находящиеся в разработке. В нём бывает можно найти пакеты, которые давно не обновляются, но что не умаляет их ценности (например, socklogd или mathopd). Для скачивания этого репозитория можно воспользоваться следующими командами:

# cd /usr/pkgsrc
# git clone git://wip.pkgsrc.org/pkgsrc-wip.git wip

Приоритет программ из pkgsrc

По умолчанию при поиске программ без указания полного пути к ним отдаётся приоритет тем программам, которые имеются в базовой поставке. Чтобы при установке одноимённых программ из pkgsrc они имели приоритет над имеющимися в базовой поставке, нужно настроить переменную PATH.

Например, поменять значение переменной PATH для пользователя root можно через файл /root/.profile, изменив в нём переменную PATH следующим образом:

export PATH=/usr/pkg/sbin:/usr/pkg/bin:/sbin:/usr/sbin:/bin:/usr/bin
export PATH=${PATH}:/usr/X11R7/bin:/usr/local/sbin:/usr/local/bin

Изменение пути к базе данных установленных пакетов

В новых сеансах пользователя root предпочтение будет отдаваться программам, установленным через pkgsrc, в том числе утилитам pkg_* из пакета pkg_install.

Последнее особенно важно, т.к. начиная с 2021 года в pkgsrc используется новое положение базы данных установленных программ. Ранее это был каталог /var/db/pkgsrc, теперь же это каталог /usr/pkg/pkgdb. Новые утилиты используют второй путь. После изменения переменной PATH содержимое старого каталога можно переместить в новый. Задать положение этого каталога явным образом можно через переменную PKG_DBDIR в файле /etc/mk.conf, например вот так:

PKG_DBDIR=                      /usr/pkg/pkgdb

Просмотр опций пакета и его зависимостей

Для рекурсивного просмотра опций пакетов я доработал файл /usr/pkgsrc/mk/bsd.pkg.readme.mk и добавил два новых правила, сделав их на основе правил build-depends-list и print-build-depends-list. Выглядят новые правила следующим образом:

.PHONY: show-options-depends
.if !target(show-options-depends)
show-options-depends:
        @${ECHO} "--- `${RECURSIVE_MAKE} ${MAKEFLAGS} package-name` ---"
        @${RECURSIVE_MAKE} ${MAKEFLAGS} show-options
        @${ECHO} ""

        @${_DEPENDS_WALK_CMD} ${PKGPATH} |                              \
        while read dir; do                                              \
                ( cd ../../$$dir &&                                     \
                ${ECHO} "--- `${RECURSIVE_MAKE} ${MAKEFLAGS} package-name` ---" &&      \
                ${RECURSIVE_MAKE} ${MAKEFLAGS} show-options &&          \
                ${ECHO} "")                                             \
        done
.endif

.PHONY: show-options-recursive
.if !target(show-options-recursive)
show-options-recursive:
.  if !empty(BUILD_DEPENDS) || !empty(DEPENDS)
        @${RECURSIVE_MAKE} ${MAKEFLAGS} show-options-depends
.  endif
.endif

Для рекурсивного просмотра опций пакета и его зависимостей после доработки файла /usr/pkgsrc/mk/bsd.pkg.readme.mk можно воспользоваться такой командой:

# make show-options-recursive

Вывод команды будет иметь примерно следующий вид:

--- curl-7.76.0 ---
Any of the following general options may be selected:
        gssapi   Enable gssapi (Kerberos V) support.
        http2    Add support for HTTP/2.
        idn      Internationalized Domain Names (IDN) support.
        inet6    Enable support for IPv6.
        ldap     Enable LDAP support.
        libssh2  Use libssh2 for SSHv2 protocol support.
        rtmp     Enable rtmp:// support using rtmpdump.

These options are enabled by default:
        gssapi http2 idn inet6

These options are currently enabled:

You can select which build options to use by setting PKG_DEFAULT_OPTIONS
or PKG_OPTIONS.curl.

--- cwrappers-20180325 ---
This package does not use the options framework.

--- digest-20190127 ---
This package does not use the options framework.

--- m4-1.4.18nb2 ---
This package does not use the options framework.

--- libtool-base-2.4.6nb2 ---
This package does not use the options framework.

--- perl-5.32.1 ---
Any of the following general options may be selected:
        debug    Enable debugging facilities in the package.
        dtrace   Enable DTrace support.
        mstats   Enable memory statistics.
        threads  Enable threads support.
Exactly one of the following perlbits options is required:
        64bitall
        64bitauto
        64bitint
        64bitmore
        64bitnone

These options are enabled by default:
        64bitauto threads

These options are currently enabled:
        64bitauto

You can select which build options to use by setting PKG_DEFAULT_OPTIONS
or PKG_OPTIONS.perl.

Использование двоичных зависимостей

Для сборки пакета из системы pkgsrc могут понадобиться зависимости, необходимые для его работы или для сборки. По умолчанию все зависимости устанавливаются из той же системы pkgsrc. Сборка и установка зависимостей может потребовать очень много времени. Чтобы ускорить сборку интересующего пакета, готовые пакеты-зависимости можно взять из двоичного репозитория. Для этого достаточно прописать в файл /etc/mk.conf две опции:

DEPENDS_TARGET=bin-install
BINPKG_SITES=file:///var/pkg_comp/packages

Первая опция как раз предписывает использовать двоичные пакеты для удовлетворения зависимостей, а вторая опция указывает путь к репозиторию, из которого нужно брать двоичные пакеты. Значение этой опции можно взять из файла /usr/pkg/etc/pkgin/repositories.conf, убрав из пути подкаталог All в конце.

Цели make

Сборка и установка пакета

  • make depends-checksum - проверяет размеры и хэш-суммы архивов с исходными текстами и заплаток на соответствие указанным в файлах /usr/pkgsrc/xxx/yyy/distinfo зависимостей,

  • make depends - собирает и устанавливает зависимости,

  • make fetch - скачивает архивы с исходными текстами и заплатки. Скачанные архивы по умолчанию попадают в каталог /usr/pkgsrc/distfiles/,

  • make checksum - проверяет размеры и хэш-суммы архивов с исходными текстами и заплаток на соответствие указанным в файле /usr/pkgsrc/xxx/yyy/distinfo,

  • make extract - извлекает исходные тексты программы из её архива в каталог /usr/pkgsrc/xxx/yyy/work,

  • make patch - применяет заплатки к исходным текстам,

  • make configure - запускает сценарий настройки сборочных скриптов,

  • make или make build или make all - выполняет компиляцию и сборку программы из исходных текстов,

  • make stage-install - устанавливает программу в промежуточный каталог /usr/pkgsrc/xxx/yyy/work/.destdir для проверки, что список установленных файлов соответствует указанному в PLIST, перед установкой в каталог prefix,

  • make test - запускает тесты пакета, если они существуют,

  • make package - создаёт пакет без его установки, но при этом всё равно будут установлены его зависимости. Собранные пакеты по умолчанию помещаются в каталоге /usr/pkgsrc/packages/All/,

  • make replace - переустановить или заменить уже установленный пакет,

  • make deinstall - удалить уже установленный пакет,

  • make install - установить программу из промежуточного каталога /usr/pkgsrc/xxx/yyy/work/.destdir в каталог prefix,

  • make package-install - собрать и установить пакет,

  • make bin-install - установить готовый пакет из каталога собранных пакетов или из удалённого репозитория, как описано в переменной BINPKG_SITES в файле mk.conf. Также можно использовать уже готовые пакеты при установке зависимостей, если настроить переменную DEPENDS_TARGET= bin-install в файле mk.conf,

Просмотр информации

  • make search key=dovecot - поиск пакета по ключевому слову (в примере используется ключевое слово dovecot).

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

    find /usr/pkgsrc/ -type d -mindepth 2 -maxdepth 2 -name dovecot*

  • make show-options - показать различные опции сборки пакета, описанные в /usr/pkgsrc/mk/options.mk.

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

    PKG_OPTIONS.dovecot=    ssl kqueue -pam -tcpwrappers
    

    Отключаемые опции указываются с минусом, включаемые указываются без минуса. Если файла /etc/mk.conf ещё нет, то нужно создать его.

  • make show-depends - показать зависимости пакета. Стоит учитывать, что список зависимостей может меняться в зависимости от выбранных опций, с которыми будет собираться пакет. Поэтому имеет смысл сначала отметить необходимые опции и лишь затем смотреть зависимости,

  • make print-build-depends-list - показать все пакеты, необходимые для сборки этого пакета,

  • make print-run-depends-list - показать все пакеты, необходимые для работы этого пакета после его установки в систему.

  • make fetch-list - генерирует скрипт для скачивания архивов с исходными текстами и заплаток самого пакета и его зависимостей, который может пригодиться для выполнения на другом компьютере, где есть доступ в интернет,

Нестандартная цель, реализация которой описана в одном из разделов выше:

  • make show-options-recursive - посмотреть опции сборки пакета и опций сборки его зависимостей.

Очистка

  • make clean-depends - очистить каталоги /usr/pkgsrc/xxx/yyy/work от исходных текстов и результатов сборки у зависимых пакетов,

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

    # find /usr/pkgsrc -name work -exec rm -r {} +
    # find /usr/pkgsrc -maxdepth 3 -mindepth 3 -name work -exec rm -r {} +
    

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

  • make clean - очистить каталог /usr/pkgsrc/xxx/yyy/work от исходных текстов и результатов сборки этого пакета,

  • make build-clean - очистить каталог /usr/pkgsrc/xxx/yyy/work только от результатов сборки,

  • make distclean - удалить скачанные архивы с исходными текстами и заплатки,

  • make package-clean - удалить собранный пакет.

Разработка

  • make makesum - обновляет размеры и хэш-суммы архивов с исходными текстами в файле /usr/pkgsrc/xxx/yyy/distinfo,

  • make makepatchsum или make mps - обновляет размеры и хэш-суммы заплаток в файле /usr/pkgsrc/xxx/yyy/distinfo,

  • make distinfo или make mdi - обновляет размеры и хэш-суммы архивов с исходными текстами и заплатками в файле /usr/pkgsrc/xxx/yyy/distinfo,

  • make show-var VARNAME=CFLAGS - посмотреть значение переменной, используемой в процессе скачивания, компиляции или установки пакета (в примере используется переменная CFLAGS),

  • make print-PLIST - сгенерировать файл PLIST из файлов, найденных в каталоге /usr/pkgsrc/xxx/yyy/work/.destdir. Может потребоваться ручная правка, особенно для учёта файлов, наличие которых зависит от указания определённых опций сборки.

Отслеживание уязвимостей

5.1.6. Checking for security vulnerabilities in installed packages

Скачивание свежей информации об уязвимостях в программном обеспечении:

# pkg_admin fetch-pkg-vulnerabilities

Проверка наличия уязвимостей в установленных пакетах:

# pkg_admin audit

Для автоматического периодического обновления информации об уязвимостях нужно вписать в /etc/daily.conf:

fetch_pkg_vulnerabilities=YES

Для автоматической периодической проверки установленных пакетов на уязвимости нужно вписать в /etc/security.conf:

check_pkg_vulnerabilities=YES

Для того, чтобы в скриптах из базовой системы использовались пути к утилитам, установленным из pkgsrc, нужно заменить пути к программам pkg_admin и pkg_info в файле /etc/pkgpath.conf:

pkg_admin=/usr/pkg/sbin/pkg_admin
pkg_info=/usr/pkg/sbin/pkg_info

Решение проблем

Проблема 1

Если при обновлении Perl возникает ошибка следующего вида:

pkg_add: Can't open +CONTENTS of depending package p5-Crypt-OpenSSL-Guess-0.11

То решить её можно при помощи следующей команды:

# pkg_admin rebuild-tree

Источник: RE: Error Installing perl-5.28.1 on netbsd 7.1.1 - pkg_add: Can't open +CONTENTS of depending package p5-Crypt-OpenSSL-Guess-0.11

Проблема 2

Если при сборке какой-либо программы из pkgsrc в процессе установки зависимостей из двоичных пакетов возникает проблема такого вида:

===> Binary install for perl-5.36.1
ERROR: perl-5.34.0nb3 is already installed - perhaps an older version?
ERROR: If so, you may wish to ``pkg_delete perl-5.34.0nb3'' and install
ERROR: this package again by ``/usr/bin/make bin-install'' to upgrade it properly.
*** Error code 1

Происходит это из-за повреждённой базы данных пакетов. Можно попробовать переустановить все установленные в системе пакеты с помощью pkgin (перед удалением пакетов не забудьте сохранить архив с пакетом pkgin). Сохраним в файл список установленных пакетов:

# pkgin export > /root/pkgs

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

# pkg_info | awk '{ print $1; }' | xargs -n1 pkg_delete -ffrR

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

Теперь удалим базу данных пакетов:

# rm -R /usr/pkg/pkgdb.refcount /usr/pkg/pkgdb /usr/pkg/bin /usr/pkg/include /usr/pkg/info /usr/pkg/lib /usr/pkg/libdata /usr/pkg/libexec /usr/pkg/man /usr/pkg/sbin /usr/pkg/share

Распакуем двоичные пакеты, необходимые для работы системы pkgsrc:

# cd /
# tar xzvf /var/pkg_comp/packages/bootstrap.tgz

Установим пакет pkgin из заранее сохранённого архива:

# pkg_add /var/pkg_comp/packages/All/pkgin-22.10.0nb2.tgz

Заново установим все пакеты, которые были установлены в системе:

# pkgin import /root/pkgs

Учтите, что pkgin должен быть настроен, а повторная установка удалённых пакетов будет происходить из репозитория, указанного в настройках pkgin.

Использованные материалы