Pacman (Português)/Restore local database (Português)
Sinais de que o pacman precisa de uma restauração da base de dados local:
pacman -Q
fornece absolutamente nenhuma saída epacman -Syu
relata erroneamente que o sistema está atualizado.- Ao tentar instalar um pacote usando
pacman -S pacote
e ele emite uma lista de dependências já satisfeitas.
Muito provavelmente, a base de dados de softwares instalados do pacman, /var/lib/pacman/local
, foi corrompida ou excluída. Embora este seja um problema sério, ele pode ser restaurado seguindo as instruções abaixo.
Primeiramente, certifique-se de que o arquivo de registro de logs do pacman está presente:
$ ls /var/log/pacman.log
Se não existe, não é possível continuar com este método. Você pode usar o script de detecção de pacotes do Xyne para recriar a base de dados. Caso contrário, a solução provável é reinstalar todo o sistema.
Gerando a lista de recuperação de pacotes
Instale o pacote pacutils para obter paclog.
Crie um script de filtro de logs e torne-o executável:
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,zst}" for pkgdir in ${pkgdirs[@]}; do pkgpath="$pkgdir"/$pkgname [ -f $pkgpath ] && { echo $pkgpath; break; }; done || echo ${parampart[0]} 1>&2 done
Execute o script (opcionalmente, passando diretórios adicionais com pacotes como parâmetros):
$ paclog --pkglist --logfile=/var/log/pacman.log | ./pacrecover >files.list 2>pkglist.orig
Desta forma, serão criados dois arquivos: files.list
com arquivos de pacote, ainda presentes na máquina e pkglist.orig
, pacotes os quais devem ser baixados. A operação posterior pode resultar em incompatibilidade entre arquivos de versões mais antigas do pacote, ainda presentes na máquina e arquivos, encontrados na nova versão. Essas incompatibilidades terão de ser corrigidas manualmente.
Aqui está uma maneira de restringir automaticamente a segunda lista de pacotes disponíveis em um repositório:
$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
Verifique se algum pacotes importantes do base está em falta e adicione-o à lista:
$ comm -23 <(pacman -Sgq base | sort) pkglist.orig >> pkglist
Proceda assim que o conteúdo de ambas listas seja satisfatório, já que elas serão usadas para restaurar a base de dados de pacotes instalados do pacman; .
Efetuando a recuperação
Defina uma função de bash para fins de recuperação:
recovery-pacman() { pacman "$@" \ --log /dev/null \ --noscriptlet \ --dbonly \ --overwrite "*" \ --nodeps \ --needed }
permite evitar a poluição desnecessária do log do pacman; economizará algum tempo ignorando pacotes, já presentes no banco de dados; permitirá a instalação de pacotes em cache, mesmo que os pacotes instalados dependam de versões mais recentes. O restante das opções permitirá o pacman operar sem ler/escrever o sistema de arquivos.
Popule a base de dados de sincronização:
# pacman -Sy
Inicie a geração da base de dados instalando arquivos de pacotes disponíveis localmente de files.list
:
# recovery-pacman -U $(< files.list)
Instale o resto de pkglist
:
# recovery-pacman -S $(< pkglist)
Atualize a base de dados local para que os pacotes que não sejam exigidos por qualquer outro pacote sejam marcados como instalados explicitamente e os outros como dependências. Você precisará ser extremamente cuidadoso no futuro ao remover pacotes, mas com a base de dados original perdida é o melhor que podemos fazer.
# pacman -D --asdeps $(pacman -Qq) # pacman -D --asexplicit $(pacman -Qtq)
Opcionalmente, verifique todos os pacotes instalados por corrompimento:
# pacman -Qk
Opcionalmente, tente pacman/Dicas e truques#Identificar arquivos que pertençam a nenhum pacote.
Atualize todos os pacotes:
# pacman -Su