User:Xolst/Restore local database 2.0 (Русский)

From ArchWiki

Несколько признаков того что локальная база пакетов /var/lib/pacman/local/* повреждена или удалена:

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

Это довольно серьезная проблема, но если следовать приведенным ниже инструкциям базу можно восстановить.

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

Первым делом обновите базу данных pacman до нового формата, выполнив команду:

# pacman-db-upgrade

если проблема осталась то переходите к инструкциям ниже.

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

$ awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n |sed '$a\\' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}' > packages.all.txt
$ comm -13 <(pacman -Sql |sort) packages.all.txt > packages.notrepo.txt
$ comm -3 packages.all.txt packages.notrepo.txt > packages.repo.txt
Примечание: Для получения и сверки списка пакетов с базой АУР необходимо чтобы были установлены пакеты curl и jq.
$ curl -s "https://aur.archlinux.org/rpc/?v=5&type=info&by=name$(awk -v ORS= '{print "&arg[]="$0}' packages.notrepo.txt)" |jq -r '.results[].Name' > packages.aur.txt
$ comm -23 packages.notrepo.txt packages.aur.txt > packages.unknown.txt

где packages.*.txt списки установленных пакетов согласно /var/log/pacman.log

packages.all.txt - все установленные пакеты
packages.repo.txt - пакеты из подключенных (в /etc/pacman.conf) репозиториев
packages.notrepo.txt - пакеты из не подключенных репозиториев
packages.aur.txt - пакеты из AUR
packages.unknown.txt - неизвестные пакеты

на простой схеме отношения списков выглядит так:

all = repo + notrepo = repo + (aur + unknown)

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

Восстановление пакетов из packages.repo.txt:

# pacman -Syu -dd --dbonly --needed --logfile /dev/null --noscriptlet $(< packages.repo.txt)

Вышеперечисленные манипуляции позволят восстановить базу пакетов без скачивания и перезаписи самих пакетов.

Далее удобным для вас способом восстановите пакеты из packages.aur.txt.

Как вариант можно воспользоваться одним из помощников для работы с АУР, например, yay (установите если нету yay-binAUR или yayAUR):

$ yay -Su -dd --dbonly --needed --logfile /dev/null --noscriptlet $(< packages.aur.txt)

Пакеты из списка packages.unknown.txt это пакеты которые были установлены но уже, по какой либо причине, перестали поддерживаться и были удалены или просто сменили название.

Одной строкой

Получение списка и восстановления сразу всех пакетов:

$ yay -Syu -dd --dbonly --needed --logfile /dev/null --noscriptlet $(awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n |sed '$a\\' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}')


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

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

Для профилактики также можно проверить все установленные пакеты на наличие повреждений:

# pacman -Qk