Система pkgsrc
Содержание
- Содержание
- Получение pkgsrc
- Обновление pkgsrc
- Переключение на другую версию pkgsrc
- Развёртывание системы
- Получение pkgsrc-wip
- Приоритет программ из pkgsrc
- Изменение пути к базе данных установленных пакетов
- Просмотр опций пакета и его зависимостей
- Использование двоичных зависимостей
- Цели make
- Отслеживание уязвимостей
- Решение проблем
- Использованные материалы
Получение 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
Проблема 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
.