О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

24.07.2008

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

Citkit, 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

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

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

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

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

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

С размером матрицы шрифта также вопросов не возникает - в современных условиях приемлема только матрица 8x16 (то, что отмечено по умолчанию на рис. 6).

"И, наконец, - как говорит очередная информационная панель, - вам нужно выбрать используемую кодировку". Поскольку мы не живем ни в Сербии, ни в Македонии, и веяниям прогресса также не чужды, останавливаемся на UNICODE (рис. 7).

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

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

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