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

Jump to content
From ArchWiki
< Pacman (Português)
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.

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,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

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() {
        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

Category:

- Package manager (Português)