Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Знакомство с 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 — подробности в разделе «Полезные ресурсы».

Полезные ресурсы

Заключение

pactree — маленькая утилита, которая отвечает на большой вопрос: откуда взялся пакет и что он тянет за собой. pactree <пакет> показывает дерево зависимостей, pactree -r <пакет> — обратное дерево, а флаги -d, -s, -u и -c делают вывод удобным под конкретную задачу. Держи её в голове, когда pacman приносит что-то неожиданное, — и система перестанет быть чёрным ящиком.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max