Pacman (Português)/Restore local database (Português)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Status de tradução: Esse artigo é uma tradução de Pacman/Restore local database. Data da última tradução: 2020-06-21. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Sinais de que o pacman precisa de uma restauração da base de dados local:

  • pacman -Q fornece absolutamente nenhuma saída e pacman -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

Atenção: Se por algum motivo o seu cache do pacman ou destino de pacotes do makepkg contenham pacotes de outras arquiteturas, remova-os antes de continuar.

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"
  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 /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
Nota: Se isso falhar com falha ao iniciar a biblioteca alpm, verifique se /var/lib/pacman/local/ALPM_DB_VERSION existe - se não existir, execute pacman-db-upgrade como root seguido por pacman -Sy e, então, tente novamente o comando anterior.

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; /var/lib/pacman/local/.

Efetuando a recuperação

Defina uma função de bash para fins de recuperação:

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

--log /dev/null permite evitar a poluição desnecessária do log do pacman; --needed economizará algum tempo ignorando pacotes, já presentes no banco de dados; --nodeps 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