Новости из Блогов Использование пакетного менеджера PKGNG во FreeBSD

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 23 Sep 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,373
    Likes Received:
    6,619
    Reputations:
    693
    Использование пакетного менеджера PKGNG во FreeBSD


    Не секрет что отсутствие в 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-portmaster-pkgng

    инструментарий который будет или уже поддерживает работу с pkgng:

    - salt support (in version 0.10)
    http://docs.saltstack.org/en/latest/ref/states/all/salt.states.pkgng.html
    и
    http://docs.saltstack.org/en/latest/ref/modules/all/salt.modules.pkgng.html
    - 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):
    Code:
      #define _LOCALBASE "/usr/local"
       #define _PKGS_URL "http://pkgbeta.FreeBSD.org"
    
       $PACKAGESITE/Latest/pkg.txz
    или
    Code:
     $PACKAGEROOT/latest/Latest/pkg.txz
    или (pkg.conf)
    Code:
        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) и конвертирует их в новый формат

    например:

    сконвертировать отдельный файл:
    Code:
    # /usr/ports/Tools/scripts/options2ng.sh -f /tmp/make.conf
    создать /tmp/optionsbackup.tar.gz и сконфертировать все OPTIONS в
    /var/db/port*/options в новый формат:
    Code:
     # /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 (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-handbook/makefile-options.html#AEN2598

    текущие проблемы и несовместимость:

    - на текущий момент в опциях могут быть только две переменные
    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

    пример:
    Code:
    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
    проверка опций в портах:
    Code:
      .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:
    Code:
    WITH_PKGNG=yes
    пример вызова пусковика, который предлагает установку pkg из портов:
    Code:
     # 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:
    Code:
      # 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:
    Code:
      # portmaster -o devel/pkgconf devel/pkg-config
    или
    Code:
    # pkg set -o devel/pkg-config:devel/pkgconf
       # pkg install -f devel/pkgconf
    или
    Code:
      # pkg_delete -f pkg-config*
       # cd /usr/ports/devel/pkgconf
       # make install clean
    - для перехода на новые порты с новым Framework OPTIONSGS, перевести
    флаги в /etc/make.conf для сборки портов и options в новый формат:
    Code:
    # /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 с применением патча:
    Code:
    # 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)
    Code:
    # pkg
    - создать ручной backup /var/db/pkg (старого формата pkg_add)

    Code:
    # cp -R /var/db/pkg /var/tmp/pkg
    - запустить конвертацию старого формата packages в новый
    Code:
    # 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, выполнить:
    Code:
    # portmaster -L (покажет установленные пакеты)
    после преобразования старой базы в базу pkg:
    Code:
    # portmaster -L (покажет отсутствие пакетов)
    Если мы используем portmaster, необходимо его пропатчить для использования
    с pkg:
    Code:
     # 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
       # echo "WITH_PKGNG=yes" >> /etc/make.conf
    проверка работы portmaster совместно с pkg:
    Code:
       # portmaster -L (должен прочитать локальную базу pkg)
    Первичные настройки pkg:
    настройки в файле /usr/local/etc/pkg.conf, аналогичные переменные в среде
    перекроют настройки pkg.conf на момент выполнения:
    Code:
      ASSUME_ALWAYS_YES  : [NO|YES]
       PACKAGESITE        : http://pkg.freebsd.org/${ABI}/latest (сайт репозитория)
       PKG_MULTIREPOS     : [NO|YES] (использовать несколько репозиториев)
    by default:
    Code:
     PKG_DBDIR    = /var/db/pkg
       PKG_CACHEDIR = /var/cache/pkg
    репозитории задаются в pkg.conf
    Code:
      # 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$" и тд и тп

    справка:
    Code:
    # pkg help
       # pkg help <command> - вызовет man pkg-command
    или
    Code:
     # man pkg-command
    поиск требуемых пакетов:
    формат:
    Code:
      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 (показать все с сортировкой)
    
    запросить информацию с удаленного репозитория:
    формат:
    Code:
         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 наличие портов/пакетов которые зависят от указанного

    показать все пакеты удаленного репозитория:
    Code:
     # pkg rquery -a "package: %n-%v"
       # pkg rquery -a "package: %n-%v - %c" (с комментарием)
       # pkg rquery -a "package: %n-%v size: %sh - %c" (размер + комментарий)
    посмотреть от каких портов зависит gtar и mc:
    Code:
      # 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:
    Code:
     # 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
    установка нужного пакета(ов) с локального или удаленного источника:

    формат:
    Code:
     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 с удаленного репозитория)
    установка нужного пакета из репозитория:

    формат:

    Code:
      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 )
    Code:
    # pkg install -y -r repo1 audio/mpg123
    апгрейд заданного пакета осуществляется опцией -f
    Code:
     # pkg install -f пакет
    
       # pkg install -fy archivers/rar (принудительно переустановить если уже есть)
    если со временем название пакетов звисимостей изменилось, а нам нужны
    пакеты в актуальном состоянии (или для последующего апгрейда) делают так:

    a) pkg set -o [<oldorigin>:<neworigin>] меняем старую зависимость на новую
    b) pkg install -fR category/name - переустанавливаем пакет name и рекурсивно
    все пакеты которые о него зависят (-R - переустановить все пакеты которые зависят от устанавливаемого)
    Code:
       # pkg set -o graphics/libglut:graphics/freeglut (заменили libglut на freeglut)
       # pkg install -Rf graphics/freeglut (установили freeglut и все что от него зависит)
    или пример с обновлением ветки emacs, создали новый порт editors/emacs
    и оставили старый как editors/emacs23, который мы хотим оставить, но
    установлен он у нас был как editors/emacs, выполняем:
    Code:
    # pkg set -o editors/emacs:editors/emacs23
    устанавливаем без апдейта удаленного репозитория, только через локальный (-L)
    Code:
    # pkg install -yL rar-4.1.1,3 unrar-4.20,5
    если мы хотим установить пакет который имеет зависимости и впоследствии
    удалить его разом с зависимостями, его можно установить с пометкой как
    orphan (сирота) опция -A
    Code:
    # pkg install -yAfL mc-4.8.1.1_1
    решили удалить его махом вместе с зависимостями - autoremove:
    Code:
      # pkg autoremove -y
    посмотреть какие пакеты были установлены с флагом autoremove:
    Code:
      # pkg query -a "installed package %o %v has autoremove flag = %a"
    или
       # pkg query -a "installed package %n-%v has autoremove flag = %a"
    Продолжение ->
     
    #1 Suicide, 23 Sep 2012
    Last edited: 23 Sep 2012
  2. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,373
    Likes Received:
    6,619
    Reputations:
    693
    Продолжение


    получить информацию от локального репозитория об установленных пакетах:

    формат:

    Code:
    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
    запросить информацию о динамических библиотеках пакета:
    Code:
     # pkg query %Fp имя_пакета | grep -E '/lib[^/]+\.so\.[0-9]+$'
    показать информацию о всех пакетах БЕЗ и C autoremove флагом:
    Code:
     # pkg query -e '%a == 0' '%n-%v'
    и
    Code:
       # pkg query -e '%a == 1' '%o'
    показать все пакеты больше 50MB:

    Code:
     # pkg query -e "%s > 50000000" "%n-%v is bigger than 50MB: %sh"
    python27-2.7.3_3 is bigger than 50MB: 67 MB
    #

    показать все пакеты больше 50MB и были установлены автоматически:

    Code:
     # pkg query -e "%s > 50000000 && %a == 1" "%n-%v is bigger than 50MB: %sh and has been automatically installed"
    аудит установленных пакетов (проверка на известные уязвимости):
    формат:

    Code:
    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

    изменение информации в базе установленных пакетов:

    формат:
    Code:
    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 для заданного пакета:
    Code:
    # pkg set -A 1 mc-4.8.1.1_1
    снять флаг autoremove:
    Code:
    # pkg set -A 0 mc-4.8.1.1_1 
    информация по установленным пакетам:

    формат:
    Code:
      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
    
    посмотреть динамические библиотеки установленные с пакетом:
    Code:
     # pkg info -B pkg
    удаление пакетов:

    формат:
    Code:
       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)
    отчет по версиям установленных пакетов:
    -----------------------------------------
    формат:
    Code:
       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
    Code:
     # 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
       #
    проверка целостности установленных пакетов:

    формат:
    Code:
     pkg check [-Bdsr] [-vy] [-a | -gxX <pattern>]
    
       # pkg check [-Bdsr] [-vy] [-a | -gxX <pattern>]
    -B - анализ SHLIBS установленных пакетов
    -d - проверка на отсутствие зависимостей
    -r - пересчитать размер и checksums
    -s - найти неверные checksums
    -v - verbose (использовать чтобы увидеть реально работу)
    Code:
     # pkg check -d или -r или -s или
    поиск принадлежности файла пакету:

    формат:
    Code:
     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
       #
    обновить локальную копию репозитория данными из удаленного репозитория:

    формат:
    Code:
      pkg update [-fq]
    
       # pkg update -f (принудительно полностью скачать удаленный репозиторий
    и обновить локальный без сравнения на свежесть локального с удаленным)

    выполнить апгрейд установленных пакетов:

    формат:
    Code:
     pkg upgrade [-fLnqy] [-r reponame]
    
       # pkg upgrade -f (принудительный апгрейд всех пакетов)
       # pkg upgrade -yf
       # pkg upgrade -yfL (принудительный апгрейд всех пакетов без обновления
                        репозитория)
    по умолчанию pkg upgrade сначала обновляет репозиторий (pkg update),
    затем производит апгрейд всех пакетов.
    Code:
     # pkg upgrade -n (посмотреть без реального выполнения апгрейда)
    прим: не путать с индивидуальным апгрейдом пакета
    Code:
    # pkg install -yfR mc-4.8.1.1_1
          # pkg install -yfRL mc-4.8.1.1_1

    статистика локального и удаленного репозитория:


    формат:
    Code:
    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 (статистика только по удаленному репозиторию)
    скачать пакет и его зависимости из удаленного репозитория:

    формат:
    Code:
     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)

    создание пакетов для дальнейшего использования:

    формат:
    Code:
     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:
    Code:
     # pkg create -a -o /usr/ports/packages/All
    создание одного пакета в формате pkg установленных ранее из портов:
    Code:
     # pkg create -o /usr/ports/packages/All packagename
    очистка локального кеша - данных об удаленных пакетах которые out-of-date и которые больше не сопровождаются:
    Code:
     # pkg clean
    
    более здесь расписывать нечего :)

    создание репозитория:

    формат:
    Code:
    pkg repo [-fq] <repo-path> [rsa-key]
    пример создания собственного локального репозитория из всех установленных
    у нас пакетов:
    Code:
      # cd /scratch/huge_free_space
       # pkg create -a
       # pkg repo .
    теперь можем использовать собственный репозиторий для установки через pkg add/install

    регистрация уже установленных пакетов или портов в локальной базе:

    формат:
    Code:
    pkg register [-ld] -f <plist-file> -m <metadatadir> -i <input-path>
    ... в man'е вроде описано, но как применить непонятно...

    посмотреть какие пакеты слинкованы со специфичными shared library:

    формат:
    Code:
      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 локальной базы данных:

    формат:
    Code:
     pkg backup -d <dest_file>
         pkg backup -r <src_file>
    прозрачная команда:
    Code:
    # pkg backup -d /var/tmp/pkgng_db.dump
       # pkg backup -r /var/tmp/pkgng_db.dump
    взаимодействие с базами пакетов:

    формат:
    Code:
     pkg shell
    pkg shell - предоставляет доступ к локальной и удаленной базе пакетов
    через консоль sqlite, например:
    Code:
    # echo 'select * from packages;' | pkg shell
       # echo 'select origin,name,version,comment from packages;' | kg shell
    показать какие есть базы:
    Code:
       # echo '.databases' | pkg shell
       seq  name             file                                                      
       0    main             /var/db/pkg/local.sqlite     
    какие есть таблицы:
    Code:
      # 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     
    схему таблицы:
    Code:
     # 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 
    21.09.2012
    http://www.opennet.ru/tips/2715_pkgng_freebsd_pkg_ports_package.shtml
     
    #2 Suicide, 23 Sep 2012
    Last edited: 23 Sep 2012