pacman (Русский)

From ArchWiki
Jump to: navigation, search

Описание
pacman - пакетный менеджер Arch Linux. Менеджеры пакетов используются для установки, обновления и удаления программного обеспечения. В данной статье рассматриваются основные приемы и советы по устранению неполадок.
Обзор
Packages in Arch Linux are built using makepkg and a custom build script for each package (known as a PKGBUILD). Once packaged, software can be installed and managed with pacman. PKGBUILDs for software in the official repositories are available from the ABS tree; thousands more are available from the (unsupported) Arch User Repository.
Дополнительно
Downgrading Packages (Русский)
Improve Pacman Performance (Русский)
pacman GUI Frontends (Русский)
pacman Rosetta
pacman Tips
Pacman package signing
FAQ_(Русский)#Управление_пакетами
pacman-key (Русский)
Pacnew and Pacsave Files
Полезные ссылки
libalpm(3) Manual Page
pacman(8) Manual Page
pacman.conf(5) Manual Page
repo-add(8) Manual Page

Система управления пакетами pacman является одной из основных особенностей Arch Linux. Он сочетает в себе простой формат бинарных пакетов и легкую в использовании систему сборки (смотрите Arch Build System и makepkg). Pacman позволяет пользователям с легкостью управлять и настраивать под себя пакеты, вне зависимости от того, из официального ли они репозитория Arch или собраны самостоятельно.

Pacman, синхронизируя пакеты с главным сервером, поддерживает систему в актуальном состоянии. Такая клиент-серверная модель позволяет скачивать/устанавливать пакеты со всеми требуемыми зависимостями всего одной командой.

Pacman написан на языке C и использует формат пакетов .pkg.tar.xz.

Tip: Официальный пакет pacman включает в себя много дополнительных полезных инструментов, таких как makepkg, pactree, vercmp и другие. Весь перечень можно получить с помощью pacman -Ql pacman | grep bin

Contents

Конфигурация

Основные настройки pacman находятся в /etc/pacman.conf. В этом файле пользователь может указать все нужные ему настройки программы. Подробнее о конфигурировании можно прочесть в man pacman.conf.

Есть пасхалка: при добавлении в # Misc options параметра ILoveCandy скучные решетки превращаются в пакмена и точки, которые он ест :D

Основные параметры

Основные параметры находятся в секции [options]. Для получения дополнительной информации о параметрах прочтите страницу man или изучите установленный по умолчанию файл pacman.conf.

Пропуск обновления пакетов

Для пропуска обновления какого-либо пакета добавьте его название в строку:

IgnorePkg=имя_пакета

В случае, если необходимо в строке IgnorePkg перечислить несколько пакетов, разделяйте их имена пробелами:

IgnorePkg=имя_пакета1 имя_пакета2 имя_пакета3

Пропуск обновления группы пакетов

Как и в случае с пакетом, вы также можете запретить обновления группы пакетов, например так:

IgnoreGroup=имя_группы

Игнорирование установки файлов в систему

Для пропуска каталогов, в которые должны будут устанавливаться файлы, перечислите эти каталоги в NoExtract. Например, для игнорирования установки юнитов systemd:

NoExtract=usr/lib/systemd/system/*

Репозитории

В этом разделе файла pacman.conf указываются репозитории, которые будут использоваться. Их можно указать прямо здесь или подключить из другого файла.

Все официальные репозитории перечислены в одном файле - /etc/pacman.d/mirrorlist, для доступа к ним используется переменная $repo; таким образом достаточно поддерживать в актуальном состоянии только один список.

Далее приведен пример использования зеркал официальных репозиториев, которые перечислены в /etc/pacman.d/mirrorlist.


#[testing]
#SigLevel = PackageRequired	
#Include = /etc/pacman.d/mirrorlist

[core]
#SigLevel = PackageRequired
Include=/etc/pacman.d/mirrorlist

[extra]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist
	
#[community-testing]
#SigLevel = PackageRequired
#Include = /etc/pacman.d/mirrorlist

[community]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist

#Если в вашей x86_64 системе необходимо запускать 32-битные программы,
#раскоментируйте нужные multilib репозитории.

#[multilib-testing]
#SigLevel = PackageRequired
#Include = /etc/pacman.d/mirrorlist

[multilib]
#SigLevel = PackageOptional
Include = /etc/pacman.d/mirrorlist

# Использование собственного репозитория. Обратитесь к справочной странице pacman для
# получения дополнительной информации по созданию собственных репозиториев.
	
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
Warning: Будьте осторожны при использовании репозитория [testing]. Пакеты в нём активно разрабатываются и обновляются, это может сказаться на стабильности и работоспособности других пакетов или системы в целом. Людям, использующим репозиторий [testing], для своевременного получения информации рекомендуется подписаться на список рассылки arch-dev-public.

Безопасность пакетов

В Pacman 4 реализован дополнительный уровень безопасности устанавливаемых пакетов - подписи пакетов. Для включения проверки подписей перейдите сюда.

Использование

Чтобы узнать обо всех возможностях pacman, изучите man pacman. Примеры ниже - это только небольшая подборка доступных операций.

Установка пакетов

Установка определенных пакетов

Для установки одного пакета или группы пакетов (включая зависимости) используйте следующую команду:

# pacman -S имя_пакета1 имя_пакета2 ...

Если пакет имеет несколько версий в разных репозиториях (например в [extra] и [testing]), можно указать, откуда именно следует установить пакет:

# pacman -S extra/имя_пакета

Установка группы пакетов

Некоторые пакеты принадлежат к группе пакетов, которые могут быть установлены одновременно. Например, при выполнении команды:

# pacman -S gnome

будут установлены все пакеты, входящие в группу gnome. Чтобы увидеть список пакетов, принадлежащих к группе gnome, выполните:

# pacman -Sg gnome

Перечень доступных групп пакетов можно изучить, посетив https://www.archlinux.org/groups/.

Note: Если не будет использована опция --needed, то при установке группы будут переустановлены все ранее установленные в систему и принадлежащие этой группе пакеты (даже если установленные в системе пакеты будут иметь последнюю доступную версию).
Warning: При установке недостаточно одного обновления списка пакетов (например, pacman -Sy имя_пакета): могут возникнуть проблемы с зависимостями. Смотрите разделы [1] и Частичные обновления не поддерживаются. В первую очередь, перед установкой новых пакетов выполняйте полное обновление системы.

Удаление пакетов

Для удаления пакета без удаления установленных зависимостей:

# pacman -R имя_пакета

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

# pacman -Rs имя_пакета

Для удаления пакета, его зависимостей и всех пакетов, зависящих от целевого пакета:

Warning: Эта операция рекурсивна и должна использоваться с осторожностью, так как появляется риск удалить много потенциально необходимых пакетов.
# pacman -Rsc имя_пакета

Для удаления пакета, который требуется другому пакету, без удаления зависимого пакета:

# pacman -Rdd package_name

По умолчанию pacman создает резервные копии конфигурационных файлов удаляемых приложений с помощью добавления к ним расширения .pacsave. Если вы хотите удалить и эти файлы, используйте ключ -n:

# pacman -Rn имя_пакета
Note: pacman не удаляет конфигурационных файлов, созданных самими приложениями (например, "dot-файлы" в вашей домашней папке).

Обновление системы

pacman может обновить все пакеты системы одной командой. Количество пакетов зависит от того, насколько свежие пакеты стоят в вашей системе. Лучший вариант - синхронизация базы данных репозиториев И обновление вашей системы одной командой (не будут обновлены пакеты из 'локальных' и не настроенных репозиториев):

# pacman -Syu
Warning: В связи с тем, что Arch является постоянно обновляемым дистрибутивом, пользователям следует помнить, что после или в процессе обновления могут возникнуть непредвиденные трудности. Поэтому обновляться следует с осторожностью. Это означает, что если, например, ожидаются большие изменения или нововведения в обновляемых пакетах, то обновлять систему лучше тогда, когда у пользователя будет достаточно свободного времени и он будет готов к решению возможных проблем.

pacman является мощным инструментом по управлению пакетами, но он не сможет обработать все возможные ситуации. Если вас это смущает - прочтите Путь Arch Linux. Пользователь должен быть внимателен и сам заниматься обеспечением работоспособности своей системы. При выполнении обновления системы крайне важно читать и осмысливать всю информацию, которую выводит pacman. Если вы изменяли конфигурационный файл, то при обновлении, во избежание перезаписи, будет создан новый конфигурационный файл .pacnew. pacman предложит объединить его с вашим конфигурационным файлом. Выполнять объединение файлов придется вручную и, лучше всего, сразу после обновления. Для получения дополнительной информации обратитесь к руководству Pacnew and Pacsave Files.

Tip: Не забывайте, что вывод pacman заносится в /var/log/pacman.log.

Перед обновлением желательно посетить главную страницу Arch Linux, главную страницу русскоязычного сообщества Arch Linux и проверить там последние новости (или подписаться на канал RSS): для обновлений, требующих дополнительного вмешательства (если выполнения указанных pacman-ом действий не достаточно), будут добавлены соответствующие новости.

Если решить проблемы согласно инструкциям не удаётся, поищите подобные сообщения на форуме. Вполне возможно, что другие пользователи, столкнувшиеся с подобными проблемами, уже предоставили варианты по их решению.

Запросы к базе данных пакетов

pacman с помощью флага -Q может искать пакеты в локальной базе данных; смотрите:

$ pacman -Q --help

и с помощью флага -S в базе данных (репозиториях); смотрите:

$ pacman -S --help

pacman умеет искать пакеты в базе данных как по названиям, так и по описаниям:

$ pacman -Ss условие1 условие2 ...

Поиск пакета по имени в базе данных (вывод без дополнительной информации):

$ pacman -Sqs  условие1 условие2 ...

Для поиска среди установленных пакетов:

$ pacman -Qs условие1 условие2 ...

Для отображения обширной информации о данном пакете:

$ pacman -Si имя_пакета

для установленных пакетов:

$ pacman -Qi имя_пакета

Использование сдвоенного флага -i позволит просмотреть список резервных копий файлов и список измененных файлов:

$ pacman -Qii имя_пакета

Для получения списка файлов установленного пакета:

$ pacman -Ql имя_пакета

Для получения списка файлов неустановленного пакета можно использовать утилиту pkgfile из состава пакета pkgtools или nosr, входящую в пакет nosr-git, который расположен в AUR (Русский).

Чтобы узнать, какому пакету принадлежит нужный файл:

$ pacman -Qo /путь/к/файлу/имя_файла

Для получения списка пакетов, которые больше не требуются как зависимости (пакеты, которые могут быть безопасно удалены или сироты):

$ pacman -Qdt

Для отображения зависимостей в виде дерева:

$ pactree имя_пакета

Для получения списка пакетов, которые зависят от вашего пакета, можно воспользоваться утилитой whoneeds из состава пакета pkgtools:

$ whoneeds имя_пакета

Получение списка установленных пакетов для быстрого восстановления системы

Хорошей практикой является сохранение списка всех установленных пакетов. Если ваша система "упала" и её сложно восстановить, pacman может легко переустановить эти пакеты.

Сначала сохраните в список пакеты (доступные в репозитории):

pacman -Qqe | grep -v "$(pacman -Qmq)" > pkglist

безопасная, но и более сложная альтернатива (во избежание удаления частичных совпадений):

comm -13 <(pacman -Qmq | sort) <(pacman -Qqe | sort) > pkglist

Сохраните этот файл на флешке или на другом носителе.

Скопируйте файл pkglist в новую систему, перейдите в эту папку. Для восстановления используйте команду:

pacman -S $(cat pkglist)

Получение списка файлов, не принадлежащих ни одному пакету

Если вы всегда хотите держать свою систему в чистоте и уважаете Путь Arch, вы должны иногда проверять файлы, отсутствующие в базе данных pacman. Эти файлы зачастую установлены сторонними приложениями с использованием ./configure; make; make install и т.п. Вы можете найти все эти установленные файлы (или симлинки), используя этот простой скрипт:

#!/bin/bash
time /usr/bin/pacman -Ql | cut -d ' ' -f 2- | sort -u > db.txt
time find /arch /bin /boot /etc /lib /opt /sbin /usr 2>/dev/null | while read i; do
	if [ ! -d "$i" ]; then
		echo "$i"
	fi;
done | sort -u > fs.txt
time comm -23 fs.txt db.txt > non-db.txt

#для проверки:
#cat non-db.txt | while read i; do pacman -Qo "$i" 2>&1; done | tee test.txt

Заметьте, все файлы, указанные в non-db.txt, НЕ БУДУТ удалены без подтверждения. Здесь могут находиться конфигурационные файлы, журналы и др. Используйте этот список только если знаете, что вы делаете.

Дополнительные команды

Обновление системы и установка списка пакетов (за одну операцию):

# pacman -Syu имя_пакета1 имя_пакета2 ...

Скачать пакет, но не устанавливать его:

# pacman -Sw имя_пакета

Установить локальный пакет (не из репозитория):

# pacman -U /путь/к/пакету/имя_пакета-version.pkg.tar.xz

Установить 'не локальный' пакет (не из репозитория):

# pacman -U http://www.example.com/repo/example.pkg.tar.xz

Удалить из кэша (/var/cache/pacman/pkg) неустановленные пакеты:

Warning: Будут удалены все пакеты из кэша. Поэтому, в случае возникновения проблем после обновлениий, появятся дополнительные трудности, связанные с откатом версий пакетов.
# pacman -Sc

Полная очистка кэша пакетов:

Warning: Будут удалены все пакеты из кэша. Выполняйте это только в том случае, если у вас всё нормально работает и вы уверены, что вам не понадобится откатывать какой-либо пакет.
# pacman -Scc
Tip: В качестве альтернативы ключам -Sc и -Scc можно использовать пакет Cacheclean, доступный в AUR. Это скрипт на python, который позволяет выборочно очищать кэш pacman'а от старых версий пакетов

Частичные обновления официально не поддерживаются

Arch Linux - постоянно обновляемый дистрибутив, и это значит, что в репозиториях всегда находятся новые версии библиотек. Разработчики и доверенные пользователи собирают пакеты для репозиториев с использованием этих библиотек. Для пакетов, установленных локально (например, пакеты из AUR), нужно самостоятельно решать вопрос с зависимостями согласно данным soname.

Именно поэтому частичное обновление не поддерживается. Не используйте pacman -Sy package или другие эквиваленты pacman -Sy и pacman -S package. Всегда перед установкой пакетов синхронизируйте репозитории и обновляйте систему полностью. По той же самой причине нужно быть осторожными при использовании IgnorePkg и IgnoreGroup.

Если после частичного обновления оказалось, что бинарные файлы не могут найти нужных версий библиотек и проблему невозможно "решить" созданием символической ссылки (библиотеки не имеют обратной совместимости), выполните pacman -Syu, как правило, этого будет достаточно для устранения проблемы.

Устранение проблем

Q: Мне нужно запустить pacman-key --init, но отсутствуют ssh / X или генераторы случайных чисел. Как мне получить энтропию?

A: Для решения проблемы нужно перемещать указатель мыши, нажимать на клавиатуре случайные кнопки или запустить дисковую активность, например, с помощью updatedb. Будьте терпеливы, процесс может затянуться на длительное время. При этом переход в другую консоль, по Alt+F2-6, временно работать не будет.

Q: Мне нужно запустить pacman-key --init через ssh. Как мне получить энтропию?

A: На целевой машине соберите и установите пакет rng-tools из AUR (Русский). Подключитесь через ssh и выполните следующие команды:
# sed -i 's/0/10/' /etc/conf.d/rngd
# rngd -f -r /dev/urandom &
# pacman-key --init

После успешного выполнения pacman-key просто остановите rngd и удалите пакет.

# killall rngd
# pacman -Rns rng-tools

Q: Pacman не находит PGP ключи для импорта и не обновляет пакеты. Как можно это исправить?

A: На самом деле проблема не в pacman. Проблема в сервере ключей, используемом по умолчанию. Измените сервер ключей на более надежный таким способом:
# sed -i '/keyserver/ s,keys.gnupg.net,pgp.mit.edu,' /etc/pacman.d/gnupg/gpg.conf
Pacman4 теперь готов к использованию.

Q: Обновление пакета XYZ сломало мою систему!

A: Arch Linux - передовой, постоянно обновляемый дистрибутив. Обновления для пакетов становятся доступными тогда, когда их посчитают достаточно стабильными для повседневного использования. Тем не менее, обновления иногда требуют вмешательства пользователя: может потребоваться обновление конфигурационных файлов, могут измениться дополнительные зависимости и т.д.

Запомните основное правило: не обновляйте систему "вслепую". Всегда внимательно изучайте список обновляемых пакетов. Обращайте внимание на обновление "критически важных" компонентов (linux, xorg-server и т.д.). Если такие пакеты есть, проверьте наличие новостей на https://www.archlinux.org/ и просмотрите последние сообщения на форуме, возможно, кто-то уже столкнулся с проблемами при обновлении.

Если известно/ожидается, что после обновления могут возникнуть проблемы, pacman выведет соответствующее сообщение. Если вы упустили какую-то информацию, которую вывел pacman, то её можно еще раз просмотреть в /var/log/pacman.log.

Теперь, если не было никаких предупреждений от pacman, отсутствуют соответствующие новости на https://www.archlinux.org/ и нет сообщений относительно обновлений на форуме, имеет смысл обратиться за помощью на форум, IRC-канал, или откатить пакет к работающей версии.

Перечитайте последний абзац.

Q: Я знаю, что для пакета ABC доступны обновления, но pacman сообщает мне, что система в актуальном состоянии!

A: Зеркала pacman синхронизируются не мгновенно. Иногда может пройти более 24 часов, прежде чем обновления станут доступны вам. В качестве решения можно посоветовать сменить зеркало. На MirrorStatus можно посмотреть состояние зеркал.

Q: При обновлении появляется сообщение об ошибке: "file exists in filesystem" ("файл существует в файловой системе")!

A: Дополнительно: Взято из https://bbs.archlinux.org/viewtopic.php?id=56373 у Misfit138.
error: could not prepare transaction
error: failed to commit transaction (conflicting files)
package: /path/to/file exists in filesystem
Errors occurred, no packages were upgraded.

Почему это происходит? pacman, при обнаружении конфликтующих файлов, по умолчанию не будет их перезаписывать автоматически. Это не ошибка, так сделано специально.

Вопрос решается тривиально. Сначала проверьте, не принадлежит ли файл другому пакету (pacman -Qo /path/to/file). Если принадлежит, создайте отчет об ошибке. Если проблемный файл не нужен другим пакетам, переименуйте его и перезапустите команду обновления. Если в дальнейшем проблем не возникнет, то старый файл можно удалить.

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

Информация о каждом установленном файле хранится в файле с метаданными пакета /var/lib/pacman/local/$package-$version/files. При повреждении этого файла (он может быть пустым или отсутствовать) во время обновления пакета и будет получена ошибка "file exists in filesystem" ("файл существует в файловой системе").

Обычно такие ошибки возникают во время установки или обновления всего лишь одного пакета, поэтому вместо ручного переименования или удаления конфликтующих файлов, принадлежащих данному пакету, выполните pacman -S --force $package. После этой команды pacman принудительно перезапишет эти файлы.

Никогда не запускайте pacman -Syu --force.

Q: При установке пакета я получаю сообщение об ошибке: "not found in sync db"

A: Для начала убедитесь, что пакет вообще существует (и вы нигде не опечатались!). Если пакет не существует, то проблема может быть в том, что ваша база пакетов не синхронизирована с репозиториями или репозитории неправильно настроены. Для принудительного обновления списка пакетов попробуйте выполнить pacman -Syy.

Q: pacman несколько раз обновляет один и тот же пакет!

A: Это может быть связано с дублированием записей в /var/lib/pacman/local/, К примеру, имеется два экземпляра linux. pacman -Qi выведет правильную версию, а pacman -Qu покажет её как устаревшую и, следовательно, требующую обновления.

Решение: удалить лишнюю запись из /var/lib/pacman/local/.

Note: pacman версии 3.4 в случае обнаружения повторяющихся записей должен вывести сообщение об ошибке.

Q: pacman сбоит при обновлении!

A: Если при попытке удаления, переустановки или обновления пакетов pacman падает с ошибкой "database write" ("записи в базу данных"):
  1. Загрузитесь, используя Arch live CD
  2. Смонтируйте корневую файловую систему
  3. Обновите базу данных pacman с помощью pacman -Syy
  4. Переустановите сломанный пакет через pacman -r /путь/к/корневому_разделу -S package

Q: Я установил программу, используя make install; теперь эти файлы не принадлежат ни одному из пакетов!

A: При обнаружении "конфликтующих файлов", чтобы их не перезаписывать вручную, можно использовать pacman с ключом --force (pacman -S --force). Почитайте pacman Tips#Identify files not owned by any package о скрипте, проверяющем файловую систему на наличие брошенных файлов.

Q: Мне нужен пакет с определенным файлом. Как узнать, какому пакету это файл принадлежит?

A: Установите pkgtools, в его состав входит pkgfile, использующий отдельную базу данных со всеми файлами и связанными с ними пакетами.

Q: pacman полностью неработоспособен! Как мне его переустановить?

A: Если pacman не работает и не получается его восстановить, скачайте вручную пакеты (openssl, libarchive и pacman) и распакуйте их в корневой раздел. Бинарный pacman будет восстановлен вместе с конфигурационным файлом по умолчанию. Затем, для поддержания целостности базы данных пакетов, переустановите скачанные пакеты стандартными средствами pacman. Дополнительную информацию и пример (устарел) скрипта, автоматизирующего этот процесс, можно найти в этом сообщении форума.

Q: После обновления системы получаю следующее сообщение об ошибке: "unable to find root device". После перезагрузки система не загружается.

A: Вероятно, при обновлении ядра "поломалась" initramfs (например, при использовании pacman с опцией --force). Для восстановления работоспособности выполните следующие действия.

Загрузитесь с Arch live-cd. После загрузки выполните:

# mkdir /mnt/arch
# mount /dev/sdaX /mnt/arch (ваш корневой раздел)
# cd /mnt/arch
# mount -t proc proc proc/
# mount -t sysfs sys sys/
# mount -o bind /dev dev/
# mount /dev/sdaX boot/ (ваш раздел /boot)
# chroot .
# pacman -Syu udev mkinitcpio
# mkinitcpio -p linux
Затем отмонтируйте смонтированные разделы и перезагрузитесь.

Смотрите также