Dpkg i что это
Это руководство предназначено для пользователей, желающих более подробно ознакомиться с параметрами командной строки dpkg и состояниями пакетов: здесь это описано более детально, чем в dpkg —help .
Это руководство не следует использовать сопровождающим пакетов, которые хотят понять, как dpkg будет устанавливать их пакеты. Описание того, что делает dpkg при установке и удалении пакетов особенно не полно.
ОПИСАНИЕ
dpkg is a tool to install, build, remove and manage Debian packages. The primary and more user-friendly front-end for dpkg is dselect (1). dpkg itself is controlled entirely via command line parameters, which consist of exactly one action and zero or more options. The action-parameter tells dpkg what to do and options control the behavior of the action in some way.
dpkg can be also be used as a front-end to dpkg-deb (1). The following are dpkg-deb actions, and if they are encountered, dpkg just runs dpkg-deb with the parameters given to it:
-b, --build, -c, --contents, -I, --info, -f, --field, -e, --control, -x, --extract, -X, --vextract и --fsys-tarfile.
Все эти действия описаны в dpkg-deb (1).
ИНФОРМАЦИЯ О ПАКЕТАХ
dpkg управляет некоторой полезной информацией о доступных пакетах. Эта информация делится на три класса: состояния , выбранные состояния и флаги . Предполагается, что в большинстве случаев эта информация изменяется с помощью dselect .
СОСТОЯНИЯ ПАКЕТА
installed Пакет распакован и успешно настроен. half-installed Установка пакета была запущена, но не закончена по какой-либо причине. not-installed Пакет в системе не установлен. unpacked Пакет распакован, но не настроен. half-configured Пакет распакован и настройка была запущена, но пока ещё не завершена по какой-либо причине. config-files В системе остались только конфигурационные файлы пакета.
ВЫБРАННЫЕ СОСТОЯНИЯ ПАКЕТА
install Пакет выбран для установки. deinstall Пакет выбран для удаления (т.е. будут удалены все файлы, кроме конфигурационных). purge Пакет выбран для полной очистки (т.е. будут удалены абсолютно все файлы, включая конфигурационные).
ФЛАГИ ПАКЕТА
hold Пакет помечен как зафиксированный и не обрабатывается dpkg , только если не указан параметр —force-hold . reinst-required Пакет, помеченный как reinst-required , является сломанным и требует переустановки. Такие пакеты не могут быть удалены, пока не указан параметр —force-reinstreq .
ДЕЙСТВИЯ
dpkg -i | —install имя файла пакета . Установить заданный пакет. Если указан параметр —recursive или -R , то вместо имени файла пакета должен быть указан каталог.
Установка состоит из следующих шагов:
1. Извлечение управляющих файлов нового пакета.
2. Если другая версия этого пакета была установлена ранее, то запускается сценарий prerm из старого пакета.
3. Запускается сценарий preinst , если он есть в пакете.
4. Распаковываются новые файлы, в тоже самое время сохраняя старые, чтобы если что-то пойдет не так, можно было их восстановить.
5. Если ранее была установлена другая версия этого пакета, то запускается сценарий postrm для старого пакета. Заметим, что этот сценарий запускается после сценария preinst нового пакета, потому что новые файлы записываются в то же самое время, когда удаляются старые.
6. Настройка пакета. Смотрите описание —configure , где приведена подробная информация об этом шаге. dpkg —unpack имя файла пакета . Распаковать пакет, но не настраивать. Если указан параметр —recursive или —R , то вместо имени файла пакета должен быть указан каталог. dpkg —configure имя пакета . | -a | —pending Повторно настроить распакованный пакет. Если вместо имени пакета задан параметр -a или —pending , то все распакованные, но не настроенные пакеты будут настроены.
Настройка состоит из следующих шагов:
1. Распаковка конфигурационных файлов, в то же самое время сохраняя старые конфигурационные файлы, чтобы можно было восстановить их, если что-то пойдет не так.
2. Запуск сценария postinst , если он есть в пакете. dpkg -r | —remove | -P | —purge имя пакета . | -a | —pending Удалить установленный пакет. Если указан параметр -r или —remove то удаляется всё, кроме конфигурационных файлов. Это позволяет избежать переконфигурации пакета, если он будет повторно установлен у будущем. (Конфигурационные файлы — это те, что указаны в управляющем файле debian/confiles ). Если указан параметр -P или —purge то удаляется всё, включая конфигурационные файлы. Если вместо имени пакета задан параметр -a или —pending, то все распакованные пакеты, но отмеченные в файле /var/lib/dpkg/status для удаления или полной очистки, соответственно, удаляются или полностью очищаются.
Удаление пакета состоит из следующих шагов:
1. Запуск сценария prerm
2. Удаление установленных фалов
3. Запуск сценария postrm
dpkg —update-avail | —merge-avail I Обновить информацию dpkg и dselect о доступных пакетах. Действие —merge-avail комбинирует старую информацию с информацией из файла Packages . Действие —update-avail перезаписывает старую информацию информацией из файла Packages . Файл Packages распространяется с Debian под именем Packages . dpkg хранит информацию о доступных пакетах в файле /var/lib/dpkg/available .
Для упрощения процедуры получения и обновления файла available можно использовать команду dselect update . dpkg -A | —record-avail имя файла пакета . Обновить информацию dpkg и dselect о доступных пакетах информацией из пакета имя файла пакета . Если задан параметр —recursive или -R , то вместо имени файла пакета должен быть указан каталог. dpkg —forget-old-unavail Забыть о неустановленных недоступных пакетах. dpkg —clear-avail Очистить имеющуюся информацию о том, какие пакеты доступны. dpkg -C | —audit Найти пакеты, которые были установлены в системе только частично. dpkg посоветует, что делать, чтобы восстановить их работоспособность. dpkg —get-selections [ шаблон имени пакета . ] Get list of package selections, and write it to stdout. Without a pattern, packages marked with state purge will not be shown. dpkg —set-selections Установить список выбранных пакетов, принимая его со стандартного ввода. Этот файл должен быть в формате ‘ ‘, где состоянием может быть install, hold, deinstall или purge. Допускаются пустые строки и строки комментариев (начинающиеся с #). dpkg —clear-selections Set the requested state of every non-essential package to deinstall. This is intended to be used immediately before —set-selections, to deinstall any packages not in list given to —set-selections. dpkg —yet-to-unpack Найти пакеты, выбранные для установки, но по какой-то причине ещё не установленные. dpkg —print-architecture Print architecture of packages dpkg installs (for example, «i386»). dpkg —compare-versions ver1 op ver2 Сравнить номера версий, используя op в качестве бинарного оператора. dpkg возвращает код успешного завершения (нуль), если указанное условие удовлетворяется, или неудачу (не-нуль) в противном случае. Есть две группы операторов, которые работают по-разному при отсутствующем параметре ver1 или ver2 . Операторы lt le eq ne ge gt считают отсутствующий номер версии более ранним, чем любой другой. Операторы lt-nl le-nl ge-nl gt-nl считают отсутствующий номер версии более поздним, чем любой другой. Операторы < = >> > используются только для совместимости с синтаксисом файла control. dpkg —command-fd Принимает серию команд из входного файлового дескриптора . Замечание: дополнительные параметры, заданные в командной строке, а также через этот дескриптор, не сбрасываются для последующих команд, выполняющихся далее в этом запуске. dpkg —help Вывести небольшую подсказку. dpkg —force-help Вывести подсказку о параметрах —force- что-нибудь . dpkg -Dh | —debug=help Вывести подсказку о параметрах отладки. dpkg —licence | dpkg —license Показать лицензию dpkg . dpkg —version Показать информацию о версии dpkg . dpkg-deb actions Смотрите dpkg-deb (1) для более подробной информации о нижеследующих действиях.
dpkg -b | --build каталог [имя файла] Собирает deb пакет. dpkg -c | --contents имя файла Показывает содержимое deb пакета. dpkg -e | --control имя файла [каталог] Извлекает управляющую информацию из пакета. dpkg -x | --extract имя файла Извлекает файлы, содержащиеся в данном пакете. dpkg -f | --field имя файла [управляющее-поле] . Показывает управляющее(ие) поле(я) пакета. dpkg --fsys-tarfile имя файла Выдает на стандартный вывод tar-файл с файловой системой из указанного пакета Debian. dpkg -I | --info имя файла [файл control] Выдает информацию о данном пакете. dpkg -X | --vextract имя файла каталог Извлекает и выдает имена файлов, содержащиеся в пакете.
dpkg-query actions Смотрите dpkg-query (1) для более подробной информации о нижеследующих действиях.
dpkg -l | --list шаблон имени пакета . Показывает пакеты, соответствующие данному шаблону. dpkg -s | --status имя пакета . Сообщает о состоянии указанного пакета. dpkg -L | --listfiles имя пакета . Показывает файлы, установленные в системе из пакета с указанным именем. dpkg -S | --search шаблон имени файла . Ищет в установленных пакетах имя файла по заданному шаблону. dpkg -p | --print-avail I Выводит детальную информацию о пакете, которую извлекает из файла /var/lib/dpkg/available.
ПАРАМЕТРЫ
Все параметры можно указывать как в командной строке, так и в конфигурационном файле dpkg — /etc/dpkg/dpkg.cfg . Каждая строка в конфигурационном файле должна быть либо параметром (в точности как в командной строке, но без начальных дефисов), либо комментарием (если начинается с # ).
—abort-after= число Change after how many errors dpkg will abort. The default is 50. -B | —auto-deconfigure При удалении пакета есть вероятность, что есть другой установленный пакет зависящий от удаляемого пакета. Указание этого параметра приведёт к автоматической деконфигурации пакета, который зависит от удаляемого пакета. -D octal | —debug= octal Switch debugging on. octal is formed by bitwise-orring desired values together from the list below (note that these values may change in future releases). -Dh or —debug=help display these debugging values.
Маска Описание
1 Основная полезная информация по ходу выполнения
2 Вызов и состояния скриптов поддержки
10 Вывод по каждому обработанному файлу
100 Подробный вывод по каждому обработанному файлу
20 Вывод по каждому конфигурационному файлу
200 Подробный вывод по каждому конфигурационному файлу
40 Зависимости и конфликты
400 Подробное освещение зависимостей и конфликтов
1000 Подробная ерунда, например о каталоге dpkg/info
2000 Невероятное количество ерунды —force- things | —no-force- things | —refuse- things
Принудительно выполнять или же отказываться выполнять ( no-force и —refuse означают одно и то же) те или иные вещи. things — это список через запятую элементов описанных далее). —force-help выдает сообщение, описывающие их. Элементы, обозначенные звёздочкой (*), принудительно выполняются по умолчанию.
Предупреждение: Эти параметры предназначены только для использования экспертами. Использование без полного понимания их действия может нарушить работоспособность всей системы.
all : Turns on (or off) all force options.
downgrade (*): Установить пакет, даже если уже установлена его более новая версия.
Предупреждение: На данный момент dpkg не выполняет проверку зависимостей при переходе на более старую версию и поэтому не предупредит если это поломает зависимости с остальными пакетами. Это может иметь серьёзные последствия: замена на более старую версию системных компонентов первой необходимости может привести к полной неработоспособности системы. Использовать осторожно.
configure-any : Настроить также все распакованные, но ненастроенные пакеты, от которых зависит текущий пакет.
hold : Обрабатывать даже пакеты, помеченные как «зафиксированные».
remove-reinstreq : Удалить пакет, даже если он сломан и отмечен как требующий переустановки. Это может, например, привести к тому, что части пакета останутся в системе, а dpkg про них забудет.
remove-essential : Удалить, даже если это пакет первой необходимости (имеет приоритет «Essential»). Эти пакеты в основном содержат базовые команды Unix. Удаление такого пакета может привести к потере работоспособности системы, так что используйте данный параметр осторожно.
depends : Превратить проблемы с зависимостями в предупреждения.
depends-version : Не обращать внимание на версии при проверке зависимостей.
conflicts : Установить, даже если пакет конфликтует с другим пакетом. Это опасно, так как обычно приводит к перезаписи некоторых файлов.
confmiss : Всегда устанавливать пропущенный конфигурационный файл. Это опасно, так как не будут сохранены изменения (удаление) файла.
confnew : Если конфигурационный файл был изменён, то всегда устанавливать новую версию без запроса подтверждения, если не задан также параметр —force-confdef , при котором предпочтение отдаётся действию по умолчанию.
confold : Если конфигурационный файл был изменён, всегда сохранять старую версию без запроса подтверждения, если не задан также параметр —force-confdef , при котором предпочтение отдаётся действию по умолчанию.
confdef : Если конфигурационный файл был изменён, всегда выбирать действие по умолчанию. Если такового нет, то спросить у пользователя, если не задан параметр —force-confnew или —force-confold (в этом случае соответствующий параметр используется для выяснения, что именно нужно делать).
overwrite : Перезаписать файл из одного пакета файлом из другого пакета.
overwrite-dir : Перезаписать каталог из одного пакета файлом из другого.
overwrite-diverted : Перезаписать файл с изменённым расположением(diverted) его неизменённой версией.
architecture : Обрабатывать даже пакеты с неправильной архитектурой.
bad-path : В PATH отсутствуют важные программы, поэтому могут возникнуть проблемы.
not-root : Попытаться установить или удалить пакет, даже если не нет прав суперпользователя.
bad-verify : Устанавливать пакет, даже если он не прошёл проверку подлинности.
—ignore-depends = пакет . Игнорировать проверку зависимостей для указанных пакетов (на самом деле, проверка выполняется, но выдаются только предупреждения о конфликтах и ничего более). —new | —old Выбрать, соответственно, новый или старый формат пакета. Это параметр программы dpkg-deb (1). —nocheck Не читать и не проверять содержимое файла control при создании пакета. Это параметр программы dpkg-deb (1). —no-act | —dry-run | —simulate Делать всё, что необходимо, но не записывать на диск изменения. Он используется для того, чтобы посмотреть, что произошло бы при выполнении указанного действия, но при этом ничего не меняется.
Убедитесь, что указали —no-act перед действием, или у вас могут получиться нежелаемые результаты. (например, dpkg —purge foo —no-act сперва выполнит полное удаление пакета foo, а затем будет пытаться полностью удалить пакет —no-act, хотя вы ожидали, что ничего выполнено не будет) -R | —recursive Рекурсивная обработать все файлы, отвечающие шаблону *.deb , которые найдены в заданных каталогах и во всех их подкаталогах. Этот параметр можно использовать вместе с действиями -i , -A , —install , —unpack и —avail . -G Don’t install a package if a newer version of the same package is already installed. This is an alias of —refuse-downgrade . —root= dir | —admindir= dir | —instdir= dir Change default directories. admindir defaults to /var/lib/dpkg and contains many files that give information about status of installed or uninstalled packages, etc. instdir defaults to / and refers to the directory where packages are to be installed. instdir is also the directory passed to chroot (2) before running package’s installation scripts, which means that the scripts see instdir as a root directory. Changing root changes instdir to dir and admindir to dir /var/lib/dpkg . -O | —selected-only Обрабатывать только пакеты, выбранные для установки. Такой выбор делается программой dselect или же самой программой dpkg при работе с пакетами. Например, когда пакет удаляется, он будет помечен для удаления. -E | —skip-same-version Не устанавливать пакет, если та же версия этого пакета уже установлена. —status-fd Send package status info to file descriptor . This can be given multiple times. Status updates are of the form `status: : ‘. Errors are reported as `status: : error: extend-error-message’. Configuration file conflicts are reported as `status: conffile-prompt: conffile : ‘current-conffile’ ‘new-conffile’ useredited distedited’. —log= имя файла Log status change updates and actions to filename , instead of the default /var/log/dpkg.log . If this option is given multiple times, the last filename is used. Log messages are of the form `YYYY-MM-DD HH:MM:SS status ‘ for status change updates; `YYYY-MM-DD HH:MM:SS ‘ for actions where is one of install, upgrade, remove, purge; and `YYYY-MM-DD HH:MM:SS conffile ‘ for conffile changes where is either install or keep. —no-debsig Не пытаться проверять подпись пакета.
ФАЙЛЫ
/etc/dpkg/dpkg.cfg Файл конфигурации с параметрами по умолчанию. /var/log/dpkg.log Файл журнала по умолчанию (смотрите /etc/dpkg/dpkg.cfg (5) и параметр —log ). Остальные файлы перечислены с указанием их каталогов по умолчанию, смотрите параметр admindir , чтобы узнать, как изменить местоположение этих файлов. /var/lib/dpkg/available Список доступных пакетов. /var/lib/dpkg/status Состояния доступных пакетов. Этот файл содержит информацию о том, помечен ли пакет для удаления или нет, установлен он или нет, и т.д. Смотрите раздел ИНФОРМАЦИЯ О ПАКЕТАХ , где приведена подробная информация. Нижеследующие файлы являются компонентами бинарного пакета. Смотрите deb (5), где приведена подробная информация: control conffiles preinst postinst prerm postrm
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
DPKG_NO_TSTP Если она определена, то dpkg при запуске оболочки не приостанавливает себя, а создаёт новый процесс. SHELL The program dpkg will execute when starting a new shell. COLUMNS Задаёт количество колонок текста, используемых программой dpkg при форматировании текста. В настоящий момент используется только с параметром -l .
ПРИМЕРЫ
To list packages related to the editor vi (1):
To see the entries in /var/lib/dpkg/available of two packages:
dpkg —print-avail elvis vim | less
Вручную просмотреть список пакетов:
Удалить установленный пакет elvis:
Чтобы установить пакет, сначала нужно найти его в архиве или на CDROM. Файл «available» показывает, что пакет vim находится в секции «editors» («редакторы»):
cd /cdrom/hamm/hamm/binary/editors
dpkg -i vim_4.5-3.deb
Получить локальную копию состояний выбранных пакетов:
dpkg —get-selections >myselections
Вы можете перенести этот файл на другой компьютер и установить его там с помощью:
dpkg —clear-selections
dpkg —set-selections
Заметим, что при этом ничего не будет ни установлено, ни удалено, просто будут заданы состояния запрошенных пакетов. Для того, чтобы на самом деле скачать и установить запрошенные пакеты, вам понадобится другая программа. Например, запустите dselect и выберите «Установить».
Обычно dselect (8) предоставляет более удобный способ изменить состояния выбранных пакетов.
ДОПОЛНИТЕЛЬНАЯ ФУНКЦИОНАЛЬНОСТЬ
Дополнительная функциональность может быть получена установкой любых следующих пакетов: apt , aptitude и debsums .
SEE ALSO
ОШИБКИ РЕАЛИЗАЦИИ
—no-act обычно дает меньше информации, чем могло бы быть полезным.
АВТОРЫ
Смотрите файл /usr/share/doc/dpkg/THANKS, где приведён список тех, кто участвовал в разработке dpkg.
ПЕРЕВОД
Перевёл с английского Виктор Вислобоков Обновление и корректура: Alexey Mahotkin . Юрий Козлов .
Dpkg i что это


5.4. Работа с пакетами при помощи dpkg
dpkg is the base command for handling Debian packages on the system. If you have .deb packages, it is dpkg that allows installation or analysis of their contents. But this program only has a partial view of the Debian universe: it knows what is installed on the system, and whatever it is given on the command line, but knows nothing of the other available packages. As such, it will fail if a dependency is not met. Tools such as apt and aptitude , on the contrary, will create a list of dependencies to install everything as automatically as possible.
ЗАМЕТКА dpkg или apt ?
dpkg стоит рассматривать как низкоуровневый инструмент (движок), а apt — как инструмент, более близкий к пользователю, обходящий ограничения первого. Эти инструменты работают совместно, каждый со своей спецификой, заточенный под определённый круг задач.
5.4.1. Установка пакетов
dpkg — это, прежде всего, инструмент для установки уже доступных пакетов Debian (поскольку он ничего не загружает). Чтобы установить пакет, используется опция -i или —install .
Пример 5.2. Установка пакета при помощи dpkg
#dpkg -i man-db_2.9.4-2_amd64.deb(Reading database . 227466 files and directories currently installed.) Preparing to unpack man-db_2.9.4-2_amd64.deb . Unpacking man-db (2.9.4-2) over (2.8.5-2) . Setting up man-db (2.9.4-2) . Updating database of manual pages . man-db.service is a disabled or a static unit not running, not starting it. Processing triggers for mailcap (3.69) .
We can see the different steps performed by dpkg ; we know, thus, at what point any error may have occurred. The installation can also be effected in two stages: first unpacking, then configuration. apt takes advantage of this, limiting the number of calls to dpkg (since each call is costly, due to loading of the database in memory, especially the list of already installed files).
Пример 5.3. Раздельная распаковка и настройка
#dpkg --unpack man-db_2.9.4-2_amd64.deb(Reading database . 227466 files and directories currently installed.) Preparing to unpack man-db_2.9.4-2_amd64.deb . Unpacking man-db (2.9.4-2) over (2.9.4-2) . Processing triggers for mailcap (3.69) . #dpkg --configure man-dbSetting up man-db (2.9.4-2) . Updating database of manual pages . man-db.service is a disabled or a static unit not running, not starting it.
Иногда dpkg по той или иной причине не может установить пакет и возвращает ошибку; если пользователь даёт указание проигнорировать эту ошибку, будет выдано лишь предупреждение; для этого существуют различные опции —force-* . Команда dpkg —force-help , или документация этой команды, выдаст полный список таких опций. Самой частой ошибкой, с которой вам придётся рано или поздно столкнуться, является конфликт файлов. Когда пакет содержит файл, который уже установлен другим пакетом, dpkg откажется устанавливать его, и мы получим такое сообщение:
Распаковывается пакет libgdm (из файла . /libgdm_3.8.3-2_amd64.deb) … dpkg: ошибка при обработке параметра /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack): попытка перезаписать «/usr/bin/gdmflexiserver», который уже имеется в пакете gdm3 3.4.1-9
В этом случае, если вы считаете, что замена этого файла не представляет существенной опасности для стабильности вашей системы (зачастую это именно так), вы можете использовать опцию —force-overwrite , которая сообщит dpkg о необходимости проигнорировать эту ошибку и перезаписать файл.
While there are many available —force-* options, only —force-overwrite is likely to be used regularly. These options only exist for exceptional situations, rarely encountered in Debian Stable . It is better to leave them alone as much as possible in order to respect the rules imposed by the packaging mechanism. Do not forget, these rules ensure the consistency and stability of your system.
ВНИМАНИЕ Эффективное использование —force-*
Если вы не будете осторожны, использование опции —force-* может привести к тому, что команды APT перестанут работать. Некоторые из этих опций позволяют установить пакет с неудовлетворёнными зависимостями или при наличии конфликта. В результате согласованность системы с точки зрения зависимостей нарушается, и команды APT откажутся выполнять какие-либо действия кроме тех, которые вернут систему в согласованное состояние (это обычно сводится к установке отсутствующей зависимости или удалению проблемного пакета). Вот пример сообщения, сигнализирующего о такой ошибке, которое получено после установки новой версии rdesktop с игнорированием зависимости от более новой версии libc6 :
#apt full-upgrade[. ] Возможно, для исправления этих ошибок вы захотите воспользоваться «apt-get -f install». Пакеты, имеющие неудовлетворённые зависимости: rdesktop: Зависит от: libc6 (>= 2.5) но 2.3.6.ds1-13etch7 уже установлен E: Неудовлетворённые зависимости. Попытайтесь использовать -f.
Бесстрашные администраторы, уверенные в правильности своего анализа ситуации, могут проигнорировать предупреждение о проблеме зависимостями или конфликте, используя соответствующую опцию —force-* . В этом случае, если необходимо продолжать использовать apt или aptitude , нужно отредактировать /var/lib/dpkg/status и удалить/изменить зависимость или конфликт.
This manipulation is an ugly hack, and should never be used, except in the most extreme case of necessity. Quite frequently, a more fitting solution is to recompile the package that is causing the problem (see Раздел 15.1, «Пересборка пакета из его исходного кода») or use a new version (potentially corrected) from a repository such as the stable-backports one (see Раздел 6.1.2.4, «Стабильное ПО с обратной совместимостью»).
5.4.2. Удаление пакета
Invoking dpkg with the -r or —remove option, followed by the name of a package, removes that package. This removal is, however, not complete: all of the configuration files, maintainer scripts, log files (system logs) and other user data handled by the package remain. That way disabling the program is easily done by uninstalling it, and it is still possible to quickly reinstall it with the same configuration. To completely remove everything associated with a package, use the -P or —purge option, followed by the package name.
Пример 5.4. Полное удаление пакета debian-cd
#dpkg -r debian-cd(Reading database . 228705 files and directories currently installed.) Removing debian-cd (3.1.35) . #dpkg -P debian-cd(Reading database . 228049 files and directories currently installed.) Purging configuration files for debian-cd (3.1.35) .
5.4.3. Запросы к базе данных dpkg и анализ файлов .deb
К ОСНОВАМ Синтаксис опций команд
Для большинста опций существуют «длинные» (одно или несколько слов, перед которыми ставится двойной дефис) и «короткие» варианты (одна буква, часто первая буква «длинного» варианта, после одного дефиса). Это соглашение так распространено, что уже является стандартом POSIX.
Before concluding this section, we will study dpkg options that query the internal database in order to obtain information. Giving first the long options and then corresponding short options (that will evidently take the same possible arguments) we cite
—listfiles package (or -L ), which lists the files installed by this package;
—search file (or -S ), which finds the package(s) containing the file;
—status package (or -s ), which displays the headers of an installed package;
—list (or -l ), which displays the list of packages known to the system and their installation status;
—contents file.deb (or -c ), which lists the files in the Debian package specified;
—info file.deb (or -I ), which displays the headers of this Debian package.
CAUTION dpkg —search and merged /usr
For various reasons, Debian now installs by default a few top-level directories as symlinks to their counterparts below /usr . For instance, /bin , /sbin and /lib are now symlinks to, respectively, /usr/bin , /usr/sbin and /usr/lib .
While this does provide desirable benefits, it can also be a source of confusion. For example, when you query dpkg which package is owning a given file, it will only be able to answer when you ask for its original path:
$dpkg --search /bin/mountmount: /bin/mount $dpkg --search /usr/bin/mountdpkg-query: no path found matching pattern /usr/bin/mount $dpkg --search /bin/aptdpkg-query: no path found matching pattern /bin/apt $dpkg --search /usr/bin/aptapt: /usr/bin/apt
This issue is currently tracked as bug #858331. There is also an ongoing discussion if the approach used so far is counterproductive.
Пример 5.5. Получение информации с помощью dpkg
$dpkg -L base-passwd/. /usr /usr/sbin /usr/sbin/update-passwd /usr/share /usr/share/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/man8/update-passwd.8.gz /usr/share/man/fr /usr/share/man/fr/man8 /usr/share/man/fr/man8/update-passwd.8.gz /usr/share/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/man8/update-passwd.8.gz /usr/share/man/pl /usr/share/man/pl/man8 /usr/share/man/pl/man8/update-passwd.8.gz /usr/share/man/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $dpkg -S /bin/datecoreutils: /bin/date $dpkg -s coreutilsPackage: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 17478 Maintainer: Michael Stone Architecture: amd64 Multi-Arch: foreign Source: coreutils (8.32-4) Version: 8.32-4+b1 Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.28), libgmp10, libselinux1 (>= 3.1~) Description: GNU core utilities This package contains the basic file, shell and text manipulation utilities which are expected to exist on every operating system. . Specifically, this package includes: arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false flock fmt fold groups head hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink users vdir wc who whoami yes Homepage: http://gnu.org/software/coreutils $dpkg -l 'b*'Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==========================-==============-============-================================== un backupninja (no description available) un backuppc (no description available) ii baloo-kf5 5.78.0-3 amd64 framework for searching and manag> un balsa (no description available) ii baobab 3.38.0-1 amd64 GNOME disk usage analyzer un base (no description available) un base-config (no description available) ii base-files 11.1 amd64 Debian base system miscellaneous > ii base-passwd 3.5.51 amd64 Debian base system master passwor> ii bash 5.1-2+b1 amd64 GNU Bourne Again SHell [..] $dpkg -c /var/cache/apt/archives/bash_5.1-3+b1_amd64.debdrwxr-xr-x root/root 0 2021-07-25 20:43 ./ drwxr-xr-x root/root 0 2021-07-25 20:43 ./bin/ -rwxr-xr-x root/root 1234376 2021-07-25 20:43 ./bin/bash drwxr-xr-x root/root 0 2021-07-25 20:43 ./etc/ -rw-r--r-- root/root 1994 2021-07-25 20:43 ./etc/bash.bashrc drwxr-xr-x root/root 0 2021-07-25 20:43 ./etc/skel/ -rw-r--r-- root/root 220 2021-07-25 20:43 ./etc/skel/.bash_logout -rw-r--r-- root/root 3526 2021-07-25 20:43 ./etc/skel/.bashrc -rw-r--r-- root/root 807 2021-07-25 20:43 ./etc/skel/.profile drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/ drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/bin/ -rwxr-xr-x root/root 6759 2021-07-25 20:43 ./usr/bin/bashbug -rwxr-xr-x root/root 14648 2021-07-25 20:43 ./usr/bin/clear_console drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/share/ drwxr-xr-x root/root 0 2021-07-25 20:43 ./usr/share/doc/ [..] $dpkg -I /var/cache/apt/archives/bash_5.1-3+b1_amd64.debnew Debian package, version 2.0. size 1416600 bytes: control archive=7256 bytes. 77 bytes, 4 lines conffiles 1030 bytes, 27 lines control 4511 bytes, 64 lines md5sums 603 bytes, 31 lines * postinst #!/bin/bash 500 bytes, 25 lines * postrm #!/bin/sh 14536 bytes, 33 lines * preinst 289 bytes, 22 lines * prerm #!/bin/bash Package: bash Source: bash (5.1-3) Version: 5.1-3+b1 Architecture: amd64 Essential: yes Maintainer: Matthias Klose Installed-Size: 6470 Pre-Depends: libc6 (>= 2.25), libtinfo6 (>= 6) Depends: base-files (>= 2.1.12), debianutils (>= 2.15) Recommends: bash-completion (>= 20060301-0) Suggests: bash-doc Conflicts: bash-completion (
УГЛУБЛЯЕМСЯ Сравнение версий
Так как dpkg является программой для работы с пакетами Debian, она, помимо всего прочего, содержит эталонную реализацию логики сравнения номеров версий. Поэтому у неё есть опция --compare-versions , используемая внешними программами (главным образом — сценариями настройки, запускаемыми самой dpkg ). Для этой опции требуются три параметра: номер версии, оператор сравнения и второй номер версии. Допустимые операторы сравнения — lt (строго меньше), le (меньше или равна), eq (равна), ne (не равна), ge (больше или равна), и gt (строго больше). Если сравнение верно, dpkg возвращает 0 (успех), если нет, то ненулевое значение (признак ошибки).
$dpkg --compare-versions 1.2-3 gt 1.1-4$echo $?0 $dpkg --compare-versions 1.2-3 lt 1.1-4$echo $?1 $dpkg --compare-versions 2.6.0pre3-1 lt 2.6.0-1$echo $?1
Обратите внимание на неожиданный сбой последнего сравнения: для dpkg буквы pre , обозначающие, как правило, предварительный выпуск, не имеет никакого особого значения, и буквенные символы сравниваются таким же образом, как и числа (a < b < c . ), в алфавитном порядке. Именно поэтому dpkg считает, что « 0pre3 » больше, чем « 0 ». При необходимости указать в номере версии, что она относится к предварительному выпуску, используется символ тильды « ~ »:
$dpkg --compare-versions 2.6.0~pre3-1 lt 2.6.0-1$echo $?0
5.4.4. Файл журнала dpkg
dpkg сохраняет журнал всех своих действий в /var/log/dpkg.log . Этот журнал чрезвычайно подробный: в нём задокументированы все этапы обработки пакетов dpkg . Этот журнал помогает не только отследить поведение dpkg, но и сохранить историю изменений в системе: можно найти точный момент, когда каждый пакет был установлен или обновлён, и эта информация может быть чрезвычайно полезной при выяснении причин изменения поведения системы в целом. Кроме того, ведётся запись информации обо всех версиях, и её легко сверить с changelog.Debian.gz из соответствующего пакета или с отчётами об ошибках онлайн.
5.4.5. Поддержка мультиархитектуры
Все пакеты Debian имеют поле Architecture в своих метаданных. Это поле может содержать либо значение « all » (для пакетов, которые не зависят от архитектуры), либо название конкретной архитектуры, для которой пакет предназначен (например «amd64», «armhf», …). В последнем случае dpkg по умолчанию допустит установку пакета только в том случае, если его архитектура соответствует архитектуре системы, возвращаемой dpkg --print-architecture .
Это ограничение гарантирует, что в системе не окажется двоичных файлов, скомпилированных для неправильной архитектуры. Всё было бы прекрасно, но на (некоторых) компьютерах можно запускать двоичные файлы для разных архитектур, нативно (к примеру, на системах «amd64» работают двоичные файлы для «i386») или через эмуляторы.
5.4.5.1. Включение мультиархитектуры
Поддержка мультиархитектуры dpkg позволяет определять «чужеродные архитектуры», которые могут быть установлены в данной системе. Это легко сделать с помощью dpkg --add-architecture , как показано в примере ниже. Существует и соответствующая команда dpkg --remove-architecture для отключения поддержки чужеродной архитектуры, но её можно использовать только в том случае, когда в системе не осталось ни одного пакета этой архитектуры.
#dpkg --print-architectureamd64 #dpkg --print-foreign-architectures#dpkg -i gcc-9-base_9.3.0-22_armhf.debdpkg: error processing archive gcc-9-base_9.3.0-22_armhf.deb (--install): package architecture (armhf) does not match system (amd64) Errors were encountered while processing: gcc-9-base_9.3.0-22_armhf.deb #dpkg --add-architecture armhf#dpkg --add-architecture armel#dpkg --print-foreign-architecturesarmhf armel #dpkg -i gcc-9-base_9.3.0-22_armhf.deb(Reading database . 456367 files and directories currently installed.) Preparing to unpack gcc-9-base_9.3.0-22_armhf.deb . Unpacking gcc-9-base:armhf (9.3.0-22) . Setting up gcc-9-base:armhf (9.3.0-22) . #dpkg --remove-architecture armhfdpkg: error: cannot remove architecture 'armhf' currently in use by the database #dpkg --remove-architecture armel#dpkg --print-foreign-architecturesarmhf
ЗАМЕТКА Поддержка мультиархитектуры в APT
APT will automatically detect when dpkg has been configured to support foreign architectures and will start downloading the corresponding Packages files during its update process.
Чужеродные пакеты можно установить при помощи команды apt install пакет:архитектура .
НА ПРАКТИКЕ Использование собственнических двоичных файлов i386 в системах amd64
There are multiple use cases for multi-arch, but the most popular ones are the possibility to execute (sometimes proprietary) 32 bit binaries (i386) on 64 bit systems (amd64), and the possibility to cross-compile software for a platform or an architecture different from the host one.
5.4.5.2. Изменения, связанные с мультиархитектурой
To make multi-arch actually useful and usable, libraries had to be repackaged and moved to an architecture-specific directory so that multiple copies (targeting different architectures) can be installed alongside. Such updated packages contain the “ Multi-Arch: same ” header field to tell the packaging system that the various architectures of the package can be safely co-installed (and that those packages can only satisfy dependencies of packages of the same architecture). The most important libraries have been converted since the introduction of multi-arch in Debian 7 Wheezy , but there are many libraries that will likely never be converted unless someone specifically requests it (through a bug report for example).
$dpkg -s gcc-9-basedpkg-query: error: --status needs a valid package name but 'gcc-9-base' is not: ambiguous package name 'gcc-9-base' with more than one installed instance Use --help for help about querying packages. $dpkg -s gcc-9-base:amd64 gcc-9-base:armhf | grep ^MultiMulti-Arch: same Multi-Arch: same $dpkg -L libgcc-s1:amd64 |grep .so/lib/x86_64-linux-gnu/libgcc_s.so.1 $dpkg -S /usr/share/doc/gcc-9-base/copyrightgcc-9-base:amd64, gcc-9-base:armhf: /usr/share/doc/gcc-9-base/copyright
Стоит отметить, что для пакетов с полем Multi-Arch: same следует указывать имена с названием архитектуры, чтобы их можно было однозначно идентифицировать. Они также могут иметь общие файлы с другими экземплярами того же пакета; dpkg в этом случае гарантирует, что все пакеты имеют бит-в-бит идентичные общие файлы. Все экземпляры пакета должны быть одной и той же версии, так что и обновляться они должны вместе.
Поддержка мультиархитектуры также привносит некоторые интересные особенности в механизм обработки зависимосей. Для удовлетворения зависимости требуется либо пакет, помеченный « Multi-Arch: foreign », или пакет с такой же архитектурой (при разрешении зависимости архитектуро-независимые пакеты считаются имеющими ту же архитектуру, что и система). Зависимость может также быть ослаблена, чтобы позволить пакету любой архитектуры удовлетворять её, с помощью синтаксиса пакет:any , но но чужеродные пакеты могут удовлетворять такую зависимость, только если они помечены « Multi-Arch: allowed ».
Dpkg i что это

5.4. Работа с пакетами при помощи dpkg
dpkg представляет собой основную программу в системе для работы с пакетами Debian. При наличии пакетов .deb именно dpkg позволяет их установить или проанализировать их содержимое. Однако эта программа имеет только частичное представление о мире Debian: она знает, что установлено в системе, а также всё, что передано ей в командной строке, но она ничего не знает о других доступных пакетах. Поэтому она завершится с ошибкой, если обнаружит неудовлетворённую зависимость. Такие инструменты как apt , напротив, автоматически создадут список зависимостей, чтобы установить всё по возможности автоматически.
ЗАМЕТКА dpkg или apt ?
dpkg стоит рассматривать как низкоуровневый инструмент (движок), а apt — как инструмент, более близкий к пользователю, обходящий ограничения первого. Эти инструменты работают совместно, каждый со своей спецификой, заточенный под определённый круг задач.
5.4.1. Установка пакетов
dpkg — это, прежде всего, инструмент для установки уже доступных пакетов Debian (поскольку он ничего не загружает). Чтобы установить пакет, используется опция -i или --install .
Пример 5.2. Установка пакета при помощи dpkg
#dpkg -i man-db_2.7.6.1-2_amd64.deb(Reading database . 110431 files and directories currently installed.) Preparing to unpack man-db_2.7.6.1-2_amd64.deb . Unpacking man-db (2.7.6.1-2) over (2.7.6.1-1) . Setting up man-db (2.7.6.1-2) . Updating database of manual pages . Processing triggers for mime-support (3.60) .
Мы можем видеть каждый этап, выполняемый dpkg , поэтому мы знаем, в каком месте могла произойти какая-либо ошибка. Установку также можно выполнить в два этапа: сперва распаковка, затем конфигурация. Благодаря этому apt-get делает меньше обращений к dpkg (каждый такой запрос является дорогостоящей операцией из-за необходимости загрузки в память базы данных, включая весь список уже установленных файлов).
Пример 5.3. Раздельная распаковка и настройка
#dpkg --unpack man-db_2.7.6.1-2_amd64.deb(Reading database . 110431 files and directories currently installed.) Preparing to unpack man-db_2.7.6.1-2_amd64.deb . Unpacking man-db (2.7.6.1-2) over (2.7.6.1-2) . Processing triggers for mime-support (3.60) . #dpkg --configure man-dbSetting up man-db (2.7.6.1-2) . Updating database of manual pages .
Иногда dpkg по той или иной причине не может установить пакет и возвращает ошибку; если пользователь даёт указание проигнорировать эту ошибку, будет выдано лишь предупреждение; для этого существуют различные опции --force-* . Команда dpkg --force-help , или документация этой команды, выдаст полный список таких опций. Самой частой ошибкой, с которой вам придётся рано или поздно столкнуться, является конфликт файлов. Когда пакет содержит файл, который уже установлен другим пакетом, dpkg откажется устанавливать его, и мы получим такое сообщение:
Распаковывается пакет libgdm (из файла . /libgdm_3.8.3-2_amd64.deb) … dpkg: ошибка при обработке параметра /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack): попытка перезаписать «/usr/bin/gdmflexiserver», который уже имеется в пакете gdm3 3.4.1-9
В этом случае, если вы считаете, что замена этого файла не представляет существенной опасности для стабильности вашей системы (зачастую это именно так), вы можете использовать опцию --force-overwrite , которая сообщит dpkg о необходимости проигнорировать эту ошибку и перезаписать файл.
Хотя есть много опций --force-* , только --force-overwrite рекомендуется для регулярного использования. Остальные предназначены только для исключительных случаев, и лучше не трогать их, пока это возможно, чтобы соблюдать правила, заложенные при создании пакета. Не забывайте, что эти правила являются гарантией целостности и стабильности системы.
ВНИМАНИЕ Эффективное использование --force-*
Если вы не будете осторожны, использование опции --force-* может привести к тому, что команды APT перестанут работать. Некоторые из этих опций позволяют установить пакет с неудовлетворёнными зависимостями или при наличии конфликта. В результате согласованность системы с точки зрения зависимостей нарушается, и команды APT откажутся выполнять какие-либо действия кроме тех, которые вернут систему в согласованное состояние (это обычно сводится к установке отсутствующей зависимости или удалению проблемного пакета). Вот пример сообщения, сигнализирующего о такой ошибке, которое получено после установки новой версии rdesktop с игнорированием зависимости от более новой версии libc6 :
#apt full-upgrade[. ] Возможно, для исправления этих ошибок вы захотите воспользоваться «apt-get -f install». Пакеты, имеющие неудовлетворённые зависимости: rdesktop: Зависит от: libc6 (>= 2.5) но 2.3.6.ds1-13etch7 уже установлен E: Неудовлетворённые зависимости. Попытайтесь использовать -f.
Бесстрашные администраторы, уверенные в правильности своего анализа ситуации, могут проигнорировать предупреждение о проблеме зависимостями или конфликте, используя соответствующую опцию --force-* . В этом случае, если необходимо продолжать использовать apt или aptitude , нужно отредактировать /var/lib/dpkg/status и удалить/изменить зависимость или конфликт.
5.4.2. Удаление пакета
Запуск dpkg с опцией -r или --remove , за которой следует имя пакета, приведет к удалению этого пакета. Это удаление, однако, не полное: все конфигурационные файлы, сценарии сопровождающего, файлы журналов (системные журналы) и другие пользовательские данные, используемые этим пакетом, останутся. Таким путём легко избавиться от программы, деинсталлировав её, но при этом сохраняется возможность установить её ещё раз с той же конфигурацией. Для полного удаления всего, связанного с пакетом, используется опция -P или --purge , сопровождающаяся именем пакета.
Пример 5.4. Полное удаление пакета debian-cd
#dpkg -r debian-cd(Reading database . 112188 files and directories currently installed.) Removing debian-cd (3.1.20) . #dpkg -P debian-cd(Reading database . 111613 files and directories currently installed.) Purging configuration files for debian-cd (3.1.20) .
5.4.3. Запросы к базе данных dpkg и анализ файлов .deb
К ОСНОВАМ Синтаксис опций команд
Для большинста опций существуют «длинные» (одно или несколько слов, перед которыми ставится двойной дефис) и «короткие» варианты (одна буква, часто первая буква «длинного» варианта, после одного дефиса). Это соглашение так распространено, что уже является стандартом POSIX.
Прежде чем завершить этот раздел, рассмотрим опции dpkg для запросов к внутренней базе данных для получения различной информации. При этом сперва будут указываться длинные, а затем соответствующие короткие опции (которые, разумеется, принимают те же самые аргументы). Так, --listfiles пакет (или -L ) выводит список файлов, установленых пакетом; --search файл (или -S ) ищет пакет, к которому относится этот файл; --status пакет (or -s ) выводит информацию о том или ином установленном пакете; --list (или -l ) показывает список пакетов, известных системе, и их статус; --contents file.deb (или -c ) показывает список файлов в этом пакете; --info file.deb (или -I ) показывает информацию о пакете Debian.
Пример 5.5. Получение информации с помощью dpkg
$dpkg -L base-passwd/. /usr /usr/sbin /usr/sbin/update-passwd /usr/share /usr/share/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/man8/update-passwd.8.gz /usr/share/man/fr /usr/share/man/fr/man8 /usr/share/man/fr/man8/update-passwd.8.gz /usr/share/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/man8/update-passwd.8.gz /usr/share/man/pl /usr/share/man/pl/man8 /usr/share/man/pl/man8/update-passwd.8.gz /usr/share/man/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $dpkg -S /bin/datecoreutils: /bin/date $dpkg -s coreutilsPackage: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 15103 Maintainer: Michael Stone Architecture: amd64 Multi-Arch: foreign Version: 8.26-3 Replaces: mktemp, realpath, timeout Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 2.1.13) Conflicts: timeout Description: GNU core utilities This package contains the basic file, shell and text manipulation utilities which are expected to exist on every operating system. . Specifically, this package includes: arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false flock fmt fold groups head hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink users vdir wc who whoami yes Homepage: http://gnu.org/software/coreutils $dpkg -l 'b*'Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-====================-===============-===============-============================================= un backupninja (no description available) un backuppc (no description available) un baekmuk-ttf (no description available) un base (no description available) un base-config (no description available) ii base-files 9.9+deb9u1 amd64 Debian base system miscellaneous files ii base-passwd 3.5.43 amd64 Debian base system master password and group ii bash 4.4-5 amd64 GNU Bourne Again SHell [. ] $dpkg -c /var/cache/apt/archives/gnupg_2.1.18-8~deb9u1_amd64.debdrwxr-xr-x root/root 0 2017-09-18 20:41 ./ drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/ drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/bin/ -rwxr-xr-x root/root 996648 2017-09-18 20:41 ./usr/bin/gpg -rwxr-xr-x root/root 3444 2017-09-18 20:41 ./usr/bin/gpg-zip -rwxr-xr-x root/root 161192 2017-09-18 20:41 ./usr/bin/gpgconf -rwxr-xr-x root/root 26696 2017-09-18 20:41 ./usr/bin/gpgparsemail -rwxr-xr-x root/root 76112 2017-09-18 20:41 ./usr/bin/gpgsplit -rwxr-xr-x root/root 158344 2017-09-18 20:41 ./usr/bin/kbxutil -rwxr-xr-x root/root 1081 2014-06-25 16:17 ./usr/bin/lspgpot -rwxr-xr-x root/root 2194 2017-09-18 20:41 ./usr/bin/migrate-pubring-from-classic-gpg -rwxr-xr-x root/root 14328 2017-09-18 20:41 ./usr/bin/watchgnupg drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/sbin/ -rwxr-xr-x root/root 3078 2017-09-18 20:41 ./usr/sbin/addgnupghome -rwxr-xr-x root/root 2219 2017-09-18 20:41 ./usr/sbin/applygnupgdefaults drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/share/ drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/share/doc/ drwxr-xr-x root/root 0 2017-09-18 20:41 ./usr/share/doc/gnupg/ -rw-r--r-- root/root 18964 2017-01-23 18:39 ./usr/share/doc/gnupg/DETAILS.gz [. ] $dpkg -I /var/cache/apt/archives/gnupg_2.1.18-8~deb9u1_amd64.debnew debian package, version 2.0. size 1124042 bytes: control archive=2221 bytes. 1388 bytes, 24 lines control 2764 bytes, 43 lines md5sums Package: gnupg Source: gnupg2 Version: 2.1.18-8~deb9u1 Architecture: amd64 Maintainer: Debian GnuPG Maintainers Installed-Size: 2088 Depends: gnupg-agent (= 2.1.18-8~deb9u1), libassuan0 (>= 2.0.1), libbz2-1.0, libc6 (>= 2.15), libgcrypt20 (>= 1.7.0), libgpg-error0 (>= 1.14), libksba8 (>= 1.3.4), libreadline7 (>= 6.0), libsqlite3-0 (>= 3.7.15), zlib1g (>= 1:1.1.4) Recommends: dirmngr (= 2.1.18-8~deb9u1), gnupg-l10n (= 2.1.18-8~deb9u1) Suggests: parcimonie, xloadimage Breaks: debsig-verify (
УГЛУБЛЯЕМСЯ Сравнение версий
Так как dpkg является программой для работы с пакетами Debian, она, помимо всего прочего, содержит эталонную реализацию логики сравнения номеров версий. Поэтому у неё есть опция --compare-versions , используемая внешними программами (главным образом — сценариями настройки, запускаемыми самой dpkg ). Для этой опции требуются три параметра: номер версии, оператор сравнения и второй номер версии. Допустимые операторы сравнения — lt (строго меньше), le (меньше или равна), eq (равна), ne (не равна), ge (больше или равна), и gt (строго больше). Если сравнение верно, dpkg возвращает 0 (успех), если нет, то ненулевое значение (признак ошибки).
$dpkg --compare-versions 1.2-3 gt 1.1-4$echo $?0 $dpkg --compare-versions 1.2-3 lt 1.1-4$echo $?1 $dpkg --compare-versions 2.6.0pre3-1 lt 2.6.0-1$echo $?1
Обратите внимание на неожиданный сбой последнего сравнения: для dpkg буквы pre , обозначающие, как правило, предварительный выпуск, не имеет никакого особого значения, и буквенные символы сравниваются таким же образом, как и числа (a < b < c . ), в алфавитном порядке. Именно поэтому dpkg считает, что « 0pre3 » больше, чем « 0 ». При необходимости указать в номере версии, что она относится к предварительному выпуску, используется символ тильды « ~ »:
$dpkg --compare-versions 2.6.0~pre3-1 lt 2.6.0-1$echo $?0
5.4.4. Файл журнала dpkg
dpkg сохраняет журнал всех своих действий в /var/log/dpkg.log . Этот журнал чрезвычайно подробный: в нём задокументированы все этапы обработки пакетов dpkg . Этот журнал помогает не только отследить поведение dpkg, но и сохранить историю изменений в системе: можно найти точный момент, когда каждый пакет был установлен или обновлён, и эта информация может быть чрезвычайно полезной при выяснении причин изменения поведения системы в целом. Кроме того, ведётся запись информации обо всех версиях, и её легко сверить с changelog.Debian.gz из соответствующего пакета или с отчётами об ошибках онлайн.
5.4.5. Поддержка мультиархитектуры
Все пакеты Debian имеют поле Architecture в своих метаданных. Это поле может содержать либо значение « all » (для пакетов, которые не зависят от архитектуры), либо название конкретной архитектуры, для которой пакет предназначен (например «amd64», «armhf», …). В последнем случае dpkg по умолчанию допустит установку пакета только в том случае, если его архитектура соответствует архитектуре системы, возвращаемой dpkg --print-architecture .
Это ограничение гарантирует, что в системе не окажется двоичных файлов, скомпилированных для неправильной архитектуры. Всё было бы прекрасно, но на (некоторых) компьютерах можно запускать двоичные файлы для разных архитектур, нативно (к примеру, на системах «amd64» работают двоичные файлы для «i386») или через эмуляторы.
5.4.5.1. Включение мультиархитектуры
Поддержка мультиархитектуры dpkg позволяет определять «чужеродные архитектуры», которые могут быть установлены в данной системе. Это легко сделать с помощью dpkg --add-architecture , как показано в примере ниже. Существует и соответствующая команда dpkg --remove-architecture для отключения поддержки чужеродной архитектуры, но её можно использовать только в том случае, когда в системе не осталось ни одного пакета этой архитектуры.
#dpkg --print-architectureamd64 #dpkg --print-foreign-architectures#dpkg -i gcc-6-base_6.3.0-18_armhf.debdpkg: error processing archive gcc-6-base_6.3.0-18_armhf.deb (--install): package architecture (armhf) does not match system (amd64) Errors were encountered while processing: gcc-6-base_6.3.0-18_armhf.deb #dpkg --add-architecture armhf#dpkg --add-architecture armel#dpkg --print-foreign-architecturesarmhf armel #dpkg -i gcc-6-base_6.3.0-18_armhf.debSelecting previously unselected package gcc-6-base:armhf. (Reading database . 112000 files and directories currently installed.) Preparing to unpack gcc-6-base_6.3.0-18_armhf.deb . Unpacking gcc-6-base:armhf (6.3.0-18) . Setting up gcc-6-base:armhf (6.3.0-18) . #dpkg --remove-architecture armhfdpkg: error: cannot remove architecture 'armhf' currently in use by the database #dpkg --remove-architecture armel#dpkg --print-foreign-architecturesarmhf
ЗАМЕТКА Поддержка мультиархитектуры в APT
APT автоматически определит, если dpkg будет настроен на поддержку чужеродных архитектур, и начнёт загрузку соответствующих файлов Packages в процессе обновления.
Чужеродные пакеты можно установить при помощи команды apt install пакет: архитектура .
НА ПРАКТИКЕ Использование собственнических двоичных файлов i386 в системах amd64
There are multiple use cases for multi-arch, but the most popular one is the possibility to execute 32 bit binaries (i386) on 64 bit systems (amd64).
5.4.5.2. Изменения, связанные с мультиархитектурой
To make multi-arch actually useful and usable, libraries had to be repackaged and moved to an architecture-specific directory so that multiple copies (targeting different architectures) can be installed alongside. Such updated packages contain the “ Multi-Arch: same ” header field to tell the packaging system that the various architectures of the package can be safely co-installed (and that those packages can only satisfy dependencies of packages of the same architecture). The most important libraries have been converted since the introduction of multi-arch in Debian Wheezy , but there are many libraries that will likely never be converted unless someone specifically requests it (through a bug report for example).
$dpkg -s gcc-6-basedpkg-query: error: --status needs a valid package name but 'gcc-6-base' is not: ambiguous package name 'gcc-6-base' with more than one installed instance Use --help for help about querying packages. $dpkg -s gcc-6-base:amd64 gcc-6-base:armhf | grep ^MultiMulti-Arch: same Multi-Arch: same $dpkg -L libgcc1:amd64 |grep .so/lib/x86_64-linux-gnu/libgcc_s.so.1 $dpkg -S /usr/share/doc/gcc-6-base/copyrightgcc-6-base:amd64, gcc-6-base:armhf: /usr/share/doc/gcc-6-base/copyright
Стоит отметить, что для пакетов с полем Multi-Arch: same следует указывать имена с названием архитектуры, чтобы их можно было однозначно идентифицировать. Они также могут иметь общие файлы с другими экземплярами того же пакета; dpkg в этом случае гарантирует, что все пакеты имеют бит-в-бит идентичные общие файлы. Все экземпляры пакета должны быть одной и той же версии, так что и обновляться они должны вместе.
Поддержка мультиархитектуры также привносит некоторые интересные особенности в механизм обработки зависимосей. Для удовлетворения зависимости требуется либо пакет, помеченный « Multi-Arch: foreign », или пакет с такой же архитектурой (при разрешении зависимости архитектуро-независимые пакеты считаются имеющими ту же архитектуру, что и система). Зависимость может также быть ослаблена, чтобы позволить пакету любой архитектуры удовлетворять её, с помощью синтаксиса пакет:any , но но чужеродные пакеты могут удовлетворять такую зависимость, только если они помечены « Multi-Arch: allowed ».
Dpkg i что это
ВНИМАНИЕ ВНИМАНИЕ ВНИМАНИЕ
Данное руководство было составлено неаккуратно, а теперь еще и устарело.
не нужно использовать для тех пакетов, где люди их устанавливающие хотят понимать как dpkg будет устанавливать их пакеты.
может быть полезно пользователям для понимания опций dpkg и состояний пакета в более подробном виде, чем это предоставляет вызов dpkg --help.
Описания же того что делает dpkg , когда устанавливает и удаляет пакеты частично неадекватно. Для подробной информации об этом обратитесь к Debian Packaging Guidelines, доступной под названием guidelines в системе GNU Info.
ОПИСАНИЕ
dpkg - это инструмент среднего уровня для инсталляции, построения, удаления и управления пакетами Debian GNU/Linux. Первичная и более дружественная облочка для dpkg - это dselect(8) параметры командной строки, которые включают одну или много опций и одно действие. Параметр-действие говорит dpkg что ему нужно сделать, а опции управляют выполнением действия.
dpkg может также использоваться как средство для работы с dpkg-deb. Действия -b , --build , -c , --contents , --I , --info , -f , --field , -e , --control , -x , --extract , -X , --vextract и --fsys-tarfile это действия dpkg-deb и если они встречаются, dpkg запускает dpkg-deb с параметрами указанными для dpkg. Читайте dpkg-deb(8)
для получения информации об этих действиях.
dpkg -i | --install . Установить заданный пакет. Если задается опция --recursive или -R , то вместо имя файла пакета должен быть указан каталог.
Установка состоит из следующих шагов:
1. Извлечение файлов управления из пакета. 2. Если другая версия этого пакета была установлена ранее, то запускается сценарий prerm для старого пакета. 3. Запускается сценарий preinst , если он есть в данном пакете. 4. Распаковываются файлы и в это же время происходит резервное сохранение старых файлов так что если что-либо пойдет не так, мы можем восстановить их. 5. Если другая версия данного пакета была установлена ранее, то запускаем сценарий postrm для старого пакета. Заметим, что этот сценарий запускается после сценария preinst нового пакета, потому что новые файлы пишутся в то же время, когда старые удаляются. 6. Настройка пакета. Смотрите --configure для более подробной информации об этом шаге.
Распаковать пакет, но не конфигурировать его. Если задана опция --recursive или --R , то вместо имя файла пакета должен быть указан каталог.
dpkg --configure . | -a|--pending Перенастроить распакованный пакет. Если вместо имя пакета задана опция -a или --pending , то все распакованные, но не настроенные пакеты будут настроены.
Настройка состоит из следующих шагов:
1. Распаковка конфигурационных файлов и в это же время сохранение старых кофигурационных файлов, так что мы можем восстановить их, если что-то пойдет не так. 2. Запуск сценария postinst, если он есть в данном пакете.
dpkg -r|--remove | --purge . | -a|--pending Удалить установленный пакет. --purge удаляет все,
с конфигурационными файлами. (конфигурационные файлы это те, что указаны в управляющем файле confiles ). Если вместо имя пакета задана опция -a или --pending, то все распакованные пакеты, но отмеченные к удалению или к очищению(purge) удаляются или очищаются (в файле /var/liba/dpkg/status ). Удаление пакета состоит из следующих шагов: 1. Запуск сценария prerm 2. Удаление установленных фалов 3. Запуск сценария postrm
dpkg -A | --avail . Обновить представление dpkg и dselect о тех пакетах, в которых доступна информация о пакете имя файла пакета. Если задана опция --recursive или --R, то вместо имя файла пакета должен быть указан каталог.
dpkg --update-avail | --merge-avail Обновить предстваление dpkg и dselect о тех пакетах, что доступны. С действием --merge-avail информация комбинируется из старой информации и файла Packages. С действием --update-avail старая информация заменяется на информацию из файла Pack_ a ges. Файл Packages распостраняется с Debian GNU/Linux и обычно называется Packages.
Ищет пакеты выбранные к установке, но которые по каким-либо причинам не были установлены.
dpkg -l|--list [ . ] Показывает пакеты соответствующие данному образцу. Если образец имени пакета не задан, показывает все пакеты в /var/lib/dpkg/avialable. В образце имени пакета можно указывать `*' и `?'.
Показывает файлы установленные в вашей системе из пакета c названием имя пакета. Однако заметим, что файлы созданные специальными сценариями данного пакета показаны не будут.
Ищет пакеты, что были установлены только частично. dpkg посоветует что делать с ними, чтобы заставить их работать.
dpkg -S|--search . Ищет имя файла по образцу в установленных пакетах. В образце допустимы символы `*' и `?'. (Для того чтобы отыскать какому пакету принадлежит файл. Прим. переводчика)
Выводит состояние заданного пакета. Это действие показывает информацию об установленном пакете из базы состояний пакетов.
Показвает небольшую подсказку.
Показывает лицензию на dpkg.
Показыает информацию о версии.
Смотрите dpkg-deb(8)
для более подробной информации об этих действиях.
dpkg -b|--build [] - Строит пакет Debian GNU/Linux.
dpkg -c|--contents - Показывает содержимое пакета GNU/Linux.
dpkg -e|--control [] Извлекает контрольную информацию из пакета. dpkg -x|--extract - Извлекает файлы содержащиеся в данном пакете. dpkg -f|--field [. ] - Показывает управляющее поле или поля пакета. dpkg --fsys-tarfile - Показывает файловую систему tar-файла, содержащегося в пакете Debian.
dpkg -I|--info [] Показывает информацию о даннои пакете.
dpkg -X|--vextract Извлекает и показывает имена файлов, содержащиеся в пакете.
-B | --auto-deconfigure
Если пакет удаляется, то возможно, что другой установленный пакет зависит от удаляемого пакета. Задание этой опции приведет к автоматической денастройке пакета, который зависит от удаляемого пакета.
Выдает помощь о опциях отладки
Включение отладки. octal - это восьмеричное число, сформированное побитно из битовых масок, указанных в списке ниже (заметим, что эти величины могут быть изменены в следующих версиях). Маска Описание
Основная полезная информация по ходу выполнения
Вызов и состояния сценариев обслуживания
Вывод по каждому файлу в ходе работы 100 Подробный вывод по каждому файлу в ходе работы
Вывод по каждому конфигурационному файлу
Подробный вывод по каждому конфигурационному файлу
Зависимости и конфликты
Подробное освещение зависимостей и конфликтов
Подробная ерунда о всяких dpkg/info каталогах
Включение или отказ (no-force и refuse состояния для тех же things) некоторых вещей для действий. things -это тот или иной модификатор из отдельного списка, приведенного ниже:
Установить пакет, даже если уже установлена его более новая версия.
Настроить также распакованные, но не настроенные пакеты, что зависят от текущего пакета.
Удалить пакет, даже если он побит и отмечен требованием к переустановке. Это может, например, привести к тому, что части пакета остануться в системе, а затем dpkg о них забудет.
hold: Не беспокоится, если пакет в состоянии hold или нет.
Удалить даже если пакет важен. Важные пакеты содержат базовые команды unix и все такое прочее. Удаление такого пакета может привести к останову работы системы, так что используйте данную опцию с осторожностью.
Установит, даже если пакет конфликтует с другими. Это опасно, так как обычно приводит к перезаписи некоторых файлов.
Удалить, даже если другой пакет зависит от этого. Это обычно приводит к побитости другого пакета.
Не беспокоится о версиях, когда проверяются зависимости. Это обычно приводит к побитости другого пакета.
Модификаторы помеченные (*) включены по умолчанию.
эти опции рекомендуется использовать только экспертам. Их использование без полного понимания их эффекта может разрушить вашу систему.
Игнорировать проверку зависимостей для заданных пакетов (тем не менее, проверка выполняется, но выдаются только предупреждения о конфликтах и ничего в других случаях).
Говорит dpkg чтобы он сохранял память или использовал ее как понадобится.
Выбирает новый или старый формат пакета. Это опция dpkg-deb(8)
Не читать или проверять содержимое файла управления пока строится пакет. Это опция dpkg-deb(8)
Делать все, что необходимо, но не записывать любые изменения. Это используется для просмотра, выполнения заданных действий без модифицирования чего-либо.
Убедитесь что задали --no-act перед действием параметром или вы
можете закончить с непредсказуемыми результатами. (т.е. dpkg --purge foo --no-act сперва выполнит очистку пакета foo и затем будет пытаться выполнить очистку пакета --no-act, несмотря на то, что вы ожидали, что действий никаких не будет)
Рекурсивное управление всеми файлами, отвечающими шаблону *.deb, которые были найдены в заданных каталогах и во всех их подкаталогах. Это может быть использовано с действиями -i, -A, --install, --unpack, --avail.
Не устанавливать пакет, если новая версия такого же пакета уже установлена.
Изменяет директории по умолчанию. admindir по умолчанию в /var/lib/dpkg и содержит много файлов, в которых дается информация о состояниях установленных или деустановленных пакетах и т.д. instdir по умолчанию / и указывает каталог, где пакеты будут инсталлированы. instdir - это также каталог установленный chroot(2)
перед запуском сценария установки пакета, который говорит сценарию рассматривать instdir как главный каталог. Chdir изменяет instdir на dir и admindir на /var/lib/dpkg.
Работать только с пакетами, что выбраны к установке. Данная пометка делается с помощью dse lect или dpkg, когда он управляет пакетами. Когда, например пакет удаляется, он будет помечен к инсталляции и т.д.
Не устанавливать пакет, если таже версия этого пакетв уже установлена.
ИНФОРМАЦИЯ О ПАКЕТАХ
dpkg обслуживает некоторую полезную информацию о доступных пакетах. Эта информация делится на три класса: состояния, состояния выборки и флаги. Эти величины могут быть изменены с помощью dselect.
installed
Пакет распакован и успешно настроен.
Установка пакета была запущена, но не закончена по какой-либо причине.
Пакет не установлен в вашей системе.
Пакет распакован, но не настроен.
Пакет распакован и настройка была запущена, но пока не завершена по какой-либо причине.
Только конфигурационные файлы пакета существуют в системе.
СОСТОЯНИЕ ВЫБОРКИ ПАКЕТА
Пакет выбран к установке.
Пакет выбран к деустановке (т.е. вы хотите удалить все файлы, исключая конфигурационные)
purge Пакет выбран к очистке (т.е. вы хотите удалить все, даже конфигурационные файлы)
hold Пакет помечен как hold и не управляется dpkg , пока включена опция --force-hold.
Пакет помечен reinst-requered, является битым и требует переустановки. Эти пакеты не могут быть удалены, пока включена опция --force-reinstreq.
Эти файлы даются здесь в их каталоге по умолчанию, см. опцию --admindir, чтобы изменить местоположение этих файлов.
Список доступных пакетов.
Состояния доступных пакетов. Этот файл содержит информацию о пакетах, помеченных к удалению или нет, установленных или нет и т.д. См. секцию ИНФОРМАЦИЯ О ПАКЕТАХ.
См. deb(5)
для информации о этом файле.
dpkg. См. deb(5)
для информации о этом файле.
См. deb(5)
для информации о этом файле.
См. deb(5)
для информации о этом файле.
prerm См. deb(5)
для информации о этом файле.
postrm См. deb(5)
для информации о этом файле.
DPKG_NO_TSTP Определяется для чего-то, если вы предпочитаете, dpkg запускается с новым shell скорее чем приостанавливается dpkg, который в это время выходит из shell.
SHELL Программа dpkg будет запущена в то время как запускается новый shell.
СМ. ТАКЖЕ
deb(5)
, dpkg-deb(8)
, dselect(8)
and deb-control(5)
ОШИБКИ
--no-act обычно дает меньше информации, чем нужно.
АВТОР(Ы)
dpkg написал Ian Jackson (ian@chiark.chu.cam.ac.uk). Страницы руководства добавил Juho Vuori (javuori@cc.helsinki.fi). Перевел с английского Виктор Вислобоков (2:5054/8.34@FidoNet)