Пакетный менеджер 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): #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 ------------- 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 пример: 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 ------------- OPTIONSNG ------------- продолжение о пакетном менеджере PKGNG Итак, после установки пакетного менеджера PKGNG в систему, чтобы перейти на его использование, необходимо добавить в /etc/make.conf: -------------------------- /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-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: # 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 -r python27-2.7.3_3 python27-2.7.3_3 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); # Прим: если у вас возникли вопросы, желание расширить, уточнить, исправить, дополнить, скачать и использовать данную заметку - пожалуйста, я буду только рад если кому-то она оказалась полезной lavr@unix1.jinr.ru Андрей Лаврентьев