URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 86575
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Использование пакетного менеджера P..."

Отправлено auto_tips , 21-Сен-12 16:20 
Не секрет что отсутствие в 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.me/tips/info/2715.shtml


Содержание

Сообщения в этом обсуждении
"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Аноним , 21-Сен-12 16:20 
+1
Lavr - спасибо снова! :)

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Fomalhaut , 22-Сен-12 11:37 
Очень хорошая подборка информации. Спасибо!

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Фкуку , 22-Сен-12 19:03 
Чем порты не устраивают?

Кто гарантирует, что в пакажьщь не вкомпилён бекдор?


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено taliano , 22-Сен-12 20:03 
А где гарантия что бекдора нет в сорцах?

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Фкуку , 22-Сен-12 21:31 
В сорцах есть возможность его поискать.

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено ALex_hha , 22-Сен-12 23:33 
> В сорцах есть возможность его поискать.

Ага, например, в KDE. Делов то проверить несколько сот тысяч строк кода! :)


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Фкуку , 23-Сен-12 16:32 
В оформлении окон рутов немА.
И аудируемых «строк кода» получается сильно меньше.

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено IMHO , 24-Сен-12 15:21 
если это будет чей то репозиторий, то да, там может быть бекдор или другая бяка, но когда ты ставишь софт с репозитория то там идет предупреждение и при этом дважды.
Дальше, я ставлю с основного репозитория FreeBSD, насколько они пишут, то у них там есть группа по безопасности, которая сначала проверяет пакадж и потом вносят в систему тех же портов или пакаджей, так что не так просто туда даже полезный софт в список снести.
а так удачи им и процветания!
я правда пошел чуть иным путем, ну ничего все работает.

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Фкуку , 30-Сен-12 17:05 
В настоящем случае и сам PKGNG отсутствует в портах?

А как вы поступаете, когда пакет XXX собран НЕ С ТОЙ версией JPEG или TIFF, что стоит у вас в системе?

Переустанавливаете 1500 пакаджей или просто компилите?


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено res2500 , 07-Окт-12 19:32 
> В настоящем случае и сам PKGNG отсутствует в портах?

я сделал установку через github https://github.com/pkgng/pkgng почитайте про установку.

> А как вы поступаете, когда пакет XXX собран НЕ С ТОЙ версией JPEG или TIFF, что стоит у вас в системе?

особо с этим не сталкивался еще, но вот я установил скайп через pbi-manager( загрузил файл skype***.pbi и установил, лeнь было через порт собирать в формате pkg ) и некоторые зависимости подтянул, а некоторые не соотвествували версиям, и работает и звук и сообщения пишу.

> Переустанавливаете 1500 пакаджей или просто компилите?

почитайте тут про pkg set


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено metallic , 26-Сен-12 16:52 
Тем, что порты - это монстрообразное, неповоротливое, не обновляемое гумно

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Аноним , 27-Сен-12 17:42 
> Тем, что порты - это монстрообразное, неповоротливое, не обновляемое гумно

в монстрообразных, неповоротливых, гаменных руках.


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Фкуку , 30-Сен-12 17:09 
> Тем, что порты - это монстрообразное, неповоротливое, не обновляемое гумно

И чем же, в вашем воображении, порты отличаются от актуальной версии исходного кода?


"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено metallic , 01-Окт-12 10:31 
> И чем же, в вашем воображении, порты отличаются от актуальной версии исходного
> кода?

Глобально ни чем, разве что портами удобнее пользоваться.
Я про другое писал: что порты, что установка софта из исходно кода - зло, в первую очередь, что это все становится крайне трудно обновляемым или совсем не обновляемым.


"Раздел полезных советов: Использование пакетного менеджера P..."
Отправлено dev , 24-Сен-12 15:48 
А есть ли уже howto для типовых задач. Например: как идеологически правильно ставить apache22 + mod_php5. Если я правильно понимаю, то через пакеты-ng - никак, только через порты. А как при этом обеспечить правильное обновление системы? Т.е. все, что пакетами ставилось - пусть пакетами и обновляется; а остальное - portupgrade.

"Раздел полезных советов: Использование пакетного менеджера P..."
Отправлено xxx , 26-Сен-12 01:22 
> А как при этом обеспечить правильное
> обновление системы? Т.е. все, что пакетами ставилось - пусть пакетами и
> обновляется; а остальное - portupgrade.

А я думаю никак. Всё осталось по старому. Либо только используй репозитарий пакетов, либо порты. Первым пользоваться до сих пор невозможно. Во-первых т.к. там до сих пор кучи пакетов нету и собирает их слоупок. Во-вторых мы никогда не увидим пакеты типа xxx-pgsql и xxx-mysql как в бинарных линуксах, т.к. это разруливается опциями портов, и следовательно в репе не может быть два пакета собранных из одного порта с разными опциями.

Зато мне понравилась простота создания своих реп.



"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено 4ertus2 , 25-Сен-12 22:01 
Сейчас для portupgrade (не -devel) наблюдаю странное. При обновлении пакет удаляется из старой базы и появляется в новой. Сколько эта багофича продержится - хз, но можно перегнать пакеты по portupgrade -Ofa.
Кто-нибудь знает способ без полного пересбора окружения?

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Аноним , 26-Сен-12 04:12 
Лавруш, сенк за подборку.
Я на все это смотрю и становится печально. У фри есть порты со сбором всего из сорцов и бинарные недопакеджи. Теперь еще будут бинарные pkgng без сорцов. Почему нельзя сразу предусмотреть и сборку из сорцов и бинарный сетап/обновление? зачем городить вторую недосистему?
Вот хочу я, например, обновляться бинарно, но mplayer пересобирать из сорцов, т.к. он компилится с флагами под конкретные процессоры, но при этом я не хочу держать N рапозиториев под N моих машин с разными процессорами, как? почему нельзя сделать как-ой то массив в конфиге: "собирать из сорцов"?

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено Пыщ я Бетмен , 02-Окт-12 10:06 
ИМХО, нужен какой-то флаг что мол данный порт ставился из сортов в тех же OPTIONS, а ещё как вариант на лету сравнивать выставленные опции порта по дефолту и сравнивать их с теми, что сохранены в OPTIONS и если различий нет, то надеяться что в репе пакет собран с теми же опциями. Это уже два варианта для проверки, что обновлять исходниками, а что пакетами.

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено mic_kkjkj , 24-Окт-12 14:45 
Много воды и дублирующей информации. Если правильно понял, переключение сводится к
1. обновлению портов (в том числе переустановка portupgrade и portmaster)
2. установка pkg (из портов или пусковиком /usr/sbin/pkg, доступным с релиза 9.1)
3. конвертация установленных портов в новый формат с помощью pkg2ng, конвертация опций портов
4. задание переменной WITH_PKGNG в /etc/make.conf

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено BSDelnik , 10-Дек-12 20:16 
А где собственно пакеты ?
http://pkgbeta.freebsd.org/freebsd:9:x86:32/latest/All/
тут их аж 3
9.1 RC3
все по книжке
только pkg install ... не находит ничего

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено res2500 , 11-Дек-12 21:46 
за конфликта он пока прикрыт на время, вот гдето про это читал в разсылке

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено OLD , 20-Мрт-13 13:41 
Временное решение:
http://mirror.exonetric.net/pub/pkgng/${ABI}/latest

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено hehe9000 , 03-Апр-13 15:54 
PACKAGESITE : http://mirror.exonetric.net/pub/pkgng/freebsd:9:x86:32/latest/

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено EndErr , 24-Сен-14 13:51 
Подскажите как установить или обновить пакет с опциями. Не могу разобрать где прописать WITH_ при установке или обновлении

"Использование пакетного менеджера PKGNG во FreeBSD"
Отправлено EndErr , 24-Сен-14 13:52 
Подскажите как установить или обновить пакет с опциями. Не могу разобрать где прописать WITH_ при установке или обновлении