Использование пакетного менеджера 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" Продолжение ->
Продолжение получить информацию от локального репозитория об установленных пакетах: формат: 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