Не секрет что отсутствие в OS FreeBSD современного пакетного менеджера
тормозит и сдерживает не только систему работы с портами, но и развитие
системы в целом.
Несомненно старый пакетный менеджер, написанный на СИ Джорданом Хаббардом,
был революционным шагом в начале 90'ых, легкий, быстрый, надежный и простой. Но современные условия выдвигают новые требования, что и послужило
толчком для создания нового пакетного менеджера и дабы прекратить споры
и разногласия среди разработчиков и сообщества FreeBSD, которые
ведутся на протяжении, примерно 10 лет или больше.
Если кто-то решит что за это время можно было разработать несколько
пакетных менеджеров, удовлетворяющих современным требованиям и
тенденциям, возможно, но в рамках концепции развития проекта FreeBSD
это, к сожалению, не так.
прим: данное описание не претендует на серьезное руководство и может
содержать повторы, точнее выжимки ранее изложенного в стиле "коротко"
Суть - показать на примерах как лучше и удобней пользоваться
новым пакетным менеджером PKGNG.
Коротко о достижения пакетного менеджера PKGNG:
- использование db для регистрации и хранения данных об
установленных пакетах (sqlite)
- использование одного или нескольких репозиториев
- использование yaml для описания пакета
- интерфейс для сторонних порт менеджеров
- создание backup и отката
- аудит
- и тд и тп
Ссылки:
- http://wiki.freebsd.org/pkgng
- http://wiki.freebsd.org/PkgPrimer
- https://github.com/pkgng/pkgng/blob/master/FAQ.md
- http://people.freebsd.org/~bapt/pres-pkgng-bsdcan.pdf
- http://www.youtube.com/watch?v=4Hxq7AHZ27I
- http://wiki.freebsd.org/pkgng
- http://wiki.freebsd.org/PkgPrimer
- https://github.com/pkgng/pkgng/blob/master/FAQ.md
- http://people.freebsd.org/~bapt/pres-pkgng-bsdcan.pdf
- http://www.youtube.com/watch?v=4Hxq7AHZ27I
Сообщить об ошибках можно на github трекер:
- http://github.com/pkgng/pkgng
Третичный софт поддерживающий работу с новым пакетным менеджером pkgng:
"из коробки":
- ports-mgmt/portupgrade-devel (soon the main portupgrade will support)
- ports-mgmt/pkg_cutleaves
- ports-mgmt/poudriere
- ports-mgmt/poudriere-devel
- ports-mgmt/portdowngrade
- ports-mgmt/tinderbox-devel (support can be improved)
- ports-mgmt/portbuilder
- sysutils/bsdstats
используя патчи:
- ports-mgmt/portmaster
https://github.com/pkgng/pkgng/blob/master/ports/patch-portm...
инструментарий который будет или уже поддерживает работу с pkgng:
- salt support (in version 0.10)
http://docs.saltstack.org/en/latest/ref/states/all/salt.stat...
и
http://docs.saltstack.org/en/latest/ref/modules/all/salt.mod...
- cfengine support (http://unix-heaven.org/cfengine3-freebsd-pkgng)
- puppet support: (https://github.com/xaque208/puppet-pkgng)
- ruby bindings: (https://github.com/baloo/libpkg-ruby/)
- PackageKit
В системе, начиная с 9.1 находится пусковик /usr/sbin/pkg - который
смотрит переменные PACKAGESITE,PACKAGEROOT и использует их для
задания репозитория и запускает УСТАНОВКУ pkg (Bootsrapping) из портов.
Если переменные не определены, использует заданные в pkg.conf
или встренные в пусковик (/usr/src/usr.sbin/pkg/pkg.c):
#define _LOCALBASE "/usr/local"
#define _PKGS_URL "http://pkgbeta.FreeBSD.org"
$PACKAGESITE/Latest/pkg.txz
или
$PACKAGEROOT/latest/Latest/pkg.txz
или (pkg.conf)
packagesite: http://pkgbeta.FreeBSD.org/freebsd:9:x86:64/latest
/usr/ports/ports-mgmt/pkg
для использования пакетного менеджера pkg, после его установки, необходимо
добавить переменную WITH_PKGNG=yes в /etc/make.conf.
Необходимо напомнить еще одно важное событие - изменение опций сборки
в портах, точнее, создание нового фреймворка для портов - OPTIONSNG.
скрипт:
/usr/ports/Tools/scripts/options2ng.sh - создает backup OPTIONS
базы портов (/var/db/ports) и конвертирует их в новый формат
например:
сконвертировать отдельный файл:
# /usr/ports/Tools/scripts/options2ng.sh -f /tmp/make.conf
создать /tmp/optionsbackup.tar.gz и сконфертировать все OPTIONS в
/var/db/port*/options в новый формат:
# /usr/ports/Tools/scripts/options2ng.sh -p
Вы можете пропустить короткое описание фреймворка OPTIONSNG
++ Немного о framework OPTIONSNG
файл KNOB в портах - устаревшая технология, которая заменена на bsd.options.desc.mk.
Ниже будет, возможно устаревшая информация основанная на материалах
конференций:
новый framework для указания опций сборок портов: OptionsNG Framework
http://people.freebsd.org/~bapt/optionsng.pdf &nb... (eurobsd conf 2011)
http://people.freebsd.org/~bapt/pres-optionng.pdf (bsdcon 2012)
актуальную информацию можно найти:
http://wiki.freebsd.org/Ports/Options/OptionsNG
http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-han...
текущие проблемы и несовместимость:
- на текущий момент в опциях могут быть только две переменные
WITH_FOO и WITHOUT_FOO
- их значения не проверяются
- несовместимость использования
предложение:
- простые опции (on или off)
- сложные опции: по крайней мере 1 для N
- простые: 1 и только 1 опция для N (исключительно)
- каждая опция может иметь описание
- опции maintainer'ов
- системные опции
- OPTIONS_DEFINE: port, maintainer
- OPTIONS_DEFAULT: port, maintainer
- OPTIONS_EXCLUDE: port, maintainer
- OPTIONS_OVERRIDE: break everything
- OPTIONS_SET= OPT1: user, make.conf
- OPTIONS_UNSET= OPT1: user, make.conf
- ${UNIQUENAME}_SET= OPT1 (zsh_SET) user, make.conf
- ${UNIQUENAME}_UNSET= OPT1 (zsh_SET) user, make.conf
- generic options desciptions - как это сейчас сделано в файле KNOBS
совместимость
1/ set the default global options
2/ removes any global via OPTIONS_EXCLUDE
3/ OPTIONS_DEFAULT: override previous
4/ system-wide OPTIONS_(UN)SET
5/ ${UNIQUENAME:U}_(UN)SET
6/ compatibility: /var/db/ports/${UNIQUENAME}/options
(note: usage of OPTIONS+= is deprecated)
6/ new /var/db/ports/${UNIQUENAME}/options from dialog ui
7/ automatic consistency check
пример:
OPTIONS_DEFINE= OPT1 OPT2 OPT3
OPTIONS_MULTI= GRP1 GRP2
OPTIONS_MULTI_GRP1= OPT4 OPT5
OPTIONS_MULTI_GRP2= OPT6 OPT7
OPTIONS_SINGLE= SEL1
OPTIONS_SINGLE_SEL1= OPT8 OPT9 OPT10
OPTIONS_DEFAULT= OPT2 OPT3 OPT9 OPT7 OPT8 OPT4
OPTIONS_EXCLUDE= NLS DOCS
OPT1_DESC= "Description of my option"
# make show-config
===> The following configuration options are available:
OPT1=off: Description of my option
OPT2=on
OPT3=on
====> Options available for the MULTI GRP1: you must choose
at least one of them
OPT4=on
OPT5=off
====> Options available for the MULTI GRP2: you must choose
at least one of them
OPT6=off
OPT7=on
====> Options available for the single SEL1: you must select
only on of them
OPT8=on
OPT9=off
OPT10=off
# make pretty-print-config:
-OPT1 +OPT2 +OPT3 GRP1[ +OPT4 -OPT5 ] GRP2[ -OPT6 +OPT7 ] \
SEL1( +OPT8 +OPT9 -OPT10 )
# make check-config
====> You should select one and only one options from the \
SEL1 single
*** Error code 1
проверка опций в портах:
.if !empty(PORTS_OPTIONS:MOPT1)
@${ECHO_CMD} "the option OPT1 is set (aka on)"
.else
@${ECHO_CMD} "the option OPT1 is not set (aka off)"
.endif
++ Продолжение о пакетном менеджере PKGNG
Итак, после установки пакетного менеджера PKGNG в систему, чтобы перейти
на его использование, необходимо добавить в /etc/make.conf:
WITH_PKGNG=yes
пример вызова пусковика, который предлагает установку pkg из портов:
# pkg -v
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg please wait
Installing pkg-1.0.r5_1... done
If you are upgrading from the old package format, first run:
$ pkg2ng
1.0-rc5
#
после установки из портов /usr/ports/ports-mgmt/pkg в систему и
соответствующих настроек в /etc/make.conf, если у нас в /var/db/pkg
уже находятся ранее установленные пакеты в старом формате pkg_add,
необходимо:
1) лучше руками сделать backup /var/db/pkg
2) запустить pkg2ng - утилита сделает backup /var/db/pkg.bak
и сконвертит ранее установленные пакеты в новом формате pkgng:
# ls -la /var/db/pkg/
total 84320
drwxr-xr-x 2 root wheel 512 Sep 1 21:56 .
drwxr-xr-x 8 root wheel 512 Sep 1 20:16 ..
-rw-r--r-- 1 root wheel 120832 Sep 1 21:56 local.sqlite
-rw-r--r-- 1 root wheel 86149120 Sep 1 20:20 repo.sqlite
#
в июле 2012 порты перевели на новый Framework OPTIONSGS, утилита pkg-config
была заменена на pkg-conf, всвязи с этими изменениями необходимо:
- после апгрейда портов (/usr/ports), посмотреть внимательно
/usr/ports/UPDATING (это нужно делать регулярно при апгрейде дерева портов)
заменить pkg-cconfig на pkgconf:
# portmaster -o devel/pkgconf devel/pkg-config
или
# pkg set -o devel/pkg-config:devel/pkgconf
# pkg install -f devel/pkgconf
или
# pkg_delete -f pkg-config*
# cd /usr/ports/devel/pkgconf
# make install clean
- для перехода на новые порты с новым Framework OPTIONSGS, перевести
флаги в /etc/make.conf для сборки портов и options в новый формат:
# /usr/ports/Tools/scripts/options2ng.sh -p
(для конвертации /var/db/ports/name/options в новый формат)
# /usr/ports/Tools/scripts/options2ng.sh -f /etc/make.conf
# /usr/ports/Tools/scripts/options2ng.sh -f /usr/local/etc/ports.conf
(если используем универсальный порт portsconf -> ports.conf его так же конвертируем в optionsng)
если используем portmaster и планируем использовать его с pkgng,
необходимо обновить до portmaster-3.13.13 с применением патча:
# wget -Y off -t 0 -c --no-check-certificate https://raw.github.com/pkgng/pkgng/
master/ports/patch-portmaster-pkgng
# cp patch-portmaster-pkgng /usr/ports/ports-mgmt/portmaster/files
# make -C /usr/ports/ports-mgmt/portmaster clean deinstall reinstall
патч можно наложить прямо на уже установленную версию portmaster-3.13.13
коротко:
- первый запуск /usr/sbin/pkg (установит из портов /usr/ports/ports-mgmt/pkg)
# pkg
- создать ручной backup /var/db/pkg (старого формата pkg_add)
# cp -R /var/db/pkg /var/tmp/pkg
- запустить конвертацию старого формата packages в новый
# pkg2ng
получим backup старого /var/db/pkg -> /var/db/pkg.bak
и новые базы sqlite для каждого репозитория в формате pkg:
- local.sqlite (локально установленные пакеты через pkg)
- repo.sqlite (содержимое удаленного репозитория)
pkg FAQ (portmaster): https://github.com/pkgng/pkgng/blob/master/FAQ.md
до преобразования pkg2ng, выполнить:
# portmaster -L (покажет установленные пакеты)
после преобразования старой базы в базу pkg:
# portmaster -L (покажет отсутствие пакетов)
Если мы используем portmaster, необходимо его пропатчить для использования
с pkg:
# wget -Y off -t 0 -c --no-check-certificate https://raw.github.com/pkgng/pkgng/master/ports/patch-portma...
# cp patch-portmaster-pkgng /usr/ports/ports-mgmt/portmaster/files
# make -C /usr/ports/ports-mgmt/portmaster clean deinstall reinstall
# echo "WITH_PKGNG=yes" >> /etc/make.conf
проверка работы portmaster совместно с pkg:
# portmaster -L (должен прочитать локальную базу pkg)
++ Первичные настройки pkg:
настройки в файле /usr/local/etc/pkg.conf, аналогичные переменные в среде
перекроют настройки pkg.conf на момент выполнения:
ASSUME_ALWAYS_YES : [NO|YES]
PACKAGESITE : http://pkg.freebsd.org/${ABI}/latest (сайт репозитория)
PKG_MULTIREPOS : [NO|YES] (использовать несколько репозиториев)
by default:
PKG_DBDIR = /var/db/pkg
PKG_CACHEDIR = /var/cache/pkg
репозитории задаются в pkg.conf
# Repository definitions
#repos:
# default : http://example.org/pkgng/
# repo1 : http://somewhere.org/pkgng/repo1/
# repo2 : http://somewhere.org/pkgng/repo2/
некоторые общеупотребительные опции:
-y - всегда отвечать "y [yes]", отменить интерактив
-q - "без вывода сообщений на stdout", однако если неверно задано имя пакета
вывод на stdout будет (почему просто не выдать код возврата "1"? )
-f - выполнить "насильно" (или полная инфо в случае pkg info)
-L - использовать только локальный кеш и запретить апдейт репозитория
-r - задать репозиторий который будет использоваться
использование шаблонов в пакетном менеджере pkg:
-g использовать как shell шаблон
-x использовать как регулярное выражение
-X использовать как расширенное регулярное выражение
например: -g a* или -g "[0-z]*" или -g "*rar" или -g "?c"
-x "perl-5*" или "^deco*$" или -x "^mc-*$" или -x "^mc-.*$"
-x ".*rar$" и тд и тп
++ справка:
# pkg help
# pkg help <command> - вызовет man pkg-command
или
# man pkg-command
++ поиск требуемых пакетов:
формат:
pkg search pkg-name
pkg search [-fDsqop] pkg-name
pkg search [-gexXcdfDsqop] pattern
# pkg search www/apache22
# pkg search misc/mc
# pkg search -x "^mc-*$" (-x поиск по regexp)
# pkg search -x "^mc-*"
# pkg search -g "?c" (-g поиск по shell global match)
# pkg search -g "l?m*"
# pkg search -g "[0-z]*" (-g поиск по shell global match - все пакеты)
# pkg search -g "[0-z]*" | sort -k 1,1 (показать все с сортировкой)
++ запросить информацию с удаленного репозитория:
формат:
pkg rquery <query-format> <pkg-name>
pkg rquery [-a] [-r reponame] <query-format>
pkg rquery -e <evaluation-condition> [-r reponame] <query-format>
pkg rquery [-gxX] [-r reponame] <query-format> <pattern> <...>
# pkg rquery "шаблон" pkgname
%d - зависимоть порта/пакета от других
%r - другие зависят от данного порта/пакета
%?d - 0/1 наличие зависимостей порта/пакета от других
%?r - 0/1 наличие портов/пакетов которые зависят от указанного
показать все пакеты удаленного репозитория:
# pkg rquery -a "package: %n-%v"
# pkg rquery -a "package: %n-%v - %c" (с комментарием)
# pkg rquery -a "package: %n-%v size: %sh - %c" (размер + комментарий)
посмотреть от каких портов зависит gtar и mc:
# pkg rquery "tar depends %?d" gtar (0 - нет зависимостей, 1 - есть)
# pkg rquery "tar depends %?d" archivers/rar
# pkg rquery "tar depends %do %dv" archivers/rar
# pkg rquery "tar depends %do %dv" rar
# pkg rquery "tar depends %do %dv" gtar
# pkg rquery "tar depends %do %dv" archivers/gtar
# pkg rquery "tar depends %do %dv" misc/mc
# pkg rquery "pkg %n-%v require next deps: %dn-%dv" bash-4.2.37
посмотреть какие порты требуют gtar и mc:
# pkg rquery "tar depends %?r" gtar (0 - нет зависимостей, 1 - есть)
# pkg rquery "tar depends %?r" archivers/rar
# pkg rquery "tar depends %ro %rv" misc/mc
# pkg rquery "pkg %n-%v needs for next packages: %rn-%rv" bash-4.2.37
++ установка нужного пакета(ов) с локального или удаленного источника:
формат:
pkg add <pkg-name>
pkg add <protocol>://<path>/<pkg-name>
# pkg add /path/to/packages/foo-1.2.3.txz (установка локального пакета foo...)
# pkg add http://example.org/pkgng-repo/foo-1.2.3.txz
# pkg add ftp://example.org/pkgng-repo/foo-1.2.3.txz
(установка пакета foo-1.2.3.txz по ftp/http с удаленного репозитория)
++ установка нужного пакета из репозитория:
формат:
pkg install [-AfgLnqRXxy] [-r reponame] <pkg-origin> ...
# pkg install www/apach22
# pkg install archivers/rar
# pkg install mc
# pkg install -y misc/mc
( -y == переменной среды или pkg.conf ASSUME_ALWAYS_YES )
# pkg install -y -r repo1 audio/mpg123
апгрейд заданного пакета осуществляется опцией -f
# pkg install -f пакет
# pkg install -fy archivers/rar (принудительно переустановить если уже есть)
если со временем название пакетов звисимостей изменилось, а нам нужны
пакеты в актуальном состоянии (или для последующего апгрейда) делают так:
a) pkg set -o [<oldorigin>:<neworigin>] меняем старую зависимость на новую
b) pkg install -fR category/name - переустанавливаем пакет name и рекурсивно
все пакеты которые о него зависят (-R - переустановить все пакеты которые
зависят от устанавливаемого)
# pkg set -o graphics/libglut:graphics/freeglut (заменили libglut на freeglut)
# pkg install -Rf graphics/freeglut (установили freeglut и все что от него зависит)
или пример с обновлением ветки emacs, создали новый порт editors/emacs
и оставили старый как editors/emacs23, который мы хотим оставить, но
установлен он у нас был как editors/emacs, выполняем:
# pkg set -o editors/emacs:editors/emacs23
устанавливаем без апдейта удаленного репозитория, только через локальный (-L)
# pkg install -yL rar-4.1.1,3 unrar-4.20,5
если мы хотим установить пакет который имеет зависимости и впоследствии
удалить его разом с зависимостями, его можно установить с пометкой как
orphan (сирота) опция -A
# pkg install -yAfL mc-4.8.1.1_1
решили удалить его махом вместе с зависимостями - autoremove:
# pkg autoremove -y
посмотреть какие пакеты были установлены с флагом autoremove:
# pkg query -a "installed package %o %v has autoremove flag = %a"
или
# pkg query -a "installed package %n-%v has autoremove flag = %a"
++ получить информацию от локального репозитория об установленных пакетах:
формат:
pkg query <query-format> <pkg-name>
pkg query [-a] <query-format>
pkg query -F <pkg-name> <query-format>
pkg query -e <evaluation-condition> <query-format>
pkg query [-gxX] <query-format> <pattern> <...>
# pkg query - всегда требуется задание формата <query-format>
# pkg query "%Fp %Fs %sh" portmaster-3.13.13
# pkg query " %n-%v \n ports: %o\n desc: %c\n home: %w\n pkg size: %sh" portmaster-3.13.13
запросить информацию о динамических библиотеках пакета:
# pkg query %Fp имя_пакета | grep -E '/lib[^/]+\.so\.[0-9]+$'
показать информацию о всех пакетах БЕЗ и C autoremove флагом:
# pkg query -e '%a == 0' '%n-%v'
и
# pkg query -e '%a == 1' '%o'
показать все пакеты больше 50MB:
# pkg query -e "%s > 50000000" "%n-%v is bigger than 50MB: %sh"
python27-2.7.3_3 is bigger than 50MB: 67 MB
#
показать все пакеты больше 50MB и были установлены автоматически:
# pkg query -e "%s > 50000000 && %a == 1" "%n-%v is bigger than 50MB: %sh and has been automatically installed"
++ аудит установленных пакетов (проверка на известные уязвимости):
формат:
pkg audit [-Fq] <pkg-name>
# pkg audit perl-5.14.2_2
# pkg audit -F perl-5.14.2_2 (скачать базу перед проверкой)
аудит сайт: http://portaudit.FreeBSD.org/auditfile.tbz
++ изменение информации в базе установленных пакетов:
формат:
pkg set [-a] [-A [01]] [-o <oldorigin>:<neworigin>] [-y] [-xXg] <pkg-name>
# pkg set -o devel/pkg-config:devel/pkgconf
# pkg set -o graphics/libglut:graphics/freeglut
установить флаг autoremove для заданного пакета:
# pkg set -A 1 mc-4.8.1.1_1
снять флаг autoremove:
# pkg set -A 0 mc-4.8.1.1_1
++ информация по установленным пакетам:
формат:
pkg info <pkg-name>
pkg info -a
pkg info [-eDgxXEdrlsqopOfRF] <pkg-name>
pkg info [-drlsq] -F <pkg-file>
# pkg info
deco-3.9_4 Demos Commander, a free Norton Commander clone
pkg-1.0 New generation package manager
portmaster-3.13.13 Manage your ports without external databases or languages
# pkg info -a (-a - все установленные пакеты)
deco-3.9_4 Demos Commander, a free Norton Commander clone
pkg-1.0 New generation package manager
portmaster-3.13.13 Manage your ports without external databases or languages
#
# pkg info deco (инфо по указанному пакету)
deco-3.9_4 Demos Commander, a free Norton Commander clone
#
# pkg info -f deco (полная инфо по указанному пакету)
Name : deco
Version : 3.9_4
Origin : misc/deco
Prefix : /usr/local
Categories : misc
Maintainer : ports@FreeBSD.org
WWW : http://deco.sourceforge.net/
Comment : Demos Commander, a free Norton Commander clone
Flat size : 159 kB
Description :
A clone of Norton Commander for Unix. Text-based,
full featured file manager intuitive interface.
WWW: http://deco.sourceforge.net/
#
# pkg info -D pkg (-D показать pkg-message)
If you are upgrading from the old package format, first run:
# pkg2ng
# pkg info -d png-1.5.12
png-1.5.12 depends on:
#
# pkg info -d mc или (pkg info -d mc-4.8.1.1_1)
mc-4.8.1.1_1 depends on:
gamin-0.1.10_4
gettext-0.18.1.1
gio-fam-backend-2.28.8_1
glib-2.28.8_4
libiconv-1.14
libslang2-2.2.4_3
pcre-8.31
perl-5.14.2_2
pkgconf-0.8.5
png-1.5.12
python27-2.7.3_3
# pkg info -r perl-5.14.2_2
perl-5.14.2_2 is required by:
glib-2.28.8_4
gamin-0.1.10_4
gio-fam-backend-2.28.8_1
mc-4.8.1.1_1
посмотреть динамические библиотеки установленные с пакетом:
# pkg info -B pkg
++ удаление пакетов:
формат:
pkg delete [-fgnqRXxy] <pkg-name> ...
pkg delete [-nqy] -a
# pkg delete rar
# pkg delete -y rar
# pkg delete -y rar unrar
# pkg delete -x ".*rar$" (удаление с использованием regexp)
++ отчет по версиям установленных пакетов:
-----------------------------------------
формат:
pkg version [-IPR] [-hoqv] [-l limchar] [-L limchar] [-Xxge pattern]
[-r reponame] [-O origin] [index]
pkg version -t version1 version2
pkg version -T <pkgname> <pattern>
# pkg version
если существует дерево портов, то оно используется для срванения
с версиями установленных пакетов посредством pkg
# pkg version -P (использовать дерево портов для сравнения с пакетами)
deco-3.9_4 =
pkg-1.0 =
portmaster-3.13.13 =
#
# pkg version -R (использовать репозиторий для определения out of date pkg)
deco-3.9_4 =
pkg-1.0 >
portmaster-3.13.13 =
#
# pkg version -vRL=
pkg-1.0 > succeeds remote (remote has 1.0.r5_1)
# pkg version -vRL\<
deco-3.9_4 = up-to-date with remote
pkg-1.0 > succeeds remote (remote has 1.0.r5_1)
portmaster-3.13.13 = up-to-date with remote
# pkg version -vRL\>
deco-3.9_4 = up-to-date with remote
portmaster-3.13.13 = up-to-date with remote
#
++ проверка целостности установленных пакетов:
формат:
pkg check [-Bdsr] [-vy] [-a | -gxX <pattern>]
# pkg check [-Bdsr] [-vy] [-a | -gxX <pattern>]
-B - анализ SHLIBS установленных пакетов
-d - проверка на отсутствие зависимостей
-r - пересчитать размер и checksums
-s - найти неверные checksums
-v - verbose (использовать чтобы увидеть реально работу)
# pkg check -d или -r или -s или
++ поиск принадлежности файла пакету:
формат:
pkg which [-qo] <file>
# pkg which /usr/local/bin/gdbus
/usr/local/bin/gdbus was installed by package glib-2.28.8_4
# pkg which /usr/local/bin/idle
/usr/local/bin/idle was installed by package python27-2.7.3_3
# pkg which -o /usr/local/bin/idle
/usr/local/bin/idle was installed by package lang/python27
#
++ обновить локальную копию репозитория данными из удаленного репозитория:
формат:
pkg update [-fq]
# pkg update -f (принудительно полностью скачать удаленный репозиторий
и обновить локальный без сравнения на свежесть локального с удаленным)
++ выполнить апгрейд установленных пакетов:
формат:
pkg upgrade [-fLnqy] [-r reponame]
# pkg upgrade -f (принудительный апгрейд всех пакетов)
# pkg upgrade -yf
# pkg upgrade -yfL (принудительный апгрейд всех пакетов без обновления
репозитория)
по умолчанию pkg upgrade сначала обновляет репозиторий (pkg update),
затем производит апгрейд всех пакетов.
# pkg upgrade -n (посмотреть без реального выполнения апгрейда)
прим: не путать с индивидуальным апгрейдом пакета
# pkg install -yfR mc-4.8.1.1_1
# pkg install -yfRL mc-4.8.1.1_1
++ статистика локального и удаленного репозитория:
формат:
pkg stats [-qlr]
# pkg stats
Local package database:
Installed packages: 3
Disk space occupied: 6932 kB
Remote package database(s):
Number of repositories: 1
Packages available: 22212
Unique packages: 22212
Total size of packages: 96 GB
# pkg stats -l (статистика только по локальной копии репозитория)
# pkg stats -r (статистика только по удаленному репозиторию)
++ скачать пакет и его зависимости из удаленного репозитория:
формат:
pkg fetch [-r reponame] [-yqgxXadL] <pkg-name> [...]
# pkg fetch -a (скачать все пакеты)
# pkg fetch -yL bash-4.2.37
# pkg fetch -yd clamav-0.97.5_1 (скачать clamav и все пакеты от которых он зависит)
пакеты будут сохранены в PKG_CACHEDIR (/var/cache/pkg/All)
++ создание пакетов для дальнейшего использования:
формат:
pkg create [-n] [-f format] [-o outdir] [-p plist] [-r rootdir] -m
manifestdir
pkg create [-gnxX] [-f format] [-o outdir] [-r rootdir] pkg-name ...
pkg create [-n] [-f format] [-o outdir] [-r rootdir] -a
создание пакетов в формате pkg из всех ранее установленных в системе
портов или пакетов и сохранение их в /usr/ports/packages/All:
# pkg create -a -o /usr/ports/packages/All
создание одного пакета в формате pkg установленных ранее из портов:
# pkg create -o /usr/ports/packages/All packagename
++ очистка локального кеша - данных об удаленных пакетах которые out-of-date и которые больше не сопровождаются:
# pkg clean
более здесь расписывать нечего :)
++ создание репозитория:
формат:
pkg repo [-fq] <repo-path> [rsa-key]
пример создания собственного локального репозитория из всех установленных
у нас пакетов:
# cd /scratch/huge_free_space
# pkg create -a
# pkg repo .
теперь можем использовать собственный репозиторий для установки через
pkg add/install
++ регистрация уже установленных пакетов или портов в локальной базе:
формат:
pkg register [-ld] -f <plist-file> -m <metadatadir> -i <input-path>
... в man'е вроде описано, но как применить непонятно...
++ посмотреть какие пакеты слинкованы со специфичными shared library:
формат:
pkg shlib <library>
# pkg shlib libpkg.so.0
libpkg.so.0 is linked to by the folowing packages:
pkg-1.0
#
динамическая библиотека задается без пути но включая версию ABI,
при поиске используется точное соответствие.
прим: непонятно как работает, не показывает явные зависимости, при
взведенной переменной SHLIBS как в pkg.conf, так и в среде.
++ dump/restore локальной базы данных:
формат:
pkg backup -d <dest_file>
pkg backup -r <src_file>
прозрачная команда:
# pkg backup -d /var/tmp/pkgng_db.dump
# pkg backup -r /var/tmp/pkgng_db.dump
++ взаимодействие с базами пакетов:
формат:
pkg shell
pkg shell - предоставляет доступ к локальной и удаленной базе пакетов
через консоль sqlite, например:
# echo 'select * from packages;' | pkg shell
# echo 'select origin,name,version,comment from packages;' | pkg shell
показать какие есть базы:
# echo '.databases' | pkg shell
seq name file
0 main /var/db/pkg/local.sqlite
какие есть таблицы:
# echo '.tables' | pkg shell
categories licenses pkg_directories scripts
deps mtree pkg_groups shlibs
directories options pkg_licenses users
files packages pkg_shlibs
groups pkg_categories pkg_users
схему таблицы:
# echo '.schema packages' | pkg shell
CREATE TABLE packages (id INTEGER PRIMARY KEY,origin TEXT UNIQUE NOT NULL,name TEXT NOT NULL,version TEXT NOT NULL,comment TEXT NOT NULL,desc TEXT NOT NULL,mtree_id INTEGER REFERENCES mtree(id) ON DELETE RESTRICT ON UPDATE CASCADE,message TEXT,arch TEXT NOT NULL,maintainer TEXT NOT NULL, www TEXT,prefix TEXT NOT NULL,flatsize INTEGER NOT NULL,automatic INTEGER NOT NULL,licenselogic INTEGER NOT NULL,infos TEXT, time INTEGER, pkg_format_version INTEGER);
#
URL: http://unix1.jinr.ru/~lavr/pkgng_usage.html
Обсуждается: http://www.opennet.dev/tips/info/2715.shtml