Пакетный менеджер PKGNG |
---|
Не секрет что отсутствие в OS FreeBSD современного пакетного менеджера тормозит и сдерживает не только систему работы с портами, но и развитие системы в целом.
Несомненно старый пакетный менеджер, написанный на СИ Джорданом Хаббардом, был революционным шагом в начале 90'ых, легкий, быстрый, надежный и простой.
Но современные условия выдвигают новые требования, что и послужило толчком для создания нового пакетного менеджера и дабы прекратить споры и разногласия среди разработчиков и сообщества FreeBSD, которые ведутся на протяжении, примерно 10 лет или больше.
Если кто-то решит что за это время можно было разработать несколько пакетных менеджеров, удовлетворяющих современным требованиям и тенденциям, возможно, но в рамках концепции развития проекта FreeBSD это, к сожалению, не так.
Прим: данное описание не претендует на серьезное руководство и может содержать повторы, точнее выжимки ранее изложенного в стиле "коротко"
Цель - показать на примерах как лучше и удобней пользоваться новым пакетным менеджером PKGNG.
Коротко о достижения пакетного менеджера PKGNG:
- использование db для регистрации и хранения данных об установленных пакетах (sqlite)
- использование одного или нескольких репозиториев
- использование yaml для описания пакета
- интерфейс для сторонних порт менеджеров
- создание backup и отката
- аудит
- и тд и тп
Ссылки:
Сообщить об ошибках можно на github трекер:
"из коробки":
используя патчи:
инструментарий который будет или уже поддерживает работу с pkgng:
В базовую систему FreeBSD входит пакетный менеджер pkg_install, это старый пакетный менеджер, который сыграл свою роль и будет заменен на новый, в его состав входят утилиты работы с пакетами:
- /usr/sbin/pkg_add
- /usr/sbin/pkg_create
- /usr/sbin/pkg_delete
- /usr/sbin/pkg_info
- /usr/sbin/pkg_updating
- /usr/sbin/pkg_version
в sources он находится в:
# ls -la /usr/src/usr.sbin/pkg_installВ ближайшем будущем, планируется ввести в базовую систему, новый пакетный менеджер PKGNG, вероятно в 9.1-RELEASE FreeBSD это сделать не успеют, но уже начиная с 9-Stable, в системе находится пусковик:
# ls -la /usr/sbin/pkgкоторый выполняет процесс Bootsrapping - установку нового пакетного менеджера из портов:
/usr/ports/ports-mgmt/pkg
прим: во избежание путаницы - PKGNG название проекта и означает PacKet management New или Next (в разных источниках по разному) Generation.
Сама же утилита - pkg.
Для работы с третичным программным обеспечением, в OS FreeBSD существуют:
Если у вас чистая, только что установленная система без установленных
пакетов или третичного софта из портов, можете опустить данный пункт.
Если у вас уже есть в системе установленный софт из пакетов и/или портов в старом формате, вы имеете:
/var/db/pkg - директорию с перечнем установленных пакетов и портов /var/db/ports - директорию с опциями сборки портовпримеры старой структуры установленных пакетов:
# ls -la /var/db/pkg/perl-5.10.1_1/ total 488 -rw-r--r-- 1 root wheel 41 7 июн 2010 +COMMENT -rw-r--r-- 1 root wheel 418192 26 июл 2010 +CONTENTS -rw-r--r-- 1 root wheel 4290 7 июн 2010 +DEINSTALL -rw-r--r-- 1 root wheel 254 7 июн 2010 +DESC -rwxr-xr-x 1 root wheel 4290 7 июн 2010 +INSTALL -rw-r--r-- 1 root wheel 17501 7 июн 2010 +MTREE_DIRS -rw-r--r-- 1 root wheel 2401 15 авг 2011 +REQUIRED_BY drwxr-xr-x 2 root wheel 512 1 окт 2010 . drwxr-xr-x 556 root wheel 15360 25 июл 13:36 .. #опций портов:
# ls -la /var/db/ports/mc/ total 6 drwxr-xr-x 2 root wheel 512 27 июл 2010 . drwxr-xr-x 25 root wheel 512 17 фев 2012 .. -rw-r--r-- 1 root wheel 243 27 июл 2010 options #
Советую перед переходом на PKGNG, сделать backup /var/db/pkg, невзирая на то, что pkgng, напомнит вам об этом и посоветует запустить специальный скрипт pkg2ng для преобразования в новый формат и который сделает backup старого формата.
Если в вашей версии или релизе FreeBSD нет пусковика, можете установить pkgng из пакетов или из порта:
# /usr/ports/ports-mgmt/pkg # make install cleanКак уже было сказано, в актуальной системе находится лишь пусковик
# ls -la /usr/sbin/pkgкоторый читает переменные среды PACKAGESITE,PACKAGEROOT и использует их для задания репозитория и установки pkg.
Если переменные не определены, используются заданные в pkg.conf или встренные в пусковик
/usr/src/usr.sbin/pkg/pkg.c:
#define _LOCALBASE "/usr/local" #define _PKGS_URL "http://pkgbeta.FreeBSD.org"обычно это:
# echo $PACKAGESITE/Latest/pkg.txzили
# echo $PACKAGEROOT/latest/Latest/pkg.txzили pkg.conf:
packagesite: http://pkgbeta.FreeBSD.org/freebsd:9:x86:64/latestустановка:
# pkgили
# /usr/sbin/pkg 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 #
Выше было предложено установить пакетный менеджер, мы согласились "y" была произведена установка и выдано сообщение о том что если у нас установлены пакеты в старом формате, необходимо запустить:
# pkg2ng (если система чистая, делать это не нужно)смотрим что получили:
# 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 #две базы в формате sqlite, каждая из которых соответствует
Внимание:
если у вас в /var/db/pkg остались или находятся описания пакетов в формате:# ls -la /var/db/pkg/rsync-3.0.9_1/ total 12 drwxr-xr-x 2 root wheel 512 11 окт 13:04 . drwxr-xr-x 23 root wheel 1024 11 окт 13:04 .. -rw-r--r-- 1 root wheel 134 11 окт 13:04 distfiles #можно сделать вывод о том что в качестве пакетного менеджера используется pkg, ибо в директории находится только один файл distfiles. Такие шаблоны обычно остаются после выполнения pkg2ng или менеджеров портов использующих новый пакетный менеджер.
Их можно просто удалить.
Для последующего использования пакетного менеджера pkg, необходимо добавить переменную WITH_PKGNG=yes в /etc/make.conf.
Все готово для использования нового пакетного менеджера.
-------------------------- /etc/make.conf --------------------------------- ... WITH_PKGNG=yes ... ---------------------------------------------------------------------------
Наиболее важные и общеупотребительные настройки, лучше задавать в конфигурационном файле.
Настройки в файле /usr/local/etc/pkg.conf, могут быть переустановлены аналогичными переменными среды на момент выполнения:
ASSUME_ALWAYS_YES : [NO|YES] PACKAGESITE : http://pkg.freebsd.org/${ABI}/latest (сайт репозитория) PKG_MULTIREPOS : [NO|YES] (использовать несколько репозиториев)по умолчанию:
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$" и тд и тп -X '(pkg)'
Нет смысла заниматься переводом manual'ов команд пакетного менеджера, попробуем сначала выполнить некое введение в использование pkgng, то есть с чего бы начал обычный администратор.
# pkg (запуск без параметров выдаст help по синтаксису использования) usage: pkg [-v] [-d] [-jверсия:|-c ] [ ] Global options supported: -d Increment debug level -j Execute pkg(1) inside a jail(8) -c Execute pkg(1) inside a chroot(8) -v Display pkg(1) version Commands supported: add Registers a package and installs it on the system ... ... For more information on the different commands see 'pkg help '.
# pkg -v 1.0 #информация по установленным пакетам:
# pkg info pkg-1.0 New generation package manager #информация по всем установленным пакетам:
# pkg info -a pkg-1.0 New generation package manager portmaster-3.13.13 Manage your ports without external databases or languages #полная информация по пакету:
# pkg info -f portmaster Name : portmaster - имя пакета Version : 3.13.13 - версия Origin : ports-mgmt/portmaster - категория_порта/имя_порта Prefix : /usr/local - префикс установки Categories : ports-mgmt - категория порта Maintainer : dougb@FreeBSD.org WWW : http://dougbarton.us/portmaster.html Comment : Manage your ports without external databases or languages Options : BASH: on - опции сборки пакета ZSH: off - опции сборки пакета Flat size : 133 kB - размер пакета Description : This script uses the existing ports infrastructure to track dependencies, and keep them up to date. It is written in /bin/sh so it has no dependencies. Portmaster has the following features: * Updates and repairs (as needed) entries for dependencies in both +CONTENTS and +REQUIRED_BY files for both the port that is being updated, and any ports that depend on it * Runs make config recursively through all ports before starting build * Downloads distfiles in the background * Recursively checks and upgrades (or installs) all dependencies * User can force upgrades of all dependent ports * Offers the user the opportunity to delete stale distfiles * Supports ports/MOVED and non-default settings of PORTSDIR and PKG_DBDIR * Interactive update mode (prompts for each update) * Option to rebuild port, and ports that depend on it * Options to make packages out of installed, and new ports * Option to clean out stale port dependencies * Options to list installed ports by category, and those with new versions * Packages can be used for installation either exclusively, if available, or only for build dependencies WWW: http://dougbarton.us/portmaster.html #
не всегда нужен содержательный и многострочный вывод, иногда полезнее получить быстрый ответ в стиле "да"/"нет", используя нужные опции:
# pkg info -e portmaster ; echo $? 0 # pkg info -e bash ; echo $? 1 #список всех файлов установленных пакетом:
# pkg info -l portmaster portmaster-3.13.13 owns the following files: /usr/local/etc/bash_completion.d/portmaster.sh /usr/local/etc/portmaster.rc.sample /usr/local/man/man8/portmaster.8.gz /usr/local/sbin/portmaster #показать зависимости depends on (от каких пакетов зависит):
# pkg info -d apache22-worker-mpm apache22-worker-mpm-2.2.22_8 depends on: apr-1.4.6.1.4.1_1 expat-2.0.1_2 libiconv-1.14 pcre-8.31_1 perl-5.14.2_2 #показать каким пакетам требуется данный required by (какие зависят от указанного):
# pkg info -r apr apr-1.4.6.1.4.1_1 is required by: apache22-worker-mpm-2.2.22_8 subversion-1.7.6 #коротко основные: pkg info
==============================< pkg info >===================================== данные обо всех установленных пакетах: pkg info или pkg info -a данные о конкретном пакете : pkg info name все данные о конкретном пакете : pkg info -f name установлен или нет пакет : pkg info -e name ; echo $? список всех файлов пакета : pkg info -l name список от кого зависит этот пакет : pkg info -d name список кто зависит от этого пакета : pkg info -r name ==============================< pkg info >=====================================
Это можно узнать используя запрос к удаленному репозиторию: rquery, в нем всегда должны присутствовать параметры <query-format>.
пока рассмотрим простые примеры (позже будут запросы с выражениями):
# pkg rquery -a "%n-%v - %c" # pkg rquery -a "%n-%v - %c" | less 0verkill-0.16_1 - 0verkill is a bloody 2D action Deathmatch-like game in ASCII-art 2ManDVD-1.3.5_2 - Create your own video dvd 2bsd-diff-2.11 - 2.11BSD diff utility 2bsd-vi-050325_1 - The original vi editor, updated to run on modern OSes 2d-rewriter-1.4 - Cellular automata simulator 2dhf-2005.05_4 - A Numerical Hartree-Fock Program for Diatomic Molecules 2ping-1.1 - A bi-directional ping utility 3dc-0.8.1_3 - 3-Dimensional Chess for X Window System 3ddesktop-0.2.9_10 - 3D Virtual Desktop Switcher ... ... zziplib-0.13.62 - A library to provide transparent read access to zipped files zzuf-0.13 - Transparent application input fuzzer #посчитаем количество пакетов, хотя при запросе к удаленному репозиторию, об этом сообщается:
# pkg rquery -a "%n-%v" | wc -l 21952 #показать все пакеты начинающиеся с "ru-":
# pkg rquery -x '%n-%v' '^ru-.*$' ru-MT-5.14 ru-PSCyr-0.4c2_4 ru-artwiz-ru-20041031_2 ... ru-xmms-1.2.11_16 ru-xruskb-1.15.4_2 #с опцией -e команды query и rquery позволяют использовать условия в запросах к локальной базе или удаленному репозиторию:
# pkg rquery -eв выражениях evaluation-condition можно использовать переменные:# pkg query -e
- %n %o %v %m и тд pkg-query(8) - операторы сравнения: - >[=] численное сравнение - <[=] численное сравнение - =[=] численное и строковое сравнение - != численное и строковое сравнение - ~ строчный шаблонвыражения могут объединяться: && (и) , || (или) и группироваться используя круглые скобки ()
в шаблон запросе - <query-format> в котором можно использовать
%n - вывести имя пакета %v - версия пакета %o - источник пакет (это категория/имя из порта) %p - префикс %m - maintainer (сопроваждающий) пакет %s[bh] - размер пакета, b - в байтах, h - в удобном формате %M - pkg-message пакета %?[drCOLB] - полезный шаблон, вернет "0" если список пуст, иначе "1" d - есть ли у заданного пакета зависимости r - зависят ли другие пакеты от заданного B - зависимость от динамических библиотек в заданном пакетенапример:
показать все пакеты удаленного репозитория с именами по шаблону [0-2]*
# pkg rquery -e '%n ~ [0-2]*' '%n-%v' 0verkill-0.16_1 2ManDVD-1.3.5_2 2bsd-diff-2.11 2bsd-vi-050325_1 2d-rewriter-1.4 2dhf-2005.05_4 2ping-1.1 #показать все пакеты удаленного репозитория размером: 500 < размер < 1000 байт
# pkg rquery -e '(%s>500 && %s<1000)' '%o %sb' security/crack 512 misc/kde-xdg-env 591 misc/kde4-xdg-env 601 devel/maven-wrapper 693 devel/pear-channel-openpear 824 ports-mgmt/pkg_remove 891 net-mgmt/ssgless 944 #показать все пакеты удаленного репозитория у которых maintainer == miwi с именами пакетов по шаблону py2*
# pkg rquery -e "%m ~ miwi* && %n ~py2*" "%n-%v" py27-apachelog-1.1 py27-apetag-1.2 py27-bcrypt-0.2 py27-django-classy-tags-0.3.4.1 py27-psycopg2-2.4.5 py27-setuptools-git-0.4.2 py27-setuptools_hg-0.4 py27-texttable-0.8.1 #коротко основные: pkg rquery
==============================< pkg rquery >=================================== все пакеты : pkg rquery -a "%n" все, с именами и версиями : pkg rquery -a "%n-%v" пакеты с по glob шаблону : pkg rquery -g "%n-%v" 'un?r*' пакеты по шаблону regexp : pkg rquery -x "%n-%v" '^un[a-z].*$' пакеты по выражению : pkg rquery -e '%n ~ [0-2]*' '%n-%v' : pkg rquery -e '(%s>500 && %s<1000)' '%o %sb' : pkg rquery -e "%m ~ miwi* && %n ~py2*" "%n-%v" пакет с зависимостями : pkg rquery "pkg depends on %do %dv" misc/mc пакеты зависящие от заданного : pkg rquery "pkg %n required by %ro %rv" devel/apr1 ==============================< pkg rquery >===================================после получения нужных сведений о пакете/ах c удаленного репозитория можно устанавливать пакеты.
интерактивная установка:
# pkg install rar Updating repository catalogue Repository catalogue is up-to-date, no need to fetch fresh copy The following packages will be installed: Installing rar: 4.1.1,3 The installation will require 1 MB more space 36 B to be downloaded Proceed with installing packages [y/N]: y pkg: cached package rar-4.1.1,3: checksum mismatch, fetching from remote rar-4.1.1,3.txz 100% 471KB 471.4KB/s 471.4KB/s 00:00 Checking integrity... done Installing rar-4.1.1,3... done #пакеты с одинаковым названием portname:
# pkg search -x "^deco$" deco-1.6.2_1 A program to extract various archive file formats deco-3.9_4 Demos Commander, a free Norton Commander clone #пакетная (неинтерактивная) установка: -y , использовать только кеш локальных данных, без обращения к удаленному репозиторию: -L
# pkg install -Ly deco-3.9_4 The following packages will be installed: Installing deco: 3.9_4 The installation will require 159 kB more space 4 B to be downloaded pkg: cached package deco-3.9_4: checksum mismatch, fetching from remote deco-3.9_4.txz 100% 75KB 75.4KB/s 75.4KB/s 00:01 Checking integrity... done Installing deco-3.9_4... done #более удобно и правильно устанавливать пакеты используя pkg-origin, это category/portname, например:
# pkg install -y net/trafshow Updating repository catalogue ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - без опции -L обратились к удаленному repo Repository catalogue is up-to-date, no need to fetch fresh copy The following packages will be installed: Installing trafshow: 5.2.3_2,1 The installation will require 111 kB more space 51 kB to be downloaded trafshow-5.2.3_2,1.txz 100% 51KB 51.0KB/s 51.0KB/s 00:00 Checking integrity... done Installing trafshow-5.2.3_2,1... done #эмуляция установки выполнения, без реальной установки -n:
# pkg install -yn security/nmap Updating repository catalogue Repository catalogue is up-to-date, no need to fetch fresh copy The following packages will be installed: Downgrading pkgconf: 0.8.9 -> 0.8.7_2 Installing lua: 5.1.5_4 Downgrading pcre: 8.31_1 -> 8.31 Installing nmap: 6.01 The installation will require 17 MB more space 3 MB to be downloaded #апгрейд ранее установленного пакета (принудительная установка) -f, предварительно посмотрим наличие:
# pkg info -f deco | egrep -i "(version|origin)" Version : 3.9_4 Origin : misc/deco #в данном случае свежая версия == той что уже установлена, о чем и сказано:
# pkg install -yfL misc/deco pkg: misc/deco is already installed and at the latest version The following packages will be installed: Reinstalling deco-3.9_4 0 B to be downloaded Checking integrity... done Reinstalling deco-3.9_4 done #апгрейд с переустановкой всех зависимостей -Rf:
# pkg install -LRf security/nmap The following packages will be installed: Downgrading pkgconf: 0.8.9 -> 0.8.7_2 Downgrading pcre: 8.31_1 -> 8.31 Reinstalling glib-2.28.8_4 Reinstalling gamin-0.1.10_4 Installing lua: 5.1.5_4 Reinstalling sqlite3-3.7.13 Reinstalling gio-fam-backend-2.28.8_1 Installing nmap: 6.01 Reinstalling apache22-worker-mpm-2.2.22_8 Downgrading subversion: 1.7.6 -> 1.7.5 Reinstalling mc-4.8.1.4_1 The installation will require 33 MB more space 12 MB to be downloaded Proceed with installing packages [y/N]: y #пакетная (неинтерактивная) установка списка пакетов:
# pkg install -yL audio/mpg123 sysutils/coreutils The following packages will be installed: Installing mpg123: 1.14.4 Installing coreutils: 8.12 The installation will require 18 MB more space 2 MB to be downloaded mpg123-1.14.4.txz 100% 172KB 172.0KB/s 172.0KB/s 00:00 coreutils-8.12.txz 100% 2340KB 2.3MB/s 2.3MB/s 00:00 Checking integrity... done Installing mpg123-1.14.4... done Installing coreutils-8.12... done #мы хотим установить пакет, но в чем-то не уверены, помечаем его как orphan для последующего автоудаления autoremove -A:
# pkg install -Ay security/clamav Updating repository catalogue Repository catalogue is up-to-date, no need to fetch fresh copy The following packages will be installed: Installing arc: 5.21p Installing arj: 3.10.22_4 Installing lha: 1.14i_6 Installing unzoo: 4.4_2 Installing clamav: 0.97.5_1 The installation will require 15 MB more space 372 B to be downloaded pkg: cached package arc-5.21p: checksum mismatch, fetching from remote arc-5.21p.txz 100% 44KB 43.9KB/s 43.9KB/s 00:00 pkg: cached package arj-3.10.22_4: checksum mismatch, fetching from remote arj-3.10.22_4.txz 100% 214KB 214.1KB/s 214.1KB/s 00:01 pkg: cached package lha-1.14i_6: checksum mismatch, fetching from remote lha-1.14i_6.txz 100% 34KB 33.9KB/s 33.9KB/s 00:00 pkg: cached package unzoo-4.4_2: checksum mismatch, fetching from remote unzoo-4.4_2.txz 100% 16KB 15.8KB/s 15.8KB/s 00:00 pkg: cached package clamav-0.97.5_1: checksum mismatch, fetching from remote clamav-0.97.5_1.txz 100% 4164KB 2.0MB/s 4.0MB/s 00:02 Checking integrity... done Installing arc-5.21p... done Installing arj-3.10.22_4... done Installing lha-1.14i_6... done Installing unzoo-4.4_2... done Installing clamav-0.97.5_1... done #если что-то непонравилось удаляем разом с зависимостями:
# pkg autoremove -y Packages to be autoremoved: clamav-0.97.5_1 arc-5.21p arj-3.10.22_4 lha-1.14i_6 unzoo-4.4_2 The autoremoval will free 15 MB Deleting clamav-0.97.5_1... ==================================================== If you want remove clamav permanently from you system execute following commands: # rm -rf /var/log/clamav # rm -rf /var/run/clamav # rm -rf /var/db/clamav # pw userdel clamav ==================================================== done Deleting arc-5.21p... done Deleting arj-3.10.22_4... done Deleting lha-1.14i_6... done Deleting unzoo-4.4_2... done #коротко основные: pkg install:
===========================< pkg install >===================================== интерактивная одного пакета: pkg install name[-version] нескольких по origin : pkg install category1/name1 category2/named2 неинтерактивная local cache: pkg install -yL category/name [category1/name1] эмуляция : pkg install -yn category/name апгрейд или принудительная : pkg install -yLf category/name апгрейд включая зависимости: pkg install -yLRf category/name с пометкой для autoremove : pkg install -Ay category/name ===========================< pkg install >=====================================
# pkg info | grep clamavотсутствует, но он ранее собирался у нас локально:
# ls -la /usr/local/pkgng/packages/All/ | grep clamav -rw-r--r-- 1 root wheel 3812776 Sep 23 12:53 clamav-0.97.6.txz # cd /usr/local/pkgng/packages/All/ # pkg add clamav-0.97.6.txz Installing clamav-0.97.6...Installing arc-5.21p... done Installing arj-3.10.22_4... done Installing lha-1.14i_6... done Installing unzoo-4.4_2... done done # pkg info | grep clamav clamav-0.97.6 Command line virus scanner written entirely in C #или
# pkg add /usr/local/pkgng/packages/All/clamav-0.97.6.txz Installing clamav-0.97.6...Installing arc-5.21p... done Installing arj-3.10.22_4... done Installing lha-1.14i_6... done Installing unzoo-4.4_2... done #с удаленного ftp/http:
# pkg add http://unix1.jinr.ru/~lavr/pkgng/lynx-2.8.7.2,1.txz lynx-2.8.7.2,1.txz 100% 928KB 927.9KB/s 927.9KB/s 00:00 Installing lynx-2.8.7.2,1... done To enable certificate handling for SSL connnections, set SSL_CERT_DIR and SSL_CERT_FILE in your environment to the proper values (depending upon which SSL library /usr/local/bin/lynx uses), as described in: /docs/README.sslcerts and: /docs/README.rootcerts. You may also need to generate keys and certificates as described in the latter document and your SSL documentation. #коротко основные: pkg add
===============================< pkg add >===================================== с локальных FS : pkg add filename.txz с удаленных FTP/HTTPS: pkg add [http/ftp]://host.domain/path/filename.txz ===============================< pkg add >=====================================
pkg query - всегда требуется задание формата
информация из готового локального пакета:
пакеты установлены с/без флага autoremove:
примеры выражений в query:
root пакеты (не являются зависимостями и сами не имеют зависимостей):
Тут расписывать нечего, полностью прозрачная ситуация
Внимание:
Далее возможны повторы, потому что будет описание всех команд в виде
синтаксиса и демонстрации наиболее часто встречающихся действий.
# pkg query -F /var/cache/pkg/All/portmaster-3.13.13.txz "%n-%v origin: %o size: %sh"
portmaster-3.13.13 origin: ports-mgmt/portmaster size: 123 kB
#
или
# cd /var/cache/pkg/All
# pkg query -F trafshow-5.2.3_2,1.txz "%n-%v origin: %o files %Fp"
trafshow-5.2.3_2,1 origin: net/trafshow files /usr/local/bin/trafshow
trafshow-5.2.3_2,1 origin: net/trafshow files /usr/local/etc/trafshow.dist
trafshow-5.2.3_2,1 origin: net/trafshow files /usr/local/man/man1/trafshow.1.gz
#
разумеется никто не отменял использование tar для просмотра содержимого
пакета:
# tar ztf /var/cache/pkg/All/ru-xcode-4.1.txz
+MANIFEST
+MTREE_DIRS
/usr/local/bin/xcode
# tar ztf /var/cache/pkg/All/pkgconf-0.8.7_2.txz
+MANIFEST
+MTREE_DIRS
/usr/local/bin/pkg-config
/usr/local/bin/pkgconf
/usr/local/share/aclocal/pkg.m4
/usr/local/share/licenses/pkgconf-0.8.7_2/BSD
/usr/local/share/licenses/pkgconf-0.8.7_2/LICENSE
/usr/local/share/licenses/pkgconf-0.8.7_2/catalog.mk
/usr/local/share/licenses/pkgconf-0.8.7_2/
/usr/local/share/licenses/
#
информация из локальной базы:
# pkg query -e '%a == 0' 'packages %n-%v without autoremove'
packages clamav-0.97.6 without autoremove
packages pkg-1.0 without autoremove
packages portmaster-3.13.13 without autoremove
и
# pkg query -e '%a == 1' 'packages %n-%v with autoremove'
packages arc-5.21p with autoremove
packages arj-3.10.22_4 with autoremove
packages lha-1.14i_6 with autoremove
packages libiconv-1.14 with autoremove
packages libltdl-2.4.2 with autoremove
packages unzoo-4.4_2 with autoremove
#
обычный форматный вывод, по заданному шаблону:
# pkg query "%o version %v : %c " clamav
security/clamav version 0.97.6 : Command line virus scanner written entirely in C
# pkg query "%C" clamav (к какой категории портов относится)
security
# pkg query "%Fp" clamav (выдать список содержимого установленного пакета)
# pkg query "%D" clamav (список директорий используемых пакетом)
/var/run/clamav/
/var/log/clamav/
/var/db/clamav/
/usr/local/share/licenses/clamav-0.97.6/
/usr/local/share/licenses/
# pkg query "%Ok %Ov" clamav (опции пакета установленные при сборке)
ARC on
ARJ on
DOCS off
EXPERIMENTAL off
ICONV on
LDAP off
LHA on
LLVM on
MILTER on
STDERR off
TESTS off
UNRAR on
UNZOO on
#
# pkg query "%n-%v use user: %U" apache22-worker-mpm (используемый UID)
apache22-worker-mpm-2.2.22_8 use user: www
# pkg query "%n-%v use user: %G" apache22-worker-mpm (используемый GID)
apache22-worker-mpm-2.2.22_8 use user: www
# pkg query "%n-%v use shared libs %B" имя (используемые дин-кие libs)
показать зависимости пакета:
# pkg query "pkg depends on %do %dv" clamav
pkg depends on archivers/arc 5.21p
pkg depends on archivers/arj 3.10.22_4
pkg depends on archivers/lha 1.14i_6
pkg depends on converters/libiconv 1.14
pkg depends on devel/libltdl 2.4.2
pkg depends on archivers/unzoo 4.4_2
#
показать какие пакеты требуют данный:
# pkg query "pkg %n required by %ro %rv" apr
pkg apr required by www/apache22-worker-mpm 2.2.22_8
#
выражения в query используются так же как и в rquery, только чуть
больше переменных можно использовать.
# pkg query -e '%a == 0' '%n-%v'
# pkg query -e '%a == 1' '%n-%v'
# pkg query -e '%a == 0 && %#d==0 ' %o
ports-mgmt/pkg
ports-mgmt/portmaster
# pkg query -e '%a == 0 && %#r==0 ' %o
www/apache22-worker-mpm
security/clamav
ports-mgmt/pkg
ports-mgmt/portmaster
#
по аналогии с portmaster'ом показать root,trunk,branch и leaf пакеты:
# pkg query -e "%#d = 0 && %#r = 0" "%n-%v"
trunk пакеты (не являются зависимостями, но сами имеют зависимости):
# pkg query -e "%#d = 0 && %#r > 0" "%n-%v"
branch пакеты (являются зависимостями и сами имеют зависимости):
# pkg query -e "%#d > 0 && %#r > 0" "%n-%v"
leaf пакеты (являются зависимостями, но сами не имеют зависимостей):
# pkg query -e "%#d > 0 && %#r = 0" "%n-%v"
Использование встроенного help или man
# pkg help
# pkg help
# 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часто используемая форма команды:pkg rquery [-a] [-r reponame] pkg rquery -e [-r reponame] 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 "rar depends %?d" archivers/rar # pkg rquery "rar depends %do %dv" archivers/rar # pkg rquery "rar depends %do %dv" rar # pkg rquery "gtar depends %do %dv" gtar # pkg rquery "gtar depends %do %dv" archivers/gtar # pkg rquery "mc 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 install, устанавливает отдельные пакеты с файловой системы, по http или ftp без участия удаленного репозитория.
# 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-origin: category/portname, интерактивные и пакетная установка с -y.
# 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 (принудительно переустановить если уже есть)если со временем название пакетов звисимостей изменилось, а нам нужны пакеты в актуальном состоянии (или для последующего апгрейда) делают так:
# 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]+$'
Внимание: показывается информация о динамических библиотеках пакета, а не от каких динамических библиотеках зависит данный пакет!
# 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]Команда простая, использует аудит-сайт, адрес которого можно определять переменной PORTAUDIT_SITE, для проверки наличия возможных уязвимостей и выдает отчет со ссылками и рекомендациями:
# pkg audit perl-5.14.2_2 # pkg audit -F perl-5.14.2_2 (обновить базу перед проверкой)Для тех кто не знает, откройте для себя аудит сайт FreeBSD
формат: 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-name>Данная команда позволяет получить разнообразные сведения по всем пакетам или конкретно заданному.
# 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опция -a - показать все установленные пакеты
# pkg info -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-message - опция -D
# pkg info -D pkg 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
Внимание: показывается информация о динамических библиотеках пакета, а не от каких динамических библиотеках зависит данный пакет!
На данный момент, реальное использование этой команды, практически не имеет смысла, требует установленной переменной SHLIBS : YES в pkg.conf до начала работы с пакетным менеджером. По умолчанию опция имеет статус off, пока считается разработчиками сырой и опасной.
формат: pkg delete [-fgnqRXxy] <pkg-name> ... pkg delete [-nqy] -aнаиболее используемые опции команды:
-a - удалить все установленные пакеты и очистить локальную базу -f - принудительно удалить пакет/ы невзирая на оставшиеся неразрешенные зависимости -n - пробный режим, в реалии ничего не делать, показать какие будут действия -R - удалить все пакеты которые требуют заданные в списке на удаление -q - принудительно использовать удаление без диагностических сообщений, исключение при использовании опции -nпримеры:
# 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 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 <pkg-name>]Простая и прозрачная команда, наиболее используемые опции:
-B - анализ SHLIBS установленных пакетов -d - проверка на отсутствие зависимостей -r - пересчитать размер и checksums -s - найти неверные checksums -v - verbose (использовать чтобы увидеть реально работу) -a - для всех пакетовБез опции -v исключительно молчаливая команда! примеры:
# pkg check -sv cvsup-mirror Checking checksums: cvsup-mirror cvsup-mirror-1.3_8: checksum mismatch for /usr/local/etc/cvsup/update.sh # pkg check -sv trafshow Checking checksums: trafshow # pkg check -dv apache22-worker-mpm Checking dependencies: apache22-worker-mpmпоиск принадлежности файла пакету:
формат: pkg which [-qo] <file>опции:
-q - без вывода сообщений -o - показать origin вместо name-versionИсключительно простая и прозрачная команда, по указанному пути и имени файла, сообщает какому пакету он принадлежит.
# 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 Updating repository catalogue repo.txz 100% 13MB 4.3MB/s 3.9MB/s 00:03 # # pkg update -f (принудительно полностью скачать удаленный репозиторий и обновить локальный без сравнения на свежесть локального с удаленным)
формат: pkg upgrade [-fLnqy] [-r reponame]
Внимание: Не используйте опцию -y, если не уверены в правильности своих действий! Так как апгрейд относится ко всем локальным пакетам версии которых ниже чем на удаленном репозиотрии.
# 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создание пакетов в формате pkgng из всех ранее установленных в системе портов или пакетов и сохранение их в /usr/ports/packages/All:
# pkg create -a -o /usr/ports/packages/Allсоздание одного пакета с именем packagename в формате pkgng из уже установленных:
# pkg create -o /usr/ports/packages/All packagename
# pkg cleanнаверное самая простая и короткая команда.
формат: pkg repo [-fq]пример создания собственного локального репозитория из всех установленных у нас пакетов:[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>
-l - задать что данный пакет будет регистрироваться в базе как устаревший, в старом формате -d - пометить зарегистрированный пакет как orphan -f plist-file - задать файл содержащий список устанавливаемых пакетом файлов -m metadatadir - указать директорию с метаданными для регистрации пакета -i input-path - указать путь к пакетуДанную команду использует утилита преобразования пакетов из старого формата в новый pkg2ng, в виде:
pkg register -l -m ${MDIR} -f ${PLIST} ${CMD_ARGS}
формат: pkg shlib <library>
Внимание: Чтобы эта команда и pkg info -B работали и показывали информацию по динамическим библиотеками, необходимо до установки пакетов, определить переменную SHLIBS : YES в файле конфигурации pkg.conf
# pkg shlib libpkg.so.0 libpkg.so.0 is linked to by the folowing packages: pkg-1.0 #динамическая библиотека задается без пути но включая версию ABI, при поиске используется точное соответствие.
# pkg shlib libapr-1.so.4 libapr-1.so.4 is linked to by the folowing packages: apache22-worker-mpm-2.2.22_8 apr-1.4.6.1.4.1_1 # # pkg info -B mc mc-4.8.1.4_1 uses the following shared libraries: libslang.so.2 libpcre.so.1 libintl.so.9 libiconv.so.3 libglib-2.0.so.0 #
формат: pkg backup -dпростая и понятная команда:pkg backup -r
# pkg backup -d /var/tmp/pkgng_db.dump # pkg backup -r /var/tmp/pkgng_db.dump
формат: pkg shellpkg 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); #
Примечание: Если у вас возникли вопросы, желание расширить, уточнить, исправить, дополнить, скачать или использовать данную заметку - пожалуйста, я буду только рад если кому-то она оказалась полезной.