UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

132 lines (81 loc) 4.92 kB
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](https://bbs.archlinux.org/viewtopic.php?pid=670876) 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](/index.php/Pacman_(Portugu%C3%AAs) "Pacman (Português)") ou destino de pacotes do [makepkg](/index.php/Makepkg_(Portugu%C3%AAs) "Makepkg (Português)") contenham pacotes de outras arquiteturas, remova-os antes de continuar. 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 pacote importante 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 \ --force \ --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](/index.php/Pacman/Dicas_e_truques#Identificar_arquivos_que_perten.C3.A7am_a_nenhum_pacote "Pacman/Dicas e truques"). Atualize todos os pacotes: ``` # pacman -Su ```