Работа с пакетами при помощи dpkg

dpkg - это базовая команда для работы с пакетами Debian .deb в системе.

DNF ничего не знает о других доступных пакетах и может поломать зависимости, он ничего не загружает и устанавливает только доступные пакеты. dpkg стоит рассматривать как низкоуровневый инструмент (движок), а apt — как инструмент, более близкий к пользователю, обходящий ограничения первого.

КомандаОписание
dpkg -i man-db_2.9.4-2_amd64.debустановка пакетов
dpkg –unpack man-db_2.9.4-2_amd64.debраспаковка пакета
dpkg –configure man-dbнастройка пакета
dpkg -r или –remove optionУдаление пакета. Конфигурационные файлы, логи, данные, скрипты останутся
dpkg -r debian-cdУдаление пакета debian-cd
dpkg -P debian-cdУдалиени конфигов

Иногда 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.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/mount mount: /bin/mount $ dpkg –search /usr/bin/mount dpkg-query: no path found matching pattern /usr/bin/mount $ dpkg –search /bin/apt dpkg-query: no path found matching pattern /bin/apt $ dpkg –search /usr/bin/apt apt: /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. → https://bugs.debian.org/858331 Пример 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/date coreutils: /bin/date $ dpkg -s coreutils Package: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 17478 Maintainer: Michael Stone mstone@debian.org 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

+++-

-==============-============-

un backupninja <none> <none> (no description available) un backuppc <none> <none> (no description available) ii baloo-kf5 5.78.0-3 amd64 framework for searching and manag> un balsa <none> <none> (no description available) ii baobab 3.38.0-1 amd64 GNOME disk usage analyzer un base <none> <none> (no description available) un base-config <none> <none> (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.deb drwxr-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.deb new 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 doko@debian.org 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 (« 20060301-0) Replaces: bash-completion (« 20060301-0), bash-doc (⇐ 2.05-1) Section: shells Priority: required Multi-Arch: foreign Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html Description: GNU Bourne Again SHell

Bash is an sh-compatible command language interpreter that executes
commands read from the standard input or from a file.  Bash also
incorporates useful features from the Korn and C shells (ksh and csh).
.
Bash is ultimately intended to be a conformant implementation of the
IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
.
The Programmable Completion Code, by Ian Macdonald, is now found in
the bash-completion package.

Сравнение версий

Так как 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-architecture amd64 # dpkg –print-foreign-architectures # dpkg -i gcc-9-base_9.3.0-22_armhf.deb dpkg: 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-architectures armhf 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 armhf dpkg: error: cannot remove architecture 'armhf' currently in use by the database # dpkg –remove-architecture armel # dpkg –print-foreign-architectures armhf ЗАМЕТКА Поддержка мультиархитектуры в 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-base dpkg-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 ^Multi Multi-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/copyright gcc-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».