User:Xolst/Restore local database 2.0 (Русский)
Несколько признаков того что локальная база пакетов /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 -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
- пакеты из AURpackages.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