Управление deb-пакетами. Утилиты семейства APT: эпонимичный apt

Алексей Федорчук

Если пакет apt выступает эпонимом для всего семейства инструментария APT, то утилита apt, казалось бы, должна быть центральной в этом пакете. Однако это не так: появилась она недавно (1 апреля 2014 года), функционал её ограничен, и она по сей день имеет репутацию нестабильной. Кроме того, о ней не очень любят говорить вслух. Сказывается и путаница — с одноимённой утилитой, существующей только в реализации для Mint’ов (которая, впрочем, тоже не пользуется большой известностью).

Тем не менее, утилита apt выполняет все обиходные функции по управлению пакетами, обеспечиваемые утилитами apt-cache и apt-get. А в использовании она проще этой «сладкой парочки» уже хотя бы тем, что она одна и короткая. Кроме того, она у неё есть и некоторые дополнительные функции.

Что же касается мнения о нестабильности apt, оно основано предупреждении, предваряющем её действия:

WARNING: apt does not have a stable CLI interface yet.
Use with caution in scripts.

Каковое взывает лишь к острожности при использовании её в скриптах. В интерактивном же режиме, используя утилиту apt со дня её появления, я не обнаружил никаких «not have a stable». Разве что в дистрибутивах проекта Mint её использование связано с маленьким неудобством: вызывать её следует с указанием полного пути:

$ apt

Ибо в ответ на просто apt запустится команда /usr/locale/bin/apt — одноимённая реализация для Mint

В любом случае, запущенная без опций и аргументов, команда apt выводит краткий список своих внутренних команд, исчерпывающий, тем не менее, её возможности:

apt 1.0.9.8 для amd64 скомпилирован Apr 13 2015 12:50:11
Usage: apt [options] command

CLI for apt.
Basic commands: 
 list - list packages based on package names
 search - search in package descriptions
 show - show package details

 update - update list of available packages

 install - install packages
 remove  - remove packages

 upgrade - upgrade the system by installing/upgrading packages
 full-upgrade - upgrade the system by removing/installing/upgrading packages

 edit-sources - edit the source information file

Самая интересная команда из этого списка — первая. Данная без указания опций, она выведет список пакетов из всех подключённых для текущей архитектуры репозиториев, как установленных, так и доступных:

Listing…
0ad/stable 0.0.17-1 amd64
0ad-data/stable 0.0.17-1 all
0ad-data-common/stable 0.0.17-1 all
0ad-dbg/stable 0.0.17-1 amd64
...

Обращаю внимание на второй компонент каждой строки, следующий после слеша и имени пакета. Это — кодовое имя дистрибутива, содержащего пакет, то есть для Debian это может быть stable, testing или unstable, для Ubuntu — что-нибудь типа vivid или trusty, для Mint — betsy. Это пригодится нам, когда речь до установки пакетов.

Пакеты установленные, в том числе и установленные автоматически, будут помечены соответствующим образом:

...
zsh/stable,now 5.0.7-5 amd64 [installed]
zsh-common/stable,now 5.0.7-5 all [installed,automatic]

В этот же список попадут и пакеты, установленные помимо репозиториев, вручную, также получив соответствующую отметку:

$ apt list  G adobe-source
...
adobe-sourcecodepro-fonts/now 2.010-23.1 all [installed,local]
adobe-sourcehansans-fonts/now 1.002-5.1 all [installed,local]
adobe-sourcesanspro-fonts/now 2.010-18.22 all [installed,local]
adobe-sourceserifpro-fonts/now 1.014-6.22 all [installed,local]

Внутренняя команда list имеет три опции: --installed, --upgradable и --all-versions. Назанчение первых двух очевидно, а третья эквивалентна отсутствию опций (то есть подразумевается по умолчанию).

Внутренняя команда search предназначена для поиска пакетов, как и одноимённая субкоманда утилиты apt-cache. В отличие от последней, она, кроме имени пакета, номера версии и краткого описания, выводит также имя содержащей пакет ветки репозитория, и его статус:

$ apt search linux-image-liquorix
Sorting… Готово
Full Text Search… Готово
linux-image-liquorix-686/unstable 4.1-9 i386
  Linux image for liquorix on modern PCs

linux-image-liquorix-686-pae/unstable 4.1-9 i386
  Linux image for liquorix on modern PCs

linux-image-liquorix-amd64/unstable,now 4.1-9 amd64 [installed]
  Linux image for liquorix on 64-bit PCs
  

Различается вывод этих команд и визуально. Напомню, что во втором случае он выглядит так:

$ apt-cache search linux-image-liquorix
linux-image-liquorix-amd64 - Linux image for liquorix on 64-bit PCs
linux-image-liquorix-686 - Linux image for liquorix on modern PCs
linux-image-liquorix-686-pae - Linux image for liquorix on modern PCs

Казалось бы, мелочь? Однако мелочь эта, как вы скоро увидим, экономит немало времени при массовой установке или удалении пакетов в командной строке.

Следующая внутренняя команда, show, как и её тёзка из apt-cache, предназначена для вывода подробной информации и о пакете. И информация эта, как ни странно, будет практически идентичной, разве что в выводе apt show не указывается архитектура и отсутствуют контрольные суммы для пакета:

$ apt show zsh
Package: zsh
Version: 5.0.7-5
Installed-Size: 2 023 kB
Maintainer: Debian Zsh Maintainers 
Depends: zsh-common (= 5.0.7-5), libc6 (>= 2.15), libcap2 (>= 1:2.10), libtinfo5
Pre-Depends: dpkg (>= 1.17.14)
Recommends: libncursesw5 (>= 5.6+20070908), libpcre3 (>= 8.35)
Suggests: zsh-doc
Homepage: http://www.zsh.org/
Tag: devel::interpreter, implemented-in::c, interface::shell,
 network::client, protocol::ftp, role::program, scope::utility
Section: shells
Priority: optional
Download-Size: 700 kB
APT-Manual-Installed: yes
APT-Sources: http://ftp.by.debian.org/debian/ jessie/main amd64 Packages
Description: командная оболочка с большим набором возможностей
 Zsh — это командный интерпретатор UNIX (shell), используемый как
 интерактивная оболочка и как оболочка для интерпретатора командных
 сценариев. Из стандартных оболочек zsh наиболее близок к ksh, но
 содержит множество расширений. Zsh позволяет редактировать командную
 строку, имеет встроенную проверку правописания, программируемое дополнение
 команд, функции оболочки (с автозагрузкой), механизм истории и много
 других возможностей.

Тогда как в apt-cache show эти соответствующая информация имеется:

$ apt-cache show zsh
Package: zsh
Version: 5.0.7-5
Installed-Size: 1976
Maintainer: Debian Zsh Maintainers 
Architecture: amd64
Depends: zsh-common (= 5.0.7-5), libc6 (>= 2.15), libcap2 (>= 1:2.10), libtinfo5
Pre-Depends: dpkg (>= 1.17.14)
Recommends: libncursesw5 (>= 5.6+20070908), libpcre3 (>= 8.35)
Suggests: zsh-doc
Description-ru: командная оболочка с большим набором возможностей
 Zsh — это командный интерпретатор UNIX (shell), используемый как
 интерактивная оболочка и как оболочка для интерпретатора командных
 сценариев. Из стандартных оболочек zsh наиболее близок к ksh, но
 содержит множество расширений. Zsh позволяет редактировать командную
 строку, имеет встроенную проверку правописания, программируемое дополнение
 команд, функции оболочки (с автозагрузкой), механизм истории и много
 других возможностей.
Description-md5: a129d6b2d23d2d5d3a6b822d3f8f856d
Homepage: http://www.zsh.org/
Tag: devel::interpreter, implemented-in::c, interface::shell,
 network::client, protocol::ftp, role::program, scope::utility
Section: shells
Priority: optional
Filename: pool/main/z/zsh/zsh_5.0.7-5_amd64.deb
Size: 700050
MD5sum: 405400b13af8b9cbd44bdb57a50f0bb0
SHA1: 4c5eebd436b1175cb8bfd498ddb76dfd8abb163c
SHA256: 9dea36227c4c199bf36031e6e4f6e6ec4f32f454c2ae48c83149e97b74f6e5ce

Как и в случае apt-cache, для выполнения трёх описанных команд достаточно прав обычного пользователя. Все остальные команды, рассмотрение которых сейчас последует, требуют привилегий администратора, получаемых командой su в Debian’е или командой sudo — в Ubuntu и Mint.

Внутренние команды update и upgrade идентичны своим тёзкам из apt-cache, выполняя обновление локального кеша и пакетов системы. Команда full-upgrade — полный аналог dist-upgrade из утилиты apt-get.

Внутреняя команда install подобна тёзке из утилиты apt-get и обычно может использоваться точно так же. Различия начинаются, если в системе включены репозитории, содержащие пакеты с одинаковыми базовыми именами, например, различных веток или релизов дистрибутива Debian. При использовании apt-get для установки пакета из конкретной ветки необходимо задать репозиторий в явном виде, например:

# apt-get install -t experimental xfce4

Для apt же достаточно задать в качестве аргумента имя пакета так, как оно выводится командами list или search:

# apt install linux-image-liquorix-amd64/unstable

Такая форма аргумента не запрещается и в общем случае. Так что можно, не задумываясь о том, где кончается базовое имя пакета, можно всё делать через «мышиный» буфер — выделив имя в выводе двойным щелчком левой кнопки и вставив его в командную строку щелчком средней.

Описанная возможность очень полезна при установке пакетов, но воистину бесценна при массовом их удалении. Ибо выполняющая его внутренняя команда remove также во-всём подобна тёзке из apt-get, за исключением того, что воспринимает аргументы в той же форме, что и install из apt:
«»

$ sudo apt remove tcsh/stable

Важно помнить, что apt remove сохраняет в системе конфигурационные файлы, а аналога apt-get purge в утилите apt не предусмотрено.

Действие обеих команд, install, и remove, может быть инвертировано. Добавление минуса к имени пакета первой приведёт к удалению его:

$ sudo apt install tcsh-

А добавление плюса в аргументе второй — к установке:

$ sudo apt remove tcsh+

В обоих случаях придётся можно использовать только базовое имя, так что именем репозитория придётся пожертвовать. Но зато это удобно для сиюминутной установки случайно удалённого пакета, или удалению пакета, установленного «на поглядеть»: воответствующая команда просто извлекается из истории и плусуется или минусуется. Правда, фича эта не уникальна — в apt-get она существует, сколько я его помню.

Наконец, последняя из внутренних команд утилиты apt носит имя edit-sources и предназначена для редактирования файла описания репозиториев — /etc/apt/sources.list. Делает это она не сама по себе, а вызывая редактор, который выбирается при первом запуске:

$ sudo apt edit-sources

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/mcedit
  4. /usr/bin/vim.tiny

vi в реинкарнации vim.tiny.

В Mint'ах команда edit-sources практически бесполезна, репозитории в них описываются в совсем других файлах. Что и покажет команада

# apt edit-sources

открыв в редакторе такую строку:

#/etc/apt/sources.list

Но в Debian'е и Ubuntu она весьма востребована, например, при обновлении с релиза на релиз.

К сказанному мало что может добавить man-страница — разве что описание опций собственно команды apt. Их немного, и знакомство с ними я оставляю на произвол читаталя.

Сам же тем временем подведу итог. Из представленного рассмотрения следует, что утилита apt позволяет выполнять все каждодневные действия с пакетами (кроме purge, clean, autoremove и нескольких ещё более редких), интегрируя большинство возможностей apt-get и apt-cache. И потому пребывание её в безвестности можно объяснить только тем, что старые Debian'исты привыкли к последним (а то и к «чистому» dpkg), а молодые Ubuntu'йцы — к копированию команд с сайтов и блогов своих собратьев. И если в Mint'ах, ввиду наличия собственной тёзки, эпонимичный apt действительно кажется избыточным, то противопоказаний к применению его в Debian'е и Ubuntu я не вижу ни малейших.

Управление deb-пакетами. Утилиты семейства APT: эпонимичный apt: 2 комментария

  1. В дебиане уже не популярно писать все репы в /etc/apt/sources.list
    Принято создавать отдельные файлы в /etc/apt/sources.list.d/

  2. В большинстве deb based популярно, как Вы говорите, писать оф. репы в /etc/apt/sources.list
    А в /etc/apt/sources.list.d/ — дописывать репы неофициальные.
    Mint — исключение: он не пишет в /etc/apt/sources.list ничего.

Добавить комментарий