Pacman (Русский)/Restore local database (Русский)

From ArchWiki
Jump to navigation Jump to search

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Pacman/Restore local database. Дата последней синхронизации: 1 августа 2019. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Несколько признаков необходимости восстановления локальной базы данных pacman:

  • Команда pacman -Q ничего не выводит, а pacman -Syu ошибочно сообщает, что система обновлена.
  • Выводится список уже удовлетворённых зависимостей при попытке установить пакет с помощью pacman -S пакет.

Скорее всего, база данных pacman с установленными пакетами (/var/lib/pacman/local) была повреждена или удалена. Хотя это и серьёзная проблема, базу данных можно восстановить приведёнными ниже инструкциями.

Для начала убедитесь, что в системе присутствует лог-файл pacman:

$ ls /var/log/pacman.log

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

Создание списка пакетов для восстановления

Важно: Прежде чем продолжить, удалите пакеты для других архитектур, если они по какой-либо причине содержатся в кеше pacman или целевой директории пакетов makepkg.

Установите пакет pacutils, чтобы получить утилиту paclog.

Создайте скрипт фильтрации логов и сделайте его исполняемым:

pacrecover
#!/bin/bash -e

. /etc/makepkg.conf

PKGCACHE=$((grep -m 1 '^CacheDir' /etc/pacman.conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir = //')

pkgdirs=("$@" "$PKGDEST" "$PKGCACHE")

while read -r -a parampart; do
  pkgname="${parampart[0]}-${parampart[1]}-*.pkg.tar.xz"
  for pkgdir in ${pkgdirs[@]}; do
    pkgpath="$pkgdir"/$pkgname
    [ -f $pkgpath ] && { echo $pkgpath; break; };
  done || echo ${parampart[0]} 1>&2
done

Запустите скрипт (опционально передав в качестве параметров дополнительные директории с пакетами):

$ paclog --pkglist /var/log/pacman.log | ./pacrecover >files.list 2>pkglist.orig

Будут созданы два файла: files.list с файлами пакетов, до сих пор присутствующих в системе, и pkglist.orig с пакетами для загрузки. После выполнения следующей команды может проявиться несоответствие между файлами новой и старых версий пакета. Такие несоответствия должны быть исправлены вручную.

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

$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
Примечание: Если эта команда завершается с ошибкой failed to initialise alpm library, проверьте, существует ли файл /var/lib/pacman/local/ALPM_DB_VERSION. Если же он отсутствует, выполните pacman-db-upgrade от имени суперпользователя, после чего также запустив pacman -Sy и повторив предыдущую команду.

Проверьте список на отсутствие важных пакетов из группы base и добавьте их:

$ comm -23 <(pacman -Sgq base | sort) pkglist.orig >> pkglist

Продолжите, когда содержание обеих файлов будет удовлетворительным, так как они используются для восстановления базы данных pacman (/var/lib/pacman/local/).

Восстановление

Объявите в bash функцию восстановления:

 recovery-pacman() {
    sudo pacman "$@"  \
    --log /dev/null   \
    --noscriptlet     \
    --dbonly          \
    --force           \
    --nodeps          \
    --needed
}

--log /dev/null позволяет избежать ненужного засорения лога pacman, --needed сохраняет немного времени, пропуская уже присутствующие в базе данных пакеты, --nodeps позволяет устанавливать пакеты из кеша даже в том случае, когда устанавливаемые пакеты зависят от более новых версий. Остальные параметры позволяют pacman работать с файловой системой без прав чтения или записи.

Заполните базу данных для синхронизации:

# pacman -Sy

Начните генерировать базу данных, установив локально доступные пакеты из файла files.list:

# recovery-pacman -U $(< files.list)

Установите оставшиеся пакеты из файла pkglist:

# recovery-pacman -S $(< pkglist)

Обновите локальную базу данных так, чтобы пакеты, которые не требуются каким-либо другим пакетам, были помечены явно установленными, а все остальные — зависимостями. Вам придётся быть очень осторожным при удалении пакетов в будущем, но это лучшее решение, доступное при удалённой оригинальной базе данных.

# pacman -D --asdeps $(pacman -Qq)
# pacman -D --asexplicit $(pacman -Qtq)

При необходимости проверьте все установленные пакеты на наличие повреждений:

# pacman -Qk

Также при необходимости найдите файлы, не принадлежащие ни одному пакету.

Обновите все пакеты:

# pacman -Su