Debian etc: семейство утилит dpkg

Алексей Федорчук
23 марта 2006 г

На фоне своих блистательных сородичей — семейства apt-get и программы aptitude, — утилиты dpkg, предназначенные для работы с единичными deb-пакетами, выглядят весьма скромно. Однако они

    • были исторически первым средством автоматического развертывания пакетов, учитывающим их зависимости,
    • лежат в фундаменте все надстраивающих их систем (apt, aptitude, synaptic, adept),
    • в ряде случаев являются наиболее простым средством для установки или удаления пакета, а
    • также получения информации о нем, и, наконец,

оказываются незаменимыми при реконфигурировании пакетов установленных.

Вообще, возможности утилит семейства (см. man (1) dpkg) очень широки, и потому заслуживают рассмотрения, хотя бы в минимально необходимом для пользователя объеме.

Наиболее употребимые утилиты семейства — следующие:

  • собственно dpkg — средство для установки и удаления программ;
  • dpkg-query — инструмент создания запросов к базе данных deb-пакетов;
  • dpkg-reconfigure — программа для настройки установленных пакетов.

А вообще это семейство включает в себя множество команд — полный их список можно получить с помощью командной конструкции

$ а /а/linux/dpkg* && а /а/sbin/dpkg*

и выглядит он следующим образом:

/usr/bin/dpkg                 /usr/bin/dpkg-gencontrol
/usr/bin/dpkg-architecture    /usr/bin/dpkg-name
/usr/bin/dpkg-buildpackage    /usr/bin/dpkg-parsechangelog
/usr/bin/dpkg-checkbuilddeps  /usr/bin/dpkg-query
/usr/bin/dpkg-deb             /usr/bin/dpkg-scanpackages
/usr/bin/dpkg-depcheck        /usr/bin/dpkg-scansources
/usr/bin/dpkg-distaddfile     /usr/bin/dpkg-shlibdeps
/usr/bin/dpkg-genbuilddeps    /usr/bin/dpkg-source
/usr/bin/dpkg-genchanges      /usr/bin/dpkg-split
/usr/sbin/dpkg-divert         /usr/sbin/dpkg-reconfigure
/usr/sbin/dpkg-preconfigure   /usr/sbin/dpkg-statoverride

Они входят в состав пакетов dpkg и dpkg-dev; первый, предназначенный для основных действий с бинарными пакетами, устанавливается по умолчанию в ходе первичной инсталляции и присутствует в любой (насколько мне известно) Debian-based системе; второй же, включающий утилиты для манипуляции с пакетами исходников, должен быть установлен дополнительно (или устанавливается как зависимость, например, при инсталляции пакета apt-build, о котором речь пойдет в одной из грядущих заметок).

Для начала рассмотрим установку пакетов. Итак, если нам необходимо установить единичный пакет, поступаем так:

$ dpkg -i path2/packagename.deb

и дело в шляпе — через считанные мгновения пакет packagename.deb будет установлен: это обеспечивает опция -i (от install) вслед за командой dpkg. Дабы в дальнейшем не повторяться, замечу, что все действия по установке и удалению пакетов требуют полномочий суперпользователя, приобретаемых временно командой su или, как это принято в Ubuntu и его дериватах, sudo.

Разумеется, успешной установка пакета будет только при соблюдении следующих условий:

  1. физическом наличии его в пределах досягаемости с локальной машины (на подключенной файловой системе, смонтированном компакт-диске или ином носителе);
  2. знании точного пути (path2) к нужному файлу пакета (имя его, кстати, также указывается полностью, в отличие от того, что мы увидим при использовании apt) или aptitude;
  3. отсутствии неудовлетворенных зависимостей.

Из первого условия следует, что dpkg удобно использовать при доустановке компонентов с инсталляционного CD/DVD (или установке заблаговременно скачанных пакетов). Второе условие самоочевидно. Ну а третье также выполнимо без особого труда: в случае нарушения зависимостей dpkg выдаст сообщение об ошибке с полным перечнем того, что нужно установить для ее устранения, причем в списке будут перечислены только обязательные зависимости. И достаточно все необходимые пакеты поместить в командную строку:

$ sudo dpkg -i path2/packagename1.deb ... path2/packagename#.deb

для того, чтобы они были установлены единой операцией (если, конечно, все эти пакеты имеются в наличии).

Другое часто требующееся применение команды dpkg — удаление ненужных пакетов. Это делается двояко: команда

$ sudo dpkg -r packagename

удалит пакет, но сохранит настроечные его файлы, а команда

$ sudo dpkg -P packagename

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

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

Следующая сфера деятельности команд семейства dpkg — получение информации о пакетах. Для уже установленных пакетов это проще всего сделать с помощью команды dpkg-query, требующей указания какого-либо из операторов действия и имени пакета в качестве аргумента. Операторы действия команды dpkg-query можно вывести так (поскольку получение информации о пакетах никак не влияет на систему в целом, необходимости в правах суперпользователя тут не возникает):

$ dpkg-query --help

Они следующие:

  • -s или --status — вывод детального статуса пакета, включающий:
    • имя пакета, собственно статус (установлен ли он) и приоритет;
    • секция репозитория, к которой пакета относится (например, editors — для текстовых редакторов, kde — для аудиоплейера amarok, и так далее);
    • размер пакета в установленном виде;
    • имя майнтайнера, архитектура, для которой пакет собран, и номер версии;
    • описание зависимостей и конфликтов;
    • краткое (в один абзац) описание пакета.
  • -p или --print-avail — практически то же самое, но в форме, приспособленной для печати;
  • -l или --list — тоже своего рода описание статуса, включающее сведения о том, установлен ли пакет, нуждается ли он в обновлении, нет ли ошибок в его настройке, и так далее;
  • -W или --show — просто вывод номера версии в форме:
     $ dpkg-query -W nano
    nano    1.3.8-2
  • -L или --listfiles — полный список файлов, относящихся к данному пакету, в форме:
     /.
    /etc
    /etc/nanorc
    /usr
    /usr/share
    /usr/share/doc
    /usr/share/doc/nano
    ...

    и так далее (пример для текстового редактора nano);

  • -S или --search — поиск пакета, к которому относится некий файл, указанный в качестве аргумента; может выполнить и обратную задачу — поиск всех файлов, принадлежащих данному пакету, вывод в этом случае оказывается аналогичным dpkg-query -L.

Повторю, что все сказанное о информации по пакетам, относится к пакетам уже установленным. Для получения же сведений о неустановленных пакетах удобнее использовать соответствующие инструменты из комплекта apt или aptitude.

Еще одна важная задача утилит dpkg — выполнение настройки отдельных, уже установленных, пакетов. Предназначенная для этого команда так и называется — dpkg-reconfigure, и запускается (от лица суперпользователя или посредством команды sudo) таким образом:

$ dpkg-reconfigure packagename

После этого вызывается диалоговая программа конфигурации — debconf, и ответы на серию более или менее тривиальных вопросов позволяют добиться желаемого результата. Каковы эти вопросы — зависит от настраиваемой программы. Чтобы получить представление о процессе, рассмотрим пример с реконфигурированием кириллического окружения в консоли, за которое отвечает пакет console-cyrillic (разумеется, перед настройкой он должен быть установлен). Правда, и без него консоль и в Debian, и во всех представителях семейства Ubuntu русифицирована вполне справно, но использование console-cyrillic позволяет использовать многие дополнительные возможности по сравнению с базовой кириллизацией.

Итак, в ответ на команду

$ dpkg-reconfigure console-cyrillic

последовательно вызывается серия диалоговых окон. Первое из них предлагает ввести список используемых (и нуждающихся в русификации) виртуальных терминалов, каковых по умолчанию шесть (и с умолчаниями вполне можно согласиться).

dpkg_ris01Далее идет выбор раскладки: и здесь можно придерживаться умолчального выбора — Русская с Win клавишами, других на просторах Руси, наверное, и не осталось.

dpkg_ris02Затем предлагается определить переключатель латиница/кириллица. Я — приверженец традиционного CapsLock, но — не тюрьма же народов! — выбор достаточно обширен, включая не только традиционный «подоконный» Alt+Shift, но даже и Win-клавиши (действительно, надо же прикрутить к ним хоть что-нибудь).dpkg_ris04

Следующая панель выбора — назначение временного переключателя между кириллической и латинской раскладками клавиатуры, действующего только на набор следующего символа (типичное его применение — ввести столь любимый соотечественниками символа бакса в русскоязычный текст). Тут я как раз и пользую одну из win-клавиш, остальные возможности приведены ниже:dpkg_ris03

После этого предлагается выбрать экранный шрифт. Их немало, но при локали UTF-8 всерьез следует рассматривать только Terminus Unicode жирный или Terminus Unicode Framebuffer — в зависимости от того, используется ли графическая консоль через линейный кадровый буфер, или нет.

dpkg_ris05С размером матрицы шрифта также вопросов не возникает — в современных условиях приемлема только матрица 8×16 — та, что отмечена по умолчанию:

dpkg_ris06«И, наконец, — как говорит очередная информационная панель, — вам нужно выбрать используемую кодировку». Поскольку мы не живем ни в Сербии, ни в Македонии, и веяниям прогресса также не чужды, останавливаемся на UNICODE:

dpkg_ris07Последний вопрос — установить настройку кириллицы в консоли при старте системы. С чем, очевидно, следует согласиться — иначе за каким таким зеленым все проделывалось? В любом случае — на этом реконфигурирование заканчивается, и возвращается приглашение командной строки.

dpkg_ris08Примерно так же выглядят диалоги при настройке любого пакета, в принципе предусматривающего реконфигурирование. Останавливаться на других примерах я не буду — мы итак очень удалились от основной темы настоящей заметки, рассмотрения возможностей утилит dpkg.

Хотя разговор о dpkg практически закончен. Конечно, я не затронул тут команд из пакета dpkg-dev, предназначенных для работы с пакетами исходников. Но, по моему скромному мнению, это не самый удобный набор инструментов для решения этой задачи.