Сразу к делу: лишние пакеты в Arch Linux это зависимости, которые остались после удаления программ и больше никому не нужны. Находит их команда pacman -Qdt, а удаляет связка pacman -Qtdq | pacman -Rns -. Опциональные зависимости (Optional Deps) это необязательные дополнения: без них пакет работает, но с ними получает лишние функции. Ниже разберу, как pacman хранит связи между пакетами и как безопасно чистить систему.
У любого пакета в Arch есть три типа связей с другими пакетами.
Без них пакет не запустится или соберётся неправильно. При установке pacman сам подтягивает их, спрашивать разрешения не нужно. Удалить такую зависимость тоже не выйдет, пока она нужна хоть одному пакету. Например, mpv тянет за собой библиотеки декодирования видео и аудио, а firefox тащит целый набор библиотек для рендеринга страниц.
Пакет работает и без них, но с ними получает дополнительные возможности. При установке pacman показывает их списком с коротким описанием. Классический пример: инструмент для скриншотов опционально тянет wl-clipboard, чтобы копировать снимок в буфер обмена Wayland. Или пакет для звука опционально предлагает alsa-utils для управления громкостью из консоли.
Опциональную зависимость можно поставить позже, отдельной командой. Ничего переустанавливать не нужно:
pacman -S <пакет> <опциональная-зависимость>
Нужны только на этапе сборки из исходников. Их описывают в 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/какой-то-файл
Сирота (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 нашёл поломку, переустанови проблемные пакеты. Как переустановить все пакеты разом, описано в статье «Переустановка всех пакетов».
Да. Значит, сирот нет: все зависимости нужны хотя бы одному пакету. Чистая система это хороший знак.
-R удаляет только сам пакет, зависимости и конфиги остаются. -Rns дополнительно убирает ненужные зависимости (-s) и конфигурационные файлы (-n). Для точечного удаления программы используй -Rns.
Можно, если не нужна функция, которую она добавляет. Но сначала проверь Required By: возможно, пакет нужен другой программе, и тогда он не опциональный, а обычная зависимость.
Переустанови пакет: pacman -S <пакет>. Чтобы не попадать в такую ситуацию, сначала прогони pacman -Rns --print и посмотри список. Если сомневаешься в пакете из списка, удали его отдельно.
Это указание читать список пакетов из стандартного ввода. Первая команда печатает имена сирот, вторая принимает их и удаляет.
Зависимости в Arch делятся на жёсткие, опциональные и сборочные. Жёсткие pacman ставит сам, опциональные добавляют функции по желанию, makedepends нужны только при сборке. Лишние пакеты находишь через pacman -Qtd, удаляешь через pacman -Qtdq | pacman -Rns -, а перед удалением конкретной программы смотришь список через pacman -Rns --print. Пара проверок раз в месяц, и система не обрастает мусором.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии