Знакомство с pactree: граф зависимостей пакетов
pactree это утилита из пакета pacman-contrib, которая строит дерево зависимостей любого пакета в Arch Linux. Запусти pactree firefox, и увидишь весь список пакетов, которые тянет за собой Firefox, а pactree -r firefox покажет обратное дерево: кто зависит от Firefox. Это главный инструмент, когда нужно понять, почему в системе появился тот или иной пакет.
Что такое pactree
pactree входит в состав pacman-contrib, набора вспомогательных утилит для pacman. Проверь, установлен ли он:
pacman -Q pacman-contrib
Если пакета нет, поставь его:
sudo pacman -S pacman-contrib
pactree читает базу данных pacman и выводит зависимости пакета в виде дерева. Каждая строка это один пакет, а отступы показывают уровень вложенности. В отличие от pacman -Qi, который показывает только прямые зависимости, pactree раскрывает всю цепочку: зависимости зависимостей и так до самого низа.
Важная деталь: pactree работает не только с установленными пакетами. Он умеет читать базу репозиториев, поэтому может показать дерево зависимостей пакета, который ты ещё не ставил. Это удобно перед установкой: сразу видно, что потянется в систему.
Утилита пригодится в трёх случаях. Первый это отладка установки: что-то не работает, и нужно понять, какие библиотеки тянет пакет. Второй это выяснение происхождения пакета: откуда в системе взялся libfoo, который ты не ставил. Третий это планирование: перед установкой программы полезно посмотреть, сколько зависимостей она притащит и не раздует ли систему.
Как запустить pactree и прочитать дерево
Базовый запуск выглядит так:
pactree firefox
Вывод начинается с самого пакета, а ниже идут его зависимости. Первая строка это firefox, дальше gtk4, libx11, nss и так далее. Отступы показывают, какой пакет от какого зависит. Чем глубже уровень, тем дальше пакет от корня дерева.
Примерно так выглядит фрагмент вывода:
firefox
├─gtk4
│ ├─cairo
│ ├─gdk-pixbuf2
│ └─pango
├─libx11
└─nss
Символы ├─ и └─ это ветки дерева. Пакеты под gtk4 нужны самому gtk4, а не Firefox напрямую. Если убрать gtk4, Firefox не запустится, потому что без него не соберётся вся ветка ниже.
Полезный флаг -s выводит размер каждого пакета:
pactree -s firefox
Так сразу видно, какие зависимости занимают больше всего места. Флаг -c включает цвета, чтобы дерево читалось легче:
pactree -c firefox
Цвета особенно помогают в длинном выводе: глаза цепляются за уровни вложенности быстрее, чем за отступы.
Как ограничить глубину дерева флагом -d
Полное дерево Firefox это сотни строк. Если нужны только прямые зависимости, ограничь глубину:
pactree -d 1 firefox
-d 1 показывает только то, что тянет сам Firefox, без зависимостей зависимостей. -d 2 добавляет один уровень вложенности:
pactree -d 2 firefox
Глубина 1 это самый частый сценарий: так удобно смотреть, что именно тянет пакет напрямую, и искать лишнее. Глубина 2 нужна, когда прямые зависимости не объясняют картину и хочется заглянуть на уровень ниже.
Флаг -d работает и с обратным деревом, и с другими флагами. Например, pactree -d 1 -s firefox покажет прямые зависимости с размерами, а pactree -r -d 1 firefox покажет только тех, кто зависит от Firefox напрямую. Флаги свободно комбинируются, так что под любую задачу собирается своя команда.
Как узнать, кто зависит от пакета (флаг -r)
Обратное дерево показывает, какие пакеты зависят от выбранного. Это нужно, когда собираешься удалить пакет и хочешь понять, что сломается:
pactree -r firefox
Вывод покажет Firefox и всё, что от него зависит: например, firefox-i18n-ru, если ты ставил языковой пакет. Чем выше пакет в дереве, тем дальше он от корня. Флаг -r работает вместе с -d:
pactree -r -d 1 firefox
Так ты увидишь только тех, кто зависит от Firefox напрямую. Комбинация -r -d 1 это стандартный способ проверить, можно ли безопасно удалить пакет.
Как найти циклы зависимостей
Цикл это ситуация, когда пакет A зависит от B, B от C, а C снова от A. В нормальной системе циклы встречаются редко, но бывают, особенно после ручных правок или при сборке своих пакетов. Цикл мешает pacman корректно вычислить порядок установки и удаления.
Искать циклы удобно обратным деревом:
pactree -r -d 2 python
Если в выводе пакет повторяется на разных уровнях, перед тобой цикл. Например, python тянет python-setuptools, а тот в свою очередь зависит от python. Это нормальный цикл, pacman с ним справляется, но знать о нём полезно. При сборке своих пакетов циклы чаще становятся проблемой: makepkg может не собрать пакет, пока не разрешишь зависимость.
Как найти неудовлетворённые зависимости (флаг -u)
Флаг -u показывает только те зависимости, которых нет в системе. Обычно вывод пустой: pacman не даёт установить пакет без зависимостей. Но после частичного обновления или ручного удаления пакета в базе появляются дыры.
pactree -u firefox
Если команда что-то вывела, в системе не хватает пакетов, которые нужны Firefox. Чаще всего это следствие частичного обновления, когда часть пакетов обновилась, а часть осталась старой. Про то, почему так делать не стоит, читай в статье «Частичное обновление: ignorepkg».
Неудовлетворённые зависимости появляются и после ручного удаления пакета через pacman -Rdd, когда ты обходишь проверку зависимостей. В такой ситуации pactree -u покажет, что именно сломалось, и ты сможешь вернуть недостающий пакет обратно.
Как найти лишние и дублирующиеся зависимости
pactree помогает выяснить, почему в системе оказался пакет, который ты не ставил. Возьми подозрительный пакет и посмотри обратное дерево:
pactree -r <пакет>
Цепочка покажет, какая программа тянет его за собой. Если пакет больше не нужен никому, его можно удалить как сироту:
pacman -Qdt
Список пакетов, которые не нужны ни одному установленному пакету, кандидаты на удаление. Подробнее про опциональные и лишние зависимости читай в статье «Зависимости: опциональные и лишние».
Ещё один приём это сравнить дерево до и после установки. Запиши pactree -d 1 <пакет> до установки, потом после, и посмотри, что добавилось. Так легко заметить, что программа притащила лишнее, и решить, стоит ли она того.
Дубли в дереве это не ошибка. Один и тот же пакет может встречаться в разных ветках: например, glib2 нужен и gtk4, и pulseaudio. pactree показывает его в каждой ветке, потому что так устроено дерево. Это нормально, и удалять пакет из-за дубля не нужно. Вопрос только в том, нужен ли сам пакет, который тянет всю ветку.
Чем pactree отличается от pacman -Qi и pacman -Qdt
pacman -Qi <пакет> показывает прямые зависимости в поле Depends On и тех, кто зависит от пакета, в поле Required By. Но это плоский список без уровней вложенности. pactree раскрывает дерево целиком.
pacman -Qdt это фильтр сирот: пакеты, которые не нужны ни одному установленному пакету. pactree же показывает, почему пакет вообще попал в систему. Эти инструменты дополняют друг друга: pacman -Qdt находит кандидатов на удаление, а pactree -r объясняет, откуда взялся конкретный пакет.
Разница видна на примере. pacman -Qi firefox покажет в Depends On десяток прямых зависимостей. pactree firefox покажет те же пакеты плюс всё, что они тянут за собой, сотни строк. Для быстрой проверки хватает pacman -Qi, для полной картины нужен pactree.
Частые вопросы
pactree не установлен: что делать?
Поставь pacman-contrib:
sudo pacman -S pacman-contrib
Вместе с pactree придут checkupdates, rankmirrors и другие утилиты из набора. Проверить установку можно командой pacman -Q pacman-contrib.
Почему pactree показывает пакеты, которых нет в системе?
pactree работает с базой данных pacman и показывает зависимости, даже если пакет не установлен. Флаг -u оставляет только неудовлетворённые зависимости, те, которых не хватает:
pactree -u <пакет>
Это удобно при отладке сборки или переноса системы. Пустой вывод означает, что все зависимости на месте.
Как посмотреть зависимости пакета, который ещё не установлен?
pactree умеет работать с пакетами из репозиториев, даже если они не установлены. Просто передай имя пакета, pactree найдёт его в базе. Для пакетов из AUR это не сработает: их нет в базе pacman. В этом случае сначала собери и установи пакет, а потом смотри его дерево.
Что делать, если цикл зависимостей ломает обновление?
Если pacman застревает на вычислении зависимостей, проверь, какие пакеты образуют цикл, через pactree -r. Обычно помогает пересборка одного из пакетов цикла или временное удаление лишнего. Про зависшие обновления и способы их прервать читай в статье «pacman -Syu завис: как прервать». Если после прерывания обновления база осталась в странном состоянии, проверь целостность пакетов командой pacman -Qkk, подробности в разделе «Полезные ресурсы».
Полезные ресурсы
- pacman, ArchWiki: основная документация по менеджеру пакетов.
- Pacman/Tips and tricks, ArchWiki: полезные приёмы, включая работу с зависимостями.
- Команды pacman от А до Я: шпаргалка по всем командам менеджера пакетов.
- Проверка целостности: pacman -Qkk: как проверить, что файлы пакетов не повреждены.
Заключение
pactree это маленькая утилита, которая отвечает на большой вопрос: откуда взялся пакет и что он тянет за собой. pactree <пакет> показывает дерево зависимостей, pactree -r <пакет> показывает обратное дерево, а флаги -d, -s, -u и -c делают вывод удобным под конкретную задачу. Держи её в голове, когда pacman приносит что-то неожиданное, и система перестанет быть чёрным ящиком.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии