< Pacman (Português)

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 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.
Status de tradução: Esse artigo é uma tradução de Pacman/Restore local database. Data da última tradução: 2022-01-23. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

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,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
gollark: In Haskell, `main` is actually just an `IO ()` (IO action returning nothing) composed from other IO actions and functions and stuff.
gollark: Feed your chickens with a very metal rich diet.
gollark: There is apparently some thing where relatively minor head injury accumulates into more badness over time: https://en.wikipedia.org/wiki/Chronic_traumatic_encephalopathy
gollark: Please be very very careful regarding safety with this stuff and avoid irradiating yourself or others for the sake of plant things.
gollark: High energy UV is probably somewhat damaging to plants, can be stopped by walls and such, and available fairly easily (I think) but please actually check this instead of expecting me to have.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.