De vez em quando, os usuários do Ubuntu encontram erros deapt
ouapt-get
, da forma:
The package some-package needs to be reinstalled, but I can't find an archive for it.
Quero saber o que causa esse erro para poder reproduzi-lo e tentar encontrar formas seguras de corrigi-lo, mesmo quando o pacote quebrado é importante e tem muitas dependências.Esta partedoCódigo-fonte do APTpode dar uma pista, mas não sei como os pacotes obtêm o status que causa o erro.
Como posso produzir este erro para teste no meu sistema (Ubuntu MATE 17.10)?
Isto é motivado poresta recente pergunta do Faça ao Ubuntue meu desconforto de longa data com questões finais sobre esse erro contraApt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele, cuja resposta usa dpkg --force-all
para remover o pacote incorreto.Feedback anônimosugere que esta solução funcionou para muitos usuários, mas não estou confiante de que o uso --force-all
não causará problemas posteriores, ou que seja uma boa ideia usar este método para remover pacotes importantes como o APT.
Responder1
O erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele" às vezes é inespecífico.
O momento mais comum em que vejo esse erro é ao atualizar o Ubuntu de uma versão para outra.
Observação: O Ubuntu está convertendo de apt-get para apt , mas estou usando o apt-get neste post. Para informações adicionais consulte man apt
ehttps://www.debian.org/doc/manuals/debian-reference/ch02.en.html
A causa mais comum desse erro é quando um usuário instala um pacote e remove o .deb, normalmente comsudo apt-get clean
http://manpages.ubuntu.com/manpages/zesty/man8/apt-get.8.html
limpar
clean clears out the local repository of retrieved package files. It removes everything but the lock file from /var/cache/apt/archives/ and /var/cache/apt/archives/partial/
Então, em algum momento, dpkg --reconfigure
é chamado, seja pelo usuário, ou por atualização, ou em algum momento o usuário tenta reinstalar o pacote é reinstalado sudo apt-get --reinstall foo
ou alguma variação.
Se o apt não conseguir localizar o .deb no repositório, seja porque os pacotes foram removidos (raro), o repositório foi removido do sistema ou porque atualizou e o pacote não está no novo repositório, você receberá o erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele"
Mas o erro pode vir de outras causas.
Citando as seções relevantes da página man do dpkg (Vejahttp://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.htmlpara detalhes )
INFORMAÇÕES SOBRE PACOTES O dpkg mantém algumas informações úteis sobre os pacotes disponíveis. As informações são divididas em três classes: estados, estados de seleção e bandeiras. Estes valores devem ser alterados principalmente com o dselect.
Estados do pacote
not-installed The package is not installed on your system. config-files Only the configuration files of the package exist on the system. half-installed The installation of the package has been started, but not completed for some reason. unpacked The package is unpacked, but not configured. half-configured The package is unpacked and configuration has been started, but not yet completed for some reason. triggers-awaited The package awaits trigger processing by another package. triggers-pending The package has been triggered. installed The package is unpacked and configured OK.
AÇÕES
-i, --install package-file... Install the package. If --recursive or -R option is specified, package-file must refer to a directory instead. Installation consists of the following steps: 1. Extract the control files of the new package. 2. If another version of the same package was installed before the new installation, execute prerm script of the old package. 3. Run preinst script, if provided by the package. 4. Unpack the new files, and at the same time back up the old files, so that if something goes wrong, they can be restored. 5. If another version of the same package was installed before the new installation, execute the postrm script of the old package. Note that this script is executed after the preinst script of the new package, because new files are written at the same time old files are removed. 6. Configure the package. See --configure for detailed information about how this is done.
--configure pacote...|-a|--pendente
Configure a package which has been unpacked but not yet configured. If -a or --pending is given instead of package, all unpacked but unconfigured packages are configured. To reconfigure a package which has already been configured, try the dpkg-reconfigure(8) command instead. Configuring consists of the following steps: 1. Unpack the conffiles, and at the same time back up the old conffiles, so that they can be restored if something goes wrong. 2. Run postinst script, if provided by the package. /var/lib/dpkg/status Statuses of available packages. This file contains information about whether a package is marked for removing or not, whether it is installed or not, etc. See section INFORMATION ABOUT PACKAGES for more info.
Se as páginas de manual forem tl;dr -> Como parte da instalação, .deb/dpkg/apt executa scripts de pré/pós-instalação e outras funções. Se esses scripts de instalação/remoção falharem por qualquer motivo, um pacote será marcado como "meio instalado" (ou algum estado diferente de não instalado/instalado). Nesse estado sujo, você às vezes também pode ver o erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele" . Neste exemplo, o problema não é um arquivo ausente, mas um problema nos scripts de pré/pós-instalação que não pode ser resolvido executando-os novamente. Assim, o erro às vezes é inespecífico.
Como gerenciar pacotes quebrados
Primeiro, tente corrigir as dependências primeiro, certificando-se de que os ppa/repositórios apropriados estejam habilitados, o universo, por exemplo, ou quaisquer repositórios necessários.
Então o infame
sudo apt-get install -f
Lerquaisquer mensagens de saída e de erro e poste o comando e a saída aqui se precisar de ajuda.
Tente reconfigurar
sudo dpkg --configure -a
Isso executará os scripts de configuração. Você pode especificar um pacote em vez de -a, mas -a é mais útil quando você está tendo problemas.
Lerquaisquer mensagens de saída e de erro e poste o comando e a saída aqui se precisar de ajuda.
Tente observar qualquer script com falha e, se possível, corrija o erro/problema no script.
Tente remover o pacote ofensivo, à força, se necessário. Você deve ter muito cuidado aqui, pois pode forçar a remoção de um pacote crítico ou pior de um conjunto de pacotes críticos. Os comandos a seguir vão de educado a menos educado e a força total. Experimente-os em ordem.
sudo dpkg --remove $broken_package sudo dpkg --remove --force-remove-reinstreq $broken_package sudo dpkg --remove --force-all $broken_package
Se algum desses funcionar, execute
sudo apt-get update && sudo apt-get upgrade
, talvez seja necessário executarsudo apt-get -f install
e/ousudo dpkg --configure -a
também.Se isso falhar, você precisará remover manualmente os pacotes. Isso pode envolver encontrar todos os componentes do seu sistema e excluí-los manualmente.
Use o seguinte procedimento
Remova as informações do dpkg (veja acima)
cd /var/lib/dpkg/info sudo rm -i package_name*
Tenha cuidado para não remover mais do que o necessário aqui.
Finalmente remova o pacote ofensivo
sudo dpkg --remove --force-remove-reinstreq package_name
Você deverá então ser capaz de usar o apt
sudo apt-get update sudo apt-get install -f sudo apt-get upgrade
Somente se necessário, localize e remova manualmente quaisquer arquivos restantes no sistema. Este é um procedimento manual e pode incluir arquivos de configuração em
/etc
páginas de manual ou dados compartilhados. Use localizar ou localizar para identificar possíveis arquivos restantes.Obviamente você deve tomar muito cuidado ao excluir arquivos do sistema. Não exclua coisas que você não entende e não usa
rm -Rf
sem entender o que aquele comando fará.rm -i
provavelmente é melhor porque a-i
opção pede confirmação.
Recrie este problema
Você pode reproduzir esta mensagem de erro editando manualmente o arquivo de status dpkg de qualquer pacote /var/lib/dpkg/info
e alterando o status para meio instalado
sudo nano /var/lib/dpkg/info/some_package
Edite a linha Status para que leia
Status: purge reinstreq meio instalado
Então tente correr apt-get
.
Se isso não funcionar, instale um pacote de um ppa, execute apt-get clean, remova o ppa e tente reinstalar ou reconfigurar o pacote.
Desculpe pela longa postagem, mas espero que isso lhe dê uma ideia da causa e da resolução desta complexa mensagem de erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele"