Все об Arch Linux

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

Зависимости pacman: опциональные, лишние, что удалится

Сразу к делу: лишние пакеты в Arch Linux это зависимости, которые остались после удаления программ и больше никому не нужны. Находит их команда pacman -Qdt, а удаляет связка pacman -Qtdq | pacman -Rns -. Опциональные зависимости (Optional Deps) это необязательные дополнения: без них пакет работает, но с ними получает лишние функции. Ниже разберу, как pacman хранит связи между пакетами и как безопасно чистить систему.

Какие зависимости бывают у пакета

У любого пакета в Arch есть три типа связей с другими пакетами.

Жёсткие зависимости

Без них пакет не запустится или соберётся неправильно. При установке pacman сам подтягивает их, спрашивать разрешения не нужно. Удалить такую зависимость тоже не выйдет, пока она нужна хоть одному пакету. Например, mpv тянет за собой библиотеки декодирования видео и аудио, а firefox тащит целый набор библиотек для рендеринга страниц.

Опциональные зависимости

Пакет работает и без них, но с ними получает дополнительные возможности. При установке pacman показывает их списком с коротким описанием. Классический пример: инструмент для скриншотов опционально тянет wl-clipboard, чтобы копировать снимок в буфер обмена Wayland. Или пакет для звука опционально предлагает alsa-utils для управления громкостью из консоли.

Опциональную зависимость можно поставить позже, отдельной командой. Ничего переустанавливать не нужно:

pacman -S <пакет> <опциональная-зависимость>

makedepends

Нужны только на этапе сборки из исходников. Их описывают в PKGBUILD, и в установленной системе pacman их не отслеживает. Если собрал пакет через makepkg, makedepends останутся висеть как обычные пакеты, пока не удалишь их вручную. Чаще всего это компиляторы, заголовочные файлы и утилиты сборки вроде cmake или meson.

При сборке из AUR помощник вроде yay подтянет makedepends сам. А при ручной сборке через makepkg их придётся ставить вручную, а после сборки удалять.

Как посмотреть зависимости конкретного пакета

За установленные пакеты отвечает команда pacman -Qi:

pacman -Qi mpv

В выводе ищи четыре поля:

  • Depends On: жёсткие зависимости.
  • Optional Deps: опциональные, каждое с описанием.
  • Required By: какие пакеты требуют этот пакет.
  • Optional For: для каких пакетов он опционален.

Там же есть поле Install Reason. Оно показывает, как пакет попал в систему: явно или как зависимость.

Для пакетов из репозиториев, которые ещё не установлены, работает pacman -Si. Там те же поля плюс размер, лицензия и описание. Так можно посмотреть, что потянет за собой программа, ещё до установки.

Если нужно только одно поле, не листай весь вывод. Отфильтруй его grep’ом:

pacman -Qi mpv | grep "Optional Deps"

Где pacman хранит эти данные? В локальной базе /var/lib/pacman/local. Каждый установленный пакет лежит там отдельным каталогом с файлом desc. Про устройство баз pacman читай в статье «Базы pacman: где лежат».

Полный разбор команд pacman есть в статье «pacman от А до Я».

Как посмотреть дерево зависимостей пакета

pacman -Qi показывает только прямые зависимости. А что тянет за собой каждая из них? Для этого есть pactree:

pactree mpv

Команда выведет всё дерево: сам пакет, его зависимости, зависимости зависимостей и так до самого низа. Дерево бывает большим, поэтому удобно смотреть только первый уровень:

pactree -d 1 mpv

Флаг -d 1 ограничивает глубину одним уровнем. Обратное дерево, то есть кто зависит от пакета, строится флагом -r:

pactree -r mpv

Так видно всех потребителей пакета. Это удобно перед удалением: если pactree -r показывает кого-то ещё, кроме тебя, пакет удалять рано.

Почему установлен этот пакет

Частый вопрос: «Я это не ставил, откуда оно взялось?» Ответ почти всегда один: это зависимость другой программы. Проверяется обратным поиском:

pacman -Qi <пакет> | grep "Required By"

Если поле пустое, пакет никто не требует. Дальше смотри, установлен ли он явно:

pacman -Qe | grep <пакет>

Если в списке явно установленных его нет, а Required By пустое, перед тобой сирота. Его можно удалять.

Обратная задача: узнать, какому пакету принадлежит файл. Например, нашёл странный бинарник в системе и хочешь понять, откуда он. Помогает pacman -Qo:

pacman -Qo /usr/bin/какой-то-файл

Команда покажет имя пакета, который владеет этим файлом. Флаг -q оставит только имя пакета без лишних слов:

pacman -Qo -q /usr/bin/какой-то-файл

Что такое лишние пакеты (orphans)

Сирота (orphan) это пакет, который поставили как зависимость, а потом программа, которой он был нужен, удалилась. Других потребителей у него нет, поэтому он висит мёртвым грузом. Больше всего сирот копится после удаления крупных программ: браузеров, офисных пакетов, окружений рабочего стола.

Найти всех сирот:

pacman -Qtd

Флаг -t отбирает пакеты, которые не требуются никому, -d оставляет только те, что установлены как зависимости. Добавь -q, чтобы получить только имена без версий:

pacman -Qtdq

Этот список удобно передавать дальше в удаление. Про то, какие пакеты вообще занимают больше всего места, читай в статье «Какие пакеты занимают место».

Перед массовым удалением пробегись по списку глазами. Иногда сирота оказывается полезным: например, ты ставил пакет как зависимость, а потом привык пользоваться им напрямую. В таком случае переведи его в явно установленные:

pacman -D --asexplicit <пакет>

После этого pacman перестанет считать его сиротой.

Как удалить пакет вместе с зависимостями

Обычный pacman -R <пакет> удаляет только сам пакет. Его зависимости остаются и со временем превращаются в сирот. Чтобы убрать всё разом, используй -Rns:

pacman -Rns <пакет>

Разбор флагов:

  • -R: удалить пакет.
  • -s: удалить заодно зависимости, которые больше никому не нужны.
  • -n: не сохранять конфигурационные файлы пакета.

Перед удалением полезно посмотреть, что именно уйдёт. Команда --print (короткая форма -p) показывает список без изменений в системе:

pacman -Rns --print <пакет>

Так ты заранее увидишь, не зацепит ли удаление что-то нужное.

Удаление всех сирот одной командой:

pacman -Qtdq | pacman -Rns -

Тире в конце означает «читать список пакетов из стандартного ввода». Команда удалит каждый пакет из списка вместе с его ненужными зависимостями и конфигами.

После такой чистки стоит заглянуть и в кеш пакетов: там копятся старые версии, которые уже никто не использует. Как почистить кеш через paccache, описано в статье «Чистка кеша пакетов paccache». А если нужно вернуть конкретную старую версию пакета из кеша, смотри статью «Установка конкретной версии из кеша».

Что делать, если пакет не удаляется

pacman откажется удалять пакет, если на нём висит другая программа. Ошибка будет примерно такой: cannot remove "X" due to "Y". Это защита, а не баг: удалив пакет силой, ты сломаешь того, кто его требует.

Сначала разберись, кто требует пакет:

pacman -Qi <пакет> | grep "Required By"

Если это старая программа, которую ты больше не используешь, удали сначала её:

pacman -Rns <программа>

Флаг -c удаляет пакет вместе с теми, кто от него зависит:

pacman -Rc <пакет>

Он спросит подтверждение и покажет полный список. А вот -Rdd (удалить, игнорируя зависимости) используй только в крайнем случае. Он снимает пакет, не спрашивая никого, и легко ломает систему. После такого всегда проверяй целостность:

pacman -Dk

Как отличить явно установленные пакеты от зависимостей

Три команды делят все установленные пакеты на группы:

pacman -Qe    # установлены явно, тобой
pacman -Qd    # установлены как зависимости
pacman -Qm    # иностранные: из AUR или собранные вручную

-Qe полезно для переноса системы на другую машину: список явно установленных пакетов можно сохранить и развернуть заново. -Qm показывает всё, что не из официальных репозиториев, включая пакеты из AUR.

Сохранить список явно установленных пакетов в файл:

pacman -Qqe > ~/packages.txt

Потом на новой системе развернуть его обратно:

pacman -S - < ~/packages.txt

Про полный перенос списка пакетов, включая пакеты из AUR, читай в статье «Экспорт списка пакетов pacman».

Как найти пакет по файлу из репозитория

pacman -Qo ищет только среди установленных пакетов. А если файла в системе ещё нет, но он есть в каком-то пакете репозитория? Для этого нужна база файлов:

pacman -Fy

Команда скачает базу файлов всех пакетов репозиториев. После этого поиск по файлу:

pacman -F /usr/bin/какой-то-файл

Так можно узнать, в каком пакете лежит нужный бинарник, ещё до установки. Удобно, когда собираешь программу и не хватает какой-то утилиты.

Что ломается при частичном обновлении

Зависимости это главная причина, почему частичное обновление в Arch запрещено. Если обновить только часть пакетов, версии библиотек разъедутся: одна программа получит новую библиотеку, другая останется на старой и начнёт требовать несуществующую версию. pacman откажется ставить или удалять пакеты, пока конфликт не разрешится.

Правило простое: обновляй систему целиком, командой pacman -Syu. Почему частичное обновление ломает систему и как выйти из такой ситуации, разобрано в статье «Частичное обновление в Arch». Если нужно временно заморозить версию конкретного пакета, делай это через IgnorePkg, а не через отказ от обновления остальных. Про заморозку версий читай в статье «Пин версий через IgnorePkg».

Если подозреваешь, что зависимости уже разъехались, проверь целостность:

pacman -Dk

Команда пройдётся по всем установленным пакетам и покажет, какие зависимости не удовлетворены. Если pacman нашёл поломку, переустанови проблемные пакеты. Как переустановить все пакеты разом, описано в статье «Переустановка всех пакетов».

Частые вопросы

pacman -Qtd ничего не показывает, это нормально?

Да. Значит, сирот нет: все зависимости нужны хотя бы одному пакету. Чистая система это хороший знак.

Чем -Rns отличается от обычного -R?

-R удаляет только сам пакет, зависимости и конфиги остаются. -Rns дополнительно убирает ненужные зависимости (-s) и конфигурационные файлы (-n). Для точечного удаления программы используй -Rns.

Можно ли удалить опциональную зависимость?

Можно, если не нужна функция, которую она добавляет. Но сначала проверь Required By: возможно, пакет нужен другой программе, и тогда он не опциональный, а обычная зависимость.

Что делать, если после удаления сирот что-то сломалось?

Переустанови пакет: pacman -S <пакет>. Чтобы не попадать в такую ситуацию, сначала прогони pacman -Rns --print и посмотри список. Если сомневаешься в пакете из списка, удали его отдельно.

Тире в команде pacman -Qtdq | pacman -Rns - это что?

Это указание читать список пакетов из стандартного ввода. Первая команда печатает имена сирот, вторая принимает их и удаляет.

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

Заключение

Зависимости в Arch делятся на жёсткие, опциональные и сборочные. Жёсткие pacman ставит сам, опциональные добавляют функции по желанию, makedepends нужны только при сборке. Лишние пакеты находишь через pacman -Qtd, удаляешь через pacman -Qtdq | pacman -Rns -, а перед удалением конкретной программы смотришь список через pacman -Rns --print. Пара проверок раз в месяц, и система не обрастает мусором.



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

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

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

Комментарии

Загрузка…

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

Telegram Max